diff --git a/404.html b/404.html index 8c2eecf0..536add41 100644 --- a/404.html +++ b/404.html @@ -36,7 +36,7 @@ // https://username.github.io/repo-name/one/two?a=b&c=d#qwe becomes // https://username.github.io/repo-name/?/one/two&a=b~and~c=d#qwe // Otherwise, leave pathSegmentsToKeep as 0. - var pathSegmentsToKeep = 0; + var pathSegmentsToKeep = 1; var l = window.location; l.replace( diff --git a/Staticfile b/Staticfile deleted file mode 100644 index 85a13140..00000000 --- a/Staticfile +++ /dev/null @@ -1 +0,0 @@ -pushstate: enabled \ No newline at end of file diff --git a/asset-manifest.json b/asset-manifest.json index ba8fda4b..699d57d5 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,60 +1,58 @@ { "files": { - "main.css": "/static/css/main.6901d5e3.chunk.css", - "main.js": "/static/js/main.d5237926.chunk.js", - "main.js.map": "/static/js/main.d5237926.chunk.js.map", - "runtime-main.js": "/static/js/runtime-main.a024820b.js", - "runtime-main.js.map": "/static/js/runtime-main.a024820b.js.map", - "static/css/2.1c8e5216.chunk.css": "/static/css/2.1c8e5216.chunk.css", - "static/js/2.bcd91392.chunk.js": "/static/js/2.bcd91392.chunk.js", - "static/js/2.bcd91392.chunk.js.map": "/static/js/2.bcd91392.chunk.js.map", - "signalfx-timer-throughput.png": "/02141ef2139e0de5d180b5b76dff1982.png", - "new-relic-timer-throughput.png": "/02f1215f99df0a7a03ac1d5986ace874.png", - "new-relic-timer-percentiles.png": "/03797aa9d08a216ed90efab2b59e0114.png", - "appoptics-timer-average.png": "/0592f647d85fc092e402fdfb77234e24.png", - "wavefront-counter-rate.png": "/105c9d351e5cabcc4504a9b863032ca3.png", - "wavefront-timer-latency.png": "/10ee7658d93746e240978c7ca9b3467b.png", - "atlas-long-task-timer.png": "/1127e78d5d7524b0c0540de3d2a732b2.png", - "prometheus-dashboard.png": "/39fa40459993be394ab40488bf8c6a8f.png", - "grafana-guava-miss-ratio.png": "/3c191f6ce81fefe9b7d1980fc9d5b4fe.png", - "prometheus-counter-norate.png": "/439c0eea1918ef143002cf62a9393e2a.png", - "atlas-timer.png": "/4ce8699a76d05ed4311151acc1772b1f.png", - "new-relic-timer-latency.png": "/4d25b7833c033d6e2380ec4ecc988d66.png", - "prometheus-counter.png": "/594dce115710525d7771ebe3ab82db19.png", - "rate-normalizing.png": "/5cdb40b089820639454d90a5e4874aee.png", - "humio-timer.png": "/6584fae5a94c66dd29f69056b031d7e3.png", - "appoptics-timer.png": "/6bf5cf6071710d129ffaadb50d2b0874.png", - "trace-id.jpg": "/7043f6f1d0731de0cc0943e896c32fca.jpg", - "jmx-counter.png": "/8077bd6e31e279e04a38e631b2d61a1e.png", - "ganglia-counter.png": "/80865a7f65d47863b3b264a9ed09629a.png", - "wavefront-timer-throughput.png": "/9cc263d6b012a89bad0374b418540a31.png", - "signalfx-timer-percentiles.png": "/a165f31f4506fa9b07f0f2319dd58aa0.png", - "prometheus-guava-cache-ratio.png": "/aa70057042488eef46660369434e99d4.png", - "signalfx-timer-sla.png": "/b19ccbd241a3bfd9377d4066961b1620.png", - "atlas-counter.png": "/b22351bea254b10bef1c26d3cc3ef397.png", - "zipkin.jpg": "/b8a4008ab6f119930854d422d6bd39b9.jpg", - "signalfx-timer-latency.png": "/beec842accba1a667e0e288745191070.png", - "graphite-counter.png": "/cd6b0314737fa94a81e42689517fd7fb.png", - "signalfx-timer-latency-query.png": "/d77cd7a4fea8c37d7dc37e7bbe069b5e.png", - "new-relic-timer-sla.png": "/e1fdf4994baf8640b183e76694d53390.png", - "parents.jpg": "/e4aa3da5f34dc789ae92d1f759a97b85.jpg", - "prometheus-long-task-timer.png": "/fb6c59cc88b85301c5bbb890afc71593.png", - "prometheus-timer.png": "/fc8d290e3f5356fad7d93f76c6abe188.png", - "prometheus-guava-cache.png": "/fd12bde9dc50409da244eb7ba80f6548.png", - "index.html": "/index.html", - "static/css/2.1c8e5216.chunk.css.map": "/static/css/2.1c8e5216.chunk.css.map", - "static/css/main.6901d5e3.chunk.css.map": "/static/css/main.6901d5e3.chunk.css.map", - "static/js/2.bcd91392.chunk.js.LICENSE.txt": "/static/js/2.bcd91392.chunk.js.LICENSE.txt", - "static/media/font-awesome.min.css": "/static/media/fontawesome-webfont.f691f37e.woff", - "static/media/logo-no-title.c52ef844.svg": "/static/media/logo-no-title.c52ef844.svg", - "static/media/logo.e2f91fdb.svg": "/static/media/logo.e2f91fdb.svg", - "static/media/playback-latency.b7cc768a.png": "/static/media/playback-latency.b7cc768a.png" + "main.css": "/docs/static/css/main.d5b959e1.chunk.css", + "main.js": "/docs/static/js/main.30543131.chunk.js", + "main.js.map": "/docs/static/js/main.30543131.chunk.js.map", + "runtime-main.js": "/docs/static/js/runtime-main.6ab23704.js", + "runtime-main.js.map": "/docs/static/js/runtime-main.6ab23704.js.map", + "static/css/2.00866533.chunk.css": "/docs/static/css/2.00866533.chunk.css", + "static/js/2.ff597791.chunk.js": "/docs/static/js/2.ff597791.chunk.js", + "static/js/2.ff597791.chunk.js.map": "/docs/static/js/2.ff597791.chunk.js.map", + "signalfx-timer-throughput.png": "/docs/02141ef2139e0de5d180b5b76dff1982.png", + "new-relic-timer-throughput.png": "/docs/02f1215f99df0a7a03ac1d5986ace874.png", + "new-relic-timer-percentiles.png": "/docs/03797aa9d08a216ed90efab2b59e0114.png", + "appoptics-timer-average.png": "/docs/0592f647d85fc092e402fdfb77234e24.png", + "wavefront-counter-rate.png": "/docs/105c9d351e5cabcc4504a9b863032ca3.png", + "wavefront-timer-latency.png": "/docs/10ee7658d93746e240978c7ca9b3467b.png", + "atlas-long-task-timer.png": "/docs/1127e78d5d7524b0c0540de3d2a732b2.png", + "prometheus-dashboard.png": "/docs/39fa40459993be394ab40488bf8c6a8f.png", + "grafana-guava-miss-ratio.png": "/docs/3c191f6ce81fefe9b7d1980fc9d5b4fe.png", + "prometheus-counter-norate.png": "/docs/439c0eea1918ef143002cf62a9393e2a.png", + "atlas-timer.png": "/docs/4ce8699a76d05ed4311151acc1772b1f.png", + "new-relic-timer-latency.png": "/docs/4d25b7833c033d6e2380ec4ecc988d66.png", + "prometheus-counter.png": "/docs/594dce115710525d7771ebe3ab82db19.png", + "rate-normalizing.png": "/docs/5cdb40b089820639454d90a5e4874aee.png", + "humio-timer.png": "/docs/6584fae5a94c66dd29f69056b031d7e3.png", + "appoptics-timer.png": "/docs/6bf5cf6071710d129ffaadb50d2b0874.png", + "trace-id.jpg": "/docs/7043f6f1d0731de0cc0943e896c32fca.jpg", + "jmx-counter.png": "/docs/8077bd6e31e279e04a38e631b2d61a1e.png", + "ganglia-counter.png": "/docs/80865a7f65d47863b3b264a9ed09629a.png", + "wavefront-timer-throughput.png": "/docs/9cc263d6b012a89bad0374b418540a31.png", + "signalfx-timer-percentiles.png": "/docs/a165f31f4506fa9b07f0f2319dd58aa0.png", + "prometheus-guava-cache-ratio.png": "/docs/aa70057042488eef46660369434e99d4.png", + "signalfx-timer-sla.png": "/docs/b19ccbd241a3bfd9377d4066961b1620.png", + "atlas-counter.png": "/docs/b22351bea254b10bef1c26d3cc3ef397.png", + "zipkin.jpg": "/docs/b8a4008ab6f119930854d422d6bd39b9.jpg", + "signalfx-timer-latency.png": "/docs/beec842accba1a667e0e288745191070.png", + "graphite-counter.png": "/docs/cd6b0314737fa94a81e42689517fd7fb.png", + "signalfx-timer-latency-query.png": "/docs/d77cd7a4fea8c37d7dc37e7bbe069b5e.png", + "new-relic-timer-sla.png": "/docs/e1fdf4994baf8640b183e76694d53390.png", + "parents.jpg": "/docs/e4aa3da5f34dc789ae92d1f759a97b85.jpg", + "prometheus-long-task-timer.png": "/docs/fb6c59cc88b85301c5bbb890afc71593.png", + "prometheus-timer.png": "/docs/fc8d290e3f5356fad7d93f76c6abe188.png", + "prometheus-guava-cache.png": "/docs/fd12bde9dc50409da244eb7ba80f6548.png", + "index.html": "/docs/index.html", + "static/css/2.00866533.chunk.css.map": "/docs/static/css/2.00866533.chunk.css.map", + "static/css/main.d5b959e1.chunk.css.map": "/docs/static/css/main.d5b959e1.chunk.css.map", + "static/js/2.ff597791.chunk.js.LICENSE.txt": "/docs/static/js/2.ff597791.chunk.js.LICENSE.txt", + "static/media/font-awesome.min.css": "/docs/static/media/fontawesome-webfont.f691f37e.woff", + "static/media/logo.e2f91fdb.svg": "/docs/static/media/logo.e2f91fdb.svg" }, "entrypoints": [ - "static/js/runtime-main.a024820b.js", - "static/css/2.1c8e5216.chunk.css", - "static/js/2.bcd91392.chunk.js", - "static/css/main.6901d5e3.chunk.css", - "static/js/main.d5237926.chunk.js" + "static/js/runtime-main.6ab23704.js", + "static/css/2.00866533.chunk.css", + "static/js/2.ff597791.chunk.js", + "static/css/main.d5b959e1.chunk.css", + "static/js/main.30543131.chunk.js" ] } \ No newline at end of file diff --git a/index.html b/index.html index 27736a33..fecfbd1b 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -Micrometer Application Observability
\ No newline at end of file +Micrometer Application Observability
\ No newline at end of file diff --git a/static/css/2.1c8e5216.chunk.css b/static/css/2.00866533.chunk.css similarity index 85% rename from static/css/2.1c8e5216.chunk.css rename to static/css/2.00866533.chunk.css index af7fe095..699d4ad2 100644 --- a/static/css/2.1c8e5216.chunk.css +++ b/static/css/2.00866533.chunk.css @@ -1,7 +1,7 @@ /*! * 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(/static/media/fontawesome-webfont.8b43027f.eot);src:url(/static/media/fontawesome-webfont.8b43027f.eot?#iefix&v=4.7.0) format("embedded-opentype"),url(/static/media/fontawesome-webfont.20fd1704.woff2) format("woff2"),url(/static/media/fontawesome-webfont.f691f37e.woff) format("woff"),url(/static/media/fontawesome-webfont.1e59d233.ttf) format("truetype"),url(/static/media/fontawesome-webfont.c1e38fd9.svg#fontawesomeregular) format("svg");font-weight:400;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:.08em solid #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 linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;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-close:before,.fa-remove: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-cog:before,.fa-gear: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-repeat:before,.fa-rotate-right: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-image:before,.fa-photo: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-exclamation-triangle:before,.fa-warning: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-cogs:before,.fa-gears: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-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder: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-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste: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-chain-broken:before,.fa-unlink: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-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won: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-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira: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-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board: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-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-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-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-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-futbol-o:before,.fa-soccer-ball-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-ils:before,.fa-shekel:before,.fa-sheqel: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-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc: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-full:before,.fa-battery: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-paper-o:before,.fa-hand-stop-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-television:before,.fa-tv: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-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing: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-address-card:before,.fa-vcard:before{content:"\f2bb"}.fa-address-card-o:before,.fa-vcard-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-full:before,.fa-thermometer: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-bath:before,.fa-bathtub:before,.fa-s15: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-focusable:active,.sr-only-focusable:focus{margin:0} + */@font-face{font-family:"FontAwesome";src:url(/docs/static/media/fontawesome-webfont.8b43027f.eot);src:url(/docs/static/media/fontawesome-webfont.8b43027f.eot?#iefix&v=4.7.0) format("embedded-opentype"),url(/docs/static/media/fontawesome-webfont.20fd1704.woff2) format("woff2"),url(/docs/static/media/fontawesome-webfont.f691f37e.woff) format("woff"),url(/docs/static/media/fontawesome-webfont.1e59d233.ttf) format("truetype"),url(/docs/static/media/fontawesome-webfont.c1e38fd9.svg#fontawesomeregular) format("svg");font-weight:400;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:.08em solid #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 linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;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-close:before,.fa-remove: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-cog:before,.fa-gear: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-repeat:before,.fa-rotate-right: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-image:before,.fa-photo: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-exclamation-triangle:before,.fa-warning: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-cogs:before,.fa-gears: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-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder: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-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste: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-chain-broken:before,.fa-unlink: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-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won: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-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira: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-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board: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-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-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-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-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-futbol-o:before,.fa-soccer-ball-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-ils:before,.fa-shekel:before,.fa-sheqel: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-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc: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-full:before,.fa-battery: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-paper-o:before,.fa-hand-stop-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-television:before,.fa-tv: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-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing: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-address-card:before,.fa-vcard:before{content:"\f2bb"}.fa-address-card-o:before,.fa-vcard-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-full:before,.fa-thermometer: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-bath:before,.fa-bathtub:before,.fa-s15: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-focusable:active,.sr-only-focusable:focus{margin:0} /*! Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */a{background:none}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}abbr{font-size:.9em}abbr[title]{cursor:help;border-bottom:1px dotted #dddddf;text-decoration:none}dfn{font-style:italic}mark{background:#ff0;color:#000}code,kbd,pre,samp{font-family:monospace}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}button,input{line-height:normal}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{vertical-align:top}table{border-spacing:0}body,html{font-size:100%}body{background:#fff;color:rgba(0,0,0,.8);padding:0;font-family:"Noto Serif","DejaVu Serif",serif;line-height:1;position:relative;cursor:auto;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}a:hover{cursor:pointer}embed,img,object{max-width:100%;height:auto}embed,object{height:100%}img{-ms-interpolation-mode:bicubic}.left{float:left!important}.right{float:right!important}.hide{display:none}img,object,svg{display:inline-block;vertical-align:middle}textarea{height:auto;min-height:50px}select{width:100%}.admonitionblock td.content>.title,.audioblock>.title,.dlist>.title,.exampleblock>.title,.hdlist>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.olist>.title,.openblock>.title,.paragraph>.title,.qlist>.title,.quoteblock>.title,.stemblock>.title,.subheader,.ulist>.title,.verseblock>.title,.videoblock>.title,table.tableblock>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}#toctitle,.sidebarblock>.content>.title,blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}a{color:#2156a5;text-decoration:underline;line-height:inherit}a:focus,a:hover{color:#1d4b8f}a img{border:0}p{line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}p aside{font-size:.875em;line-height:1.35;font-style:italic}#toctitle,.sidebarblock>.content>.title,h1,h2,h3,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}#toctitle small,.sidebarblock>.content>.title small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}h1{font-size:2.125em}h2{font-size:1.6875em}#toctitle,.sidebarblock>.content>.title,h3{font-size:1.375em}h4,h5{font-size:1.125em}h6{font-size:1em}hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:60%;line-height:inherit}code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}dl,ol,ul{line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}ol,ul{margin-left:1.5em}ul li ol,ul li ul{margin-left:1.25em;margin-bottom:0}ul.circle li ul,ul.disc li ul,ul.square li ul{list-style:inherit}ul.square{list-style-type:square}ul.circle{list-style-type:circle}ul.disc{list-style-type:disc}ol li ol,ol li ul{margin-left:1.25em;margin-bottom:0}dl dt{margin-bottom:.3125em;font-weight:700}dl dd{margin-bottom:1.25em}blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}@media screen and (min-width:768px){#toctitle,.sidebarblock>.content>.title,h1,h2,h3,h4,h5,h6{line-height:1.2}h1{font-size:2.75em}h2{font-size:2.3125em}#toctitle,.sidebarblock>.content>.title,h3{font-size:1.6875em}h4{font-size:1.4375em}}table{background:#fff;margin-bottom:1.25em;border:1px solid #dedede;word-wrap:normal}table tfoot,table thead{background:#f7f8f7}table tfoot tr td,table tfoot tr th,table thead tr td,table thead tr th{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}table tr td,table tr th{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}table tr.alt,table tr.even{background:#f8f8f7}table tbody tr td,table tfoot tr td,table tfoot tr th,table thead tr th,table tr td{line-height:1.6}#toctitle,.sidebarblock>.content>.title,h1,h2,h3,h4,h5,h6{line-height:1.2;word-spacing:-.05em}#toctitle strong,.sidebarblock>.content>.title strong,h1 strong,h2 strong,h3 strong,h4 strong,h5 strong,h6 strong{font-weight:400}.center{margin-left:auto;margin-right:auto}.stretch{width:100%}.clearfix:after,.clearfix:before,.float-group:after,.float-group:before{content:" ";display:table}.clearfix:after,.float-group:after{clear:both}:not(pre).nobreak{word-wrap:normal}:not(pre).nowrap{white-space:nowrap}:not(pre).pre-wrap{white-space:pre-wrap}:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;border-radius:4px}:not(pre):not([class^=L])>code,pre{line-height:1.45;text-rendering:optimizeSpeed}pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace}pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}pre>code{display:block}pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}em em{font-style:normal}strong strong{font-weight:400}.keyseq{color:rgba(51,51,51,.8)}kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 0 0 .1em #fff;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}.keyseq kbd:first-child{margin-left:0}.keyseq kbd:last-child{margin-right:0}.menuref,.menuseq{color:#000}.menuref,.menuseq b:not(.caret){font-weight:inherit}.menuseq{word-spacing:-.02em}.menuseq b.caret{font-size:1.25em;line-height:.8}.menuseq i.caret{font-weight:700;text-align:center;width:.45em}b.button:after,b.button:before{position:relative;top:-1px;font-weight:400}b.button:before{content:"[";padding:0 3px 0 2px}b.button:after{content:"]";padding:0 2px 0 3px}p a>code:hover{color:rgba(0,0,0,.9)}#content,#footer,#footnotes,#header{width:100%;margin:0 auto;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}#content:after,#content:before,#footer:after,#footer:before,#footnotes:after,#footnotes:before,#header:after,#header:before{content:" ";display:table}#content:after,#footer:after,#footnotes:after,#header:after{clear:both}#content{margin-top:1.25em}#content:before{content:none}#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:flex;flex-flow:row wrap}#header .details span:first-child{margin-left:-.125em}#header .details span.email a{color:rgba(0,0,0,.85)}#header .details br{display:none}#header .details br+span:before{content:"\00a0\2013\00a0"}#header .details br+span.author:before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}#header .details br+span#revremark:before{content:"\00a0|\00a0"}#header #revnumber{text-transform:capitalize}#header #revnumber:after{content:"\00a0"}#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}#toc>ul{margin-left:.125em}#toc ul.sectlevel0>li>a{font-style:italic}#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}#toc li{line-height:1.3334;margin-top:.3334em}#toc a{text-decoration:none}#toc a:active{text-decoration:underline}#toctitle{color:#7a2518;font-size:1.2em}@media screen and (min-width:768px){#toctitle{font-size:1.375em}body.toc2{padding-left:15em;padding-right:0}#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}#toc.toc2>ul{font-size:.9em;margin-bottom:0}#toc.toc2 ul ul{margin-left:0;padding-left:1em}#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}body.toc2.toc-right{padding-left:0;padding-right:15em}body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}#toc.toc2{width:20em}#toc.toc2 #toctitle{font-size:1.375em}#toc.toc2>ul{font-size:.95em}#toc.toc2 ul ul{padding-left:1.25em}body.toc2.toc-right{padding-left:0;padding-right:20em}}#content #toc{border:1px solid #e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;border-radius:4px}#content #toc>:first-child{margin-top:0}#content #toc>:last-child{margin-bottom:0}#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}#footer-text{color:hsla(0,0%,100%,.8);line-height:1.44}#content{margin-bottom:.625em}.sect1{padding-bottom:.625em}@media screen and (min-width:768px){#content{margin-bottom:1.25em}.sect1{padding-bottom:1.25em}}.sect1:last-child{padding-bottom:0}.sect1+.sect1{border-top:1px solid #e7e7e9}#content h1>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h2>a.anchor,h3>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}#content h1>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}#content h1:hover>a.anchor,#content h1>a.anchor:hover,#toctitle:hover>a.anchor,#toctitle>a.anchor:hover,.sidebarblock>.content>.title:hover>a.anchor,.sidebarblock>.content>.title>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,h3>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}#content h1>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h2>a.link,h3>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}#content h1>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h2>a.link:hover,h3>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}.audioblock,.imageblock,.listingblock,.literalblock,.stemblock,.videoblock,details{margin-bottom:1.25em}details{margin-left:1.25rem}details>summary{cursor:pointer;display:block;position:relative;line-height:1.6;margin-bottom:.625rem;-webkit-tap-highlight-color:transparent}details>summary:before{content:"";border-left:solid;border-width:.3em medium .5em;border-bottom:.3em solid transparent;border-right:0 solid transparent;border-top:.3em solid transparent;position:absolute;top:.5em;left:-1.25rem;-webkit-transform:translateX(15%);transform:translateX(15%)}details[open]>summary:before{border-width:medium;border-top:solid;border-left:.3em solid transparent;border-bottom:0 solid transparent;border-right:.3em solid transparent;border-top-width:.5em;-webkit-transform:translateY(15%);transform:translateY(15%)}details>summary:after{content:"";width:1.25rem;height:1em;position:absolute;top:.3em;left:-1.25rem}.admonitionblock td.content>.title,.audioblock>.title,.dlist>.title,.exampleblock>.title,.hdlist>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.olist>.title,.openblock>.title,.paragraph>.title,.qlist>.title,.quoteblock>.title,.stemblock>.title,.ulist>.title,.verseblock>.title,.videoblock>.title,table.tableblock>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}#preamble>.sectionbody>[class=paragraph]:first-of-type p,.paragraph.lead>p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}.admonitionblock>table{border-collapse:initial;border:0;background:none;width:100%}.admonitionblock>table td.icon{text-align:center;width:80px}.admonitionblock>table td.icon img{max-width:none}.admonitionblock>table td.icon .title{font-weight:700;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}.exampleblock>.content{border:1px solid #e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;border-radius:4px}.exampleblock>.content>:first-child{margin-top:0}.exampleblock>.content>:last-child{margin-bottom:0}.sidebarblock{border:1px solid #dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;border-radius:4px}.sidebarblock>:first-child{margin-top:0}.sidebarblock>:last-child{margin-bottom:0}.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child{margin-bottom:0}.listingblock>.content>pre,.literalblock pre{border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}@media screen and (min-width:768px){.listingblock>.content>pre,.literalblock pre{font-size:.90625em}}@media screen and (min-width:1280px){.listingblock>.content>pre,.literalblock pre{font-size:1em}}.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class=highlight],.listingblock>.content>pre[class^="highlight "],.literalblock pre{background:#f7f7f8}.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}.listingblock>.content{position:relative}.listingblock code[data-lang]:before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}.listingblock:hover code[data-lang]:before{display:block}.listingblock.terminal pre .command:before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}.listingblock.terminal pre .command:not([data-prompt]):before{content:"$"}.listingblock pre.highlightjs{padding:0}.listingblock pre.highlightjs>code{padding:1em;border-radius:4px}.listingblock pre.prettyprint{border-width:0}.prettyprint{background:#f7f7f8}pre.prettyprint .linenums{line-height:1.45;margin-left:2em}pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}pre.prettyprint li code[data-lang]:before{opacity:1}pre.prettyprint li:not(:first-child) code[data-lang]:before{display:none}table.linenotable{border-collapse:initial;border:0;margin-bottom:0;background:none}table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}table.linenotable td.code{padding-left:.75em}table.linenotable td.linenos{border-right:1px solid;opacity:.35;padding-right:.5em}pre.pygments .lineno{border-right:1px solid;opacity:.35;display:inline-block;margin-right:.75em}pre.pygments .lineno:before{content:"";margin-right:-.125em}.quoteblock{margin:0 1em 1.25em 1.5em;display:table}.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}.quoteblock blockquote{margin:0;padding:0;border:0}.quoteblock blockquote:before{content:"\201c";float:left;font-size:2.75em;font-weight:700;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}.verseblock{margin:0 1em 1.25em}.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans-serif;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}.verseblock pre strong{font-weight:400}.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}.quoteblock .attribution br,.verseblock .attribution br{display:none}.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}.quoteblock.abstract blockquote:before,.quoteblock.excerpt blockquote:before,.quoteblock .quoteblock blockquote:before{display:none}.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}.quoteblock.abstract{margin:0 1em 1.25em;display:block}.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;font-size:.85rem;text-align:left;margin-right:0}p.tableblock:last-child{margin-bottom:0}td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere}td.tableblock>.content>:last-child{margin-bottom:-1.25em}table.tableblock,td.tableblock,th.tableblock{border:0 solid #dedede}table.grid-all>*>tr>*{border-width:1px}table.grid-cols>*>tr>*{border-width:0 1px}table.grid-rows>*>tr>*{border-width:1px 0}table.frame-all{border-width:1px}table.frame-ends{border-width:1px 0}table.frame-sides{border-width:0 1px}table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}table.frame-ends>*>tr>:first-child,table.frame-none>*>tr>:first-child{border-left-width:0}table.frame-ends>*>tr>:last-child,table.frame-none>*>tr>:last-child{border-right-width:0}table.stripes-all tr,table.stripes-even tr:nth-of-type(2n),table.stripes-hover tr:hover,table.stripes-odd tr:nth-of-type(odd){background:#f8f8f7}td.halign-left,th.halign-left{text-align:left}td.halign-right,th.halign-right{text-align:right}td.halign-center,th.halign-center{text-align:center}td.valign-top,th.valign-top{vertical-align:top}td.valign-bottom,th.valign-bottom{vertical-align:bottom}td.valign-middle,th.valign-middle{vertical-align:middle}table tfoot th,table thead th{font-weight:700}tbody tr th{background:#f7f8f7}tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:700}p.tableblock>code:only-child{background:none;padding:0}p.tableblock{font-size:1em}ol{margin-left:1.75em}ul li ol{margin-left:1.5em}dl dd{margin-left:1.125em}dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}.olist .olist,.olist .ulist,.ulist .olist,.ulist .ulist,ol>li p,ol dd,ul>li p,ul dd{margin-bottom:.625em}ol.no-bullet,ol.none,ol.unnumbered,ol.unstyled,ul.checklist,ul.no-bullet,ul.none,ul.unstyled{list-style-type:none}ol.no-bullet,ol.unnumbered,ul.no-bullet{margin-left:.625em}ol.unstyled,ul.unstyled{margin-left:0}ul.checklist>li>p:first-child{margin-left:-1em}ul.checklist>li>p:first-child>.fa-check-square-o:first-child,ul.checklist>li>p:first-child>.fa-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}ul.checklist>li>p:first-child>input[type=checkbox]:first-child{margin-right:.25em}ul.inline{display:flex;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}ul.inline>li{margin-left:1.25em}.unstyled dl dt{font-weight:400;font-style:normal}ol.arabic{list-style-type:decimal}ol.decimal{list-style-type:decimal-leading-zero}ol.loweralpha{list-style-type:lower-alpha}ol.upperalpha{list-style-type:upper-alpha}ol.lowerroman{list-style-type:lower-roman}ol.upperroman{list-style-type:upper-roman}ol.lowergreek{list-style-type:lower-greek}.colist>table,.hdlist>table{border:0;background:none}.colist>table>tbody>tr,.hdlist>table>tbody>tr{background:none}td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}td.hdlist1{font-weight:700;padding-bottom:1.25em}td.hdlist2{word-wrap:anywhere}.listingblock+.colist,.literalblock+.colist{margin-top:-.5em}.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}.colist td:not([class]):first-child img{max-width:none}.colist td:not([class]):last-child{padding:.25em 0}.th,.thumb{line-height:0;display:inline-block;border:4px solid #fff;box-shadow:0 0 0 1px #ddd}.imageblock.left{margin:.25em .625em 1.25em 0}.imageblock.right{margin:.25em 0 1.25em .625em}.imageblock>.title{margin-bottom:0}.imageblock.th,.imageblock.thumb{border-width:6px}.imageblock.th>.title,.imageblock.thumb>.title{padding:0 .125em}.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}.image.left{margin-right:.625em}.image.right{margin-left:.625em}a.image{text-decoration:none;display:inline-block}a.image object{pointer-events:none}sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}sup.footnote a,sup.footnoteref a{text-decoration:none}sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}#footnotes .footnote a:first-of-type{font-weight:700;text-decoration:none;margin-left:-1.05em}#footnotes .footnote:last-of-type{margin-bottom:0}#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}.gist .file-data>table td.line-data{width:99%}div.unbreakable{page-break-inside:avoid}.big{font-size:larger}.small{font-size:smaller}.underline{text-decoration:underline}.overline{text-decoration:overline}.line-through{text-decoration:line-through}.aqua{color:#00bfbf}.aqua-background{background:#00fafa}.black{color:#000}.black-background{background:#000}.blue{color:#0000bf}.blue-background{background:#0000fa}.fuchsia{color:#bf00bf}.fuchsia-background{background:#fa00fa}.gray{color:#606060}.gray-background{background:#7d7d7d}.green{color:#006000}.green-background{background:#007d00}.lime{color:#00bf00}.lime-background{background:#00fa00}.maroon{color:#600000}.maroon-background{background:#7d0000}.navy{color:#000060}.navy-background{background:#00007d}.olive{color:#606000}.olive-background{background:#7d7d00}.purple{color:#600060}.purple-background{background:#7d007d}.red{color:#bf0000}.red-background{background:#fa0000}.silver{color:#909090}.silver-background{background:#bcbcbc}.teal{color:#006060}.teal-background{background:#007d7d}.white{color:#bfbfbf}.white-background{background:#fafafa}.yellow{color:#bfbf00}.yellow-background{background:#fafa00}span.icon>.fa{cursor:default}a span.icon>.fa{cursor:inherit}.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}.admonitionblock td.icon .icon-note:before{content:"\f05a";color:#19407c}.admonitionblock td.icon .icon-tip:before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}.admonitionblock td.icon .icon-warning:before{content:"\f071";color:#bf6900}.admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400}.admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000}.conum[data-value]{display:inline-block;background:rgba(0,0,0,.8);border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:700}.conum[data-value],.conum[data-value] *{color:#fff!important}.conum[data-value]+b{display:none}.conum[data-value]:after{content:attr(data-value)}pre .conum[data-value]{position:relative;top:-.125em}b.conum *{color:inherit!important}.conum:not([data-value]):empty{display:none}div.footnote,dt,td.content,th.tableblock{text-rendering:optimizeLegibility}h1,h2,p,span.alt,summary,td.content{letter-spacing:-.01em}div.footnote strong,p strong,td.content strong{letter-spacing:-.005em}blockquote,dt,p,span.alt,summary,td.content{font-size:1.0625rem}p{margin-bottom:1.25rem}.sidebarblock dt,.sidebarblock p,.sidebarblock td.content,p.tableblock{font-size:1em}.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;box-shadow:0 1px 4px #e0e0dc}.print-only{display:none!important}@page{margin:1.25cm .75cm}@media print{*{box-shadow:none!important;text-shadow:none!important}html{font-size:80%}a{color:inherit!important;text-decoration:underline!important}a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}a[href^="http:"]:not(.bare):after,a[href^="https:"]:not(.bare):after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}abbr[title]{border-bottom:1px dotted}abbr[title]:after{content:" (" attr(title) ")"}blockquote,img,object,pre,svg,tr{page-break-inside:avoid}thead{display:table-header-group}svg{max-width:100%}blockquote,dt,p,td.content{font-size:1em;orphans:3;widows:3}#toctitle,.sidebarblock>.content>.title,h2,h3{page-break-after:avoid}#content,#footer,#footnotes,#header{max-width:none}#toc,.exampleblock>.content,.sidebarblock{background:none!important}#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}body.book #header{text-align:center}body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}body.book #header .details{border:0!important;display:block;padding:0!important}body.book #header .details span:first-child{margin-left:0!important}body.book #header .details br{display:block}body.book #header .details br+span:before{content:none!important}body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}body.book #preamble,body.book #toc,body.book .sect1>h2,body.book h1.sect0{page-break-before:always}.listingblock code[data-lang]:before{display:block}#footer{padding:0 .9375em}.hide-on-print{display:none!important}.print-only{display:block!important}.hide-for-print{display:none!important}.show-for-print{display:inherit!important}}@media amzn-kf8,print{#header>h1:first-child{margin-top:1.25rem}.sect1{padding:0!important}.sect1+.sect1{border:0}#footer{background:none}#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}@media amzn-kf8{#content,#footer,#footnotes,#header{padding:0}} @@ -11,4 +11,4 @@ * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:initial;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:initial}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:initial}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer:before{content:"\2014\00A0"}.img-fluid,.img-thumbnail{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.333333%;max-width:33.333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.666667%;max-width:16.666667%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.333333%;max-width:8.333333%}.col-2{flex:0 0 16.666667%;max-width:16.666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.333333%;max-width:33.333333%}.col-5{flex:0 0 41.666667%;max-width:41.666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.333333%;max-width:58.333333%}.col-8{flex:0 0 66.666667%;max-width:66.666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.333333%;max-width:83.333333%}.col-11{flex:0 0 91.666667%;max-width:91.666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.333333%;max-width:33.333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.666667%;max-width:16.666667%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.333333%;max-width:33.333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.666667%;max-width:16.666667%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.333333%;max-width:33.333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.666667%;max-width:16.666667%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.333333%;max-width:33.333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.666667%;max-width:16.666667%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th,.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:hsla(0,0%,100%,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:initial;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;appearance:none}select.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:initial;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size],textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem)!important;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated select.form-control:valid,select.form-control.is-valid{padding-right:3rem!important;background-position:right 1.5rem center}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem)!important;background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem)!important;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated select.form-control:invalid,select.form-control.is-invalid{padding-right:3rem!important;background-position:right 1.5rem center}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem)!important;background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{justify-content:center}.form-inline .form-group,.form-inline label{display:flex;align-items:center;margin-bottom:0}.form-inline .form-group{flex:0 0 auto;flex-flow:row wrap}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;user-select:none;background-color:initial;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary.focus,.btn-primary:focus,.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary.focus,.btn-secondary:focus,.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success.focus,.btn-success:focus,.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info.focus,.btn-info:focus,.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning.focus,.btn-warning:focus,.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger.focus,.btn-danger:focus,.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light.focus,.btn-light:focus,.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark.focus,.btn-dark:focus,.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:initial}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:initial}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:initial}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:initial}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:initial}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:initial}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:initial}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:initial}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";display:none}.dropleft .dropdown-toggle:before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:initial;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:initial}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:flex;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label:after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label:after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3),.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label:after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-append,.input-group-prepend{display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;-webkit-print-color-adjust:exact;color-adjust:exact}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label:before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label:before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label:before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label:before,.custom-control-input[disabled]~.custom-control-label:before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label:before{pointer-events:none;background-color:#fff;border:1px solid #adb5bd}.custom-control-label:after,.custom-control-label:before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:""}.custom-control-label:after{background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label:before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label:after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label:after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label:after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{position:relative;width:100%;height:calc(1.5em + .75rem + 2px)}.custom-file-input{z-index:2;margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]:after{content:attr(data-browse)}.custom-file-label{left:0;z-index:1;height:calc(1.5em + .75rem + 2px);overflow:hidden;font-weight:400;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label,.custom-file-label:after{position:absolute;top:0;right:0;padding:.375rem .75rem;line-height:1.5;color:#495057}.custom-file-label:after{bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:initial;-webkit-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:initial;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label:before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label:before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:initial;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;padding:.5rem 1rem}.navbar,.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:initial;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:hsla(0,0%,100%,.5);border-color:hsla(0,0%,100%,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:initial;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-bottom:-.75rem;border-bottom:0}.card-header-pills,.card-header-tabs{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{display:flex;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{flex:1 0;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;grid-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:flex;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:initial;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{height:1rem;line-height:0;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress,.progress-bar{display:flex;overflow:hidden}.progress-bar{flex-direction:column;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:flex;align-items:flex-start}.media-body{flex:1 1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:initial;border:0}a.close.disabled{pointer-events:none}.toast{flex-basis:350px;max-width:350px;font-size:.875rem;background-color:hsla(0,0%,100%,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:flex;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:hsla(0,0%,100%,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translateY(-50px);transform:translateY(-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered:before{display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable:before{content:none}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered:before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:min-content}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{top:0;left:0;z-index:1060;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{top:0;border-width:0 .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{top:1px;border-width:0 .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner:after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:initial;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spinner-border{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid;border-right:.25em solid transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.align-baseline{vertical-align:initial!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:initial!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix:after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive:before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9:before{padding-top:42.857143%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:576px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:768px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{position:fixed;right:0;left:0;z-index:1030}.fixed-bottom{bottom:0}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:transparent}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:initial;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,:after,:before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd}blockquote,img,pre,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} -/*# sourceMappingURL=2.1c8e5216.chunk.css.map */ \ No newline at end of file +/*# sourceMappingURL=2.00866533.chunk.css.map */ \ No newline at end of file diff --git a/static/css/2.00866533.chunk.css.map b/static/css/2.00866533.chunk.css.map new file mode 100644 index 00000000..2ed9c391 --- /dev/null +++ b/static/css/2.00866533.chunk.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack://node_modules/font-awesome/css/font-awesome.min.css","webpack://node_modules/@asciidoctor/core/dist/css/asciidoctor.css","webpack://node_modules/bootstrap/scss/bootstrap.scss","webpack://node_modules/bootstrap/scss/_root.scss","webpack://node_modules/bootstrap/dist/css/dist/css/bootstrap.css","webpack://node_modules/bootstrap/scss/_reboot.scss","webpack://node_modules/bootstrap/scss/vendor/_rfs.scss","webpack://node_modules/bootstrap/dist/css/bootstrap.css","webpack://node_modules/bootstrap/scss/mixins/_hover.scss","webpack://node_modules/bootstrap/scss/_type.scss","webpack://node_modules/bootstrap/scss/mixins/_lists.scss","webpack://node_modules/bootstrap/scss/_images.scss","webpack://node_modules/bootstrap/scss/mixins/_image.scss","webpack://node_modules/bootstrap/scss/mixins/_border-radius.scss","webpack://node_modules/bootstrap/scss/_code.scss","webpack://node_modules/bootstrap/scss/_grid.scss","webpack://node_modules/bootstrap/scss/mixins/_grid.scss","webpack://node_modules/bootstrap/scss/mixins/_breakpoints.scss","webpack://node_modules/bootstrap/scss/mixins/_grid-framework.scss","webpack://node_modules/bootstrap/scss/_tables.scss","webpack://node_modules/bootstrap/scss/mixins/_table-row.scss","webpack://node_modules/bootstrap/scss/_forms.scss","webpack://node_modules/bootstrap/scss/mixins/_transition.scss","webpack://node_modules/bootstrap/scss/mixins/_forms.scss","webpack://node_modules/bootstrap/scss/mixins/_gradients.scss","webpack://node_modules/bootstrap/scss/_buttons.scss","webpack://node_modules/bootstrap/scss/mixins/_buttons.scss","webpack://node_modules/bootstrap/scss/_transitions.scss","webpack://node_modules/bootstrap/scss/_dropdown.scss","webpack://node_modules/bootstrap/scss/mixins/_caret.scss","webpack://node_modules/bootstrap/scss/mixins/_nav-divider.scss","webpack://node_modules/bootstrap/scss/_button-group.scss","webpack://node_modules/bootstrap/scss/_input-group.scss","webpack://node_modules/bootstrap/scss/_custom-forms.scss","webpack://node_modules/bootstrap/scss/_nav.scss","webpack://node_modules/bootstrap/scss/_navbar.scss","webpack://node_modules/bootstrap/scss/_card.scss","webpack://node_modules/bootstrap/scss/_breadcrumb.scss","webpack://node_modules/bootstrap/scss/_pagination.scss","webpack://node_modules/bootstrap/scss/mixins/_pagination.scss","webpack://node_modules/bootstrap/scss/_badge.scss","webpack://node_modules/bootstrap/scss/mixins/_badge.scss","webpack://node_modules/bootstrap/scss/_jumbotron.scss","webpack://node_modules/bootstrap/scss/_alert.scss","webpack://node_modules/bootstrap/scss/mixins/_alert.scss","webpack://node_modules/bootstrap/scss/_progress.scss","webpack://node_modules/bootstrap/scss/_media.scss","webpack://node_modules/bootstrap/scss/_list-group.scss","webpack://node_modules/bootstrap/scss/mixins/_list-group.scss","webpack://node_modules/bootstrap/scss/_close.scss","webpack://node_modules/bootstrap/scss/_toasts.scss","webpack://node_modules/bootstrap/scss/_modal.scss","webpack://node_modules/bootstrap/scss/_tooltip.scss","webpack://node_modules/bootstrap/scss/mixins/_reset-text.scss","webpack://node_modules/bootstrap/scss/_popover.scss","webpack://node_modules/bootstrap/scss/_carousel.scss","webpack://node_modules/bootstrap/scss/mixins/_clearfix.scss","webpack://node_modules/bootstrap/scss/_spinners.scss","webpack://node_modules/bootstrap/scss/utilities/_align.scss","webpack://node_modules/bootstrap/scss/mixins/_background-variant.scss","webpack://node_modules/bootstrap/scss/utilities/_background.scss","webpack://node_modules/bootstrap/scss/utilities/_borders.scss","webpack://node_modules/bootstrap/scss/utilities/_display.scss","webpack://node_modules/bootstrap/scss/utilities/_embed.scss","webpack://node_modules/bootstrap/scss/utilities/_flex.scss","webpack://node_modules/bootstrap/scss/utilities/_float.scss","webpack://node_modules/bootstrap/scss/utilities/_interactions.scss","webpack://node_modules/bootstrap/scss/utilities/_overflow.scss","webpack://node_modules/bootstrap/scss/utilities/_position.scss","webpack://node_modules/bootstrap/scss/utilities/_screenreaders.scss","webpack://node_modules/bootstrap/scss/mixins/_screen-reader.scss","webpack://node_modules/bootstrap/scss/utilities/_shadows.scss","webpack://node_modules/bootstrap/scss/utilities/_sizing.scss","webpack://node_modules/bootstrap/scss/utilities/_spacing.scss","webpack://node_modules/bootstrap/scss/utilities/_stretched-link.scss","webpack://node_modules/bootstrap/scss/utilities/_text.scss","webpack://node_modules/bootstrap/scss/mixins/_text-truncate.scss","webpack://node_modules/bootstrap/scss/mixins/_text-emphasis.scss","webpack://node_modules/bootstrap/scss/mixins/_text-hide.scss","webpack://node_modules/bootstrap/scss/utilities/_visibility.scss","webpack://node_modules/bootstrap/scss/_print.scss"],"names":[],"mappings":"AAAA;;;EAGE,CAAC,WAAW,yBAAyB,CAAC,4DAAoD,CAAA,iaAA0e,CAAA,eAAoB,CAAA,iBAAA,CAAA,IAAmC,oBAAA,CAAA,4CAAgE,CAAA,iBAAkB,CAAA,mBAAoB,CAAA,kCAA4B,CAAA,iCAA0C,CAAA,OAAA,sBAAqB,CAAA,iBAAmB,CAAA,mBAAyB,CAAA,OAAA,aAAe,CAAA,OAAA,aAAyB,CAAA,OAAA,aAAqB,CAAA,OAAU,aAAA,CAAiB,OAAC,kBAAwB,CAAC,iBAAA,CAAkB,OAAC,cAAmB,CAAA,wBAAgB,CAAA,oBAA+B,CAAA,UAAA,iBAAmB,CAAA,OAAW,iBAAA,CAAwB,kBAAC,CAAA,kBAAwB,CAAA,eAAmB,CAAA,iBAAyB,CAAA,aAAe,kBAAY,CAAA,WAAiB,wBAAkB,CAAA,uBAAkB,CAAA,kBAA6B,CAAA,cAAY,UAAW,CAAA,eAAW,WAAc,CAAA,iBAAkB,iBAAe,CAAA,kBAA0B,gBAAA,CAAA,YAAA,WAAA,CAA4C,WAAC,UAAA,CAAA,cAAA,iBAA+C,CAAA,eAAA,gBAAA,CAAA,SAA+C,4CAAuC,CAAA,oCAA8B,CAAA,UAAA,8CAA2D,CAAA,sCAAiC,CAAA,2BAA0B,GAAmB,8BAAG,CAA8B,sBAAC,CAAsB,GAAC,gCAAK,CAAgC,wBAAC,CAAwB,CAAC,mBAAe,GAAA,8BAAA,CAAA,sBAAA,CAAA,GAAA,gCAAsE,CAAA,wBAA4D,CAAA,CAAuB,cAAC,qEAAe,CAAA,+BAAsE,CAAA,uBAA8D,CAAA,eAAyB,qEAAe,CAAA,gCAAsE,CAAA,wBAA8D,CAAA,eAAyB,qEAAoB,CAAA,gCAAgF,CAAA,wBAA0D,CAAA,oBAAuB,+EAAkB,CAAA,4BAAgF,CAAA,oBAA0D,CAAA,kBAAuB,+EAAA,CAAA,4BAAgH,CAAA,oBAAA,CAAA,gHAAuH,mBAAC,CAAA,WAA0B,CAAA,UAAA,iBAAyB,CAAA,oBAA4B,CAAC,SAAA,CAAA,UAAa,CAAA,eAAoB,CAAA,qBAAa,CAAa,0BAAwB,iBAAiB,CAAA,MAAA,CAAA,UAAgB,CAAA,iBAAiB,CAAA,aAAgB,mBAAkB,CAAA,aAAgB,aAAA,CAAA,YAAsB,UAAgB,CAAA,iBAAiB,eAAgB,CAAA,iBAAgB,eAAgB,CAAA,kBAAkB,eAAgB,CAAA,sBAAgB,eAAgB,CAAA,iBAAgB,eAAgB,CAAA,gBAAoB,eAAgB,CAAA,kBAAc,eAAgB,CAAA,gBAAmB,eAAgB,CAAA,gBAAiB,eAAgB,CAAA,oBAAA,eAAA,CAAA,cAAoD,eAAgB,CAAA,mBAAA,eAAuB,CAAe,iBAAC,eAAwB,CAAA,oDAAqD,eAAkB,CAAA,uBAAgB,eAAA,CAAA,wBAA+C,eAAmB,CAAA,qBAAgB,eAAgB,CAAA,kBAAgB,eAAkB,CAAA,+BAAmC,eAAgB,CAAA,mBAAgB,eAAgB,CAAA,gBAAoB,eAAgB,CAAA,kBAAA,eAA+B,CAAA,mBAAgB,eAAA,CAAA,gBAA6B,eAAgB,CAAA,oBAAiB,eAAgB,CAAA,+BAAyC,eAAA,CAAA,6BAA0C,eAAgB,CAAA,iBAAmB,eAAgB,CAAA,yBAAoB,eAAgB,CAAA,0CAAgD,eAAgB,CAAA,mBAAsB,eAAgB,CAAA,oBAAA,eAAsB,CAAe,gBAAC,eAAuB,CAAA,gBAAgB,eAAqB,CAAA,sBAAgB,eAAkB,CAAA,sBAAgB,eAAmB,CAAA,uBAA+B,eAAgB,CAAA,qBAAgB,eAAgB,CAAA,kBAAgB,eAAgB,CAAA,mBAAoB,eAAgB,CAAA,eAAiB,eAAgB,CAAA,gBAAkB,eAAgB,CAAA,gBAAgB,eAAgB,CAAA,oBAAgB,eAAgB,CAAA,iBAAkB,eAAgB,CAAA,kBAAuB,eAAgB,CAAA,gBAAA,eAAsB,CAAA,gBAAgB,eAAsB,CAAA,kBAAgB,eAAA,CAAwB,uBAAgB,eAAA,CAAuB,sBAAgB,eAAA,CAAA,sBAAyC,eAAgB,CAAA,wBAAgB,eAAA,CAAA,uBAAqC,eAAgB,CAAA,yBAAkC,eAAA,CAAA,gBAAwB,eAAgB,CAAA,qCAAA,eAAuD,CAAA,kBAAgB,eAAkB,CAAA,wBAAgB,eAAsB,CAAA,uDAAkE,eAAgB,CAAA,kBAAA,eAAA,CAAA,sBAA2C,eAAgB,CAAA,kBAA0B,eAAgB,CAAA,gBAAA,eAA0B,CAAA,2CAAkD,eAAA,CAAA,0BAAyC,eAAA,CAAA,0BAAyC,eAAoB,CAAA,kBAAgB,eAAgB,CAAA,yBAAgB,eAAiB,CAAA,yBAAgC,eAAgB,CAAA,oBAAmB,eAAgB,CAAA,gBAAA,eAAwB,CAAe,iBAAC,eAAwB,CAAA,gBAAgB,eAAiB,CAAA,mBAAgB,eAAwB,CAAA,wBAAgB,eAAyB,CAAA,wBAAgB,eAAuB,CAAA,iBAAgB,eAAA,CAAA,wBAAwC,eAAA,CAAA,yBAAwC,eAAA,CAAA,uBAAwC,eAAA,CAAA,wBAA2C,eAAA,CAAA,wBAAuC,eAAA,CAAA,wBAAsC,eAAA,CAAA,2BAA0C,eAAA,CAAA,uBAA0C,eAAe,CAAA,sBAAgB,eAAsB,CAAA,0BAAgB,eAAuB,CAAA,0BAAgB,eAAoB,CAAA,eAAgB,eAAsB,CAAA,sBAAgB,eAAA,CAAA,uBAAyC,eAAgB,CAAA,oBAAkB,eAAgB,CAAA,sBAAoB,eAAgB,CAAA,yCAAiD,eAAgB,CAAA,kBAAoB,eAAgB,CAAA,oBAAA,eAA8B,CAAA,gBAAgB,eAAgB,CAAA,iBAAgB,eAAgB,CAAA,oBAAgB,eAAgB,CAAA,8BAA+B,eAAgB,CAAA,gBAAqB,eAAgB,CAAA,gBAAA,eAAA,CAAA,gBAAmD,eAAgB,CAAA,eAAiB,eAAgB,CAAA,qBAAoB,eAAgB,CAAA,mDAAqD,eAAgB,CAAA,iBAAkB,eAAe,CAAC,oBAAA,eAAsB,CAAA,kBAAgB,eAAwB,CAAA,mBAAgB,eAAmB,CAAA,kBAAgB,eAAyB,CAAA,sBAAgB,eAAkB,CAAA,wBAAgB,eAAuB,CAAA,mBAAgB,eAAoB,CAAA,yBAAgB,eAAoB,CAAA,kBAAgB,eAAA,CAAA,uBAA4C,eAAgB,CAAA,oBAA0B,eAAgB,CAAA,oBAAA,eAA2B,CAAA,4CAAwC,eAAgB,CAAA,0BAA+B,eAAA,CAAA,2BAAiD,eAAA,CAAA,wBAAoC,eAAA,CAAuB,eAAe,eAAC,CAAA,iCAAyC,eAAqB,CAAA,oBAAgB,eAAmB,CAAA,uBAAgB,eAAoB,CAAA,yBAAgB,eAA2B,CAAA,qBAAgB,eAAsB,CAAA,mBAAgB,eAAA,CAAA,oBAAyC,eAAA,CAAA,2BAAmC,eAAkB,CAAA,sBAAgB,eAAyB,CAAA,yBAAgB,eAAkB,CAAA,mBAAgB,eAAmB,CAAA,kBAAgB,eAAiB,CAAA,yBAAoC,eAAgB,CAAA,kBAAA,eAAsB,CAAA,mBAAgB,eAAwB,CAAA,iBAAgB,eAAmB,CAAA,oBAAgB,eAAA,CAAA,sBAA0C,eAAgB,CAAA,wBAAkB,eAAgB,CAAA,mBAAkB,eAAgB,CAAA,0CAAuC,eAA+B,CAAA,kBAAgB,eAAiB,CAAA,kBAAgB,eAAA,CAAoB,uBAAgB,eAAgB,CAAA,+BAAgB,eAAuB,CAAe,iBAAC,eAAwB,CAAA,oBAAgB,eAAuB,CAAA,gBAAgB,eAAA,CAAqB,uBAAgB,eAAA,CAAuB,wBAAgB,eAAA,CAAA,uBAA6C,eAAA,CAAA,qBAA8B,eAAgB,CAAA,uBAA2B,eAAgB,CAAA,6BAA6B,eAAgB,CAAA,8BAAiC,eAAA,CAAkB,2BAAgB,eAAiB,CAAA,6BAAkC,eAAgB,CAAA,iBAAqB,eAAgB,CAAA,kBAAA,eAAsB,CAAA,iBAAgB,eAAA,CAAA,kBAAkC,eAAgB,CAAA,qBAAiC,eAAgB,CAAA,sBAAiB,eAAgB,CAAA,kCAAiC,eAAA,CAAA,iCAAmD,eAAA,CAAA,iBAAmC,eAAgB,CAAA,iBAAqB,eAAe,CAAC,mCAAA,eAAoC,CAAe,mCAAmC,eAAA,CAAA,qBAAA,eAAA,CAAA,oCAAyF,eAAe,CAAC,kBAAA,eAAmB,CAAe,sDAA0C,eAAqB,CAAA,mBAAgB,eAAiB,CAAA,mBAAgB,eAAiB,CAAA,yBAAiC,eAAgB,CAAA,qBAAqB,eAAgB,CAAA,iBAAA,eAA4B,CAAA,iBAAgB,eAAA,CAAA,iBAA8B,eAAgB,CAAA,qBAAuB,eAAgB,CAAA,4BAAiC,eAAA,CAAA,8BAAsC,eAAoB,CAAA,uBAAgB,eAAsB,CAAA,iBAAgB,eAAuB,CAAA,sBAAgB,eAAmB,CAAA,oBAAgB,eAAA,CAAA,sBAAoC,eAAgB,CAAA,uBAAA,eAA0C,CAAA,mBAAgB,eAAA,CAAA,oCAAuD,eAAoB,CAAA,0CAAoC,eAAgB,CAAA,uCAAuC,eAAgB,CAAA,oBAAA,eAAkC,CAAA,oBAAgB,eAAA,CAAA,uCAA2D,eAAqB,CAAA,kCAAsC,eAAgB,CAAA,2CAAgD,eAAC,CAAA,qBAAmC,eAAA,CAAA,sBAAoC,eAAA,CAAA,iCAAsC,eAAgB,CAAA,mBAAuB,eAAgB,CAAA,oBAAoB,eAAgB,CAAA,sCAA0C,eAAA,CAAA,uBAAwC,eAAmB,CAAA,oBAAgB,eAAA,CAAA,0BAAuC,eAAoB,CAAA,wBAAgB,eAAkB,CAAA,mBAAgB,eAAkB,CAAA,uBAAmC,eAAe,CAAC,oBAAA,eAAuB,CAAA,kBAAgB,eAAsB,CAAA,kBAAgB,eAAsB,CAAA,mBAAgB,eAAqB,CAAA,uBAAgB,eAAkB,CAAA,sBAAgB,eAAuB,CAAA,sBAAgB,eAAgB,CAAA,qBAAgB,eAAoB,CAAA,kBAAgB,eAAuB,CAAA,uBAAgB,eAA6B,CAAA,gBAAgB,eAAA,CAAA,oBAA8B,eAAgB,CAAA,uBAA2B,eAAgB,CAAA,6BAA6B,eAAgB,CAAA,8BAAsB,eAAgB,CAAA,2BAAuC,eAAA,CAAA,6BAAoC,eAAsB,CAAA,sBAAgB,eAAmB,CAAA,uBAAgB,eAAkB,CAAA,oBAAgB,eAAkB,CAAA,sBAAgB,eAAA,CAAA,mBAA0C,eAAgB,CAAA,kBAAoB,eAAgB,CAAA,kBAAsB,eAAgB,CAAA,0CAAuC,eAAmB,CAAA,oBAAgB,eAAkB,CAAA,sBAAgB,eAAA,CAAA,uBAAsD,eAAC,CAAA,mBAAsB,eAAgB,CAAA,kBAAoB,eAAgB,CAAA,uCAAyC,eAAmB,CAAA,sBAAgB,eAAmB,CAAA,oBAAgB,eAAiB,CAAA,yBAAmC,eAAgB,CAAA,mBAAA,eAAsB,CAAA,mBAAgB,eAAkB,CAAe,iBAAC,eAA0B,CAAA,mBAAgB,eAAoB,CAAA,sBAAgB,eAAgB,CAAA,kBAAgB,eAAA,CAAA,0BAA+C,eAAgB,CAAA,oBAAA,eAAA,CAAA,gBAAA,eAAA,CAA4E,+CAA0C,eAAgB,CAAA,4EAAqE,eAAA,CAAA,0BAA0C,eAAgB,CAAA,gBAAoB,eAAgB,CAAA,qBAAgB,eAAgB,CAAA,0CAAuC,eAAuB,CAAA,oBAAgB,eAAqB,CAAA,gBAAgB,eAAkB,CAAA,uBAAgB,eAAwB,CAAA,uBAAgB,eAAsB,CAAA,qBAAgB,eAAA,CAAA,kBAA4C,eAAA,CAAA,wBAAkC,eAAsB,CAAA,sBAAgB,eAAA,CAAA,4BAA6C,eAAkB,CAAA,kBAAgB,eAAkB,CAAA,sBAAgB,eAAA,CAAA,6BAA+C,eAAA,CAAA,kBAAgC,eAAgB,CAAA,kBAAA,eAA6B,CAAe,+BAAC,eAA+B,CAAe,gCAAkB,eAAgB,CAAA,6BAAgC,eAAkB,CAAA,+BAAsC,eAAgB,CAAA,iBAAA,eAAoB,CAAe,gBAAC,eAAsB,CAAA,kBAAgB,eAAsB,CAAA,sBAAgB,eAAsB,CAAA,oBAAgB,eAAuB,CAAA,sBAAgB,eAAkB,CAAA,sBAAgB,eAAwB,CAAA,sBAAgB,eAAA,CAA0B,uBAAgB,eAAoB,CAAA,kBAAgB,eAAA,CAAA,wBAAsC,eAAA,CAAA,0BAAwC,eAAA,CAAyB,oBAAgB,eAAA,CAAA,sBAAgC,eAAgB,CAAA,wBAAwB,eAAgB,CAAA,yBAAmC,eAAA,CAAA,gCAAA,eAAsD,CAAA,wBAAgB,eAAA,CAAA,mBAAkD,eAAgB,CAAA,sDAAwD,eAAgB,CAAA,kDAA+C,eAAe,CAAA,wDAAiD,eAAgB,CAAA,+BAAgC,eAAgB,CAAA,eAAA,eAAA,CAAA,iCAA2E,eAAC,CAAA,gCAAA,eAAkD,CAAA,4DAA8D,eAAA,CAAA,kDAAkE,eAAgB,CAAA,8BAAqC,eAAA,CAAA,kCAA0C,eAA2B,CAAA,gBAAgB,eAAA,CAAA,qBAA2B,eAAgB,CAAA,0BAA4B,eAAgB,CAAA,2BAA4B,eAAgB,CAAA,2BAA6B,eAAgB,CAAA,4BAAqB,eAAgB,CAAA,4BAAuC,eAAA,CAAA,6BAA0C,eAAmB,CAAA,qBAAgB,eAAgB,CAAA,uBAAgB,eAAuB,CAAA,0BAAgB,eAAwB,CAAA,mBAAgB,eAAmB,CAAA,gBAAgB,eAAA,CAAA,uBAA0C,eAAqB,CAAA,wBAAgB,eAAkB,CAAA,mBAAgB,eAAe,CAAA,0BAAqC,eAAe,CAAC,qBAAA,eAA4B,CAAA,kBAAgB,eAAkB,CAAA,eAAgB,eAAA,CAAA,qBAAyC,eAAA,CAAA,4BAA2C,eAAA,CAAA,kBAAyB,eAAgB,CAAA,yBAA2B,eAAgB,CAAA,2BAA4B,eAAgB,CAAA,yBAAiC,eAAA,CAAmB,2BAAgB,eAAmB,CAAA,4BAAiC,eAAgB,CAAA,iBAAoB,eAAe,CAAC,mBAAiB,eAAgB,CAAA,mBAAA,eAAsB,CAAe,iBAAC,eAAkB,CAAA,oBAAkC,eAAe,CAAC,iBAAgB,eAAgB,CAAA,sBAAA,eAAsC,CAAA,kBAAgB,eAAiB,CAAA,kBAAgB,eAAkB,CAAA,gBAAgB,eAAA,CAAA,sCAAkD,eAAgB,CAAA,iBAAc,eAAgB,CAAA,kBAAiB,eAAgB,CAAA,mBAAkB,eAAgB,CAAA,eAAqB,eAAgB,CAAA,cAAA,eAA0B,CAAA,iBAAgB,eAAA,CAAA,kBAAgC,eAAgB,CAAA,qBAA+B,eAAgB,CAAA,0BAAA,eAAA,CAAA,gCAAsE,eAAA,CAAA,+BAAwC,eAAsB,CAAA,sDAAwD,eAAA,CAAA,wBAAuC,eAAgB,CAAA,sBAAyB,eAAgB,CAAA,wBAAyB,eAAgB,CAAA,uCAAiC,eAAA,CAAA,yBAA2C,eAAqB,CAAA,yBAAgB,eAAkB,CAAA,iBAAgB,eAAA,CAAA,2BAAA,eAA6D,CAAA,qBAAgB,eAAA,CAAA,kBAAA,eAAkD,CAAA,6DAAmE,eAAgB,CAAA,kDAAkC,eAAyB,CAAA,iBAAgB,eAAA,CAA8B,kBAAgB,eAAA,CAAA,kBAAuB,eAAgB,CAAA,yBAAqC,eAAgB,CAAA,8BAAgB,eAAyB,CAAA,uBAAgB,eAA0B,CAAA,qBAAgB,eAAkB,CAAA,gBAAgB,eAAkB,CAAA,yBAAgB,eAAoB,CAAA,0BAA+B,eAAgB,CAAA,kBAAoB,eAAgB,CAAA,kBAAiB,eAAgB,CAAA,oBAAe,eAAgB,CAAA,eAAiB,eAAgB,CAAA,oBAAgB,eAAgB,CAAA,iBAAiB,eAAgB,CAAA,eAAmB,eAAgB,CAAA,iBAAA,eAA0B,CAAA,gBAAgB,eAAiB,CAAA,iBAAgB,eAAwB,CAAA,mBAAgB,eAAmB,CAAA,0BAAgB,eAAA,CAAA,iBAAqC,eAAgB,CAAA,wBAA+B,eAAgB,CAAA,mBAAgB,eAAgB,CAAA,qCAAmC,eAAsB,CAAA,+BAAgB,eAAsB,CAAA,gBAAgB,eAAoB,CAAA,mBAAgB,eAAsB,CAAA,sBAAgB,eAAuB,CAAA,sBAAgB,eAAwB,CAAA,oBAAgB,eAAA,CAAA,sBAA4C,eAAC,CAAA,uBAAA,eAAA,CAAA,wBAA0E,eAAgB,CAAA,6BAAA,eAAgD,CAAA,0EAAgE,eAAgB,CAAA,gDAAgD,eAAgB,CAAA,gDAAuD,eAAgB,CAAA,gDAAmC,eAAoB,CAAA,uBAAgB,eAAA,CAAA,gBAAA,eAAA,CAAA,mBAAA,eAAA,CAAA,oBAAwH,eAAA,CAAA,wGAA+G,eAAA,CAAA,0BAAgD,eAAA,CAAsB,qDAA+C,eAAA,CAAA,gCAAA,eAAA,CAAA,sBAA2F,eAAA,CAAA,eAAyB,eAAgB,CAAA,2EAAkF,eAAA,CAAA,yBAAuC,eAAgB,CAAA,cAAA,eAAA,CAAA,oCAA2D,eAAmB,CAAA,uCAAuC,eAAgB,CAAA,2CAAkC,eAAqB,CAAA,mBAAgB,eAAmB,CAAA,uBAAgB,eAAqB,CAAA,kBAAgB,eAA4B,CAAA,qBAAgB,eAAgB,CAAA,mBAAgB,eAAA,CAAA,qBAA6C,eAAgB,CAAA,4BAA8B,eAAC,CAAA,gBAAsB,eAAgB,CAAA,6CAAsD,eAAe,CAAC,eAAA,eAAkB,CAAA,sBAAgC,eAAgB,CAAA,gBAAA,eAAuB,CAAA,sBAAgC,eAAgB,CAAA,kBAAA,eAAsB,CAAA,gBAAgB,eAAkB,CAAA,uBAAgB,eAAyB,CAAA,gBAAgB,eAAmB,CAAA,sBAAgB,eAAyB,CAAA,kBAAgB,eAAA,CAAA,yBAAuC,eAAmB,CAAA,mBAAgB,eAAqB,CAAA,yBAAgB,eAAqB,CAAA,uBAAgB,eAAsB,CAAA,mBAAgB,eAAwB,CAAA,qBAAgB,eAAiB,CAAA,qBAAgB,eAAqB,CAAA,sBAAgB,eAAc,CAAe,wBAAuB,eAAgB,CAAA,iBAAA,eAAuB,CAAA,qBAAgB,eAAyB,CAAA,cAAgB,eAAA,CAAA,sBAAsC,eAAA,CAAqB,uBAAgB,eAAsB,CAAA,yBAAgB,eAAkB,CAAA,sBAAgB,eAAyB,CAAA,qBAAgB,eAAsB,CAAA,sBAAgB,eAAqB,CAAA,kBAAgB,eAAmB,CAAA,yBAAgB,eAAe,CAAA,sBAAmC,eAAgB,CAAA,qBAAqB,eAAgB,CAAA,mBAAc,eAAgB,CAAA,eAAA,eAAA,CAAA,mBAAmD,eAAgB,CAAA,qBAAoB,eAAgB,CAAA,cAAA,eAAsB,CAAA,mDAA0D,eAAoB,CAAA,oBAAgB,eAAoB,CAAA,sBAAgB,eAAmB,CAAA,0BAAgB,eAAkB,CAAA,oBAAgB,eAAwB,CAAA,oBAAgB,eAAuB,CAAA,mBAAgB,eAAoB,CAAA,kBAAgB,eAAqB,CAAA,wBAAgB,eAAA,CAA2B,uBAAgB,eAAmB,CAAA,oBAAgB,eAAgB,CAAA,qBAAgB,eAAuB,CAAA,2BAAgB,eAAsB,CAAA,mBAAgB,eAAuB,CAAA,gBAAgB,eAAqB,CAAA,uBAAgB,eAAiB,CAAA,sBAAgB,eAAgB,CAAA,uBAAmC,eAAgB,CAAA,qBAAA,eAAA,CAAA,iBAA2C,eAAgB,CAAA,gBAA2B,eAAgB,CAAA,mBAAA,eAAwB,CAAA,2CAAuD,eAAA,CAAA,2BAAsC,eAAA,CAAA,wBAAuC,eAAA,CAAA,uBAAyC,eAAA,CAAA,sBAAyC,eAAA,CAAkB,uBAAgB,eAAsB,CAAA,yBAAgB,eAAA,CAAA,yBAA6C,eAAA,CAAA,kBAAuC,eAAA,CAAA,sBAAoC,eAAkB,CAAA,6BAAgB,eAAqB,CAAA,uBAAgB,eAAsB,CAAA,oBAAgB,eAAA,CAAA,kBAAgD,eAAA,CAAA,qBAAmC,eAAiB,CAAA,sBAAgB,eAAkB,CAAA,gCAAkC,eAAgB,CAAA,mBAAA,eAAA,CAAsC,iBAAgB,eAAA,CAAA,kBAAyB,eAAgB,CAAA,kBAAoB,eAAgB,CAAA,sCAAwC,eAAA,CAAA,yBAAA,eAAA,CAAA,oBAAgF,eAAA,CAAA,wBAAA,eAAuD,CAAA,gEAA6D,eAAgB,CAAA,uDAAgD,eAAgB,CAAA,6CAA8C,eAAgB,CAAA,gDAA6D,eAAe,CAAC,8CAAwC,eAAA,CAAA,yBAA0C,eAAA,CAAA,oBAAuC,eAAA,CAAA,wBAAyC,eAAA,CAAA,0BAAkC,eAAA,CAAA,uBAA0C,eAAiB,CAAA,yBAAgB,eAAyB,CAAA,kBAAgB,eAAA,CAAuB,0BAAgB,eAAA,CAAA,iBAAA,eAAkD,CAAA,yBAAgB,eAAA,CAAA,uBAAiD,eAAgB,CAAA,kDAAgD,eAAgB,CAAA,iDAAqC,eAAA,CAAA,gDAA8D,eAAA,CAAA,qBAA+C,eAAgB,CAAA,8CAA2C,eAAyB,CAAA,+CAAuD,eAAC,CAAA,2BAA0C,eAAA,CAAA,yBAAwC,eAAA,CAAA,wBAAqC,eAAA,CAAA,0BAAsC,eAAA,CAAA,wBAA4C,eAAc,CAAA,qBAAgB,eAAqB,CAAA,sBAAgB,eAAuB,CAAA,4BAAgB,eAAyB,CAAA,cAAgB,eAAA,CAAA,qBAAgC,eAAgB,CAAA,uBAAsB,eAAgB,CAAA,yBAAuB,eAAgB,CAAA,gCAAkC,eAAkB,CAAA,sBAAgB,eAAmB,CAAA,uBAAiC,eAAgB,CAAA,kBAAA,eAA6B,CAAA,kBAAgB,eAAA,CAAA,mBAAoC,eAAgB,CAAA,iBAAkB,eAAgB,CAAA,6BAAiC,eAAkB,CAAA,oCAAgB,eAA2B,CAAA,kBAAgB,eAA4B,CAAA,iBAAgB,eAAA,CAAA,kBAA4B,eAAgB,CAAA,2BAA4B,eAAgB,CAAA,4BAAmC,eAAC,CAAA,4BAAmC,eAAqB,CAAA,4BAAgB,eAAiB,CAAA,oBAA+B,eAAgB,CAAA,mBAAsB,eAAe,CAAC,qBAAA,eAAwB,CAAA,iBAAgB,eAAiB,CAAA,eAAgB,eAAiB,CAAA,sBAAgB,eAAqB,CAAA,wBAAgB,eAAqB,CAAe,iBAAC,eAAwB,CAAA,iBAAgB,eAAgB,CAAA,qBAAgB,eAA2B,CAAA,qBAAgB,eAAoB,CAAA,wBAAgB,eAAgB,CAAA,gBAAgB,eAAwB,CAAA,2BAA+B,eAAe,CAAC,oBAAA,eAAwB,CAAA,gBAAgB,eAAoB,CAAA,wBAAgB,eAAkB,CAAA,eAAgB,eAAwB,CAAA,wBAAgB,eAA0B,CAAA,oBAAgB,eAAA,CAAuB,kBAAgB,eAAA,CAAA,wBAAyC,eAAA,CAAA,0BAAwC,eAAA,CAAA,uBAA0C,eAAC,CAAA,yBAAmC,eAAA,CAAqB,wBAAgB,eAAuB,CAAA,2BAAgB,eAAmB,CAAA,mBAAgB,eAAkB,CAAA,qBAAgB,eAAsB,CAAA,uBAAgB,eAAmB,CAAA,mBAAgB,eAAkB,CAAA,kBAAgB,eAA4B,CAAA,sBAAgB,eAAA,CAA0B,mBAAgB,eAAA,CAAA,kBAA6B,eAAgB,CAAA,4BAAiC,eAAA,CAAA,0BAA6C,eAAA,CAAA,6BAAgC,eAAgB,CAAA,iBAAmB,eAAgB,CAAA,6BAAuC,eAAgB,CAAA,gCAAA,eAAA,CAAA,mBAAA,eAA2E,CAAA,uCAAgB,eAAA,CAAA,2EAAgH,eAAmB,CAAA,+DAA4D,eAAgB,CAAA,iBAAsB,eAAgB,CAAA,mBAAkB,eAAgB,CAAA,4CAAyC,eAAoB,CAAA,sBAAgB,eAA0B,CAAA,kBAAgB,eAAA,CAAA,yBAA2C,eAAA,CAAA,oBAAsC,eAAA,CAAA,0BAAuC,eAAiB,CAAA,2BAAgB,eAAqB,CAAA,sBAAgB,eAAA,CAAA,uBAAA,eAA8D,CAAA,iBAAgB,eAAA,CAAA,qBAAsC,eAAgB,CAAA,8DAAgE,eAAgB,CAAA,sCAA2C,eAAA,CAAA,uBAAkC,eAAA,CAAA,yBAAwC,eAAA,CAAA,2BAA0C,eAAA,CAAA,kBAAyC,eAAe,CAAC,wBAAA,eAAA,CAAA,0BAA6D,eAAA,CAAA,yCAAuC,eAAyB,CAAA,6CAAkD,eAAoB,CAAA,uBAAgB,eAAA,CAAA,yBAA8C,eAAgB,CAAA,kBAAA,eAAA,CAAA,oBAAkD,eAAgB,CAAA,8CAAiC,eAA0B,CAAA,kDAAoD,eAAA,CAAA,iBAAA,eAAA,CAAA,0BAA4E,eAAgB,CAAA,oBAAA,eAAA,CAAA,4EAA+E,eAAqD,CAAA,+DAAgB,eAAwD,CAAA,qDAAgB,eAAsD,CAAA,wDAAkD,eAAA,CAAA,sDAAqF,eAAgB,CAAA,kBAAA,eAA2B,CAAA,kDAA2D,eAAA,CAAA,mBAA0B,eAAgB,CAAA,2BAAA,eAAmD,CAAA,2BAAgB,eAAA,CAAA,0BAAuD,eAAgB,CAAA,mDAAoD,eAAe,CAAC,uDAAgD,eAAgB,CAAA,oBAAmB,eAAgB,CAAA,gBAAmB,eAAgB,CAAA,gBAAqB,eAAe,CAAC,gBAAA,eAAuB,CAAA,mBAAgB,eAAuB,CAAA,mBAAgB,eAAsB,CAAA,qBAAgB,eAAkB,CAAA,uBAAyB,eAAkB,CAAA,uBAAqB,eAAU,CAAA,sBAA4B,eAAA,CAAA,kBAA+B,eAAA,CAA6H,mDAAA,QAAA;;ACHpn8B,4EAA4E,CAI5E,EAAE,eAAe,CACjB,QAAQ,mBAAmB,CAC3B,iBAAiB,SAAS,CAC1B,GAAG,aAAa,CAAC,cAAc,CAE/B,KAAK,cAAc,CACnB,YAAY,WAAW,CAAC,gCAAgC,CAAC,oBAAoB,CAC7E,IAAI,iBAAiB,CAErB,KAAK,eAAe,CAAC,UAAU,CAC/B,kBAAkB,qBAAmC,CACrD,IAAI,oBAAoB,CACxB,EAAE,sCAAsC,CAKxC,IAAI,QAAQ,CACZ,eAAe,eAAe,CAC9B,OAAO,QAAQ,CACf,YAAY,oBAAoB,CAChC,sBAAsB,YAAY,CAAC,QAAQ,CAC3C,SAAS,uBAAuB,CAAC,YAAY,CAAC,0BAA0B,CACxE,OAAO,QAAkB,CACzB,6BAA6B,mBAAmB,CAAC,cAAc,CAAC,QAAQ,CACxE,aAAa,kBAAkB,CAE/B,oEAAoE,yBAAyB,CAAC,cAAc,CAC5G,sCAAsC,cAAc,CAEpD,iDAAiD,QAAQ,CAAC,SAAS,CACnE,SAAuB,kBAAkB,CACzC,MAA+B,gBAAgB,CAE/C,UAAU,cAAc,CACxB,KAAK,eAAe,CAAC,oBAAoB,CAAC,SAAS,CAAU,6CAA6C,CAAC,aAAa,CAAC,iBAAiB,CAAC,WAAW,CAA+B,UAAU,CAAC,kBAAkB,CAAC,iCAAiC,CAAC,kCAAkC,CACvR,QAAQ,cAAc,CACtB,iBAAiB,cAAc,CAAC,WAAW,CAC3C,aAAa,WAAW,CACxB,IAAI,8BAA8B,CAClC,MAAM,oBAAoB,CAC1B,OAAO,qBAAqB,CAK5B,MAAM,YAAY,CAClB,eAAe,oBAAoB,CAAC,qBAAqB,CACzD,SAAS,WAAW,CAAC,eAAe,CACpC,OAAO,UAAU,CACjB,iWAAiW,gBAAgB,CAAC,aAAa,CAAC,eAAe,CAAC,YAAY,CAAC,mBAAmB,CAChb,4GAA4G,QAAQ,CAAC,SAAS,CAC9H,EAAE,aAAa,CAAC,yBAAyB,CAAC,mBAAmB,CAC7D,gBAAgB,aAAa,CAC7B,MAAM,QAAQ,CACd,EAAE,eAAe,CAAC,oBAAoB,CAAC,iCAAiC,CACxE,QAAQ,gBAAgB,CAAC,gBAAgB,CAAC,iBAAiB,CAC3D,0DAA0D,gDAAgD,CAAC,eAAe,CAAC,iBAAiB,CAAC,aAAa,CAAC,iCAAiC,CAAC,cAAc,CAAC,kBAAkB,CAAC,oBAAoB,CACnP,0GAA0G,aAAa,CAAC,aAAa,CAAC,aAAa,CACnJ,GAAG,iBAAiB,CACpB,GAAG,kBAAkB,CACrB,2CAA2C,iBAAiB,CAC5D,MAAM,iBAAiB,CACvB,GAAG,aAAa,CAChB,GAAwB,oBAAoB,CAApB,oBAAoB,CAAC,UAAU,CAAC,wBAAwB,CAChF,KAAK,iBAAqC,CAC1C,cADuB,mBACsB,CAA7C,SAAS,eAAoC,CAC7C,MAAM,aAAa,CAAC,mBAAmB,CACvC,KAAK,0DAA0D,CAAC,eAAe,CAAC,oBAAoB,CACpG,SAAS,eAAe,CAAC,oBAAoB,CAAC,2BAA2B,CAAC,mBAAmB,CAC7F,MAAM,iBAAiB,CACvB,kBAAkB,kBAAkB,CAAC,eAAe,CACpD,8CAA8C,kBAAkB,CAChE,UAAU,sBAAsB,CAChC,UAAU,sBAAsB,CAChC,QAAQ,oBAAoB,CAC5B,kBAAkB,kBAAkB,CAAC,eAAe,CACpD,MAAM,qBAAqB,CAAC,eAAgB,CAC5C,MAAM,oBAAoB,CAC1B,WAAW,iBAAiB,CAAC,iCAAiC,CAAC,0BAA0B,CACzF,wBAAwB,eAAe,CAAC,qBAAqB,CAC7D,oCAAoC,0DAA0D,eAAe,CAC7G,GAAG,gBAAgB,CACnB,GAAG,kBAAkB,CACrB,2CAA2C,kBAAkB,CAC7D,GAAG,kBAAkB,CAAC,CACtB,MAAM,eAAe,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,gBAAgB,CACpF,wBAAwB,kBAAkB,CAC1C,wEAAwE,0BAA0B,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,eAAe,CACzJ,wBAAwB,sBAAsB,CAAC,iBAAiB,CAAC,oBAAoB,CACrF,2BAA2B,kBAAkB,CAC7C,oFAAoF,eAAe,CACnG,0DAA0D,eAAe,CAAC,mBAAmB,CAC7F,kHAAkH,eAAe,CACjI,QAAQ,gBAAgB,CAAC,iBAAiB,CAC1C,SAAS,UAAU,CACnB,wEAA4E,WAAW,CAAC,aAAa,CACrG,mCAAqC,UAAU,CAC/C,kBAAkB,gBAAgB,CAClC,iBAAiB,kBAAkB,CACnC,mBAAmB,oBAAoB,CACvC,+BAA+B,iBAAiB,CAAC,2BAA2B,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,iBAA+D,CACtN,mCADyK,gBAAgB,CAAC,4BACzD,CAAjI,IAAI,oBAAoB,CAAC,0DAAwG,CACjI,iBAAiB,aAAa,CAAC,iBAAiB,CAAC,mBAAmB,CACpE,SAAS,aAAa,CACtB,0BAA0B,eAAe,CAAC,gBAAgB,CAC1D,MAAM,iBAAiB,CACvB,cAAc,eAAe,CAC7B,QAAQ,uBAAuB,CAC/B,IAAI,0DAA0D,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,eAAe,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,uDAAuD,CAAC,cAAc,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,SAAS,CAAC,kBAAkB,CAClW,wBAAwB,aAAa,CACrC,uBAAuB,cAAc,CACrC,kBAAkB,UAAU,CAC5B,gCAAgC,mBAAmB,CACnD,SAAS,mBAAmB,CAC5B,iBAAiB,gBAAgB,CAAC,cAAc,CAChD,iBAAiB,eAAgB,CAAC,iBAAiB,CAAC,WAAW,CAC/D,+BAAiC,iBAAiB,CAAC,QAAQ,CAAC,eAAe,CAC3E,gBAAiB,WAAW,CAAC,mBAAmB,CAChD,eAAgB,WAAW,CAAC,mBAAmB,CAC/C,eAAe,oBAAoB,CACnC,oCAAoC,UAAU,CAAC,aAAa,CAAC,gBAAgB,EAAA,MAAQ,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,qBAAqB,CAClJ,4HAAoI,WAAW,CAAC,aAAa,CAC7J,4DAAgE,UAAU,CAC1E,SAAS,iBAAiB,CAC1B,gBAAiB,YAAY,CAC7B,uBAAuB,qBAAqB,CAAC,kBAAkB,CAAC,eAAe,CAC/E,4BAA4B,cAAc,CAAC,4BAA4B,CACvE,6DAA6D,+BAA+B,CAAC,kBAAkB,CAC/G,iBAAiB,+BAA+B,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,YAAY,CAAC,kBAAkB,CAChL,kCAAkC,mBAAmB,CACrD,8BAA8B,qBAAqB,CACnD,oBAAoB,YAAY,CAChC,gCAAiC,yBAAyB,CAC1D,uCAAwC,yBAAyB,CAAC,qBAAqB,CACvF,0CAA2C,qBAAqB,CAChE,mBAAmB,yBAAyB,CAC5C,yBAA0B,eAAe,CACzC,qCAAqC,qBAAqB,CAAC,+BAA+B,CAAC,kBAAkB,CAAC,YAAY,CAAC,gBAAgB,CAAC,qBAAqB,CACjK,KAAK,+BAA+B,CAAC,mBAAmB,CACxD,QAAQ,kBAAkB,CAC1B,wBAAwB,iBAAiB,CACzC,iCAAiC,aAAa,CAC9C,QAAQ,gDAAgD,CAAC,oBAAoB,CAC7E,QAAQ,kBAAkB,CAAC,kBAAkB,CAC7C,OAAO,oBAAoB,CAC3B,cAAc,yBAAyB,CACvC,UAAU,aAAa,CAAC,eAAe,CACvC,oCAAoC,UAAU,iBAAiB,CAC/D,UAAU,iBAAiB,CAAC,eAAe,CAC3C,UAAU,sBAAsB,CAAC,kBAAkB,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,4BAA4B,CAAC,+BAA+B,CAAC,YAAY,CAAC,kBAAkB,CAAC,WAAW,CAAC,aAAa,CAChP,oBAAoB,YAAY,CAAC,mBAAmB,CAAC,eAAe,CACpE,aAAa,cAAc,CAAC,eAAe,CAC3C,gBAAgB,aAAa,CAAC,gBAAgB,CAC9C,sCAAsC,cAAc,CAAC,eAAe,CAAC,kBAAkB,CACvF,oBAAoB,cAAc,CAAC,kBAAkB,CACrD,8BAA8B,oBAAoB,CAAC,6BAA6B,CAAC,SAAS,CAAC,OAAO,CAAC,CACnG,qCAAqC,UAAU,iBAAiB,CAAC,eAAe,CAChF,UAAU,UAAU,CACpB,oBAAoB,iBAAiB,CACrC,aAAa,eAAe,CAC5B,gBAAgB,mBAAmB,CACnC,oBAAoB,cAAc,CAAC,kBAAkB,CAAC,CACtD,cAAc,wBAAwB,CAAC,oBAAoB,CAAC,cAAc,CAAC,kBAAkB,CAAC,iBAAiB,CAC/G,2BAA2B,YAAY,CACvC,0BAA0B,eAAe,CACzC,QAAQ,cAAc,CAAC,yBAAyB,CAAC,cAAc,CAC/D,aAAa,wBAAwB,CAAC,gBAAgB,CACtD,SAAS,oBAAoB,CAC7B,OAAO,qBAAqB,CAC5B,oCAAoC,SAAS,oBAAoB,CACjE,OAAO,qBAAqB,CAAC,CAC7B,kBAAkB,gBAAgB,CAClC,cAAc,4BAA4B,CAC1C,2IAA2I,iBAAiB,CAAC,YAAY,CAAC,WAAW,CAAC,kBAAkB,CAAC,aAAa,CAAC,8BAA8B,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,eAAe,CACzS,mMAA2M,eAAe,CAAC,eAAe,CAAC,aAAa,CAAC,gBAAgB,CACzQ,sXAAsX,kBAAkB,CACxY,2HAA2H,aAAa,CAAC,oBAAoB,CAC7J,2KAA2K,aAAa,CACxL,mFAAmF,oBAAoB,CACvG,QAAQ,mBAAmB,CAC3B,gBAAgB,cAAc,CAAC,aAAa,CAAC,iBAAiB,CAAC,eAAe,CAAC,qBAAqB,CAAC,uCAAuC,CAC5I,uBAAwB,UAAU,CAA0B,iBAAiB,CAAC,6BAA6B,CAA7B,oCAA6B,CAA7B,gCAA6B,CAA7B,iCAA6B,CAAC,iBAAiB,CAAC,QAAQ,CAAC,aAAa,CAAC,iCAAwB,CAAxB,yBAAyB,CAC9K,6BAA8B,mBAAwB,CAAC,gBAAgB,CAAC,kCAAwB,CAAxB,iCAAwB,CAAxB,mCAAwB,CAAxB,qBAAwB,CAAC,iCAAwB,CAAxB,yBAAyB,CAC1H,sBAAuB,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,iBAAiB,CAAC,QAAQ,CAAC,aAAa,CACnG,sVAAsV,iCAAiC,CAAC,eAAe,CAAC,6CAA6C,CAAC,cAAc,CAAC,iBAAiB,CACtd,2CAA2C,kBAAkB,CAAC,OAAO,CACrE,2EAA2E,mBAAmB,CAAC,eAAe,CAAC,qBAAqB,CACpI,uBAAuB,uBAAwB,CAAC,QAAQ,CAAC,eAAe,CAAC,UAAU,CACnF,+BAA+B,iBAAiB,CAAC,UAAU,CAC3D,mCAAmC,cAAc,CACjD,sCAAsC,eAAgB,CAAC,gDAAgD,CAAC,wBAAwB,CAChI,kCAAkC,oBAAoB,CAAC,oBAAoB,CAAC,6BAA6B,CAAC,oBAAoB,CAAC,kBAAkB,CACjJ,0DAA0D,eAAe,CACzE,uBAAuB,wBAAwB,CAAC,oBAAoB,CAAC,cAAc,CAAC,eAAe,CAAC,iBAAiB,CACrH,oCAAoC,YAAY,CAChD,mCAAmC,eAAe,CAClD,cAAc,wBAAwB,CAAC,oBAAoB,CAAC,cAAc,CAAC,kBAAkB,CAAC,iBAAiB,CAC/G,2BAA2B,YAAY,CACvC,0BAA0B,eAAe,CACzC,8BAA8B,aAAa,CAAC,YAAY,CAAC,iBAAiB,CAC1E,gcAAgc,eAAe,CAC/c,6CAA6C,iBAAiB,CAAC,eAAe,CAAC,WAAW,CAAC,iBAAiB,CAC5G,oCAAoC,6CAA6C,kBAAkB,CAAC,CACpG,qCAAqC,6CAA6C,aAAa,CAAC,CAChG,yJAAyJ,kBAAkB,CAC3K,yBAAyB,aAAa,CAAC,yBAAyB,CAChE,uBAAuB,iBAAiB,CACxC,qCAAsC,YAAY,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,eAAe,CAAC,WAAW,CAAC,WAAW,CAAC,aAAa,CAAC,wBAAwB,CAAC,aAAa,CAAC,UAAU,CACpM,2CAA4C,aAAa,CACzD,2CAA4C,yBAAyB,CAAC,kBAAkB,CAAC,aAAa,CAAC,UAAU,CACjH,8DAA+D,WAAW,CAC1E,8BAA8B,SAAS,CACvC,mCAAmC,WAAW,CAAC,iBAAiB,CAChE,8BAA8B,cAAc,CAC5C,aAAa,kBAAkB,CAC/B,0BAA0B,gBAAgB,CAAC,eAAe,CAC1D,mBAAmB,eAAe,CAAC,uBAAuB,CAAC,cAAc,CACzE,0CAA2C,SAAS,CACpD,4DAA6D,YAAY,CACzE,kBAAkB,uBAAwB,CAAC,QAAQ,CAAC,eAAe,CAAC,eAAe,CACnF,4BAA4B,aAAa,CAAC,kBAAkB,CAAC,SAAS,CAAC,mBAAmB,CAAC,kBAAkB,CAC7G,0BAA0B,kBAAkB,CAC5C,6BAA6B,sBAAsB,CAAC,WAAW,CAAC,kBAAkB,CAClF,qBAAqB,sBAAsB,CAAC,WAAW,CAAC,oBAAoB,CAAC,kBAAkB,CAC/F,4BAA6B,UAAU,CAAC,oBAAoB,CAC5D,YAAY,yBAAyB,CAAC,aAAa,CACnD,iCAAiC,kBAAkB,CAAC,mBAAmB,CACvE,qCAAqC,qBAAqB,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,kBAAkB,CACrK,uBAAuB,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAClD,8BAA+B,eAAe,CAAC,UAAU,CAAC,gBAAgB,CAAC,eAAgB,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,aAAa,CAAC,oCAAoC,CACjL,+CAA+C,eAAe,CAC9D,yBAAyB,gBAAgB,CAAC,iBAAiB,CAAC,gBAAgB,CAC5E,YAAY,mBAAmB,CAC/B,gBAAgB,gDAAgD,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,eAAe,CAAC,iCAAiC,CAC1J,uBAAuB,eAAe,CACtC,yBAAyB,kBAAkB,CAAC,gBAAgB,CAC5D,kDAAkD,iBAAiB,CAAC,gBAAgB,CAAC,iBAAiB,CACtG,wDAAwD,YAAY,CACpE,4DAA4D,aAAa,CAAC,sBAAsB,CAAC,oBAAoB,CACrH,uHAA0H,YAAY,CACtI,yKAAyK,eAAe,CAAC,cAAc,CACvM,qBAAqB,mBAAmB,CAAC,aAAa,CACtD,4BAA4B,iBAAiB,CAAC,gBAAgB,CAAC,iBAAiB,CAChF,uDAAuD,qBAAqB,CAAC,+BAA+B,CAC5G,4CAA4C,aAAa,CACzD,kHAAkH,aAAa,CAAC,mBAAmB,CACnJ,sEAAsE,aAAa,CAAC,gBAAgB,CAAC,eAAe,CAAC,cAAc,CACnI,wBAAwB,eAAe,CACvC,uBAAuB,oBAAoB,CAAC,kBAAkB,CAC9D,mCAAmC,qBAAqB,CACxD,6CAA6C,sBAAsB,CACnE,sBAAsB,gBAAgB,CACtC,uBAAuB,kBAAkB,CACzC,uBAAuB,kBAAkB,CACzC,gBAAgB,gBAAgB,CAChC,iBAAiB,kBAAkB,CACnC,kBAAkB,kBAAkB,CACpC,uFAAuF,kBAAkB,CACzG,uFAAuF,qBAAqB,CAC5G,sEAAsE,mBAAmB,CACzF,oEAAoE,oBAAoB,CACxF,8HAAgI,kBAAkB,CAClJ,8BAA8B,eAAe,CAC7C,gCAAgC,gBAAgB,CAChD,kCAAkC,iBAAiB,CACnD,4BAA4B,kBAAkB,CAC9C,kCAAkC,qBAAqB,CACvD,kCAAkC,qBAAqB,CACvD,8BAA8B,eAAgB,CAC9C,YAAY,kBAAkB,CAC9B,oDAAoD,oBAAoB,CAAC,eAAgB,CACzF,6BAA6B,eAAe,CAAC,SAAS,CACtD,aAAa,aAAa,CAC1B,GAAG,kBAAkB,CACrB,SAAS,iBAAiB,CAC1B,MAAM,mBAAmB,CACzB,8CAA8C,eAAe,CAC7D,oFAAoF,oBAAoB,CACxG,6FAA6F,oBAAoB,CACjH,wCAAwC,kBAAkB,CAC1D,wBAAwB,aAAa,CACrC,8BAA8B,gBAAgB,CAC9C,oHAAoH,YAAY,CAAC,cAAc,CAAC,iBAAiB,CAAC,aAAa,CAC/K,+DAA+D,kBAAkB,CACjF,UAAU,YAAY,CAAC,kBAAkB,CAAC,eAAe,CAAC,yBAAyB,CACnF,aAAa,kBAAkB,CAC/B,gBAAgB,eAAe,CAAC,iBAAiB,CACjD,UAAU,uBAAuB,CACjC,WAAW,oCAAoC,CAC/C,cAAc,2BAA2B,CACzC,cAAc,2BAA2B,CACzC,cAAc,2BAA2B,CACzC,cAAc,2BAA2B,CACzC,cAAc,2BAA2B,CACzC,4BAA4B,QAAQ,CAAC,eAAe,CACpD,8CAA8C,eAAe,CAC7D,sBAAsB,kBAAkB,CAAC,gBAAgB,CACzD,WAAW,eAAgB,CAAC,qBAAqB,CACjD,WAAW,kBAAkB,CAC7B,4CAA4C,gBAAgB,CAC5D,oCAAoC,oBAAoB,CAAC,aAAa,CAAC,kBAAkB,CACzF,wCAAwC,cAAc,CACtD,mCAAmC,eAAe,CAClD,WAAW,aAAa,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,yBAAyB,CAC7F,iBAAiB,4BAA4B,CAC7C,kBAAkB,4BAA4B,CAC9C,mBAAmB,eAAe,CAClC,iCAAiC,gBAAgB,CACjD,+CAA+C,gBAAgB,CAC/D,yBAAyB,gBAAgB,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,aAAa,CAChG,YAAY,mBAAmB,CAC/B,aAAa,kBAAkB,CAC/B,QAAQ,oBAAoB,CAAC,oBAAoB,CACjD,eAAe,mBAAmB,CAClC,6BAA6B,gBAAgB,CAAC,eAAe,CAAC,oBAAoB,CAClF,iCAAiC,oBAAoB,CACrD,+CAA+C,yBAAyB,CACxE,WAAW,iBAAiB,CAAC,oBAAoB,CAAC,oBAAoB,CACtE,cAAc,SAAS,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,oBAAoB,CACnF,qBAAqB,yBAAyB,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,kBAAkB,CACvH,qCAAqC,eAAgB,CAAC,oBAAoB,CAAC,mBAAmB,CAC9F,kCAAkC,eAAe,CACjD,oBAAoB,kBAAkB,CAAC,eAAe,CAAC,eAAe,CACtE,uBAAuB,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAC,eAAe,CAC1E,oCAAoC,SAAS,CAC7C,gBAAgB,uBAAuB,CACvC,KAAK,gBAAgB,CACrB,OAAO,iBAAiB,CACxB,WAAW,yBAAyB,CACpC,UAAU,wBAAwB,CAClC,cAAc,4BAA4B,CAC1C,MAAM,aAAa,CACnB,iBAAiB,kBAAkB,CACnC,OAAO,UAAU,CACjB,kBAAkB,eAAe,CACjC,MAAM,aAAa,CACnB,iBAAiB,kBAAkB,CACnC,SAAS,aAAa,CACtB,oBAAoB,kBAAkB,CACtC,MAAM,aAAa,CACnB,iBAAiB,kBAAkB,CACnC,OAAO,aAAa,CACpB,kBAAkB,kBAAkB,CACpC,MAAM,aAAa,CACnB,iBAAiB,kBAAkB,CACnC,QAAQ,aAAa,CACrB,mBAAmB,kBAAkB,CACrC,MAAM,aAAa,CACnB,iBAAiB,kBAAkB,CACnC,OAAO,aAAa,CACpB,kBAAkB,kBAAkB,CACpC,QAAQ,aAAa,CACrB,mBAAmB,kBAAkB,CACrC,KAAK,aAAa,CAClB,gBAAgB,kBAAkB,CAClC,QAAQ,aAAa,CACrB,mBAAmB,kBAAkB,CACrC,MAAM,aAAa,CACnB,iBAAiB,kBAAkB,CACnC,OAAO,aAAa,CACpB,kBAAkB,kBAAkB,CACpC,QAAQ,aAAa,CACrB,mBAAmB,kBAAkB,CACrC,cAAc,cAAc,CAC5B,gBAAgB,cAAc,CAC9B,6CAA6C,eAAe,CAAC,sCAAsC,CAAC,cAAc,CAClH,2CAA4C,eAAe,CAAC,aAAa,CACzE,0CAA2C,eAAe,CAAC,0CAA0C,CAAC,UAAU,CAChH,8CAA+C,eAAe,CAAC,aAAa,CAC5E,8CAA+C,eAAe,CAAC,aAAa,CAC5E,gDAAiD,eAAe,CAAC,aAAa,CAC9E,mBAAmB,oBAAoB,CAAsB,yBAAyB,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,eAAe,CAAC,YAAY,CAAC,aAAa,CAAC,kBAAkB,CAAC,gDAAgD,CAAC,iBAAiB,CAAC,eAAgB,CAC5Q,wCADwC,oBACC,CACzC,qBAAqB,YAAY,CACjC,yBAA0B,wBAAwB,CAClD,uBAAuB,iBAAiB,CAAC,WAAW,CACpD,UAAU,uBAAuB,CACjC,+BAA+B,YAAY,CAC3C,yCAAyC,iCAAiC,CAC1E,oCAAoC,qBAAqB,CACzD,+CAA+C,sBAAsB,CACrE,4CAA4C,mBAAmB,CAC/D,EAAE,qBAAqB,CACvB,uEAAuE,aAAa,CACpF,uBAAuB,kBAAkB,CAAC,oBAAoB,CAAC,4BAA4B,CAC3F,YAAY,sBAAsB,CAClC,MAAM,mBAAmB,CACzB,aAAa,EAAE,yBAAyB,CAAC,0BAA0B,CACnE,KAAK,aAAa,CAClB,EAAE,uBAAuB,CAAC,mCAAmC,CAC7D,uCAAuC,8BAA8B,CACrE,qEAAuE,0BAA0B,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,kBAAkB,CAC1J,YAAY,wBAAwB,CACpC,kBAAmB,4BAA4B,CAC/C,iCAAiC,uBAAuB,CACxD,MAAM,0BAA0B,CAChC,IAAI,cAAc,CAClB,2BAA2B,aAAa,CAAC,SAAS,CAAC,QAAQ,CAC3D,8CAA8C,sBAAsB,CACpE,oCAAoC,cAAc,CAClD,0CAA0C,yBAAyB,CACnE,KAAK,yCAAyC,CAAC,0BAA0B,CACzE,kBAAkB,iBAAiB,CACnC,iCAAiC,kBAAkB,CAAC,kBAAkB,CACtE,2BAA2B,kBAAkB,CAAC,aAAa,CAAC,mBAAmB,CAC/E,4CAA4C,uBAAuB,CACnE,8BAA8B,aAAa,CAC3C,0CAA2C,sBAAsB,CACjE,eAAe,kBAAkB,CAAC,yBAAyB,CAAC,mBAAmB,CAAC,kBAAkB,CAClG,0EAA0E,wBAAwB,CAClG,qCAAsC,aAAa,CACnD,QAAQ,iBAAiB,CACzB,eAAe,sBAAsB,CACrC,YAAY,uBAAuB,CACnC,gBAAgB,sBAAsB,CACtC,gBAAgB,yBAAyB,CAAC,CAC1C,sBAAsB,uBAAuB,kBAAkB,CAC/D,OAAO,mBAAmB,CAC1B,cAAc,QAAQ,CACtB,QAAQ,eAAe,CACvB,aAAa,oBAAoB,CAAC,cAAc,CAAC,CACjD,gBAAgB,oCAAoC,SAAS,CAAC;;AC1a9D;;;;;ECAA,CAAA,MAGI,cAAA,CAAA,gBAAA,CAAA,gBAAA,CAAA,cAAA,CAAA,aAAA,CAAA,gBAAA,CAAA,gBAAA,CAAA,eAAA,CAAA,cAAA,CAAA,cAAA,CAAA,YAAA,CAAA,cAAA,CAAA,mBAIA,CAAA,iBAAA,CAAA,mBAAA,CAAA,iBAAA,CAAA,cAAA,CAAA,iBAAA,CAAA,gBAAA,CAAA,eAAA,CAAA,cAIA,CAAA,iBAAA,CAAA,qBAAA,CAAA,qBAAA,CAAA,qBAAA,CAAA,sBAKF,CAAA,qNACA,CAAA,sGCsBF,CAAA,iBClBE,qBAGF,CAAA,KACE,sBACA,CAAA,gBACA,CAAA,6BACA,CAAA,uCAMF,CAAA,sEACE,aAUF,CAAA,KACE,QACA,CAAA,wMCqII,CAAA,cDnIJ,CAAA,eACA,CAAA,eACA,CAAA,aACA,CAAA,eACA,CAAA,qBEYF,CAAA,0CFCE,mBASF,CACE,GAAA,kBACA,CAAA,QACA,CAAA,gBAaF,CAAA,kBACE,YACA,CAAA,mBAQA,CAAA,EAAA,YACA,CAAA,kBDhBF,CAAA,sCC6BE,yBACA,CAAA,wCAAA,CAAA,gCACA,CAAA,WACA,CAAA,eACA,CAAA,qCAAA,CAAA,6BAGF,CAAA,QAEE,iBACA,CAAA,mBDrBF,CCwBA,iBALE,kBAYF,CAPA,SAGE,YAIF,CAAA,wBAIE,eAGF,CACE,GAAA,eAGF,CACE,GAAA,mBACA,CAAA,aAGF,CAAA,WACE,eDtBF,CAAA,SC2BE,kBAGF,CAAA,MCII,aDKJ,CAAA,QAEE,iBCPE,CAAA,aDSF,CAAA,aACA,CAAA,sBAGF,CAAA,IAAM,aACN,CAAA,IAAM,SAQJ,CAAA,EAAA,aACA,CAAA,oBACA,CAAA,wBGhLA,CAAA,QHmLE,aACA,CAAA,yBASJ,CG7LE,4DHkME,aACA,CAAA,oBD/BJ,CAAA,kBC4CE,0FCxDE,CAAA,aD4DJ,CAAA,IAEE,YAEA,CAAA,kBAEA,CAAA,aAGA,CAAA,4BAQF,CAAA,OAEE,eAQF,CAAA,IAEE,iBAGF,CAAA,QAJE,qBAgBF,CAZA,IAGE,eASF,CAAA,MACE,wBAGF,CAAA,QACE,kBACA,CAAA,qBACA,CAAA,aACA,CAAA,eACA,CAAA,mBAOF,CAEE,GAAA,kBACA,CAAA,+BAQF,CAAA,MAEE,oBACA,CAAA,mBAMF,CAAA,OAEE,eAQF,CAAA,iCACE,SDhFF,CAAA,sCCwFE,QACA,CAAA,mBChKE,CAAA,iBDkKF,CAAA,mBAGF,CAAA,aAEE,gBAGF,CAAA,cAEE,mBEnFF,CAAA,cF0FE,cAMF,CAAA,OACE,gBDtFF,CAAA,gDCiGE,yBD1FF,CAAA,4GCoGM,cD7FN,CAAA,wHCuGE,SACA,CAAA,iBDhGF,CAAA,uCCqGE,qBACA,CAAA,SAIF,CAAA,SACE,aAEA,CAAA,eAGF,CAAA,SAME,WAEA,CAAA,SACA,CAAA,QACA,CAAA,QAKF,CAAA,OACE,aACA,CAAA,UACA,CAAA,cACA,CAAA,SACA,CAAA,mBC9OI,CAAA,gBDgPJ,CAAA,mBACA,CAAA,aACA,CAAA,kBAGF,CAAA,SACE,sBE7GF,CAAA,kFFmHE,WE9GF,CAAA,cFsHE,mBACA,CAAA,uBElHF,CAAA,yCF0HE,uBAQF,CAAA,6BACE,YACA,CAAA,yBAOF,CAAA,OACE,oBAGF,CAAA,QACE,iBACA,CAAA,cAGF,CAAA,SACE,YE/HF,CAAA,SFqIE,sBD9HF,CAAA,0CK5VE,mBAEA,CAAA,eACA,CAAA,eAIF,CAAA,OHqKM,gBGpKN,CAAA,OHoKM,cGnKN,CAAA,OHmKM,iBGlKN,CAAA,OHkKM,gBGjKN,CAAA,OHiKM,iBGhKN,CAAA,OHgKM,cG9JN,CAAA,MH8JM,iBG5JJ,CAAA,eAIF,CAAA,WHwJM,cGnJN,CAAA,sBAHE,eACA,CAAA,eAOF,CALA,WHmJM,gBG9IN,CAAA,WH8IM,gBGzIN,CAAA,sBAHE,eACA,CAAA,eJkCF,CIhCA,WHyIM,gBDzGN,CIpBE,GAAA,eACA,CAAA,kBACA,CAAA,QACA,CAAA,mCL6WF,CAAA,aEnQI,aG/FF,CAAA,eLwWF,CAAA,WKnWE,YACA,CAAA,wBAQF,CAKA,4BCpFE,cACA,CAAA,eDsFF,CAAA,kBACE,oBADF,CAAA,mCAII,kBAUJ,CAAA,YH2DI,aGzDF,CAAA,wBAIF,CAAA,YACE,kBHoEI,CAAA,iBGhEN,CAAA,mBACE,aH+CE,CAAA,aG7CF,CAAA,aAHF,CAAA,0BAMI,oBEnHJ,CAMA,0BCFE,cAGA,CAAA,WDcF,CAfA,eACE,cACA,CAAA,qBACA,CAAA,wBEEE,CAAA,oBFUJ,CAAA,QAEE,oBAGF,CAAA,YACE,mBACA,CAAA,aAGF,CAAA,gBL8HI,aK5HF,CAAA,aGvCF,CAAA,KRmKI,eQjKF,CAAA,aACA,CAAA,oBAGA,CAAA,OACE,aAKJ,CAAA,IACE,mBRsJE,CAAA,eQpJF,CAAA,UACA,CAAA,wBDCE,CAAA,mBCLJ,CAAA,QASI,SR8IA,CAAA,cQ5IA,CAAA,eTwMJ,CAAA,ISjME,aRqIE,CAAA,eQnIF,CAAA,aAHF,CAAA,SRsII,iBQ9HA,CAAA,aACA,CAAA,iBAKJ,CAAA,gBACE,gBACA,CAAA,iBCxCA,CAAA,oFCDA,UACA,CAAA,kBACA,CAAA,iBACA,CAAA,iBACA,CAAA,gBCmDE,CAAA,yBFzCE,yBACE,eEwCJ,CAAA,CAAA,yBFzCE,uCACE,eEwCJ,CAAA,CAAA,yBFzCE,qDACE,eEwCJ,CAAA,CAAA,0BFzCE,mEACE,gBA4BN,CAAA,CAAA,KCnCA,YACA,CAAA,cACA,CAAA,kBACA,CAAA,iBDsCA,CAAA,YACE,cACA,CAAA,aAFF,CAAA,2CAMI,eACA,CAAA,cGtDJ,CAAA,sqBACE,iBACA,CAAA,UACA,CAAA,kBACA,CAAA,iBAsBE,CAAA,KACE,YACA,CAAA,WACA,CAAA,cAKE,CAAA,cFwBN,aACA,CAAA,cEzBM,CAAA,cFwBN,YACA,CAAA,aEzBM,CAAA,cFwBN,mBACA,CAAA,oBEzBM,CAAA,cFwBN,YACA,CAAA,aEzBM,CAAA,cFwBN,YACA,CAAA,aEzBM,CAAA,cFwBN,mBACA,CAAA,oBEnBE,CAAA,UFCJ,aACA,CAAA,UACA,CAAA,cEGQ,CAAA,OFbR,kBAIA,CAAA,mBESQ,CAAA,OFbR,mBAIA,CAAA,oBESQ,CAAA,OFbR,YAIA,CAAA,aESQ,CAAA,OFbR,mBAIA,CAAA,oBESQ,CAAA,OFbR,mBAIA,CAAA,oBESQ,CAAA,OFbR,YAIA,CAAA,aESQ,CAAA,OFbR,mBAIA,CAAA,oBESQ,CAAA,OFbR,mBAIA,CAAA,oBESQ,CAAA,OFbR,YAIA,CAAA,aESQ,CAAA,QFbR,mBAIA,CAAA,oBESQ,CAAA,QFbR,mBAIA,CAAA,oBESQ,CAAA,QFbR,aAIA,CAAA,cEeI,CAAA,aAAwB,QAExB,CAAA,YAAuB,QAGrB,CAAA,SAAwB,OAAxB,CAAA,SAAwB,OAAxB,CAAA,SAAwB,OAAxB,CAAA,SAAwB,OAAxB,CAAA,SAAwB,OAAxB,CAAA,SAAwB,OAAxB,CAAA,SAAwB,OAAxB,CAAA,SAAwB,OAAxB,CAAA,SAAwB,OAAxB,CAAA,SAAwB,OAAxB,CAAA,UAAwB,QAAxB,CAAA,UAAwB,QAAxB,CAAA,UAAwB,QAOpB,CAAA,UFhBV,qBEgBU,CAAA,UFhBV,sBEgBU,CAAA,UFhBV,eEgBU,CAAA,UFhBV,sBEgBU,CAAA,UFhBV,sBEgBU,CAAA,UFhBV,eEgBU,CAAA,UFhBV,sBEgBU,CAAA,UFhBV,sBEgBU,CAAA,UFhBV,eEgBU,CAAA,WFhBV,sBEgBU,CAAA,WFhBV,sBCKE,CAAA,yBC3BE,QACE,YACA,CAAA,WACA,CAAA,cAKE,CAAA,iBFwBN,aACA,CAAA,cEzBM,CAAA,iBFwBN,YACA,CAAA,aEzBM,CAAA,iBFwBN,mBACA,CAAA,oBEzBM,CAAA,iBFwBN,YACA,CAAA,aEzBM,CAAA,iBFwBN,YACA,CAAA,aEzBM,CAAA,iBFwBN,mBACA,CAAA,oBEnBE,CAAA,aFCJ,aACA,CAAA,UACA,CAAA,cEGQ,CAAA,UFbR,kBAIA,CAAA,mBESQ,CAAA,UFbR,mBAIA,CAAA,oBESQ,CAAA,UFbR,YAIA,CAAA,aESQ,CAAA,UFbR,mBAIA,CAAA,oBESQ,CAAA,UFbR,mBAIA,CAAA,oBESQ,CAAA,UFbR,YAIA,CAAA,aESQ,CAAA,UFbR,mBAIA,CAAA,oBESQ,CAAA,UFbR,mBAIA,CAAA,oBESQ,CAAA,UFbR,YAIA,CAAA,aESQ,CAAA,WFbR,mBAIA,CAAA,oBESQ,CAAA,WFbR,mBAIA,CAAA,oBESQ,CAAA,WFbR,aAIA,CAAA,cEeI,CAAA,gBAAwB,QAExB,CAAA,eAAuB,QAGrB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,aAAwB,QAAxB,CAAA,aAAwB,QAAxB,CAAA,aAAwB,QAOpB,CAAA,aFhBV,aEgBU,CAAA,aFhBV,qBEgBU,CAAA,aFhBV,sBEgBU,CAAA,aFhBV,eEgBU,CAAA,aFhBV,sBEgBU,CAAA,aFhBV,sBEgBU,CAAA,aFhBV,eEgBU,CAAA,aFhBV,sBEgBU,CAAA,aFhBV,sBEgBU,CAAA,aFhBV,eEgBU,CAAA,cFhBV,sBEgBU,CAAA,cFhBV,sBCKE,CAAA,CAAA,yBC3BE,QACE,YACA,CAAA,WACA,CAAA,cAKE,CAAA,iBFwBN,aACA,CAAA,cEzBM,CAAA,iBFwBN,YACA,CAAA,aEzBM,CAAA,iBFwBN,mBACA,CAAA,oBEzBM,CAAA,iBFwBN,YACA,CAAA,aEzBM,CAAA,iBFwBN,YACA,CAAA,aEzBM,CAAA,iBFwBN,mBACA,CAAA,oBEnBE,CAAA,aFCJ,aACA,CAAA,UACA,CAAA,cEGQ,CAAA,UFbR,kBAIA,CAAA,mBESQ,CAAA,UFbR,mBAIA,CAAA,oBESQ,CAAA,UFbR,YAIA,CAAA,aESQ,CAAA,UFbR,mBAIA,CAAA,oBESQ,CAAA,UFbR,mBAIA,CAAA,oBESQ,CAAA,UFbR,YAIA,CAAA,aESQ,CAAA,UFbR,mBAIA,CAAA,oBESQ,CAAA,UFbR,mBAIA,CAAA,oBESQ,CAAA,UFbR,YAIA,CAAA,aESQ,CAAA,WFbR,mBAIA,CAAA,oBESQ,CAAA,WFbR,mBAIA,CAAA,oBESQ,CAAA,WFbR,aAIA,CAAA,cEeI,CAAA,gBAAwB,QAExB,CAAA,eAAuB,QAGrB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,aAAwB,QAAxB,CAAA,aAAwB,QAAxB,CAAA,aAAwB,QAOpB,CAAA,aFhBV,aEgBU,CAAA,aFhBV,qBEgBU,CAAA,aFhBV,sBEgBU,CAAA,aFhBV,eEgBU,CAAA,aFhBV,sBEgBU,CAAA,aFhBV,sBEgBU,CAAA,aFhBV,eEgBU,CAAA,aFhBV,sBEgBU,CAAA,aFhBV,sBEgBU,CAAA,aFhBV,eEgBU,CAAA,cFhBV,sBEgBU,CAAA,cFhBV,sBCKE,CAAA,CAAA,yBC3BE,QACE,YACA,CAAA,WACA,CAAA,cAKE,CAAA,iBFwBN,aACA,CAAA,cEzBM,CAAA,iBFwBN,YACA,CAAA,aEzBM,CAAA,iBFwBN,mBACA,CAAA,oBEzBM,CAAA,iBFwBN,YACA,CAAA,aEzBM,CAAA,iBFwBN,YACA,CAAA,aEzBM,CAAA,iBFwBN,mBACA,CAAA,oBEnBE,CAAA,aFCJ,aACA,CAAA,UACA,CAAA,cEGQ,CAAA,UFbR,kBAIA,CAAA,mBESQ,CAAA,UFbR,mBAIA,CAAA,oBESQ,CAAA,UFbR,YAIA,CAAA,aESQ,CAAA,UFbR,mBAIA,CAAA,oBESQ,CAAA,UFbR,mBAIA,CAAA,oBESQ,CAAA,UFbR,YAIA,CAAA,aESQ,CAAA,UFbR,mBAIA,CAAA,oBESQ,CAAA,UFbR,mBAIA,CAAA,oBESQ,CAAA,UFbR,YAIA,CAAA,aESQ,CAAA,WFbR,mBAIA,CAAA,oBESQ,CAAA,WFbR,mBAIA,CAAA,oBESQ,CAAA,WFbR,aAIA,CAAA,cEeI,CAAA,gBAAwB,QAExB,CAAA,eAAuB,QAGrB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,aAAwB,QAAxB,CAAA,aAAwB,QAAxB,CAAA,aAAwB,QAOpB,CAAA,aFhBV,aEgBU,CAAA,aFhBV,qBEgBU,CAAA,aFhBV,sBEgBU,CAAA,aFhBV,eEgBU,CAAA,aFhBV,sBEgBU,CAAA,aFhBV,sBEgBU,CAAA,aFhBV,eEgBU,CAAA,aFhBV,sBEgBU,CAAA,aFhBV,sBEgBU,CAAA,aFhBV,eEgBU,CAAA,cFhBV,sBEgBU,CAAA,cFhBV,sBCKE,CAAA,CAAA,0BC3BE,QACE,YACA,CAAA,WACA,CAAA,cAKE,CAAA,iBFwBN,aACA,CAAA,cEzBM,CAAA,iBFwBN,YACA,CAAA,aEzBM,CAAA,iBFwBN,mBACA,CAAA,oBEzBM,CAAA,iBFwBN,YACA,CAAA,aEzBM,CAAA,iBFwBN,YACA,CAAA,aEzBM,CAAA,iBFwBN,mBACA,CAAA,oBEnBE,CAAA,aFCJ,aACA,CAAA,UACA,CAAA,cEGQ,CAAA,UFbR,kBAIA,CAAA,mBESQ,CAAA,UFbR,mBAIA,CAAA,oBESQ,CAAA,UFbR,YAIA,CAAA,aESQ,CAAA,UFbR,mBAIA,CAAA,oBESQ,CAAA,UFbR,mBAIA,CAAA,oBESQ,CAAA,UFbR,YAIA,CAAA,aESQ,CAAA,UFbR,mBAIA,CAAA,oBESQ,CAAA,UFbR,mBAIA,CAAA,oBESQ,CAAA,UFbR,YAIA,CAAA,aESQ,CAAA,WFbR,mBAIA,CAAA,oBESQ,CAAA,WFbR,mBAIA,CAAA,oBESQ,CAAA,WFbR,aAIA,CAAA,cEeI,CAAA,gBAAwB,QAExB,CAAA,eAAuB,QAGrB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,YAAwB,OAAxB,CAAA,aAAwB,QAAxB,CAAA,aAAwB,QAAxB,CAAA,aAAwB,QAOpB,CAAA,aFhBV,aEgBU,CAAA,aFhBV,qBEgBU,CAAA,aFhBV,sBEgBU,CAAA,aFhBV,eEgBU,CAAA,aFhBV,sBEgBU,CAAA,aFhBV,sBEgBU,CAAA,aFhBV,eEgBU,CAAA,aFhBV,sBEgBU,CAAA,aFhBV,sBEgBU,CAAA,aFhBV,eEgBU,CAAA,cFhBV,sBEgBU,CAAA,cFhBV,sBGnDF,CAAA,CAAA,OACE,UACA,CAAA,kBACA,CAAA,af4nDF,CAAA,oBevnDI,cACA,CAAA,kBACA,CAAA,4BAVJ,CAAA,gBAcI,qBACA,CAAA,+BAfJ,CAAA,mBAmBI,4Bf4nDJ,CAAA,0BehnDI,aASJ,CfgnDA,sDe3mDI,wBfgnDJ,CAAA,kDe1mDM,uBfinDN,CAAA,mGevmDI,QAQJ,CAAA,yCAEI,gCX/DF,CAAA,4BW2EI,aACA,CAAA,iCCnFJ,CAAA,mDAII,wBhBqrDN,CAAA,uFgB7qDQ,oBZLN,CYYA,4GASQ,wBA5BR,CAAA,yDAII,wBhB2sDN,CAAA,+FgBnsDQ,oBZLN,CYYA,kHASQ,wBA5BR,CAAA,mDAII,wBhBiuDN,CAAA,uFgBztDQ,oBZLN,CYYA,4GASQ,wBA5BR,CAAA,0CAII,wBhBuvDN,CAAA,2EgB/uDQ,oBZLN,CYYA,mGASQ,wBA5BR,CAAA,mDAII,wBhB6wDN,CAAA,uFgBrwDQ,oBZLN,CYYA,4GASQ,wBA5BR,CAAA,gDAII,wBhBmyDN,CAAA,mFgB3xDQ,oBZLN,CYYA,yGASQ,wBA5BR,CAAA,6CAII,wBhByzDN,CAAA,+EgBjzDQ,oBZLN,CYYA,sGASQ,wBA5BR,CAAA,0CAII,wBhB+0DN,CAAA,2EgBv0DQ,oBZLN,CYYA,mGASQ,wBA5BR,CAmBA,yJASQ,iCD8EV,CAAA,sBAGM,UACA,CAAA,wBACA,CAAA,oBALN,CAAA,uBAWM,aACA,CAAA,wBACA,CAAA,oBAKN,CAAA,YACE,UACA,CAAA,wBfmwDF,CAAA,mDe9vDI,oBAPJ,CAAA,2BAWI,QAXJ,CAAA,oDAgBM,oCXrIJ,CAAA,uCW4IM,UACA,CAAA,qCFhFJ,CAAA,4BEiGA,qBAEI,aACA,CAAA,UACA,CAAA,eACA,CAAA,gCALH,CAAA,qCASK,QF1GN,CAAA,CAAA,4BEiGA,qBAEI,aACA,CAAA,UACA,CAAA,eACA,CAAA,gCALH,CAAA,qCASK,QF1GN,CAAA,CAAA,4BEiGA,qBAEI,aACA,CAAA,UACA,CAAA,eACA,CAAA,gCALH,CAAA,qCASK,QF1GN,CAAA,CAAA,6BEiGA,qBAEI,aACA,CAAA,UACA,CAAA,eACA,CAAA,gCALH,CAAA,qCASK,QAdV,CAAA,CAAA,kBAOQ,aACA,CAAA,UACA,CAAA,eACA,CAAA,gCAVR,CAAA,kCAcU,QE7KV,CAAA,cACE,aACA,CAAA,UACA,CAAA,iCACA,CAAA,sBf0KI,CAAA,cevKJ,CAAA,eACA,CAAA,eACA,CAAA,aACA,CAAA,qBACA,CAAA,2BACA,CAAA,wBRAE,CAAA,oBSFE,CAAA,oEAIA,CAAA,uCDdN,cCeQ,eDfR,CAAA,CAAA,0BAsBI,wBACA,CAAA,QEhBF,CAAA,oBACE,aACA,CAAA,qBACA,CAAA,oBACA,CAAA,SAKE,CAAA,0CFhBN,CAAA,yCA+BI,aAEA,CAAA,SAjCJ,CAAA,2BA+BI,aAEA,CAAA,SAjCJ,CAAA,+CA2CI,wBAEA,CAAA,SAIJ,CAAA,mIAKI,uBAAA,CAAA,eAIJ,CAAA,mCAGI,iBACA,CAAA,yBAJJ,CAAA,qCAaI,aACA,CAAA,qBAKJ,CAAA,uCAEE,aACA,CAAA,UAUF,CAAA,gBACE,+BACA,CAAA,kCACA,CAAA,efiEE,CAAA,iBe/DF,CAAA,eAGF,CAAA,mBACE,6BACA,CAAA,gCf0EI,CAAA,iBexEJ,CAAA,eAGF,CAAA,mBACE,8BACA,CAAA,iCfmEI,CAAA,iBejEJ,CAAA,eASF,CAAA,wBACE,aACA,CAAA,UACA,CAAA,iBACA,CAAA,efoDI,CAAA,celDJ,CAAA,eACA,CAAA,aACA,CAAA,wBACA,CACA,wBAAA,CAAA,kBAVF,CAAA,gFAcI,eACA,CAAA,cAYJ,CAAA,iBACE,gCACA,CAAA,oBf2BI,CAAA,iBezBJ,CAAA,eRzIE,CAAA,mBQ6IJ,CAAA,iBACE,+BACA,CAAA,kBfmBI,CAAA,iBejBJ,CAAA,eRjJE,CAAA,mBQsJJ,CAOA,8EACE,WAQF,CAAA,YACE,kBAGF,CAAA,WACE,aACA,CAAA,iBAQF,CAAA,UACE,YACA,CAAA,cACA,CAAA,iBACA,CAAA,gBAJF,CAAA,uCAQI,iBACA,CAAA,gBASJ,CAAA,YACE,iBACA,CAAA,aACA,CAAA,oBAGF,CAAA,kBACE,iBACA,CAAA,gBACA,CAAA,oBjBi7DF,CAAA,2FiB56DI,aAIJ,CAAA,kBACE,eAGF,CAAA,mBACE,mBACA,CAAA,kBACA,CAAA,cACA,CAAA,mBAJF,CAAA,qCAQI,eACA,CAAA,YACA,CAAA,qBACA,CAAA,aE7MF,CAAA,gBACE,YACA,CAAA,UACA,CAAA,iBjBqHA,CAAA,aiBnHA,CAAA,aAGF,CAAA,eACE,iBACA,CAAA,QACA,CAAA,MACA,CAAA,SACA,CAAA,YACA,CAAA,cACA,CAAA,oBACA,CAAA,gBjBwHE,CAAA,iBiBtHF,CAAA,eACA,CAAA,UACA,CAAA,mCV9CA,CAAA,oBUmDA,CAAA,qEAEE,QnBkoEN,CAAA,8HmB3nEM,aA9CF,CAAA,0DAoDE,oBAGE,CAAA,4CACA,CAAA,4QACA,CAAA,2BACA,CAAA,wDACA,CAAA,2DA3DJ,CAAA,sEA+DI,oBACA,CAAA,0CAhEJ,CAAA,sEAyEI,4BACA,CAAA,uCA1EJ,CAAA,0EAmFI,kCACA,CAAA,6EApFJ,CAAA,4DA2FE,oBAGE,CAAA,+CACA,CAAA,wiBA/FJ,CAAA,wEAmGI,oBACA,CAAA,0CApGJ,CAAA,sGA4GI,anB0mEiD,CAAA,kMmBrmEjD,aAjHJ,CAAA,sHAyHI,aAzHJ,CAAA,oIA4HM,oBA5HN,CAAA,oJAkIM,oBC5JN,CAAA,wBD0BA,CAAA,gJAyIM,0CAzIN,CAAA,sRAuJI,oBAvJJ,CAAA,sHA4JM,oBACA,CAAA,0CAjJR,CAAA,kBACE,YACA,CAAA,UACA,CAAA,iBjBqHA,CAAA,aiBnHA,CAAA,aAGF,CAAA,iBACE,iBACA,CAAA,QACA,CAAA,MACA,CAAA,SACA,CAAA,YACA,CAAA,cACA,CAAA,oBACA,CAAA,gBjBwHE,CAAA,iBiBtHF,CAAA,eACA,CAAA,UACA,CAAA,mCV9CA,CAAA,oBUmDA,CAAA,yEAEE,QnBivEN,CAAA,8ImB1uEM,aA9CF,CAAA,8DAoDE,oBAGE,CAAA,4CACA,CAAA,qUACA,CAAA,2BACA,CAAA,wDACA,CAAA,2DA3DJ,CAAA,0EA+DI,oBACA,CAAA,0CAhEJ,CAAA,0EAyEI,4BACA,CAAA,uCA1EJ,CAAA,8EAmFI,kCACA,CAAA,6EApFJ,CAAA,gEA2FE,oBAGE,CAAA,+CACA,CAAA,imBA/FJ,CAAA,4EAmGI,oBACA,CAAA,0CApGJ,CAAA,0GA4GI,anBytEqD,CAAA,kNmBptErD,aAjHJ,CAAA,0HAyHI,aAzHJ,CAAA,wIA4HM,oBA5HN,CAAA,wJAkIM,oBC5JN,CAAA,wBD0BA,CAAA,oJAyIM,0CAzIN,CAAA,8RAuJI,oBAvJJ,CAAA,0HA4JM,oBACA,CAAA,0CFqFV,CAAA,aACE,YACA,CAAA,kBACA,CAAA,kBAHF,CAAA,yBASI,UJ/NA,CAAA,yBIsNJ,mBAiBM,sBAjBN,CAAA,4CAeM,YACA,CAAA,kBACA,CACA,eAlBN,CAAA,yBAwBM,aACA,CAAA,kBAzBN,CAAA,2BAgCM,oBACA,CAAA,UACA,CAAA,qBAlCN,CAAA,qCAuCM,oBjB0nEJ,CAAA,sDiBrnEI,UA5CN,CAAA,yBAkDM,YACA,CAAA,kBACA,CAAA,sBACA,CAAA,UACA,CAAA,cAtDN,CAAA,+BAyDM,iBACA,CAAA,aACA,CAAA,YACA,CAAA,mBACA,CAAA,aA7DN,CAAA,6BAiEM,kBACA,CAAA,sBAlEN,CAAA,mCAqEM,eIjVN,CAAA,CAAA,KACE,oBAEA,CAAA,eACA,CAAA,aACA,CAAA,iBAGA,CAAA,qBACA,CAAA,wBAAA,CAAA,gBACA,CAAA,wBACA,CAAA,4BCuFA,CAAA,sBpB4EI,CAAA,coB1EJ,CAAA,ebxFE,CAAA,oBSFE,CAAA,6HAIA,CAAA,uCGdN,KHeQ,edTN,CAAA,CAAA,WiBUE,aACA,CAAA,oBAjBJ,CAAA,sBAsBI,SACA,CAAA,0CAvBJ,CAAA,4BA6BI,WA7BJ,CAAA,mCAkCI,cAcJ,CAAA,uCAEE,mBASA,CAAA,aC3DA,UFAE,CAAA,wBEEF,CAAA,oBlBIA,CkBKA,yDALE,UFNA,CAAA,wBEQA,CAAA,oBAiBF,CAdA,sCASI,0CAKJ,CAAA,4CAEE,UACA,CAAA,wBACA,CAAA,oBAOF,CAAA,uIAGE,UACA,CAAA,wBAIA,CAAA,oBAEA,CAAA,yJAKI,0CDQN,CAAA,eC3DA,UFAE,CAAA,wBEEF,CAAA,oBlBIA,CkBKA,+DALE,UFNA,CAAA,wBEQA,CAAA,oBAiBF,CAdA,0CASI,2CAKJ,CAAA,gDAEE,UACA,CAAA,wBACA,CAAA,oBAOF,CAAA,6IAGE,UACA,CAAA,wBAIA,CAAA,oBAEA,CAAA,+JAKI,2CDQN,CAAA,aC3DA,UFAE,CAAA,wBEEF,CAAA,oBlBIA,CkBKA,yDALE,UFNA,CAAA,wBEQA,CAAA,oBAiBF,CAdA,sCASI,yCAKJ,CAAA,4CAEE,UACA,CAAA,wBACA,CAAA,oBAOF,CAAA,uIAGE,UACA,CAAA,wBAIA,CAAA,oBAEA,CAAA,yJAKI,yCDQN,CAAA,UC3DA,UFAE,CAAA,wBEEF,CAAA,oBlBIA,CkBKA,gDALE,UFNA,CAAA,wBEQA,CAAA,oBAiBF,CAdA,gCASI,0CAKJ,CAAA,sCAEE,UACA,CAAA,wBACA,CAAA,oBAOF,CAAA,8HAGE,UACA,CAAA,wBAIA,CAAA,oBAEA,CAAA,gJAKI,0CDQN,CAAA,aC3DA,aFAE,CAAA,wBEEF,CAAA,oBlBIA,CkBKA,yDALE,aFNA,CAAA,wBEQA,CAAA,oBAiBF,CAdA,sCASI,0CAKJ,CAAA,4CAEE,aACA,CAAA,wBACA,CAAA,oBAOF,CAAA,uIAGE,aACA,CAAA,wBAIA,CAAA,oBAEA,CAAA,yJAKI,0CDQN,CAAA,YC3DA,UFAE,CAAA,wBEEF,CAAA,oBlBIA,CkBKA,sDALE,UFNA,CAAA,wBEQA,CAAA,oBAiBF,CAdA,oCASI,yCAKJ,CAAA,0CAEE,UACA,CAAA,wBACA,CAAA,oBAOF,CAAA,oIAGE,UACA,CAAA,wBAIA,CAAA,oBAEA,CAAA,sJAKI,yCDQN,CAAA,WC3DA,aFAE,CAAA,wBEEF,CAAA,oBlBIA,CkBKA,mDALE,aFNA,CAAA,wBEQA,CAAA,oBAiBF,CAdA,kCASI,2CAKJ,CAAA,wCAEE,aACA,CAAA,wBACA,CAAA,oBAOF,CAAA,iIAGE,aACA,CAAA,wBAIA,CAAA,oBAEA,CAAA,mJAKI,2CDQN,CAAA,UC3DA,UFAE,CAAA,wBEEF,CAAA,oBlBIA,CkBKA,gDALE,UFNA,CAAA,wBEQA,CAAA,oBAiBF,CAdA,gCASI,wCAKJ,CAAA,sCAEE,UACA,CAAA,wBACA,CAAA,oBAOF,CAAA,8HAGE,UACA,CAAA,wBAIA,CAAA,oBAEA,CAAA,gJAKI,wCDcN,CAAA,qBCPA,aACA,CAAA,oBlBrDA,CAAA,2BkBwDE,UACA,CAAA,wBACA,CAAA,oBAGF,CAAA,sDAEE,yCAGF,CAAA,4DAEE,aACA,CAAA,wBAGF,CAAA,+JAGE,UACA,CAAA,wBACA,CAAA,oBAEA,CAAA,iLAKI,yCDzBN,CAAA,uBCPA,aACA,CAAA,oBlBrDA,CAAA,6BkBwDE,UACA,CAAA,wBACA,CAAA,oBAGF,CAAA,0DAEE,2CAGF,CAAA,gEAEE,aACA,CAAA,wBAGF,CAAA,qKAGE,UACA,CAAA,wBACA,CAAA,oBAEA,CAAA,uLAKI,2CDzBN,CAAA,qBCPA,aACA,CAAA,oBlBrDA,CAAA,2BkBwDE,UACA,CAAA,wBACA,CAAA,oBAGF,CAAA,sDAEE,yCAGF,CAAA,4DAEE,aACA,CAAA,wBAGF,CAAA,+JAGE,UACA,CAAA,wBACA,CAAA,oBAEA,CAAA,iLAKI,yCDzBN,CAAA,kBCPA,aACA,CAAA,oBlBrDA,CAAA,wBkBwDE,UACA,CAAA,wBACA,CAAA,oBAGF,CAAA,gDAEE,0CAGF,CAAA,sDAEE,aACA,CAAA,wBAGF,CAAA,sJAGE,UACA,CAAA,wBACA,CAAA,oBAEA,CAAA,wKAKI,0CDzBN,CAAA,qBCPA,aACA,CAAA,oBlBrDA,CAAA,2BkBwDE,aACA,CAAA,wBACA,CAAA,oBAGF,CAAA,sDAEE,yCAGF,CAAA,4DAEE,aACA,CAAA,wBAGF,CAAA,+JAGE,aACA,CAAA,wBACA,CAAA,oBAEA,CAAA,iLAKI,yCDzBN,CAAA,oBCPA,aACA,CAAA,oBlBrDA,CAAA,0BkBwDE,UACA,CAAA,wBACA,CAAA,oBAGF,CAAA,oDAEE,yCAGF,CAAA,0DAEE,aACA,CAAA,wBAGF,CAAA,4JAGE,UACA,CAAA,wBACA,CAAA,oBAEA,CAAA,8KAKI,yCDzBN,CAAA,mBCPA,aACA,CAAA,oBlBrDA,CAAA,yBkBwDE,aACA,CAAA,wBACA,CAAA,oBAGF,CAAA,kDAEE,2CAGF,CAAA,wDAEE,aACA,CAAA,wBAGF,CAAA,yJAGE,aACA,CAAA,wBACA,CAAA,oBAEA,CAAA,2KAKI,2CDzBN,CAAA,kBCPA,aACA,CAAA,oBlBrDA,CAAA,wBkBwDE,UACA,CAAA,wBACA,CAAA,oBAGF,CAAA,gDAEE,wCAGF,CAAA,sDAEE,aACA,CAAA,wBAGF,CAAA,sJAGE,UACA,CAAA,wBACA,CAAA,oBAEA,CAAA,wKAKI,wCDdR,CAAA,UACE,eACA,CAAA,aACA,CAAA,oBjBzEA,CAAA,gBiB4EE,aANJ,CAAA,gDAOI,yBAPJ,CAAA,sCAiBI,aACA,CAAA,mBAWJ,CAAA,2BCPE,kBpB4EI,CAAA,iBoB1EJ,CAAA,ebxFE,CAAA,mBYiGJ,CAAA,2BCXE,oBpB4EI,CAAA,iBoB1EJ,CAAA,ebxFE,CAAA,mBY0GJ,CAAA,WACE,aACA,CAAA,UAFF,CAAA,sBAMI,gBrBs9FJ,CAAA,sFqB78FI,UE3IJ,CAAA,MLgBM,8BAIA,CAAA,uCKpBN,MLqBQ,eKrBR,CAAA,CAAA,iBAII,SAIJ,CAAA,qBAEI,YAIJ,CAAA,YACE,iBACA,CAAA,QACA,CAAA,eLDI,CAAA,2BAIA,CAAA,uCKNN,YLOQ,elBwmGR,CAAA,CAAA,uCwBxnGE,iBAGF,CAAA,iBACE,kBCoBE,CAAA,uBACE,oBACA,CAAA,kBACA,CAAA,qBACA,CAAA,UAhCJ,CAAA,qBACA,CAAA,mCACA,CAAA,eACA,CAAA,kCAqDE,CAAA,6BACE,aD1CN,CAAA,eACE,iBACA,CAAA,QACA,CAAA,MACA,CAAA,YACA,CAAA,YACA,CAAA,UACA,CAAA,eACA,CAAA,eACA,CAAA,kBtB2JI,CAAA,csBzJJ,CAAA,aACA,CAAA,eACA,CAAA,eACA,CAAA,qBACA,CAAA,2BACA,CAAA,gCfdE,CAAA,oBeuBA,CAAA,oBACE,UACA,CAAA,MAGF,CAAA,qBACE,OACA,CAAA,SXYF,CAAA,yBWnBA,uBACE,UACA,CAAA,MAGF,CAAA,wBACE,OACA,CAAA,SXYF,CAAA,CAAA,yBWnBA,uBACE,UACA,CAAA,MAGF,CAAA,wBACE,OACA,CAAA,SXYF,CAAA,CAAA,yBWnBA,uBACE,UACA,CAAA,MAGF,CAAA,wBACE,OACA,CAAA,SXYF,CAAA,CAAA,0BWnBA,uBACE,UACA,CAAA,MAGF,CAAA,wBACE,OACA,CAAA,SAON,CAAA,CAAA,uBAEI,QACA,CAAA,WACA,CAAA,YACA,CAAA,qBC/BA,CAAA,+BACE,oBACA,CAAA,kBACA,CAAA,qBACA,CAAA,UAzBJ,CAAA,YACA,CAAA,mCACA,CAAA,wBACA,CAAA,kCA8CE,CAAA,qCACE,aDUN,CAAA,0BAEI,KACA,CAAA,UACA,CAAA,SACA,CAAA,YACA,CAAA,mBC7CA,CAAA,kCACE,oBACA,CAAA,kBACA,CAAA,qBACA,CAAA,UAlBJ,CAAA,iCACA,CAAA,cACA,CAAA,oCACA,CAAA,sBAuCE,CAAA,wCACE,aA7BF,CAAA,kCDmDE,gBAKN,CAAA,yBAEI,KACA,CAAA,UACA,CAAA,SACA,CAAA,YACA,CAAA,oBC9DA,CAAA,iCACE,oBACA,CAAA,kBACA,CAAA,qBACA,CAAA,UAAA,CAYE,YAhBJ,CAmBE,kCACE,oBACA,CAAA,mBACA,CAAA,qBACA,CAAA,UA9BN,CAAA,iCACA,CAAA,uBACA,CAAA,oCAiCE,CAAA,uCACE,aAVA,CAAA,kCDiDA,gBAON,CAAA,0IAKI,UACA,CAAA,WAKJ,CAAA,kBE9GE,QACA,CAAA,cACA,CAAA,eACA,CAAA,4BFkHF,CAAA,eACE,aACA,CAAA,UACA,CAAA,qBACA,CAAA,UACA,CAAA,eACA,CAAA,aACA,CAAA,kBAEA,CAAA,kBACA,CAAA,wBACA,CAAA,QpBrHA,CAAA,0CoBoIE,aACA,CAAA,oBJ/IA,CAAA,wBIoHJ,CAAA,4CAiCI,UACA,CAAA,oBJtJA,CAAA,wBIoHJ,CAAA,gDAwCI,aACA,CAAA,mBACA,CAAA,wBAQJ,CAAA,oBACE,aAIF,CAAA,iBACE,aACA,CAAA,oBACA,CAAA,etBAI,CAAA,iBsBEJ,CAAA,aACA,CAAA,kBAIF,CAAA,oBACE,aACA,CAAA,qBACA,CAAA,aG3LF,CAAA,+BAEE,iBACA,CAAA,mBACA,CAAA,qB3Bq3GF,CAAA,yC2Bl3GI,iBACA,CAAA,a3Bw3GJ,CAOA,wN2Br3GM,SAMN,CAAA,aACE,YACA,CAAA,cACA,CAAA,0BAHF,CAAA,0BAMI,U3B23GJ,CAAA,0E2Bn3GI,gB3Bw3GJ,CAAA,mGS/3GI,yBACA,CAAA,4BTo4GJ,CAAA,+ESv3GI,wBACA,CAAA,2BkBmBJ,CAAA,uBACE,sBACA,CAAA,qBAFF,CAAA,0GAOI,aAGF,CAAA,wCACE,cAIJ,CAAA,yEACE,qBACA,CAAA,oBAGF,CAAA,yEACE,oBACA,CAAA,mBAoBF,CAAA,oBACE,qBACA,CAAA,sBACA,CAAA,sBAHF,CAAA,wDAOI,U3B+1GJ,CAAA,4F2B11GI,e3B+1GJ,CAAA,qHSh7GI,4BACA,CAAA,2BTq7GJ,CAAA,iGSp8GI,wBACA,CAAA,yBkB0HJ,CAAA,yDAGI,e3Bi1GJ,CAAA,gM2B70GM,iBACA,CAAA,kBACA,CAAA,mBCzJN,CAAA,aACE,iBACA,CAAA,YACA,CAAA,cACA,CAAA,mBACA,CAAA,U5Bq/GF,CAAA,sH4B/+GI,iBACA,CAAA,aACA,CAAA,QACA,CAAA,WACA,CAAA,e5B+/GJ,CAAA,0gB4B1/GM,gB5BggHN,CAAA,yI4Bx/GI,SA5BJ,CAAA,mDAiCI,S5B4/GJ,CAAA,2FSn/GI,wBACA,CAAA,2BmB3CJ,CAAA,0BA4CI,YACA,CAAA,kBA7CJ,CAAA,kInB4BI,yBACA,CAAA,4BmB7BJ,CAAA,+DnB0CI,wBACA,CAAA,2BT2gHJ,CAQA,klBSliHI,yBACA,CAAA,4BTwiHJ,CAAA,yC4Br/GE,Y5B2/GF,CAAA,mD4Br/GI,iBACA,CAAA,S5B0/GJ,CAAA,+D4Bv/GM,S5B+/GN,CAAA,4V4Bv/GI,gBAIJ,CAAA,qBAAuB,iBACvB,CAAA,oBAAsB,gBAQtB,CAAA,kBACE,YACA,CAAA,kBACA,CAAA,sBACA,CAAA,e1B2DI,CAAA,c0BzDJ,CAAA,eACA,CAAA,eACA,CAAA,aACA,CAAA,iBACA,CAAA,kBACA,CAAA,wBACA,CAAA,wBnB/GE,CAAA,oBT+mHJ,CAAA,2E4B1/GI,Y5B+/GJ,CAAA,2E4Bn/GE,+B5Bw/GF,CAAA,6P4B/+GE,kB1BwBI,CAAA,iB0BtBJ,CAAA,enB5IE,CAAA,mBTqoHJ,CAAA,2E4Bn/GE,gC5Bw/GF,CAAA,6P4B/+GE,oB1BOI,CAAA,iB0BLJ,CAAA,enB7JE,CAAA,mBmBiKJ,CAAA,8DAEE,qB5B2/GF,CAAA,skBS9oHI,yBACA,CAAA,4BmBwKJ,CAAA,+WnB3JI,wBACA,CAAA,2BoBxCJ,CAAA,gBACE,iBACA,CAAA,SACA,CAAA,aACA,CAAA,iBACA,CAAA,mBACA,CAAA,gCAAA,CAAA,kBAGF,CAAA,uBACE,mBACA,CAAA,iBAGF,CAAA,sBACE,iBACA,CAAA,MACA,CAAA,UACA,CAAA,UACA,CAAA,cACA,CAAA,SANF,CAAA,2DASI,UACA,CAAA,oBT3BA,CAAA,wBSiBJ,CAAA,yDAoBM,0CApBN,CAAA,uEAyBI,oBAzBJ,CAAA,yEA6BI,UACA,CAAA,wBACA,CAAA,oBA/BJ,CAAA,2GAuCM,aAvCN,CAAA,yHA0CQ,wBAUR,CAAA,sBACE,iBACA,CAAA,eAEA,CAAA,kBAJF,CAAA,6BAeI,mBACA,CACA,qBACA,CAAA,wBAlBJ,CAAA,yDASI,iBACA,CAAA,UACA,CAAA,YACA,CAAA,aACA,CAAA,UACA,CAAA,WACA,CACA,UAwBJ,CAxCA,4BA+BI,gCASJ,CAAA,8CpBjGI,oBoBiGJ,CAAA,2EAOM,6NAPN,CAAA,kFAaM,oBT1HF,CAAA,wBS6GJ,CAAA,iFAkBM,0KAlBN,CAAA,qFT7GI,mCS6GJ,CAAA,2FT7GI,mCSiJJ,CAAA,2CAGI,iBAHJ,CAAA,wEAQM,2LARN,CAAA,kFTjJI,mCSyKJ,CAAA,eACE,oBADF,CAAA,4CAKM,aACA,CAAA,aACA,CAAA,kBAEA,CAAA,mBATN,CAAA,2CAaM,sBACA,CAAA,yBACA,CAAA,sBACA,CAAA,uBACA,CAAA,wBAEA,CAAA,mBXlLA,CAAA,yIAAA,CAAA,iIAAA,CAAA,oKAIA,CAAA,uCW2JN,2CX1JQ,eW0JR,CAAA,CAAA,yEA0BM,qBACA,CAAA,oCAAA,CAAA,4BA3BN,CAAA,mFTzKI,mCSsNJ,CAAA,eACE,oBACA,CAAA,UACA,CAAA,iCACA,CAAA,sC3B5CI,CAAA,c2B+CJ,CAAA,eACA,CAAA,eACA,CAAA,aACA,CAAA,qBACA,CAAA,iOACA,CAAA,wBpBtNE,CAAA,oBoByNF,CAAA,uBAAA,CAAA,eAfF,CAAA,qBAkBI,oBACA,CAAA,SAKE,CAAA,0CAxBN,CAAA,gCAiCM,aACA,CAAA,qBAlCN,CAAA,8DAwCI,WACA,CAAA,oBACA,CAAA,qBA1CJ,CAAA,wBA8CI,aACA,CAAA,wBA/CJ,CAAA,2BAoDI,YApDJ,CAAA,8BAyDI,iBACA,CAAA,yBAIJ,CAAA,kBACE,gCACA,CAAA,kBACA,CAAA,qBACA,CAAA,kB3B1GI,CAAA,iB2B8GN,CAAA,kBACE,+BACA,CAAA,iBACA,CAAA,oBACA,CAAA,iB3BlHI,CAAA,iB2B2HN,CAAA,aAEE,oBACA,CAEA,eAGF,CAAA,gCAPE,iBACA,CACA,UACA,CAAA,iCAIF,CAAA,mBAEE,SACA,CAEA,QACA,CAAA,eACA,CAAA,SAPF,CAAA,4CAUI,oBACA,CAAA,0C7BwnHJ,CAAA,+F6BlnHI,wBAjBJ,CAAA,qDAsBM,gBAtBN,CAAA,yDA2BI,yBAIJ,CAAA,mBAIE,MACA,CAAA,SACA,CAAA,iCACA,CACA,eAEA,CAAA,eACA,CAEA,qBACA,CAAA,wBpBlVE,CAAA,oBoBoUJ,CAAA,4CACE,iBACA,CAAA,KACA,CAAA,OACA,CAGA,sBACA,CAGA,eACA,CAAA,aA8BF,CA1CA,yBAsBI,QACA,CAAA,SACA,CAAA,aACA,CAAA,2BACA,CAGA,gBT7WA,CAAA,wBS+WA,CAAA,mBpBnWA,CAAA,+BoB8WJ,CAAA,cACE,UACA,CAAA,aACA,CAAA,SACA,CAAA,wBACA,CAAA,uBAAA,CAAA,eALF,CAAA,oBAQI,SARJ,CAAA,0CAY8B,yDAZ9B,CAAA,sCAa8B,yDAb9B,CAAA,+BAc8B,yDAd9B,CAAA,gCAkBI,QAlBJ,CAAA,oCAsBI,UACA,CAAA,WACA,CAAA,kBTlZA,CAAA,wBSoZA,CAAA,QpBxYA,CAAA,kBSFE,CAAA,8GW8YF,CX9YE,sGW8YF,CAAA,uBAAA,CAAA,eX1YE,CAAA,uCW4WN,oCX3WQ,uBW2WR,CX3WQ,eW2WR,CAAA,CAAA,2CT1XI,wBS0XJ,CAAA,6CAsCI,UACA,CAAA,YACA,CAAA,iBACA,CAAA,cACA,CAAA,wBACA,CAAA,wBpBzZA,CAAA,kBoB8WJ,CAAA,gCAiDI,UACA,CAAA,WT5aA,CAAA,wBS8aA,CAAA,QpBlaA,CAAA,kBSFE,CAAA,2GWwaF,CXxaE,sGWwaF,CAAA,eXpaE,CAAA,uCW4WN,gCX3WQ,oBW2WR,CX3WQ,eW2WR,CAAA,CAAA,uCT1XI,wBS0XJ,CAAA,gCAgEI,UACA,CAAA,YACA,CAAA,iBACA,CAAA,cACA,CAAA,wBACA,CAAA,wBpBnbA,CAAA,kBoB8WJ,CAAA,yBA2EI,UACA,CAAA,WACA,CAAA,YACA,CAAA,kBACA,CAAA,iBTzcA,CAAA,wBS2cA,CAAA,QpB/bA,CAAA,kBSFE,CAAA,0GWqcF,CXrcE,sGWqcF,CAAA,eXjcE,CAAA,uCW4WN,yBX3WQ,mBW2WR,CX3WQ,eW2WR,CAAA,CAAA,gCT1XI,wBS0XJ,CAAA,yBA6FI,UACA,CAAA,YACA,CAAA,iBACA,CAAA,cACA,CAAA,wBACA,CAAA,wBACA,CAAA,kBAnGJ,CAAA,4DAwGI,wBpBtdA,CAAA,kBoB8WJ,CAAA,8BA6GI,iBA7GJ,CAAA,6CAoHM,wBApHN,CAAA,sDAwHM,cAxHN,CAAA,yCA4HM,wBA5HN,CAAA,yCAgIM,cAhIN,CAAA,kCAoIM,wBAKN,CAAA,+DXzfM,sGAIA,CAAA,uCWqfN,+DXpfQ,eYhBR,CAAA,CAAA,KACE,YACA,CAAA,cACA,CAAA,cACA,CAAA,eACA,CAAA,eAGF,CAAA,UACE,aACA,CAAA,kB1BCA,CAAA,gC0BGE,oBANJ,CAAA,mBAWI,aACA,CAAA,mBACA,CAAA,cAQJ,CAAA,UACE,+BADF,CAAA,oBAII,kBACA,CAAA,4BrBZA,CAAA,6BACA,CAAA,8BLZF,CAAA,oD0B2BI,oCATN,CAAA,6BAaM,aACA,CAAA,wBACA,CAAA,wB9BupIN,CAAA,8D8BjpII,aACA,CAAA,qBACA,CAAA,iCAvBJ,CAAA,yBA4BI,erBnCA,CAAA,wBACA,CAAA,yBqB6CJ,CAAA,qBrBvDI,oBqBuDJ,CAAA,uDAOI,UACA,CAAA,wB9B8oIJ,CAAA,wC8BloII,aACA,CAAA,iB9BwoIJ,CAAA,kD8BjoII,YACA,CAAA,WACA,CAAA,iBASJ,CAAA,uBAEI,YAFJ,CAAA,qBAKI,aCpGJ,CAAA,QACE,iBACA,CAIA,kBANF,CAAA,4IAEE,YACA,CAAA,cACA,CAAA,kBACA,CAAA,6BA6BF,CAAA,cACE,oBACA,CAAA,oBACA,CAAA,uBACA,CAAA,iB7B6HI,CAAA,iB6B3HJ,CAAA,mBACA,CAAA,kB3B1CA,CAAA,wC2B6CE,oBASJ,CAAA,YACE,YACA,CAAA,qBACA,CAAA,cACA,CAAA,eACA,CAAA,eALF,CAAA,sBAQI,eACA,CAAA,cATJ,CAAA,2BAaI,eACA,CAAA,UASJ,CAAA,aACE,oBACA,CAAA,iBACA,CAAA,oBAYF,CAAA,iBACE,eACA,CAAA,WAGA,CAAA,kBAIF,CAAA,gBACE,qB7B8DI,CAAA,iB6B5DJ,CAAA,aACA,CAAA,wBACA,CAAA,4BtBxGE,CAAA,oBLFF,CAAA,4C2B8GE,oBAMJ,CAAA,qBACE,oBACA,CAAA,WACA,CAAA,YACA,CAAA,qBACA,CAAA,UACA,CAAA,kCAGF,CAAA,mBACE,eACA,CAAA,elBtEE,CAAA,4BkBgFC,gMAGK,eACA,CAAA,clBjGN,CAAA,CAAA,yBkB6FA,kBAoBI,oBACA,CAAA,0BArBH,CAAA,8BAwBK,kBAxBL,CAAA,6CA2BO,iBA3BP,CAAA,wCA+BO,mBACA,CAAA,kBAhCP,CAAA,gMAsCK,gBAtCL,CAAA,qCAqDK,gBArDL,CAAA,mCAyDK,sBAGA,CAAA,eA5DL,CAAA,kCAgEK,YlBhJN,CAAA,CAAA,4BkBgFC,gMAGK,eACA,CAAA,clBjGN,CAAA,CAAA,yBkB6FA,kBAoBI,oBACA,CAAA,0BArBH,CAAA,8BAwBK,kBAxBL,CAAA,6CA2BO,iBA3BP,CAAA,wCA+BO,mBACA,CAAA,kBAhCP,CAAA,gMAsCK,gBAtCL,CAAA,qCAqDK,gBArDL,CAAA,mCAyDK,sBAGA,CAAA,eA5DL,CAAA,kCAgEK,YlBhJN,CAAA,CAAA,4BkBgFC,gMAGK,eACA,CAAA,clBjGN,CAAA,CAAA,yBkB6FA,kBAoBI,oBACA,CAAA,0BArBH,CAAA,8BAwBK,kBAxBL,CAAA,6CA2BO,iBA3BP,CAAA,wCA+BO,mBACA,CAAA,kBAhCP,CAAA,gMAsCK,gBAtCL,CAAA,qCAqDK,gBArDL,CAAA,mCAyDK,sBAGA,CAAA,eA5DL,CAAA,kCAgEK,YlBhJN,CAAA,CAAA,6BkBgFC,gMAGK,eACA,CAAA,clBjGN,CAAA,CAAA,0BkB6FA,kBAoBI,oBACA,CAAA,0BArBH,CAAA,8BAwBK,kBAxBL,CAAA,6CA2BO,iBA3BP,CAAA,wCA+BO,mBACA,CAAA,kBAhCP,CAAA,gMAsCK,gBAtCL,CAAA,qCAqDK,gBArDL,CAAA,mCAyDK,sBAGA,CAAA,eA5DL,CAAA,kCAgEK,YArEV,CAAA,CAAA,eAyBQ,oBACA,CAAA,0BA1BR,CAAA,8KAQU,eACA,CAAA,cATV,CAAA,2BA6BU,kBA7BV,CAAA,0CAgCY,iBAhCZ,CAAA,qCAoCY,mBACA,CAAA,kBArCZ,CAAA,8KA2CU,gBA3CV,CAAA,kCA0DU,gBA1DV,CAAA,gCA8DU,sBAGA,CAAA,eAjEV,CAAA,+BAqEU,YAaV,C3BtNE,gG2B2NI,oBALN,CAAA,oCAWM,oB3BjOJ,CAAA,oF2BoOM,oBAdR,CAAA,6CAkBQ,oB/B41IR,CAAA,0K+Bp1IM,oBA1BN,CAAA,8BA+BI,oBACA,CAAA,2BAhCJ,CAAA,mCAoCI,wQApCJ,CAAA,2BAwCI,oBAxCJ,C3BtNE,mG2BmQM,oBAOR,C3B1QE,6F2B+QI,UALN,CAAA,mCAWM,wB3BrRJ,CAAA,kF2BwRM,yBAdR,CAAA,4CAkBQ,yB/Bw1IR,CAAA,sK+Bh1IM,UA1BN,CAAA,6BA+BI,wBACA,CAAA,+BAhCJ,CAAA,kCAoCI,8QApCJ,CAAA,0BAwCI,wBAxCJ,C3B1QE,gG2BuTM,UCnUR,CAAA,MACE,iBACA,CAAA,YACA,CAAA,qBACA,CAAA,WAEA,CAAA,oBACA,CAAA,qBACA,CAAA,uBACA,CAAA,iCvBKE,CAAA,oBuBdJ,CAAA,SAaI,cACA,CAAA,aAdJ,CAAA,kBAkBI,kBACA,CAAA,qBAnBJ,CAAA,8BAsBM,kBvBCF,CAAA,yCACA,CAAA,0CuBxBJ,CAAA,6BA2BM,qBvBUF,CAAA,6CACA,CAAA,4CuBtCJ,CAAA,8DAoCI,YAIJ,CAAA,WAGE,aAGA,CAAA,cACA,CAAA,eAIF,CAAA,YACE,oBAGF,CAAA,eACE,mBAIF,CAAA,qCAHE,e5BjDA,CAAA,iB4B0DE,oBAFJ,CAAA,sBAMI,mBAQJ,CAAA,aACE,sBACA,CAAA,eAEA,CAAA,gCACA,CAAA,wCALF,CAAA,yBvBhEI,uDuB4EJ,CAAA,aACE,sBAEA,CAAA,gCACA,CAAA,qCAJF,CAAA,wBvB5EI,uDuB4FJ,CAAA,kBAEE,qBACA,CACA,eAGF,CAAA,qCANE,qBACA,CACA,oBAUF,CAAA,kBACE,iBACA,CAAA,KACA,CAAA,OACA,CAAA,QACA,CAAA,MACA,CAAA,evB/GE,CAAA,gCuBmHJ,CAAA,yCAGE,aACA,CAAA,UAGF,CAAA,wBvBjHI,yCACA,CAAA,0CuBqHJ,CAAA,2BvBxGI,6CACA,CAAA,4CuB+GJ,CAAA,iBAEI,kBnB/FA,CAAA,yBmB6FJ,WAMI,YACA,CAAA,kBACA,CAAA,kBACA,CAAA,iBATJ,CAAA,iBAaM,QACA,CAAA,iBACA,CAAA,eACA,CAAA,gBAUN,CAAA,CAAA,kBAII,kBnB3HA,CAAA,yBmBuHJ,YAQI,YACA,CAAA,kBATJ,CAAA,kBAcM,QACA,CAAA,eAfN,CAAA,wBAkBQ,aACA,CAAA,aAnBR,CAAA,mCvBjJI,yBACA,CAAA,4BT+yJF,CAAA,iGgCjoJU,yBhCqoJV,CAAA,oGgChoJU,4BAnCZ,CAAA,oCvBnII,wBACA,CAAA,2BT6yJF,CAAA,mGgC9nJU,wBhCkoJV,CAAA,sGgC7nJU,2BAaZ,CAAA,CAAA,oBAEI,oBnBxLA,CAAA,yBmBsLJ,cAMI,sBAAA,CAAA,cACA,CAAA,0BAAA,CAAA,uBAAA,CAAA,uBACA,CADA,kBACA,CAAA,SACA,CAAA,QATJ,CAAA,oBAYM,oBACA,CAAA,UAUN,CAAA,CAAA,WACE,oBADF,CAAA,iBAII,eAJJ,CAAA,oCAOM,evBvOF,CAAA,4BACA,CAAA,2BuB+NJ,CAAA,qCvB9OI,wBACA,CAAA,yBuB6OJ,CAAA,8BvBvPI,euBwQE,CAAA,kBC1RN,CAAA,YACE,YACA,CAAA,cACA,CAAA,mBACA,CAAA,kBAEA,CAAA,eACA,CAAA,wBxBWE,CAAA,oBwBPJ,CAAA,kCAGI,kBAHJ,CAAA,yCAMM,UACA,CAAA,mBACA,CAAA,aACA,CAAA,WATN,CAAA,+CAoBI,yBAAA,CAIA,oBAxBJ,CAAA,wBA4BI,aCvCJ,CAAA,YACE,Y5BGA,CAAA,cACA,CAAA,eGaE,CAAA,oByBZJ,CAAA,WACE,iBACA,CAAA,aACA,CAAA,oBACA,CAAA,gBACA,CAAA,gBACA,CAAA,aAEA,CAAA,qBACA,CAAA,wBATF,CAAA,iBAYI,SACA,CAAA,aACA,CAAA,oBACA,CAAA,wBACA,CAAA,oBAhBJ,CAAA,iBAoBI,SACA,CAAA,SACA,CAAA,0CAIJ,CAAA,kCAGM,azBaF,CAAA,6BACA,CAAA,gCyBjBJ,CAAA,iCzBEI,8BACA,CAAA,iCyBHJ,CAAA,6BAcI,SACA,CAAA,UACA,CAAA,wBACA,CAAA,oBAjBJ,CAAA,+BAqBI,aACA,CAAA,mBAEA,CAAA,WACA,CAAA,qBACA,CAAA,oBCvDF,CAAA,0BACE,qBjCgLE,CAAA,iBiC9KF,CAAA,eAKE,CAAA,iD1BqCF,4BACA,CAAA,+B0BjCE,CAAA,gD1BkBF,6BACA,CAAA,gC0BhCF,CAAA,0BACE,oBjCgLE,CAAA,iBiC9KF,CAAA,eAKE,CAAA,iD1BqCF,4BACA,CAAA,+B0BjCE,CAAA,gD1BkBF,6BACA,CAAA,gC2B9BJ,CAAA,OACE,oBACA,CAAA,kBlC6JE,CAAA,akC3JF,CAAA,eACA,CAAA,aACA,CAAA,iBACA,CAAA,kBACA,CAAA,sB3BKE,CAAA,oBSFE,CAAA,6HAIA,CAAA,uCkBfN,OlBgBQ,edLN,CAAA,CAAA,4BgCGI,oBAdN,CAAA,aAoBI,YAKJ,CAAA,YACE,iBACA,CAAA,QAOF,CAAA,YACE,kBACA,CAAA,iB3BvBE,CAAA,mB2BgCF,CAAA,eCjDA,UACA,CAAA,wBjCcA,CAAA,4CiCVI,UACA,CAAA,wBAHI,CAAA,4CAQJ,SACA,CAAA,yCDqCJ,CAAA,iBCjDA,UACA,CAAA,wBjCcA,CAAA,gDiCVI,UACA,CAAA,wBAHI,CAAA,gDAQJ,SACA,CAAA,2CDqCJ,CAAA,eCjDA,UACA,CAAA,wBjCcA,CAAA,4CiCVI,UACA,CAAA,wBAHI,CAAA,4CAQJ,SACA,CAAA,yCDqCJ,CAAA,YCjDA,UACA,CAAA,wBjCcA,CAAA,sCiCVI,UACA,CAAA,wBAHI,CAAA,sCAQJ,SACA,CAAA,0CDqCJ,CAAA,eCjDA,aACA,CAAA,wBjCcA,CAAA,4CiCVI,aACA,CAAA,wBAHI,CAAA,4CAQJ,SACA,CAAA,yCDqCJ,CAAA,cCjDA,UACA,CAAA,wBjCcA,CAAA,0CiCVI,UACA,CAAA,wBAHI,CAAA,0CAQJ,SACA,CAAA,yCDqCJ,CAAA,aCjDA,aACA,CAAA,wBjCcA,CAAA,wCiCVI,aACA,CAAA,wBAHI,CAAA,wCAQJ,SACA,CAAA,2CDqCJ,CAAA,YCjDA,UACA,CAAA,wBjCcA,CAAA,sCiCVI,UACA,CAAA,wBAHI,CAAA,sCAQJ,SACA,CAAA,wCCbN,CAAA,WACE,iBACA,CAAA,kBAEA,CAAA,wB7BcE,CAAA,mBI0CA,CAAA,yByB5DJ,WAQI,iBAIJ,CAAA,CAAA,iBACE,eACA,CAAA,c7BIE,CAAA,e8BdJ,CAAA,OACE,iBACA,CAAA,sBACA,CAAA,kBACA,CAAA,4B9BUE,CAAA,oB8BLJ,CAAA,eAEE,aAIF,CAAA,YACE,eAQF,CAAA,mBACE,kBADF,CAAA,0BAKI,iBACA,CAAA,KACA,CAAA,OACA,CAAA,SACA,CAAA,sBACA,CAAA,aAUF,CAAA,eC/CA,apBKE,CAAA,wBoBHF,CAAA,oBAEA,CAAA,kBACE,wBAGF,CAAA,2BACE,aDsCF,CAAA,iBC/CA,apBKE,CAAA,wBoBHF,CAAA,oBAEA,CAAA,oBACE,wBAGF,CAAA,6BACE,aDsCF,CAAA,eC/CA,apBKE,CAAA,wBoBHF,CAAA,oBAEA,CAAA,kBACE,wBAGF,CAAA,2BACE,aDsCF,CAAA,YC/CA,apBKE,CAAA,wBoBHF,CAAA,oBAEA,CAAA,eACE,wBAGF,CAAA,wBACE,aDsCF,CAAA,eC/CA,apBKE,CAAA,wBoBHF,CAAA,oBAEA,CAAA,kBACE,wBAGF,CAAA,2BACE,aDsCF,CAAA,cC/CA,apBKE,CAAA,wBoBHF,CAAA,oBAEA,CAAA,iBACE,wBAGF,CAAA,0BACE,aDsCF,CAAA,aC/CA,apBKE,CAAA,wBoBHF,CAAA,oBAEA,CAAA,gBACE,wBAGF,CAAA,yBACE,aDsCF,CAAA,YC/CA,apBKE,CAAA,wBoBHF,CAAA,oBAEA,CAAA,eACE,wBAGF,CAAA,wBACE,aCRF,CAAA,wCACE,GAAO,0BACP,CAAK,GAAA,uBAFP,CAAA,CAAA,gCACE,GAAO,0BACP,CAAK,GAAA,uBAIT,CAAA,CAAA,UAEE,WACA,CACA,avCwKI,CAAA,gBuCtKJ,CAAA,wBhCIE,CAAA,oBgCCJ,CAAA,wBAVE,YACA,CACA,evBSI,CuBDN,cAEE,qBACA,CAAA,sBACA,CACA,UACA,CAAA,iBACA,CAAA,kBACA,CAAA,wBvBXI,CAAA,yBAIA,CAAA,uCuBDN,cvBEQ,euBUR,CAAA,CAAA,sBrBYE,qKqBVA,CAAA,yBAIA,CAAA,uBACE,yDAAA,CAAA,iDAGE,CAAA,uCAJJ,uBAKM,sBAAA,CAAA,cC1CR,CAAA,CAAA,OACE,YACA,CAAA,sBAGF,CAAA,YACE,QCFF,CAAA,YACE,YACA,CAAA,qBAGA,CAAA,cACA,CAAA,elCQE,CAAA,oBkCEJ,CAAA,wBACE,UACA,CAAA,aACA,CAAA,kBvCPA,CAAA,4DuCWE,SACA,CAAA,aACA,CAAA,oBACA,CAAA,wBAVJ,CAAA,+BAcI,aACA,CAAA,wBASJ,CAAA,iBACE,iBACA,CAAA,aACA,CAAA,sBAGA,CAAA,qBACA,CAAA,iCAPF,CAAA,6BlCjBI,8BACA,CAAA,+BkCgBJ,CAAA,4BlCHI,kCACA,CAAA,iCkCEJ,CAAA,oDAmBI,aACA,CAAA,mBACA,CAAA,qBArBJ,CAAA,wBA0BI,SACA,CAAA,UACA,CAAA,wBACA,CAAA,oBA7BJ,CAAA,kCAiCI,kBAjCJ,CAAA,yCAoCM,eACA,CAAA,oBAcF,CAAA,uBACE,kBADF,CAAA,oDlCtBA,gCAZA,CAAA,yBkCkCA,CAAA,mDlClCA,8BAYA,CAAA,2BkCsBA,CAAA,+CAeM,YAfN,CAAA,yDAmBM,oBACA,CAAA,mBApBN,CAAA,gEAuBQ,gBACA,CAAA,qB9B3DR,CAAA,yB8BmCA,0BACE,kBADF,CAAA,uDlCtBA,gCAZA,CAAA,yBkCkCA,CAAA,sDlClCA,8BAYA,CAAA,2BkCsBA,CAAA,kDAeM,YAfN,CAAA,4DAmBM,oBACA,CAAA,mBApBN,CAAA,mEAuBQ,gBACA,CAAA,qB9B3DR,CAAA,CAAA,yB8BmCA,0BACE,kBADF,CAAA,uDlCtBA,gCAZA,CAAA,yBkCkCA,CAAA,sDlClCA,8BAYA,CAAA,2BkCsBA,CAAA,kDAeM,YAfN,CAAA,4DAmBM,oBACA,CAAA,mBApBN,CAAA,mEAuBQ,gBACA,CAAA,qB9B3DR,CAAA,CAAA,yB8BmCA,0BACE,kBADF,CAAA,uDlCtBA,gCAZA,CAAA,yBkCkCA,CAAA,sDlClCA,8BAYA,CAAA,2BkCsBA,CAAA,kDAeM,YAfN,CAAA,4DAmBM,oBACA,CAAA,mBApBN,CAAA,mEAuBQ,gBACA,CAAA,qB9B3DR,CAAA,CAAA,0B8BmCA,0BACE,kBADF,CAAA,uDlCtBA,gCAZA,CAAA,yBkCkCA,CAAA,sDlClCA,8BAYA,CAAA,2BkCsBA,CAAA,kDAeM,YAfN,CAAA,4DAmBM,oBACA,CAAA,mBApBN,CAAA,mEAuBQ,gBACA,CAAA,qBAcZ,CAAA,CAAA,kBlCnHI,ekCmHJ,CAAA,mCAII,oBAJJ,CAAA,8CAOM,qBCzIJ,CAAA,yBACE,aACA,CAAA,wBxCWF,CAAA,4GwCPM,aACA,CAAA,wBAPN,CAAA,uDAWM,UACA,CAAA,wBACA,CAAA,oBAbN,CAAA,2BACE,aACA,CAAA,wBxCWF,CAAA,gHwCPM,aACA,CAAA,wBAPN,CAAA,yDAWM,UACA,CAAA,wBACA,CAAA,oBAbN,CAAA,yBACE,aACA,CAAA,wBxCWF,CAAA,4GwCPM,aACA,CAAA,wBAPN,CAAA,uDAWM,UACA,CAAA,wBACA,CAAA,oBAbN,CAAA,sBACE,aACA,CAAA,wBxCWF,CAAA,sGwCPM,aACA,CAAA,wBAPN,CAAA,oDAWM,UACA,CAAA,wBACA,CAAA,oBAbN,CAAA,yBACE,aACA,CAAA,wBxCWF,CAAA,4GwCPM,aACA,CAAA,wBAPN,CAAA,uDAWM,UACA,CAAA,wBACA,CAAA,oBAbN,CAAA,wBACE,aACA,CAAA,wBxCWF,CAAA,0GwCPM,aACA,CAAA,wBAPN,CAAA,sDAWM,UACA,CAAA,wBACA,CAAA,oBAbN,CAAA,uBACE,aACA,CAAA,wBxCWF,CAAA,wGwCPM,aACA,CAAA,wBAPN,CAAA,qDAWM,UACA,CAAA,wBACA,CAAA,oBAbN,CAAA,sBACE,aACA,CAAA,wBxCWF,CAAA,sGwCPM,aACA,CAAA,wBAPN,CAAA,oDAWM,UACA,CAAA,wBACA,CAAA,oBChBR,CAAA,OACE,W3CmLI,CAAA,gB2CjLJ,CAAA,eACA,CAAA,aACA,CAAA,UACA,CAAA,wBACA,CAAA,UzCKA,CAAA,ayCDE,UACA,CAAA,oBzCIF,CAAA,sFyCCI,WAWN,CAAA,aACE,SACA,CAAA,wBACA,CAAA,QAMF,CAAA,iBACE,mBCtCF,CAAA,OAGE,gBACA,CAAA,e5CgLI,CAAA,iB4C7KJ,CAAA,oCACA,CAAA,2BACA,CAAA,+BACA,CAAA,yCACA,CAAA,SrCOE,CAAA,oBqClBJ,CAAA,wBAeI,oBAfJ,CAAA,eAmBI,SAnBJ,CAAA,YAuBI,aACA,CAAA,SAxBJ,CAAA,YA4BI,YAIJ,CAAA,cACE,YACA,CAAA,kBACA,CAAA,qBACA,CAAA,aACA,CAAA,oCACA,CAAA,2BACA,CAAA,uCrCZE,CAAA,yCACA,CAAA,0CqCeJ,CAAA,YACE,cCtCF,CAAA,YAEE,eAFF,CAAA,mBAKI,iBACA,CAAA,eAKJ,CAAA,OACE,cACA,CAAA,KACA,CAAA,MACA,CAAA,YACA,CAAA,YACA,CAAA,UACA,CAAA,WACA,CAAA,eAGA,CAAA,SAOF,CAAA,cACE,iBACA,CAAA,UACA,CAAA,YAEA,CAAA,mBAGA,CAAA,0B7B3BI,yCAAA,CAAA,iCAAA,CAAA,gE6B6BF,CAAA,mCAAA,CAAA,2B7BzBE,CAAA,uC6BuBJ,0B7BtBM,e6B0BN,CAAA,CAAA,0BACE,sBAAA,CAAA,cAIF,CAAA,kCACE,6BAAA,CAAA,qBAIJ,CAAA,yBACE,YACA,CAAA,4BAFF,CAAA,wCAKI,6BACA,CAAA,e/Ck0LJ,CAAA,8E+C7zLI,aAXJ,CAAA,qCAeI,eAIJ,CAAA,uBACE,YACA,CAAA,kBACA,CAAA,4BAHF,CAAA,8BAOI,aACA,CAAA,yBACA,CAAA,0BAAA,CAAA,kBACA,CAAA,UAVJ,CAAA,+CAeI,qBACA,CAAA,sBACA,CAAA,WAjBJ,CAAA,8DAoBM,eApBN,CAAA,sDAwBM,YAMN,CAAA,eACE,iBACA,CAAA,YACA,CAAA,qBACA,CAAA,UAGA,CAAA,mBACA,CAAA,qBACA,CAAA,2BACA,CAAA,+BtClGE,CAAA,mBsCsGF,CAAA,SAIF,CAAA,gBACE,cACA,CAAA,KACA,CAAA,MACA,CAAA,YACA,CAAA,WACA,CAAA,YACA,CAAA,qBAPF,CAAA,qBAUW,SAVX,CAAA,qBAWW,UAKX,CAAA,cACE,YACA,CAAA,sBACA,CAAA,6BACA,CAAA,YACA,CAAA,+BtCtHE,CAAA,wCACA,CAAA,yCsCgHJ,CAAA,qBASI,YAEA,CAAA,6BAKJ,CAAA,aACE,eACA,CAAA,eAKF,CAAA,YACE,iBAGA,CAAA,aACA,CAAA,YAIF,CAAA,cACE,YACA,CAAA,cACA,CAAA,kBACA,CAAA,wBACA,CAAA,cACA,CAAA,4BtCzIE,CAAA,4CACA,CAAA,2CsCkIJ,CAAA,gBAaI,aAKJ,CAAA,yBACE,iBACA,CAAA,WACA,CAAA,UACA,CAAA,WACA,CAAA,elCvIE,CAAA,yBkCzBJ,cAuKI,eACA,CAAA,mBAlJJ,CAAA,yBAsJI,8BAtJJ,CAAA,wCAyJM,+BAtIN,CAAA,uBA2II,8BA3IJ,CAAA,8BA8IM,2BACA,CAAA,0BAAA,CAAA,kBAQJ,CAAA,UAAY,elCvKV,CAAA,CAAA,yBkC2KF,oBAEE,elC7KA,CAAA,CAAA,0BkCkLF,UAAY,gBC7Od,CAAA,CAAA,SACE,iBACA,CAAA,YACA,CAAA,aACA,CAAA,QCJA,CAAA,wMAEA,CAAA,iBACA,CAAA,eACA,CAAA,eACA,CAAA,eACA,CAAA,gBACA,CAAA,oBACA,CAAA,gBACA,CAAA,mBACA,CAAA,qBACA,CAAA,iBACA,CAAA,mBACA,CAAA,kBACA,CAAA,e/CqKI,CAAA,iB8CzKJ,CAAA,oBACA,CAAA,SAXF,CAAA,cAaW,UAbX,CAAA,gBAgBI,iBACA,CAAA,aACA,CAAA,WACA,CAAA,YAnBJ,CAAA,uBAsBM,iBACA,CAAA,UACA,CAAA,wBACA,CAAA,kBAKN,CAAA,mDACE,eADF,CAAA,iEAII,QAJJ,CAAA,+EAOM,KACA,CAAA,0BACA,CAAA,qBAKN,CAAA,uDACE,eADF,CAAA,qEAII,MACA,CAAA,WACA,CAAA,YANJ,CAAA,mFASM,OACA,CAAA,gCACA,CAAA,uBAKN,CAAA,yDACE,eADF,CAAA,uEAII,KAJJ,CAAA,qFAOM,QACA,CAAA,0BACA,CAAA,wBAKN,CAAA,qDACE,eADF,CAAA,mEAII,OACA,CAAA,WACA,CAAA,YANJ,CAAA,iFASM,MACA,CAAA,gCACA,CAAA,sBAqBN,CAAA,eACE,eACA,CAAA,oBACA,CAAA,UACA,CAAA,iBACA,CAAA,qBvC9FE,CAAA,oByClBJ,CAAA,SAEE,KACA,CAAA,MACA,CAAA,YACA,CACA,eDLA,CAAA,wMAEA,CAAA,iBACA,CAAA,eACA,CAAA,eACA,CAAA,eACA,CAAA,gBACA,CAAA,oBACA,CAAA,gBACA,CAAA,mBACA,CAAA,qBACA,CAAA,iBACA,CAAA,mBACA,CAAA,kBACA,CAAA,e/CqKI,CAAA,iBgDxKJ,CAAA,oBACA,CAAA,qBACA,CAAA,2BACA,CAAA,+BzCGE,CAAA,mByClBJ,CAAA,yBACE,iBACA,CAGA,aALF,CAAA,gBAsBI,UACA,CAAA,YACA,CAAA,cAxBJ,CAAA,6CA4BM,iBACA,CAAA,aACA,CAAA,UACA,CAAA,wBACA,CAAA,kBAKN,CAAA,mDACE,mBADF,CAAA,iEAII,yBAJJ,CAAA,+EAOM,QACA,CAAA,0BACA,CAAA,gCATN,CAAA,6EAaM,UACA,CAAA,0BACA,CAAA,qBAKN,CAAA,uDACE,iBADF,CAAA,qEAII,uBACA,CAAA,WACA,CAAA,WACA,CAAA,cAPJ,CAAA,mFAUM,MACA,CAAA,gCACA,CAAA,kCAZN,CAAA,iFAgBM,QACA,CAAA,gCACA,CAAA,uBAKN,CAAA,yDACE,gBADF,CAAA,uEAII,sBAJJ,CAAA,qFAOM,KACA,CAAA,0BACA,CAAA,mCATN,CAAA,mFAaM,OACA,CAAA,0BACA,CAAA,wBAfN,CAAA,uGAqBI,iBACA,CAAA,KACA,CAAA,QACA,CAAA,aACA,CAAA,UACA,CAAA,kBACA,CAAA,UACA,CAAA,+BAIJ,CAAA,qDACE,kBADF,CAAA,mEAII,wBACA,CAAA,WACA,CAAA,WACA,CAAA,cAPJ,CAAA,iFAUM,OACA,CAAA,gCACA,CAAA,iCAZN,CAAA,+EAgBM,SACA,CAAA,gCACA,CAAA,sBAsBN,CAAA,gBACE,oBACA,CAAA,ehD0BI,CAAA,cgDvBJ,CAAA,wBACA,CAAA,+BzCnIE,CAAA,wCACA,CAAA,yCyC4HJ,CAAA,sBAUI,YAIJ,CAAA,cACE,oBACA,CAAA,aC3JF,CAAA,UACE,iBAGF,CAAA,wBACE,kBAGF,CAAA,gBACE,iBACA,CAAA,UACA,CAAA,eCvBA,CAAA,sBACE,aACA,CAAA,UACA,CAAA,UDwBJ,CAAA,eACE,iBACA,CAAA,YACA,CAAA,UACA,CAAA,UACA,CAAA,kBACA,CAAA,kCAAA,CAAA,0BjClBI,CAAA,4CAAA,CAAA,oCAAA,CAAA,sEAIA,CAAA,uCiCQN,ejCPQ,elB+0MR,CAAA,CAAA,8DmD3zME,anDi0MF,CAAA,yEmD5zME,kCAAA,CAAA,0BnDk0MF,CAAA,yEmD7zME,mCAAA,CAAA,2BAQF,CAAA,8BAEI,SACA,CAAA,2BACA,CAAA,sBAAA,CAAA,cnD8zMJ,CAAA,kJmDxzMI,SACA,CAAA,SAXJ,CAAA,qFAgBI,SACA,CAAA,SjC5DE,CAAA,yBAIA,CAAA,uCiCuCN,qFjCtCQ,elB63MR,CAAA,CAAA,8CmD1zME,iBACA,CAAA,KACA,CAAA,QACA,CAAA,SAEA,CAAA,YACA,CAAA,kBACA,CAAA,sBACA,CAAA,SACA,CAAA,SACA,CAAA,UACA,CAAA,iBACA,CAAA,cACA,CAAA,QACA,CAAA,UjCtFI,CAAA,4BAIA,CAAA,uClBq5MJ,8CkBp5MM,elB25MR,CAAA,CAAA,oHmDr0MI,UACA,CAAA,oBACA,CAAA,SACA,CAAA,UAGJ,CAAA,uBACE,MAKF,CAAA,uBACE,OnDw0MF,CAAA,wDmD/zME,oBACA,CAAA,UACA,CAAA,WACA,CAAA,kCAEF,CAAA,4BACE,iNAEF,CAAA,4BACE,kNASF,CAAA,qBACE,iBACA,CAAA,OACA,CAAA,QACA,CAAA,MACA,CAAA,UACA,CAAA,YACA,CAAA,sBACA,CAAA,cAEA,CAAA,gBACA,CAAA,eACA,CAAA,eAZF,CAAA,wBAeI,kBACA,CAAA,aACA,CAAA,UACA,CAAA,UACA,CAAA,gBACA,CAAA,eACA,CAAA,kBACA,CAAA,cACA,CAAA,qBACA,CAAA,2BAEA,CAAA,iCACA,CAAA,oCACA,CAAA,UjC/JE,CAAA,2BAIA,CAAA,uCiC+HN,wBjC9HQ,eiC8HR,CAAA,CAAA,6BAiCI,SASJ,CAAA,kBACE,iBACA,CAAA,SACA,CAAA,WACA,CAAA,QACA,CAAA,UACA,CAAA,gBACA,CAAA,mBACA,CAAA,UACA,CAAA,iBElMF,CAAA,kCACO,GAAA,+BAAA,CAAA,uBADP,CAAA,CAAA,0BACO,GAAA,+BAAA,CAAA,uBAGP,CAAA,CAAA,gBACE,oBACA,CAAA,UACA,CAAA,WACA,CAAA,sBACA,CACA,kBAEA,CAFA,oCAEA,CAAA,iBACA,CAAA,qDAAA,CAAA,6CAGF,CAAA,mBACE,UACA,CAAA,WACA,CAAA,iBAOF,CAAA,gCAEI,GAAA,0BAAA,CAAA,kBAEF,CAAA,IACE,SACA,CAAA,sBAAA,CAAA,cANJ,CAAA,CAAA,wBAEI,GAAA,0BAAA,CAAA,kBAEF,CAAA,IACE,SACA,CAAA,sBAAA,CAAA,cAIJ,CAAA,CAAA,cACE,oBACA,CAAA,UACA,CAAA,WACA,CAAA,sBACA,CAAA,6BAEA,CAAA,iBACA,CAAA,SACA,CAAA,mDAAA,CAAA,2CAGF,CAAA,iBACE,UACA,CAAA,WAIA,CAAA,uCACE,8BAEE,+BAAA,CAAA,uBC3DN,CAAA,CAAA,gBAAqB,gCACrB,CAAA,WAAqB,4BACrB,CAAA,cAAqB,+BACrB,CAAA,cAAqB,+BACrB,CAAA,mBAAqB,oCACrB,CAAA,gBAAqB,iCCFnB,CAAA,YACE,kCnDUF,CAAA,sFmDLI,kCANJ,CAAA,cACE,kCnDUF,CAAA,8FmDLI,kCANJ,CAAA,YACE,kCnDUF,CAAA,sFmDLI,kCANJ,CAAA,SACE,kCnDUF,CAAA,0EmDLI,kCANJ,CAAA,YACE,kCnDUF,CAAA,sFmDLI,kCANJ,CAAA,WACE,kCnDUF,CAAA,kFmDLI,kCANJ,CAAA,UACE,kCnDUF,CAAA,8EmDLI,kCANJ,CAAA,SACE,kCnDUF,CAAA,0EmDLI,kCCCN,CAAA,UACE,+BAGF,CAAA,gBACE,kCCXF,CAAA,QAAkB,kCAClB,CAAA,YAAkB,sCAClB,CAAA,cAAkB,wCAClB,CAAA,eAAkB,yCAClB,CAAA,aAAkB,uCAElB,CAAA,UAAmB,kBACnB,CAAA,cAAmB,sBACnB,CAAA,gBAAmB,wBACnB,CAAA,iBAAmB,yBACnB,CAAA,eAAmB,uBAGjB,CAAA,gBACE,8BADF,CAAA,kBACE,8BADF,CAAA,gBACE,8BADF,CAAA,aACE,8BADF,CAAA,gBACE,8BADF,CAAA,eACE,8BADF,CAAA,cACE,8BADF,CAAA,aACE,8BAIJ,CAAA,cACE,2BAOF,CAAA,YACE,6BAGF,CAAA,SACE,8BAGF,CAAA,aACE,uCAIF,CAAA,4BAHE,wCAQF,CAAA,+BAHE,2CAQF,CAAA,8BAHE,0CAQF,CALA,cACE,uCAIF,CAAA,YACE,6BAGF,CAAA,gBACE,2BAGF,CAAA,cACE,6BAGF,CAAA,WACE,yBLxEA,CAAA,gBACE,aACA,CAAA,UACA,CAAA,UMOE,CAAA,QAAwB,sBAAxB,CAAA,UAAwB,wBAAxB,CAAA,gBAAwB,8BAAxB,CAAA,SAAwB,uBAAxB,CAAA,SAAwB,uBAAxB,CAAA,aAAwB,2BAAxB,CAAA,cAAwB,4BAAxB,CAAA,QAAwB,sBAAxB,CAAA,eAAwB,6B7CiD1B,CAAA,yB6CjDE,WAAwB,sBAAxB,CAAA,aAAwB,wBAAxB,CAAA,mBAAwB,8BAAxB,CAAA,YAAwB,uBAAxB,CAAA,YAAwB,uBAAxB,CAAA,gBAAwB,2BAAxB,CAAA,iBAAwB,4BAAxB,CAAA,WAAwB,sBAAxB,CAAA,kBAAwB,6B7CiD1B,CAAA,CAAA,yB6CjDE,WAAwB,sBAAxB,CAAA,aAAwB,wBAAxB,CAAA,mBAAwB,8BAAxB,CAAA,YAAwB,uBAAxB,CAAA,YAAwB,uBAAxB,CAAA,gBAAwB,2BAAxB,CAAA,iBAAwB,4BAAxB,CAAA,WAAwB,sBAAxB,CAAA,kBAAwB,6B7CiD1B,CAAA,CAAA,yB6CjDE,WAAwB,sBAAxB,CAAA,aAAwB,wBAAxB,CAAA,mBAAwB,8BAAxB,CAAA,YAAwB,uBAAxB,CAAA,YAAwB,uBAAxB,CAAA,gBAAwB,2BAAxB,CAAA,iBAAwB,4BAAxB,CAAA,WAAwB,sBAAxB,CAAA,kBAAwB,6B7CiD1B,CAAA,CAAA,0B6CjDE,WAAwB,sBAAxB,CAAA,aAAwB,wBAAxB,CAAA,mBAAwB,8BAAxB,CAAA,YAAwB,uBAAxB,CAAA,YAAwB,uBAAxB,CAAA,gBAAwB,2BAAxB,CAAA,iBAAwB,4BAAxB,CAAA,WAAwB,sBAAxB,CAAA,kBAAwB,6BAU9B,CAAA,CAAA,aAEI,cAAqB,sBAArB,CAAA,gBAAqB,wBAArB,CAAA,sBAAqB,8BAArB,CAAA,eAAqB,uBAArB,CAAA,eAAqB,uBAArB,CAAA,mBAAqB,2BAArB,CAAA,oBAAqB,4BAArB,CAAA,cAAqB,sBAArB,CAAA,qBAAqB,6BCrBzB,CAAA,CAAA,kBACE,iBACA,CAAA,aACA,CAAA,UACA,CAAA,SACA,CAAA,eALF,CAAA,yBAQI,aACA,CAAA,UATJ,CAAA,2IAiBI,iBACA,CAAA,KACA,CAAA,QACA,CAAA,MACA,CAAA,UACA,CAAA,WACA,CAAA,QAQF,CAAA,+BAEI,sBAFJ,CAAA,+BAEI,kBAFJ,CAAA,8BAEI,eAFJ,CAAA,8BAEI,gBCzBF,CAAA,UAAgC,4BAChC,CAAA,aAAgC,+BAChC,CAAA,kBAAgC,oCAChC,CAAA,qBAAgC,uCAEhC,CAAA,WAA8B,wBAC9B,CAAA,aAA8B,0BAC9B,CAAA,mBAA8B,gCAC9B,CAAA,WAA8B,uBAC9B,CAAA,aAA8B,qBAC9B,CAAA,aAA8B,qBAC9B,CAAA,eAA8B,uBAC9B,CAAA,eAA8B,uBAE9B,CAAA,uBAAoC,oCACpC,CAAA,qBAAoC,kCACpC,CAAA,wBAAoC,gCACpC,CAAA,yBAAoC,uCACpC,CAAA,wBAAoC,sCAEpC,CAAA,mBAAiC,gCACjC,CAAA,iBAAiC,8BACjC,CAAA,oBAAiC,4BACjC,CAAA,sBAAiC,8BACjC,CAAA,qBAAiC,6BAEjC,CAAA,qBAAkC,kCAClC,CAAA,mBAAkC,gCAClC,CAAA,sBAAkC,8BAClC,CAAA,uBAAkC,qCAClC,CAAA,sBAAkC,oCAClC,CAAA,uBAAkC,+BAElC,CAAA,iBAAgC,yBAChC,CAAA,kBAAgC,+BAChC,CAAA,gBAAgC,6BAChC,CAAA,mBAAgC,2BAChC,CAAA,qBAAgC,6BAChC,CAAA,oBAAgC,4B/CYhC,CAAA,yB+ClDA,aAAgC,4BAChC,CAAA,gBAAgC,+BAChC,CAAA,qBAAgC,oCAChC,CAAA,wBAAgC,uCAEhC,CAAA,cAA8B,wBAC9B,CAAA,gBAA8B,0BAC9B,CAAA,sBAA8B,gCAC9B,CAAA,cAA8B,uBAC9B,CAAA,gBAA8B,qBAC9B,CAAA,gBAA8B,qBAC9B,CAAA,kBAA8B,uBAC9B,CAAA,kBAA8B,uBAE9B,CAAA,0BAAoC,oCACpC,CAAA,wBAAoC,kCACpC,CAAA,2BAAoC,gCACpC,CAAA,4BAAoC,uCACpC,CAAA,2BAAoC,sCAEpC,CAAA,sBAAiC,gCACjC,CAAA,oBAAiC,8BACjC,CAAA,uBAAiC,4BACjC,CAAA,yBAAiC,8BACjC,CAAA,wBAAiC,6BAEjC,CAAA,wBAAkC,kCAClC,CAAA,sBAAkC,gCAClC,CAAA,yBAAkC,8BAClC,CAAA,0BAAkC,qCAClC,CAAA,yBAAkC,oCAClC,CAAA,0BAAkC,+BAElC,CAAA,oBAAgC,yBAChC,CAAA,qBAAgC,+BAChC,CAAA,mBAAgC,6BAChC,CAAA,sBAAgC,2BAChC,CAAA,wBAAgC,6BAChC,CAAA,uBAAgC,4B/CYhC,CAAA,CAAA,yB+ClDA,aAAgC,4BAChC,CAAA,gBAAgC,+BAChC,CAAA,qBAAgC,oCAChC,CAAA,wBAAgC,uCAEhC,CAAA,cAA8B,wBAC9B,CAAA,gBAA8B,0BAC9B,CAAA,sBAA8B,gCAC9B,CAAA,cAA8B,uBAC9B,CAAA,gBAA8B,qBAC9B,CAAA,gBAA8B,qBAC9B,CAAA,kBAA8B,uBAC9B,CAAA,kBAA8B,uBAE9B,CAAA,0BAAoC,oCACpC,CAAA,wBAAoC,kCACpC,CAAA,2BAAoC,gCACpC,CAAA,4BAAoC,uCACpC,CAAA,2BAAoC,sCAEpC,CAAA,sBAAiC,gCACjC,CAAA,oBAAiC,8BACjC,CAAA,uBAAiC,4BACjC,CAAA,yBAAiC,8BACjC,CAAA,wBAAiC,6BAEjC,CAAA,wBAAkC,kCAClC,CAAA,sBAAkC,gCAClC,CAAA,yBAAkC,8BAClC,CAAA,0BAAkC,qCAClC,CAAA,yBAAkC,oCAClC,CAAA,0BAAkC,+BAElC,CAAA,oBAAgC,yBAChC,CAAA,qBAAgC,+BAChC,CAAA,mBAAgC,6BAChC,CAAA,sBAAgC,2BAChC,CAAA,wBAAgC,6BAChC,CAAA,uBAAgC,4B/CYhC,CAAA,CAAA,yB+ClDA,aAAgC,4BAChC,CAAA,gBAAgC,+BAChC,CAAA,qBAAgC,oCAChC,CAAA,wBAAgC,uCAEhC,CAAA,cAA8B,wBAC9B,CAAA,gBAA8B,0BAC9B,CAAA,sBAA8B,gCAC9B,CAAA,cAA8B,uBAC9B,CAAA,gBAA8B,qBAC9B,CAAA,gBAA8B,qBAC9B,CAAA,kBAA8B,uBAC9B,CAAA,kBAA8B,uBAE9B,CAAA,0BAAoC,oCACpC,CAAA,wBAAoC,kCACpC,CAAA,2BAAoC,gCACpC,CAAA,4BAAoC,uCACpC,CAAA,2BAAoC,sCAEpC,CAAA,sBAAiC,gCACjC,CAAA,oBAAiC,8BACjC,CAAA,uBAAiC,4BACjC,CAAA,yBAAiC,8BACjC,CAAA,wBAAiC,6BAEjC,CAAA,wBAAkC,kCAClC,CAAA,sBAAkC,gCAClC,CAAA,yBAAkC,8BAClC,CAAA,0BAAkC,qCAClC,CAAA,yBAAkC,oCAClC,CAAA,0BAAkC,+BAElC,CAAA,oBAAgC,yBAChC,CAAA,qBAAgC,+BAChC,CAAA,mBAAgC,6BAChC,CAAA,sBAAgC,2BAChC,CAAA,wBAAgC,6BAChC,CAAA,uBAAgC,4B/CYhC,CAAA,CAAA,0B+ClDA,aAAgC,4BAChC,CAAA,gBAAgC,+BAChC,CAAA,qBAAgC,oCAChC,CAAA,wBAAgC,uCAEhC,CAAA,cAA8B,wBAC9B,CAAA,gBAA8B,0BAC9B,CAAA,sBAA8B,gCAC9B,CAAA,cAA8B,uBAC9B,CAAA,gBAA8B,qBAC9B,CAAA,gBAA8B,qBAC9B,CAAA,kBAA8B,uBAC9B,CAAA,kBAA8B,uBAE9B,CAAA,0BAAoC,oCACpC,CAAA,wBAAoC,kCACpC,CAAA,2BAAoC,gCACpC,CAAA,4BAAoC,uCACpC,CAAA,2BAAoC,sCAEpC,CAAA,sBAAiC,gCACjC,CAAA,oBAAiC,8BACjC,CAAA,uBAAiC,4BACjC,CAAA,yBAAiC,8BACjC,CAAA,wBAAiC,6BAEjC,CAAA,wBAAkC,kCAClC,CAAA,sBAAkC,gCAClC,CAAA,yBAAkC,8BAClC,CAAA,0BAAkC,qCAClC,CAAA,yBAAkC,oCAClC,CAAA,0BAAkC,+BAElC,CAAA,oBAAgC,yBAChC,CAAA,qBAAgC,+BAChC,CAAA,mBAAgC,6BAChC,CAAA,sBAAgC,2BAChC,CAAA,wBAAgC,6BAChC,CAAA,uBAAgC,4BC1ChC,CAAA,CAAA,YAAwB,oBACxB,CAAA,aAAwB,qBACxB,CAAA,YAAwB,oBhDoDxB,CAAA,yBgDtDA,eAAwB,oBACxB,CAAA,gBAAwB,qBACxB,CAAA,eAAwB,oBhDoDxB,CAAA,CAAA,yBgDtDA,eAAwB,oBACxB,CAAA,gBAAwB,qBACxB,CAAA,eAAwB,oBhDoDxB,CAAA,CAAA,yBgDtDA,eAAwB,oBACxB,CAAA,gBAAwB,qBACxB,CAAA,eAAwB,oBhDoDxB,CAAA,CAAA,0BgDtDA,eAAwB,oBACxB,CAAA,gBAAwB,qBACxB,CAAA,eAAwB,oBCL1B,CAAA,CAAA,iBAAyB,iCAAA,CAAA,yBAAzB,CAAA,kBAAyB,kCAAA,CAAA,0BAAzB,CAAA,kBAAyB,kCAAA,CAAA,0BCAzB,CAAA,eAAsB,uBAAtB,CAAA,iBAAsB,yBCCtB,CAAA,iBAAyB,yBAAzB,CAAA,mBAAyB,2BAAzB,CAAA,mBAAyB,2BAAzB,CAAA,gBAAyB,wBAAzB,CAAA,iBAAyB,iCAAA,CAAA,yBAK3B,CAAA,WAEE,KAMF,CAAA,yBAPE,cACA,CACA,OACA,CAAA,MACA,CAAA,YAY4B,CAT9B,cAGE,QAM4B,CAAA,2DAD9B,YAEI,uBAAA,CAAA,eACA,CAAA,KACA,CAAA,YCzBJ,CAAA,CAAA,SCEE,iBACA,CAAA,SACA,CAAA,UACA,CAAA,SACA,CAAA,WACA,CAAA,eACA,CAAA,kBACA,CAAA,kBACA,CAAA,QAUA,CAAA,mDAEE,eACA,CAAA,UACA,CAAA,WACA,CAAA,gBACA,CAAA,SACA,CAAA,kBC7BJ,CAAA,WAAa,sDACb,CAAA,QAAU,iDACV,CAAA,WAAa,iDACb,CAAA,aAAe,yBCCX,CAAA,MAAuB,mBAAvB,CAAA,MAAuB,mBAAvB,CAAA,MAAuB,mBAAvB,CAAA,OAAuB,oBAAvB,CAAA,QAAuB,oBAAvB,CAAA,MAAuB,oBAAvB,CAAA,MAAuB,oBAAvB,CAAA,MAAuB,oBAAvB,CAAA,OAAuB,qBAAvB,CAAA,QAAuB,qBAI3B,CAAA,QAAU,wBACV,CAAA,QAAU,yBAIV,CAAA,YAAc,yBACd,CAAA,YAAc,0BAEd,CAAA,QAAU,qBACV,CAAA,QAAU,sBCTF,CAAA,KAAgC,kBAChC,CAAA,YAEE,sBAEF,CAAA,YAEE,wBAEF,CAAA,YAEE,yBAEF,CAAA,YAEE,uBAfF,CAAA,KAAgC,uBAChC,CAAA,YAEE,2BAEF,CAAA,YAEE,6BAEF,CAAA,YAEE,8BAEF,CAAA,YAEE,4BAfF,CAAA,KAAgC,sBAChC,CAAA,YAEE,0BAEF,CAAA,YAEE,4BAEF,CAAA,YAEE,6BAEF,CAAA,YAEE,2BAfF,CAAA,KAAgC,qBAChC,CAAA,YAEE,yBAEF,CAAA,YAEE,2BAEF,CAAA,YAEE,4BAEF,CAAA,YAEE,0BAfF,CAAA,KAAgC,uBAChC,CAAA,YAEE,2BAEF,CAAA,YAEE,6BAEF,CAAA,YAEE,8BAEF,CAAA,YAEE,4BAfF,CAAA,KAAgC,qBAChC,CAAA,YAEE,yBAEF,CAAA,YAEE,2BAEF,CAAA,YAEE,4BAEF,CAAA,YAEE,0BAfF,CAAA,KAAgC,mBAChC,CAAA,YAEE,uBAEF,CAAA,YAEE,yBAEF,CAAA,YAEE,0BAEF,CAAA,YAEE,wBAfF,CAAA,KAAgC,wBAChC,CAAA,YAEE,4BAEF,CAAA,YAEE,8BAEF,CAAA,YAEE,+BAEF,CAAA,YAEE,6BAfF,CAAA,KAAgC,uBAChC,CAAA,YAEE,2BAEF,CAAA,YAEE,6BAEF,CAAA,YAEE,8BAEF,CAAA,YAEE,4BAfF,CAAA,KAAgC,sBAChC,CAAA,YAEE,0BAEF,CAAA,YAEE,4BAEF,CAAA,YAEE,6BAEF,CAAA,YAEE,2BAfF,CAAA,KAAgC,wBAChC,CAAA,YAEE,4BAEF,CAAA,YAEE,8BAEF,CAAA,YAEE,+BAEF,CAAA,YAEE,6BAfF,CAAA,KAAgC,sBAChC,CAAA,YAEE,0BAEF,CAAA,YAEE,4BAEF,CAAA,YAEE,6BAEF,CAAA,YAEE,2BAQF,CAAA,MAAwB,wBACxB,CAAA,cAEE,4BAEF,CAAA,cAEE,8BAEF,CAAA,cAEE,+BAEF,CAAA,cAEE,6BAfF,CAAA,MAAwB,uBACxB,CAAA,cAEE,2BAEF,CAAA,cAEE,6BAEF,CAAA,cAEE,8BAEF,CAAA,cAEE,4BAfF,CAAA,MAAwB,sBACxB,CAAA,cAEE,0BAEF,CAAA,cAEE,4BAEF,CAAA,cAEE,6BAEF,CAAA,cAEE,2BAfF,CAAA,MAAwB,wBACxB,CAAA,cAEE,4BAEF,CAAA,cAEE,8BAEF,CAAA,cAEE,+BAEF,CAAA,cAEE,6BAfF,CAAA,MAAwB,sBACxB,CAAA,cAEE,0BAEF,CAAA,cAEE,4BAEF,CAAA,cAEE,6BAEF,CAAA,cAEE,2BAMN,CAAA,QAAmB,qBACnB,CAAA,kBAEE,yBAEF,CAAA,kBAEE,2BAEF,CAAA,kBAEE,4BAEF,CAAA,kBAEE,0BxDTF,CAAA,yBwDlDI,QAAgC,kBAChC,CAAA,kBAEE,sBAEF,CAAA,kBAEE,wBAEF,CAAA,kBAEE,yBAEF,CAAA,kBAEE,uBAfF,CAAA,QAAgC,uBAChC,CAAA,kBAEE,2BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,8BAEF,CAAA,kBAEE,4BAfF,CAAA,QAAgC,sBAChC,CAAA,kBAEE,0BAEF,CAAA,kBAEE,4BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,2BAfF,CAAA,QAAgC,qBAChC,CAAA,kBAEE,yBAEF,CAAA,kBAEE,2BAEF,CAAA,kBAEE,4BAEF,CAAA,kBAEE,0BAfF,CAAA,QAAgC,uBAChC,CAAA,kBAEE,2BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,8BAEF,CAAA,kBAEE,4BAfF,CAAA,QAAgC,qBAChC,CAAA,kBAEE,yBAEF,CAAA,kBAEE,2BAEF,CAAA,kBAEE,4BAEF,CAAA,kBAEE,0BAfF,CAAA,QAAgC,mBAChC,CAAA,kBAEE,uBAEF,CAAA,kBAEE,yBAEF,CAAA,kBAEE,0BAEF,CAAA,kBAEE,wBAfF,CAAA,QAAgC,wBAChC,CAAA,kBAEE,4BAEF,CAAA,kBAEE,8BAEF,CAAA,kBAEE,+BAEF,CAAA,kBAEE,6BAfF,CAAA,QAAgC,uBAChC,CAAA,kBAEE,2BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,8BAEF,CAAA,kBAEE,4BAfF,CAAA,QAAgC,sBAChC,CAAA,kBAEE,0BAEF,CAAA,kBAEE,4BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,2BAfF,CAAA,QAAgC,wBAChC,CAAA,kBAEE,4BAEF,CAAA,kBAEE,8BAEF,CAAA,kBAEE,+BAEF,CAAA,kBAEE,6BAfF,CAAA,QAAgC,sBAChC,CAAA,kBAEE,0BAEF,CAAA,kBAEE,4BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,2BAQF,CAAA,SAAwB,wBACxB,CAAA,oBAEE,4BAEF,CAAA,oBAEE,8BAEF,CAAA,oBAEE,+BAEF,CAAA,oBAEE,6BAfF,CAAA,SAAwB,uBACxB,CAAA,oBAEE,2BAEF,CAAA,oBAEE,6BAEF,CAAA,oBAEE,8BAEF,CAAA,oBAEE,4BAfF,CAAA,SAAwB,sBACxB,CAAA,oBAEE,0BAEF,CAAA,oBAEE,4BAEF,CAAA,oBAEE,6BAEF,CAAA,oBAEE,2BAfF,CAAA,SAAwB,wBACxB,CAAA,oBAEE,4BAEF,CAAA,oBAEE,8BAEF,CAAA,oBAEE,+BAEF,CAAA,oBAEE,6BAfF,CAAA,SAAwB,sBACxB,CAAA,oBAEE,0BAEF,CAAA,oBAEE,4BAEF,CAAA,oBAEE,6BAEF,CAAA,oBAEE,2BAMN,CAAA,WAAmB,qBACnB,CAAA,wBAEE,yBAEF,CAAA,wBAEE,2BAEF,CAAA,wBAEE,4BAEF,CAAA,wBAEE,0BxDTF,CAAA,CAAA,yBwDlDI,QAAgC,kBAChC,CAAA,kBAEE,sBAEF,CAAA,kBAEE,wBAEF,CAAA,kBAEE,yBAEF,CAAA,kBAEE,uBAfF,CAAA,QAAgC,uBAChC,CAAA,kBAEE,2BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,8BAEF,CAAA,kBAEE,4BAfF,CAAA,QAAgC,sBAChC,CAAA,kBAEE,0BAEF,CAAA,kBAEE,4BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,2BAfF,CAAA,QAAgC,qBAChC,CAAA,kBAEE,yBAEF,CAAA,kBAEE,2BAEF,CAAA,kBAEE,4BAEF,CAAA,kBAEE,0BAfF,CAAA,QAAgC,uBAChC,CAAA,kBAEE,2BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,8BAEF,CAAA,kBAEE,4BAfF,CAAA,QAAgC,qBAChC,CAAA,kBAEE,yBAEF,CAAA,kBAEE,2BAEF,CAAA,kBAEE,4BAEF,CAAA,kBAEE,0BAfF,CAAA,QAAgC,mBAChC,CAAA,kBAEE,uBAEF,CAAA,kBAEE,yBAEF,CAAA,kBAEE,0BAEF,CAAA,kBAEE,wBAfF,CAAA,QAAgC,wBAChC,CAAA,kBAEE,4BAEF,CAAA,kBAEE,8BAEF,CAAA,kBAEE,+BAEF,CAAA,kBAEE,6BAfF,CAAA,QAAgC,uBAChC,CAAA,kBAEE,2BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,8BAEF,CAAA,kBAEE,4BAfF,CAAA,QAAgC,sBAChC,CAAA,kBAEE,0BAEF,CAAA,kBAEE,4BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,2BAfF,CAAA,QAAgC,wBAChC,CAAA,kBAEE,4BAEF,CAAA,kBAEE,8BAEF,CAAA,kBAEE,+BAEF,CAAA,kBAEE,6BAfF,CAAA,QAAgC,sBAChC,CAAA,kBAEE,0BAEF,CAAA,kBAEE,4BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,2BAQF,CAAA,SAAwB,wBACxB,CAAA,oBAEE,4BAEF,CAAA,oBAEE,8BAEF,CAAA,oBAEE,+BAEF,CAAA,oBAEE,6BAfF,CAAA,SAAwB,uBACxB,CAAA,oBAEE,2BAEF,CAAA,oBAEE,6BAEF,CAAA,oBAEE,8BAEF,CAAA,oBAEE,4BAfF,CAAA,SAAwB,sBACxB,CAAA,oBAEE,0BAEF,CAAA,oBAEE,4BAEF,CAAA,oBAEE,6BAEF,CAAA,oBAEE,2BAfF,CAAA,SAAwB,wBACxB,CAAA,oBAEE,4BAEF,CAAA,oBAEE,8BAEF,CAAA,oBAEE,+BAEF,CAAA,oBAEE,6BAfF,CAAA,SAAwB,sBACxB,CAAA,oBAEE,0BAEF,CAAA,oBAEE,4BAEF,CAAA,oBAEE,6BAEF,CAAA,oBAEE,2BAMN,CAAA,WAAmB,qBACnB,CAAA,wBAEE,yBAEF,CAAA,wBAEE,2BAEF,CAAA,wBAEE,4BAEF,CAAA,wBAEE,0BxDTF,CAAA,CAAA,yBwDlDI,QAAgC,kBAChC,CAAA,kBAEE,sBAEF,CAAA,kBAEE,wBAEF,CAAA,kBAEE,yBAEF,CAAA,kBAEE,uBAfF,CAAA,QAAgC,uBAChC,CAAA,kBAEE,2BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,8BAEF,CAAA,kBAEE,4BAfF,CAAA,QAAgC,sBAChC,CAAA,kBAEE,0BAEF,CAAA,kBAEE,4BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,2BAfF,CAAA,QAAgC,qBAChC,CAAA,kBAEE,yBAEF,CAAA,kBAEE,2BAEF,CAAA,kBAEE,4BAEF,CAAA,kBAEE,0BAfF,CAAA,QAAgC,uBAChC,CAAA,kBAEE,2BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,8BAEF,CAAA,kBAEE,4BAfF,CAAA,QAAgC,qBAChC,CAAA,kBAEE,yBAEF,CAAA,kBAEE,2BAEF,CAAA,kBAEE,4BAEF,CAAA,kBAEE,0BAfF,CAAA,QAAgC,mBAChC,CAAA,kBAEE,uBAEF,CAAA,kBAEE,yBAEF,CAAA,kBAEE,0BAEF,CAAA,kBAEE,wBAfF,CAAA,QAAgC,wBAChC,CAAA,kBAEE,4BAEF,CAAA,kBAEE,8BAEF,CAAA,kBAEE,+BAEF,CAAA,kBAEE,6BAfF,CAAA,QAAgC,uBAChC,CAAA,kBAEE,2BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,8BAEF,CAAA,kBAEE,4BAfF,CAAA,QAAgC,sBAChC,CAAA,kBAEE,0BAEF,CAAA,kBAEE,4BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,2BAfF,CAAA,QAAgC,wBAChC,CAAA,kBAEE,4BAEF,CAAA,kBAEE,8BAEF,CAAA,kBAEE,+BAEF,CAAA,kBAEE,6BAfF,CAAA,QAAgC,sBAChC,CAAA,kBAEE,0BAEF,CAAA,kBAEE,4BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,2BAQF,CAAA,SAAwB,wBACxB,CAAA,oBAEE,4BAEF,CAAA,oBAEE,8BAEF,CAAA,oBAEE,+BAEF,CAAA,oBAEE,6BAfF,CAAA,SAAwB,uBACxB,CAAA,oBAEE,2BAEF,CAAA,oBAEE,6BAEF,CAAA,oBAEE,8BAEF,CAAA,oBAEE,4BAfF,CAAA,SAAwB,sBACxB,CAAA,oBAEE,0BAEF,CAAA,oBAEE,4BAEF,CAAA,oBAEE,6BAEF,CAAA,oBAEE,2BAfF,CAAA,SAAwB,wBACxB,CAAA,oBAEE,4BAEF,CAAA,oBAEE,8BAEF,CAAA,oBAEE,+BAEF,CAAA,oBAEE,6BAfF,CAAA,SAAwB,sBACxB,CAAA,oBAEE,0BAEF,CAAA,oBAEE,4BAEF,CAAA,oBAEE,6BAEF,CAAA,oBAEE,2BAMN,CAAA,WAAmB,qBACnB,CAAA,wBAEE,yBAEF,CAAA,wBAEE,2BAEF,CAAA,wBAEE,4BAEF,CAAA,wBAEE,0BxDTF,CAAA,CAAA,0BwDlDI,QAAgC,kBAChC,CAAA,kBAEE,sBAEF,CAAA,kBAEE,wBAEF,CAAA,kBAEE,yBAEF,CAAA,kBAEE,uBAfF,CAAA,QAAgC,uBAChC,CAAA,kBAEE,2BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,8BAEF,CAAA,kBAEE,4BAfF,CAAA,QAAgC,sBAChC,CAAA,kBAEE,0BAEF,CAAA,kBAEE,4BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,2BAfF,CAAA,QAAgC,qBAChC,CAAA,kBAEE,yBAEF,CAAA,kBAEE,2BAEF,CAAA,kBAEE,4BAEF,CAAA,kBAEE,0BAfF,CAAA,QAAgC,uBAChC,CAAA,kBAEE,2BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,8BAEF,CAAA,kBAEE,4BAfF,CAAA,QAAgC,qBAChC,CAAA,kBAEE,yBAEF,CAAA,kBAEE,2BAEF,CAAA,kBAEE,4BAEF,CAAA,kBAEE,0BAfF,CAAA,QAAgC,mBAChC,CAAA,kBAEE,uBAEF,CAAA,kBAEE,yBAEF,CAAA,kBAEE,0BAEF,CAAA,kBAEE,wBAfF,CAAA,QAAgC,wBAChC,CAAA,kBAEE,4BAEF,CAAA,kBAEE,8BAEF,CAAA,kBAEE,+BAEF,CAAA,kBAEE,6BAfF,CAAA,QAAgC,uBAChC,CAAA,kBAEE,2BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,8BAEF,CAAA,kBAEE,4BAfF,CAAA,QAAgC,sBAChC,CAAA,kBAEE,0BAEF,CAAA,kBAEE,4BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,2BAfF,CAAA,QAAgC,wBAChC,CAAA,kBAEE,4BAEF,CAAA,kBAEE,8BAEF,CAAA,kBAEE,+BAEF,CAAA,kBAEE,6BAfF,CAAA,QAAgC,sBAChC,CAAA,kBAEE,0BAEF,CAAA,kBAEE,4BAEF,CAAA,kBAEE,6BAEF,CAAA,kBAEE,2BAQF,CAAA,SAAwB,wBACxB,CAAA,oBAEE,4BAEF,CAAA,oBAEE,8BAEF,CAAA,oBAEE,+BAEF,CAAA,oBAEE,6BAfF,CAAA,SAAwB,uBACxB,CAAA,oBAEE,2BAEF,CAAA,oBAEE,6BAEF,CAAA,oBAEE,8BAEF,CAAA,oBAEE,4BAfF,CAAA,SAAwB,sBACxB,CAAA,oBAEE,0BAEF,CAAA,oBAEE,4BAEF,CAAA,oBAEE,6BAEF,CAAA,oBAEE,2BAfF,CAAA,SAAwB,wBACxB,CAAA,oBAEE,4BAEF,CAAA,oBAEE,8BAEF,CAAA,oBAEE,+BAEF,CAAA,oBAEE,6BAfF,CAAA,SAAwB,sBACxB,CAAA,oBAEE,0BAEF,CAAA,oBAEE,4BAEF,CAAA,oBAEE,6BAEF,CAAA,oBAEE,2BAMN,CAAA,WAAmB,qBACnB,CAAA,wBAEE,yBAEF,CAAA,wBAEE,2BAEF,CAAA,wBAEE,4BAEF,CAAA,wBAEE,0BCjEN,CAAA,CAAA,sBAEI,iBACA,CAAA,KACA,CAAA,OACA,CAAA,QACA,CAAA,MACA,CAAA,SAEA,CAAA,mBACA,CAAA,UAEA,CAAA,4BCVJ,CAAA,gBAAkB,oGAIlB,CAAA,cAAiB,4BACjB,CAAA,WAAiB,4BACjB,CAAA,aAAiB,4BACjB,CAAA,eCTE,eACA,CAAA,sBACA,CAAA,kBDeE,CAAA,WAAwB,yBACxB,CAAA,YAAwB,0BACxB,CAAA,aAAwB,2B1DqCxB,CAAA,yB0DvCA,cAAwB,yBACxB,CAAA,eAAwB,0BACxB,CAAA,gBAAwB,2B1DqCxB,CAAA,CAAA,yB0DvCA,cAAwB,yBACxB,CAAA,eAAwB,0BACxB,CAAA,gBAAwB,2B1DqCxB,CAAA,CAAA,yB0DvCA,cAAwB,yBACxB,CAAA,eAAwB,0BACxB,CAAA,gBAAwB,2B1DqCxB,CAAA,CAAA,0B0DvCA,cAAwB,yBACxB,CAAA,eAAwB,0BACxB,CAAA,gBAAwB,2BAM5B,CAAA,CAAA,gBAAmB,kCACnB,CAAA,gBAAmB,kCACnB,CAAA,iBAAmB,mCAInB,CAAA,mBAAuB,yBACvB,CAAA,qBAAuB,6BACvB,CAAA,oBAAuB,yBACvB,CAAA,kBAAuB,yBACvB,CAAA,oBAAuB,4BACvB,CAAA,aAAuB,2BAIvB,CAAA,YAAc,oBEvCZ,CAAA,cACE,uBrEUF,CAAA,0CqELM,uBANN,CAAA,gBACE,uBrEUF,CAAA,8CqELM,uBANN,CAAA,cACE,uBrEUF,CAAA,0CqELM,uBANN,CAAA,WACE,uBrEUF,CAAA,oCqELM,uBANN,CAAA,cACE,uBrEUF,CAAA,0CqELM,uBANN,CAAA,aACE,uBrEUF,CAAA,wCqELM,uBANN,CAAA,YACE,uBrEUF,CAAA,sCqELM,uBANN,CAAA,WACE,uBrEUF,CAAA,oCqELM,uBFuCR,CAAA,WAAa,uBACb,CAAA,YAAc,uBAEd,CAAA,eAAiB,8BACjB,CAAA,eAAiB,kCAIjB,CAAA,WGvDE,UACA,CAAA,iBACA,CAAA,gBACA,CAAA,wBACA,CAAA,QHuDF,CAAA,sBAAwB,8BAExB,CAAA,YACE,+BACA,CAAA,8BAKF,CAAA,YAAc,uBIjEd,CAAA,SACE,4BAGF,CAAA,WACE,2BCAA,CAAA,a5Eu/TA,iB4Ej/TI,0BAEA,CAAA,yBAGF,CAAA,YAEI,yBASJ,CAAA,kBACE,4B3E8LN,CAAA,I2E/KM,8B5E+9TJ,CAAA,e4E39TI,wB5Eg+TJ,CAAA,sB4E/9TI,uB5Em+TJ,CACA,Q4Ez9TI,SACA,CAAA,QAGF,C5E09TF,M4Ex9TI,sBAQF,CAAA,MACE,O3EnCN,C2EwCI,gBACE,yB7CrEN,CAAA,Q6C0EM,YxCtFN,CAAA,OwCyFM,qB7D1FN,CAAA,O6D8FM,kCADF,CAAA,oBAKI,+B5Em9TN,CAAA,sC4E58TM,kC7DoBR,CAAA,Y6DfM,a5Eg9TJ,CAAA,2E4E18TM,oB7DTR,CAAA,sB6DcM,aACA,CAAA,oBAAA,CAAA","file":"2.00866533.chunk.css","sourcesContent":["/*!\n * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome\n * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */@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}\n","/*! Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */\n/* Uncomment the following line when using as a custom stylesheet */\n/* @import \"https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700\"; */\nhtml{font-family:sans-serif;-webkit-text-size-adjust:100%}\na{background:none}\na:focus{outline:thin dotted}\na:active,a:hover{outline:0}\nh1{font-size:2em;margin:.67em 0}\nb,strong{font-weight:bold}\nabbr{font-size:.9em}\nabbr[title]{cursor:help;border-bottom:1px dotted #dddddf;text-decoration:none}\ndfn{font-style:italic}\nhr{height:0}\nmark{background:#ff0;color:#000}\ncode,kbd,pre,samp{font-family:monospace;font-size:1em}\npre{white-space:pre-wrap}\nq{quotes:\"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\"}\nsmall{font-size:80%}\nsub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}\nsup{top:-.5em}\nsub{bottom:-.25em}\nimg{border:0}\nsvg:not(:root){overflow:hidden}\nfigure{margin:0}\naudio,video{display:inline-block}\naudio:not([controls]){display:none;height:0}\nfieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}\nlegend{border:0;padding:0}\nbutton,input,select,textarea{font-family:inherit;font-size:100%;margin:0}\nbutton,input{line-height:normal}\nbutton,select{text-transform:none}\nbutton,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}\nbutton[disabled],html input[disabled]{cursor:default}\ninput[type=checkbox],input[type=radio]{padding:0}\nbutton::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}\ntextarea{overflow:auto;vertical-align:top}\ntable{border-collapse:collapse;border-spacing:0}\n*,::before,::after{box-sizing:border-box}\nhtml,body{font-size:100%}\nbody{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:\"Noto Serif\",\"DejaVu Serif\",serif;line-height:1;position:relative;cursor:auto;-moz-tab-size:4;-o-tab-size:4;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}\na:hover{cursor:pointer}\nimg,object,embed{max-width:100%;height:auto}\nobject,embed{height:100%}\nimg{-ms-interpolation-mode:bicubic}\n.left{float:left!important}\n.right{float:right!important}\n.text-left{text-align:left!important}\n.text-right{text-align:right!important}\n.text-center{text-align:center!important}\n.text-justify{text-align:justify!important}\n.hide{display:none}\nimg,object,svg{display:inline-block;vertical-align:middle}\ntextarea{height:auto;min-height:50px}\nselect{width:100%}\n.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}\ndiv,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}\na{color:#2156a5;text-decoration:underline;line-height:inherit}\na:hover,a:focus{color:#1d4b8f}\na img{border:0}\np{line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}\np aside{font-size:.875em;line-height:1.35;font-style:italic}\nh1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:\"Open Sans\",\"DejaVu Sans\",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}\nh1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}\nh1{font-size:2.125em}\nh2{font-size:1.6875em}\nh3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}\nh4,h5{font-size:1.125em}\nh6{font-size:1em}\nhr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em}\nem,i{font-style:italic;line-height:inherit}\nstrong,b{font-weight:bold;line-height:inherit}\nsmall{font-size:60%;line-height:inherit}\ncode{font-family:\"Droid Sans Mono\",\"DejaVu Sans Mono\",monospace;font-weight:400;color:rgba(0,0,0,.9)}\nul,ol,dl{line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}\nul,ol{margin-left:1.5em}\nul li ul,ul li ol{margin-left:1.25em;margin-bottom:0}\nul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}\nul.square{list-style-type:square}\nul.circle{list-style-type:circle}\nul.disc{list-style-type:disc}\nol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}\ndl dt{margin-bottom:.3125em;font-weight:bold}\ndl dd{margin-bottom:1.25em}\nblockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}\nblockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}\n@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}\nh1{font-size:2.75em}\nh2{font-size:2.3125em}\nh3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}\nh4{font-size:1.4375em}}\ntable{background:#fff;margin-bottom:1.25em;border:1px solid #dedede;word-wrap:normal}\ntable thead,table tfoot{background:#f7f8f7}\ntable thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}\ntable tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}\ntable tr.even,table tr.alt{background:#f8f8f7}\ntable thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6}\nh1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}\nh1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}\n.center{margin-left:auto;margin-right:auto}\n.stretch{width:100%}\n.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:\" \";display:table}\n.clearfix::after,.float-group::after{clear:both}\n:not(pre).nobreak{word-wrap:normal}\n:not(pre).nowrap{white-space:nowrap}\n:not(pre).pre-wrap{white-space:pre-wrap}\n:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}\npre{color:rgba(0,0,0,.9);font-family:\"Droid Sans Mono\",\"DejaVu Sans Mono\",monospace;line-height:1.45;text-rendering:optimizeSpeed}\npre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}\npre>code{display:block}\npre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}\nem em{font-style:normal}\nstrong strong{font-weight:400}\n.keyseq{color:rgba(51,51,51,.8)}\nkbd{font-family:\"Droid Sans Mono\",\"DejaVu Sans Mono\",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 0 0 .1em #fff;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}\n.keyseq kbd:first-child{margin-left:0}\n.keyseq kbd:last-child{margin-right:0}\n.menuseq,.menuref{color:#000}\n.menuseq b:not(.caret),.menuref{font-weight:inherit}\n.menuseq{word-spacing:-.02em}\n.menuseq b.caret{font-size:1.25em;line-height:.8}\n.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}\nb.button::before,b.button::after{position:relative;top:-1px;font-weight:400}\nb.button::before{content:\"[\";padding:0 3px 0 2px}\nb.button::after{content:\"]\";padding:0 2px 0 3px}\np a>code:hover{color:rgba(0,0,0,.9)}\n#header,#content,#footnotes,#footer{width:100%;margin:0 auto;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}\n#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:\" \";display:table}\n#header::after,#content::after,#footnotes::after,#footer::after{clear:both}\n#content{margin-top:1.25em}\n#content::before{content:none}\n#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}\n#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}\n#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}\n#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:flex;flex-flow:row wrap}\n#header .details span:first-child{margin-left:-.125em}\n#header .details span.email a{color:rgba(0,0,0,.85)}\n#header .details br{display:none}\n#header .details br+span::before{content:\"\\00a0\\2013\\00a0\"}\n#header .details br+span.author::before{content:\"\\00a0\\22c5\\00a0\";color:rgba(0,0,0,.85)}\n#header .details br+span#revremark::before{content:\"\\00a0|\\00a0\"}\n#header #revnumber{text-transform:capitalize}\n#header #revnumber::after{content:\"\\00a0\"}\n#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}\n#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}\n#toc>ul{margin-left:.125em}\n#toc ul.sectlevel0>li>a{font-style:italic}\n#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}\n#toc ul{font-family:\"Open Sans\",\"DejaVu Sans\",sans-serif;list-style-type:none}\n#toc li{line-height:1.3334;margin-top:.3334em}\n#toc a{text-decoration:none}\n#toc a:active{text-decoration:underline}\n#toctitle{color:#7a2518;font-size:1.2em}\n@media screen and (min-width:768px){#toctitle{font-size:1.375em}\nbody.toc2{padding-left:15em;padding-right:0}\n#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}\n#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}\n#toc.toc2>ul{font-size:.9em;margin-bottom:0}\n#toc.toc2 ul ul{margin-left:0;padding-left:1em}\n#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}\nbody.toc2.toc-right{padding-left:0;padding-right:15em}\nbody.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}\n@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}\n#toc.toc2{width:20em}\n#toc.toc2 #toctitle{font-size:1.375em}\n#toc.toc2>ul{font-size:.95em}\n#toc.toc2 ul ul{padding-left:1.25em}\nbody.toc2.toc-right{padding-left:0;padding-right:20em}}\n#content #toc{border:1px solid #e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;border-radius:4px}\n#content #toc>:first-child{margin-top:0}\n#content #toc>:last-child{margin-bottom:0}\n#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}\n#footer-text{color:hsla(0,0%,100%,.8);line-height:1.44}\n#content{margin-bottom:.625em}\n.sect1{padding-bottom:.625em}\n@media screen and (min-width:768px){#content{margin-bottom:1.25em}\n.sect1{padding-bottom:1.25em}}\n.sect1:last-child{padding-bottom:0}\n.sect1+.sect1{border-top:1px solid #e7e7e9}\n#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}\n#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:\"\\00A7\";font-size:.85em;display:block;padding-top:.1em}\n#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}\n#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}\n#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}\ndetails,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}\ndetails{margin-left:1.25rem}\ndetails>summary{cursor:pointer;display:block;position:relative;line-height:1.6;margin-bottom:.625rem;-webkit-tap-highlight-color:transparent}\ndetails>summary::before{content:\"\";border:solid transparent;border-left:solid;border-width:.3em 0 .3em .5em;position:absolute;top:.5em;left:-1.25rem;transform:translateX(15%)}\ndetails[open]>summary::before{border:solid transparent;border-top:solid;border-width:.5em .3em 0;transform:translateY(15%)}\ndetails>summary::after{content:\"\";width:1.25rem;height:1em;position:absolute;top:.3em;left:-1.25rem}\n.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:\"Noto Serif\",\"DejaVu Serif\",serif;font-size:1rem;font-style:italic}\ntable.tableblock.fit-content>caption.title{white-space:nowrap;width:0}\n.paragraph.lead>p,#preamble>.sectionbody>[class=paragraph]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}\n.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}\n.admonitionblock>table td.icon{text-align:center;width:80px}\n.admonitionblock>table td.icon img{max-width:none}\n.admonitionblock>table td.icon .title{font-weight:bold;font-family:\"Open Sans\",\"DejaVu Sans\",sans-serif;text-transform:uppercase}\n.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}\n.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}\n.exampleblock>.content{border:1px solid #e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;border-radius:4px}\n.exampleblock>.content>:first-child{margin-top:0}\n.exampleblock>.content>:last-child{margin-bottom:0}\n.sidebarblock{border:1px solid #dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;border-radius:4px}\n.sidebarblock>:first-child{margin-top:0}\n.sidebarblock>:last-child{margin-bottom:0}\n.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}\n.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}\n.literalblock pre,.listingblock>.content>pre{border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}\n@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}\n@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}\n.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class=highlight],.listingblock>.content>pre[class^=\"highlight \"]{background:#f7f7f8}\n.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}\n.listingblock>.content{position:relative}\n.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}\n.listingblock:hover code[data-lang]::before{display:block}\n.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}\n.listingblock.terminal pre .command:not([data-prompt])::before{content:\"$\"}\n.listingblock pre.highlightjs{padding:0}\n.listingblock pre.highlightjs>code{padding:1em;border-radius:4px}\n.listingblock pre.prettyprint{border-width:0}\n.prettyprint{background:#f7f7f8}\npre.prettyprint .linenums{line-height:1.45;margin-left:2em}\npre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}\npre.prettyprint li code[data-lang]::before{opacity:1}\npre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}\ntable.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}\ntable.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}\ntable.linenotable td.code{padding-left:.75em}\ntable.linenotable td.linenos{border-right:1px solid;opacity:.35;padding-right:.5em}\npre.pygments .lineno{border-right:1px solid;opacity:.35;display:inline-block;margin-right:.75em}\npre.pygments .lineno::before{content:\"\";margin-right:-.125em}\n.quoteblock{margin:0 1em 1.25em 1.5em;display:table}\n.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}\n.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}\n.quoteblock blockquote{margin:0;padding:0;border:0}\n.quoteblock blockquote::before{content:\"\\201c\";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}\n.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}\n.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}\n.verseblock{margin:0 1em 1.25em}\n.verseblock pre{font-family:\"Open Sans\",\"DejaVu Sans\",sans-serif;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}\n.verseblock pre strong{font-weight:400}\n.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}\n.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}\n.quoteblock .attribution br,.verseblock .attribution br{display:none}\n.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}\n.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}\n.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}\n.quoteblock.abstract{margin:0 1em 1.25em;display:block}\n.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}\n.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}\n.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}\n.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}\n.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;font-size:.85rem;text-align:left;margin-right:0}\np.tableblock:last-child{margin-bottom:0}\ntd.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere}\ntd.tableblock>.content>:last-child{margin-bottom:-1.25em}\ntable.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}\ntable.grid-all>*>tr>*{border-width:1px}\ntable.grid-cols>*>tr>*{border-width:0 1px}\ntable.grid-rows>*>tr>*{border-width:1px 0}\ntable.frame-all{border-width:1px}\ntable.frame-ends{border-width:1px 0}\ntable.frame-sides{border-width:0 1px}\ntable.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}\ntable.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}\ntable.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}\ntable.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0}\ntable.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7}\nth.halign-left,td.halign-left{text-align:left}\nth.halign-right,td.halign-right{text-align:right}\nth.halign-center,td.halign-center{text-align:center}\nth.valign-top,td.valign-top{vertical-align:top}\nth.valign-bottom,td.valign-bottom{vertical-align:bottom}\nth.valign-middle,td.valign-middle{vertical-align:middle}\ntable thead th,table tfoot th{font-weight:bold}\ntbody tr th{background:#f7f8f7}\ntbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}\np.tableblock>code:only-child{background:none;padding:0}\np.tableblock{font-size:1em}\nol{margin-left:1.75em}\nul li ol{margin-left:1.5em}\ndl dd{margin-left:1.125em}\ndl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}\nol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}\nul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}\nul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}\nul.unstyled,ol.unstyled{margin-left:0}\nul.checklist>li>p:first-child{margin-left:-1em}\nul.checklist>li>p:first-child>.fa-square-o:first-child,ul.checklist>li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}\nul.checklist>li>p:first-child>input[type=checkbox]:first-child{margin-right:.25em}\nul.inline{display:flex;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}\nul.inline>li{margin-left:1.25em}\n.unstyled dl dt{font-weight:400;font-style:normal}\nol.arabic{list-style-type:decimal}\nol.decimal{list-style-type:decimal-leading-zero}\nol.loweralpha{list-style-type:lower-alpha}\nol.upperalpha{list-style-type:upper-alpha}\nol.lowerroman{list-style-type:lower-roman}\nol.upperroman{list-style-type:upper-roman}\nol.lowergreek{list-style-type:lower-greek}\n.hdlist>table,.colist>table{border:0;background:none}\n.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}\ntd.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}\ntd.hdlist1{font-weight:bold;padding-bottom:1.25em}\ntd.hdlist2{word-wrap:anywhere}\n.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}\n.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}\n.colist td:not([class]):first-child img{max-width:none}\n.colist td:not([class]):last-child{padding:.25em 0}\n.thumb,.th{line-height:0;display:inline-block;border:4px solid #fff;box-shadow:0 0 0 1px #ddd}\n.imageblock.left{margin:.25em .625em 1.25em 0}\n.imageblock.right{margin:.25em 0 1.25em .625em}\n.imageblock>.title{margin-bottom:0}\n.imageblock.thumb,.imageblock.th{border-width:6px}\n.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}\n.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}\n.image.left{margin-right:.625em}\n.image.right{margin-left:.625em}\na.image{text-decoration:none;display:inline-block}\na.image object{pointer-events:none}\nsup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}\nsup.footnote a,sup.footnoteref a{text-decoration:none}\nsup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}\n#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}\n#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}\n#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}\n#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}\n#footnotes .footnote:last-of-type{margin-bottom:0}\n#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}\n.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}\n.gist .file-data>table td.line-data{width:99%}\ndiv.unbreakable{page-break-inside:avoid}\n.big{font-size:larger}\n.small{font-size:smaller}\n.underline{text-decoration:underline}\n.overline{text-decoration:overline}\n.line-through{text-decoration:line-through}\n.aqua{color:#00bfbf}\n.aqua-background{background:#00fafa}\n.black{color:#000}\n.black-background{background:#000}\n.blue{color:#0000bf}\n.blue-background{background:#0000fa}\n.fuchsia{color:#bf00bf}\n.fuchsia-background{background:#fa00fa}\n.gray{color:#606060}\n.gray-background{background:#7d7d7d}\n.green{color:#006000}\n.green-background{background:#007d00}\n.lime{color:#00bf00}\n.lime-background{background:#00fa00}\n.maroon{color:#600000}\n.maroon-background{background:#7d0000}\n.navy{color:#000060}\n.navy-background{background:#00007d}\n.olive{color:#606000}\n.olive-background{background:#7d7d00}\n.purple{color:#600060}\n.purple-background{background:#7d007d}\n.red{color:#bf0000}\n.red-background{background:#fa0000}\n.silver{color:#909090}\n.silver-background{background:#bcbcbc}\n.teal{color:#006060}\n.teal-background{background:#007d7d}\n.white{color:#bfbfbf}\n.white-background{background:#fafafa}\n.yellow{color:#bfbf00}\n.yellow-background{background:#fafa00}\nspan.icon>.fa{cursor:default}\na span.icon>.fa{cursor:inherit}\n.admonitionblock td.icon [class^=\"fa icon-\"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}\n.admonitionblock td.icon .icon-note::before{content:\"\\f05a\";color:#19407c}\n.admonitionblock td.icon .icon-tip::before{content:\"\\f0eb\";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}\n.admonitionblock td.icon .icon-warning::before{content:\"\\f071\";color:#bf6900}\n.admonitionblock td.icon .icon-caution::before{content:\"\\f06d\";color:#bf3400}\n.admonitionblock td.icon .icon-important::before{content:\"\\f06a\";color:#bf0000}\n.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:\"Open Sans\",\"DejaVu Sans\",sans-serif;font-style:normal;font-weight:bold}\n.conum[data-value] *{color:#fff!important}\n.conum[data-value]+b{display:none}\n.conum[data-value]::after{content:attr(data-value)}\npre .conum[data-value]{position:relative;top:-.125em}\nb.conum *{color:inherit!important}\n.conum:not([data-value]):empty{display:none}\ndt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}\nh1,h2,p,td.content,span.alt,summary{letter-spacing:-.01em}\np strong,td.content strong,div.footnote strong{letter-spacing:-.005em}\np,blockquote,dt,td.content,span.alt,summary{font-size:1.0625rem}\np{margin-bottom:1.25rem}\n.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}\n.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;box-shadow:0 1px 4px #e0e0dc}\n.print-only{display:none!important}\n@page{margin:1.25cm .75cm}\n@media print{*{box-shadow:none!important;text-shadow:none!important}\nhtml{font-size:80%}\na{color:inherit!important;text-decoration:underline!important}\na.bare,a[href^=\"#\"],a[href^=\"mailto:\"]{text-decoration:none!important}\na[href^=\"http:\"]:not(.bare)::after,a[href^=\"https:\"]:not(.bare)::after{content:\"(\" attr(href) \")\";display:inline-block;font-size:.875em;padding-left:.25em}\nabbr[title]{border-bottom:1px dotted}\nabbr[title]::after{content:\" (\" attr(title) \")\"}\npre,blockquote,tr,img,object,svg{page-break-inside:avoid}\nthead{display:table-header-group}\nsvg{max-width:100%}\np,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}\nh2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}\n#header,#content,#footnotes,#footer{max-width:none}\n#toc,.sidebarblock,.exampleblock>.content{background:none!important}\n#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}\nbody.book #header{text-align:center}\nbody.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}\nbody.book #header .details{border:0!important;display:block;padding:0!important}\nbody.book #header .details span:first-child{margin-left:0!important}\nbody.book #header .details br{display:block}\nbody.book #header .details br+span::before{content:none!important}\nbody.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}\nbody.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}\n.listingblock code[data-lang]::before{display:block}\n#footer{padding:0 .9375em}\n.hide-on-print{display:none!important}\n.print-only{display:block!important}\n.hide-for-print{display:none!important}\n.show-for-print{display:inherit!important}}\n@media amzn-kf8,print{#header>h1:first-child{margin-top:1.25rem}\n.sect1{padding:0!important}\n.sect1+.sect1{border:0}\n#footer{background:none}\n#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}\n@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}\n","/*!\n * Bootstrap v4.6.1 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"code\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"input-group\";\n@import \"custom-forms\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"jumbotron\";\n@import \"alert\";\n@import \"progress\";\n@import \"media\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"utilities\";\n@import \"print\";\n",":root {\n // Custom variable values only support SassScript inside `#{}`.\n @each $color, $value in $colors {\n --#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$color}: #{$value};\n }\n\n @each $bp, $value in $grid-breakpoints {\n --breakpoint-#{$bp}: #{$value};\n }\n\n // Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --font-family-sans-serif: #{inspect($font-family-sans-serif)};\n --font-family-monospace: #{inspect($font-family-monospace)};\n}\n","/*!\n * Bootstrap v4.6.1 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root {\n --blue: #007bff;\n --indigo: #6610f2;\n --purple: #6f42c1;\n --pink: #e83e8c;\n --red: #dc3545;\n --orange: #fd7e14;\n --yellow: #ffc107;\n --green: #28a745;\n --teal: #20c997;\n --cyan: #17a2b8;\n --white: #fff;\n --gray: #6c757d;\n --gray-dark: #343a40;\n --primary: #007bff;\n --secondary: #6c757d;\n --success: #28a745;\n --info: #17a2b8;\n --warning: #ffc107;\n --danger: #dc3545;\n --light: #f8f9fa;\n --dark: #343a40;\n --breakpoint-xs: 0;\n --breakpoint-sm: 576px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 992px;\n --breakpoint-xl: 1200px;\n --font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus:not(:focus-visible) {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n -webkit-text-decoration-skip-ink: none;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([class]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([class]):hover {\n color: inherit;\n text-decoration: none;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n -ms-overflow-style: scrollbar;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n text-align: -webkit-match-parent;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\n[role=\"button\"] {\n cursor: pointer;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 0.5rem;\n font-weight: 500;\n line-height: 1.2;\n}\n\nh1, .h1 {\n font-size: 2.5rem;\n}\n\nh2, .h2 {\n font-size: 2rem;\n}\n\nh3, .h3 {\n font-size: 1.75rem;\n}\n\nh4, .h4 {\n font-size: 1.5rem;\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 6rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-2 {\n font-size: 5.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-3 {\n font-size: 4.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-4 {\n font-size: 3.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\nhr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n font-size: 80%;\n font-weight: 400;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 0.5rem;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 80%;\n color: #6c757d;\n}\n\n.blockquote-footer::before {\n content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #dee2e6;\n border-radius: 0.25rem;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #6c757d;\n}\n\ncode {\n font-size: 87.5%;\n color: #e83e8c;\n word-wrap: break-word;\n}\n\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 87.5%;\n color: #fff;\n background-color: #212529;\n border-radius: 0.2rem;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n}\n\npre {\n display: block;\n font-size: 87.5%;\n color: #212529;\n}\n\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container,\n.container-fluid,\n.container-sm,\n.container-md,\n.container-lg,\n.container-xl {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container, .container-sm {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container, .container-sm, .container-md {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container, .container-sm, .container-md, .container-lg {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container, .container-sm, .container-md, .container-lg, .container-xl {\n max-width: 1140px;\n }\n}\n\n.row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.row-cols-1 > * {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.row-cols-2 > * {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.row-cols-3 > * {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.row-cols-4 > * {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.row-cols-5 > * {\n -ms-flex: 0 0 20%;\n flex: 0 0 20%;\n max-width: 20%;\n}\n\n.row-cols-6 > * {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n -ms-flex-order: -1;\n order: -1;\n}\n\n.order-last {\n -ms-flex-order: 13;\n order: 13;\n}\n\n.order-0 {\n -ms-flex-order: 0;\n order: 0;\n}\n\n.order-1 {\n -ms-flex-order: 1;\n order: 1;\n}\n\n.order-2 {\n -ms-flex-order: 2;\n order: 2;\n}\n\n.order-3 {\n -ms-flex-order: 3;\n order: 3;\n}\n\n.order-4 {\n -ms-flex-order: 4;\n order: 4;\n}\n\n.order-5 {\n -ms-flex-order: 5;\n order: 5;\n}\n\n.order-6 {\n -ms-flex-order: 6;\n order: 6;\n}\n\n.order-7 {\n -ms-flex-order: 7;\n order: 7;\n}\n\n.order-8 {\n -ms-flex-order: 8;\n order: 8;\n}\n\n.order-9 {\n -ms-flex-order: 9;\n order: 9;\n}\n\n.order-10 {\n -ms-flex-order: 10;\n order: 10;\n}\n\n.order-11 {\n -ms-flex-order: 11;\n order: 11;\n}\n\n.order-12 {\n -ms-flex-order: 12;\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .row-cols-sm-1 > * {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .row-cols-sm-2 > * {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .row-cols-sm-3 > * {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .row-cols-sm-4 > * {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .row-cols-sm-5 > * {\n -ms-flex: 0 0 20%;\n flex: 0 0 20%;\n max-width: 20%;\n }\n .row-cols-sm-6 > * {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-sm-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-sm-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-sm-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-sm-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-sm-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-sm-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-sm-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-sm-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-sm-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-sm-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-sm-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-sm-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-sm-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-sm-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .row-cols-md-1 > * {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .row-cols-md-2 > * {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .row-cols-md-3 > * {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .row-cols-md-4 > * {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .row-cols-md-5 > * {\n -ms-flex: 0 0 20%;\n flex: 0 0 20%;\n max-width: 20%;\n }\n .row-cols-md-6 > * {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-md-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-md-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-md-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-md-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-md-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-md-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-md-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-md-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-md-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-md-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-md-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-md-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-md-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-md-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .row-cols-lg-1 > * {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .row-cols-lg-2 > * {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .row-cols-lg-3 > * {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .row-cols-lg-4 > * {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .row-cols-lg-5 > * {\n -ms-flex: 0 0 20%;\n flex: 0 0 20%;\n max-width: 20%;\n }\n .row-cols-lg-6 > * {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-lg-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-lg-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-lg-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-lg-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-lg-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-lg-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-lg-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-lg-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-lg-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-lg-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-lg-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-lg-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-lg-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-lg-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .row-cols-xl-1 > * {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .row-cols-xl-2 > * {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .row-cols-xl-3 > * {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .row-cols-xl-4 > * {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .row-cols-xl-5 > * {\n -ms-flex: 0 0 20%;\n flex: 0 0 20%;\n max-width: 20%;\n }\n .row-cols-xl-6 > * {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-xl-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-xl-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-xl-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-xl-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-xl-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-xl-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-xl-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-xl-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-xl-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-xl-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-xl-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-xl-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-xl-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-xl-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n margin-bottom: 1rem;\n color: #212529;\n}\n\n.table th,\n.table td {\n padding: 0.75rem;\n vertical-align: top;\n border-top: 1px solid #dee2e6;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #dee2e6;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #dee2e6;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3rem;\n}\n\n.table-bordered {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n color: #212529;\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #b8daff;\n}\n\n.table-primary th,\n.table-primary td,\n.table-primary thead th,\n.table-primary tbody + tbody {\n border-color: #7abaff;\n}\n\n.table-hover .table-primary:hover {\n background-color: #9fcdff;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: #d6d8db;\n}\n\n.table-secondary th,\n.table-secondary td,\n.table-secondary thead th,\n.table-secondary tbody + tbody {\n border-color: #b3b7bb;\n}\n\n.table-hover .table-secondary:hover {\n background-color: #c8cbcf;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: #c8cbcf;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #c3e6cb;\n}\n\n.table-success th,\n.table-success td,\n.table-success thead th,\n.table-success tbody + tbody {\n border-color: #8fd19e;\n}\n\n.table-hover .table-success:hover {\n background-color: #b1dfbb;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #bee5eb;\n}\n\n.table-info th,\n.table-info td,\n.table-info thead th,\n.table-info tbody + tbody {\n border-color: #86cfda;\n}\n\n.table-hover .table-info:hover {\n background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffeeba;\n}\n\n.table-warning th,\n.table-warning td,\n.table-warning thead th,\n.table-warning tbody + tbody {\n border-color: #ffdf7e;\n}\n\n.table-hover .table-warning:hover {\n background-color: #ffe8a1;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #f5c6cb;\n}\n\n.table-danger th,\n.table-danger td,\n.table-danger thead th,\n.table-danger tbody + tbody {\n border-color: #ed969e;\n}\n\n.table-hover .table-danger:hover {\n background-color: #f1b0b7;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #fdfdfe;\n}\n\n.table-light th,\n.table-light td,\n.table-light thead th,\n.table-light tbody + tbody {\n border-color: #fbfcfc;\n}\n\n.table-hover .table-light:hover {\n background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: #c6c8ca;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th,\n.table-dark tbody + tbody {\n border-color: #95999c;\n}\n\n.table-hover .table-dark:hover {\n background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table .thead-dark th {\n color: #fff;\n background-color: #343a40;\n border-color: #454d55;\n}\n\n.table .thead-light th {\n color: #495057;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.table-dark {\n color: #fff;\n background-color: #343a40;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n border-color: #454d55;\n}\n\n.table-dark.table-bordered {\n border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-dark.table-hover tbody tr:hover {\n color: #fff;\n background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 575.98px) {\n .table-responsive-sm {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-sm > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 767.98px) {\n .table-responsive-md {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-md > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 991.98px) {\n .table-responsive-lg {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-lg > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1199.98px) {\n .table-responsive-xl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xl > .table-bordered {\n border: 0;\n }\n}\n\n.table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n border: 0;\n}\n\n.form-control {\n display: block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #495057;\n background-color: #fff;\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.form-control::-webkit-input-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control::-moz-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control:-ms-input-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control::-ms-input-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control::placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n background-color: #e9ecef;\n opacity: 1;\n}\n\ninput[type=\"date\"].form-control,\ninput[type=\"time\"].form-control,\ninput[type=\"datetime-local\"].form-control,\ninput[type=\"month\"].form-control {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\nselect.form-control:-moz-focusring {\n color: transparent;\n text-shadow: 0 0 0 #495057;\n}\n\nselect.form-control:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n.col-form-label {\n padding-top: calc(0.375rem + 1px);\n padding-bottom: calc(0.375rem + 1px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.5;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem + 1px);\n padding-bottom: calc(0.5rem + 1px);\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem + 1px);\n padding-bottom: calc(0.25rem + 1px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding: 0.375rem 0;\n margin-bottom: 0;\n font-size: 1rem;\n line-height: 1.5;\n color: #212529;\n background-color: transparent;\n border: solid transparent;\n border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm {\n height: calc(1.5em + 0.5rem + 2px);\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.form-control-lg {\n height: calc(1.5em + 1rem + 2px);\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n height: auto;\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n.form-group {\n margin-bottom: 1rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.25rem;\n}\n\n.form-row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n padding-left: 1.25rem;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.3rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input[disabled] ~ .form-check-label,\n.form-check-input:disabled ~ .form-check-label {\n color: #6c757d;\n}\n\n.form-check-label {\n margin-bottom: 0;\n}\n\n.form-check-inline {\n display: -ms-inline-flexbox;\n display: inline-flex;\n -ms-flex-align: center;\n align-items: center;\n padding-left: 0;\n margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: 0.3125rem;\n margin-left: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #28a745;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.5;\n color: #fff;\n background-color: rgba(40, 167, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.form-row > .col > .valid-tooltip,\n.form-row > [class*=\"col-\"] > .valid-tooltip {\n left: 5px;\n}\n\n.was-validated :valid ~ .valid-feedback,\n.was-validated :valid ~ .valid-tooltip,\n.is-valid ~ .valid-feedback,\n.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #28a745;\n padding-right: calc(1.5em + 0.75rem) !important;\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: right calc(0.375em + 0.1875rem) center;\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated select.form-control:valid, select.form-control.is-valid {\n padding-right: 3rem !important;\n background-position: right 1.5rem center;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n border-color: #28a745;\n padding-right: calc(0.75em + 2.3125rem) !important;\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") right 0.75rem center/8px 10px no-repeat, #fff url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem) no-repeat;\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #28a745;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n border-color: #28a745;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n border-color: #34ce57;\n background-color: #34ce57;\n}\n\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #dc3545;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.5;\n color: #fff;\n background-color: rgba(220, 53, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.form-row > .col > .invalid-tooltip,\n.form-row > [class*=\"col-\"] > .invalid-tooltip {\n left: 5px;\n}\n\n.was-validated :invalid ~ .invalid-feedback,\n.was-validated :invalid ~ .invalid-tooltip,\n.is-invalid ~ .invalid-feedback,\n.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #dc3545;\n padding-right: calc(1.5em + 0.75rem) !important;\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: right calc(0.375em + 0.1875rem) center;\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated select.form-control:invalid, select.form-control.is-invalid {\n padding-right: 3rem !important;\n background-position: right 1.5rem center;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n border-color: #dc3545;\n padding-right: calc(0.75em + 2.3125rem) !important;\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") right 0.75rem center/8px 10px no-repeat, #fff url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e\") center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem) no-repeat;\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #dc3545;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n border-color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n border-color: #e4606d;\n background-color: #e4606d;\n}\n\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .form-inline label {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n -ms-flex-align: center;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group,\n .form-inline .custom-select {\n width: auto;\n }\n .form-inline .form-check {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n -ms-flex-negative: 0;\n flex-shrink: 0;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n }\n .form-inline .custom-control-label {\n margin-bottom: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-weight: 400;\n color: #212529;\n text-align: center;\n vertical-align: middle;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n background-color: transparent;\n border: 1px solid transparent;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n line-height: 1.5;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n\n.btn:hover {\n color: #212529;\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n opacity: 0.65;\n}\n\n.btn:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n.btn-primary {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:hover {\n color: #fff;\n background-color: #0069d9;\n border-color: #0062cc;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n color: #fff;\n background-color: #0069d9;\n border-color: #0062cc;\n box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle {\n color: #fff;\n background-color: #0062cc;\n border-color: #005cbf;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-secondary {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:hover {\n color: #fff;\n background-color: #5a6268;\n border-color: #545b62;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n color: #fff;\n background-color: #5a6268;\n border-color: #545b62;\n box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle {\n color: #fff;\n background-color: #545b62;\n border-color: #4e555b;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-success {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:hover {\n color: #fff;\n background-color: #218838;\n border-color: #1e7e34;\n}\n\n.btn-success:focus, .btn-success.focus {\n color: #fff;\n background-color: #218838;\n border-color: #1e7e34;\n box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #1e7e34;\n border-color: #1c7430;\n}\n\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-info {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:hover {\n color: #fff;\n background-color: #138496;\n border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n color: #fff;\n background-color: #138496;\n border-color: #117a8b;\n box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle {\n color: #fff;\n background-color: #117a8b;\n border-color: #10707f;\n}\n\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-warning {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:hover {\n color: #212529;\n background-color: #e0a800;\n border-color: #d39e00;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n color: #212529;\n background-color: #e0a800;\n border-color: #d39e00;\n box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,\n.show > .btn-warning.dropdown-toggle {\n color: #212529;\n background-color: #d39e00;\n border-color: #c69500;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-danger {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:hover {\n color: #fff;\n background-color: #c82333;\n border-color: #bd2130;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n color: #fff;\n background-color: #c82333;\n border-color: #bd2130;\n box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #bd2130;\n border-color: #b21f2d;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-light {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:hover {\n color: #212529;\n background-color: #e2e6ea;\n border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n color: #212529;\n background-color: #e2e6ea;\n border-color: #dae0e5;\n box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,\n.show > .btn-light.dropdown-toggle {\n color: #212529;\n background-color: #dae0e5;\n border-color: #d3d9df;\n}\n\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-dark {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:hover {\n color: #fff;\n background-color: #23272b;\n border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n color: #fff;\n background-color: #23272b;\n border-color: #1d2124;\n box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,\n.show > .btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #1d2124;\n border-color: #171a1d;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-outline-primary {\n color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:hover {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #007bff;\n background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-secondary {\n color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:hover {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #6c757d;\n background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-success {\n color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:hover {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #28a745;\n background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-info {\n color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #17a2b8;\n background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-warning {\n color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:hover {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #ffc107;\n background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-danger {\n color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:hover {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #dc3545;\n background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-light {\n color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #f8f9fa;\n background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-dark {\n color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #343a40;\n background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-link {\n font-weight: 400;\n color: #007bff;\n text-decoration: none;\n}\n\n.btn-link:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\n.btn-link:focus, .btn-link.focus {\n text-decoration: underline;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n color: #6c757d;\n pointer-events: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-bottom: 0;\n border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0.125rem 0 0;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n@media (min-width: 576px) {\n .dropdown-menu-sm-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-sm-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .dropdown-menu-md-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-md-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 992px) {\n .dropdown-menu-lg-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-lg-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 1200px) {\n .dropdown-menu-xl-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xl-right {\n right: 0;\n left: auto;\n }\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0;\n border-right: 0.3em solid transparent;\n border-bottom: 0.3em solid;\n border-left: 0.3em solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: 0.125rem;\n}\n\n.dropright .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0;\n border-bottom: 0.3em solid transparent;\n border-left: 0.3em solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: 0.125rem;\n}\n\n.dropleft .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0.3em solid;\n border-bottom: 0.3em solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.25rem 1.5rem;\n clear: both;\n font-weight: 400;\n color: #212529;\n text-align: inherit;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n color: #16181b;\n text-decoration: none;\n background-color: #e9ecef;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #007bff;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #adb5bd;\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1.5rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #6c757d;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.25rem 1.5rem;\n color: #212529;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: -ms-inline-flexbox;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-left: -1px;\n}\n\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.5625rem;\n padding-left: 0.5625rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-align: start;\n align-items: flex-start;\n -ms-flex-pack: center;\n justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -1px;\n}\n\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: stretch;\n align-items: stretch;\n width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n position: relative;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n width: 1%;\n min-width: 0;\n margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n margin-left: -1px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n z-index: 4;\n}\n\n.input-group > .form-control:not(:first-child),\n.input-group > .custom-select:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group > .custom-file {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.input-group > .custom-file:not(:last-child) .custom-file-label,\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .custom-file:not(:first-child) .custom-file-label {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group:not(.has-validation) > .form-control:not(:last-child),\n.input-group:not(.has-validation) > .custom-select:not(:last-child),\n.input-group:not(.has-validation) > .custom-file:not(:last-child) .custom-file-label,\n.input-group:not(.has-validation) > .custom-file:not(:last-child) .custom-file-label::after {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group.has-validation > .form-control:nth-last-child(n + 3),\n.input-group.has-validation > .custom-select:nth-last-child(n + 3),\n.input-group.has-validation > .custom-file:nth-last-child(n + 3) .custom-file-label,\n.input-group.has-validation > .custom-file:nth-last-child(n + 3) .custom-file-label::after {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group-prepend,\n.input-group-append {\n display: -ms-flexbox;\n display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n position: relative;\n z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n margin-left: -1px;\n}\n\n.input-group-prepend {\n margin-right: -1px;\n}\n\n.input-group-append {\n margin-left: -1px;\n}\n\n.input-group-text {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n padding: 0.375rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n text-align: center;\n white-space: nowrap;\n background-color: #e9ecef;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: calc(1.5em + 1rem + 2px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: calc(1.5em + 0.5rem + 2px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-right: 1.75rem;\n}\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group:not(.has-validation) > .input-group-append:not(:last-child) > .btn,\n.input-group:not(.has-validation) > .input-group-append:not(:last-child) > .input-group-text,\n.input-group.has-validation > .input-group-append:nth-last-child(n + 3) > .btn,\n.input-group.has-validation > .input-group-append:nth-last-child(n + 3) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.custom-control {\n position: relative;\n z-index: 1;\n display: block;\n min-height: 1.5rem;\n padding-left: 1.5rem;\n -webkit-print-color-adjust: exact;\n color-adjust: exact;\n}\n\n.custom-control-inline {\n display: -ms-inline-flexbox;\n display: inline-flex;\n margin-right: 1rem;\n}\n\n.custom-control-input {\n position: absolute;\n left: 0;\n z-index: -1;\n width: 1rem;\n height: 1.25rem;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n color: #fff;\n border-color: #007bff;\n background-color: #007bff;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #80bdff;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n color: #fff;\n background-color: #b3d7ff;\n border-color: #b3d7ff;\n}\n\n.custom-control-input[disabled] ~ .custom-control-label, .custom-control-input:disabled ~ .custom-control-label {\n color: #6c757d;\n}\n\n.custom-control-input[disabled] ~ .custom-control-label::before, .custom-control-input:disabled ~ .custom-control-label::before {\n background-color: #e9ecef;\n}\n\n.custom-control-label {\n position: relative;\n margin-bottom: 0;\n vertical-align: top;\n}\n\n.custom-control-label::before {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n pointer-events: none;\n content: \"\";\n background-color: #fff;\n border: #adb5bd solid 1px;\n}\n\n.custom-control-label::after {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background: 50% / 50% 50% no-repeat;\n}\n\n.custom-checkbox .custom-control-label::before {\n border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n border-color: #007bff;\n background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-radio .custom-control-label::before {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-switch {\n padding-left: 2.25rem;\n}\n\n.custom-switch .custom-control-label::before {\n left: -2.25rem;\n width: 1.75rem;\n pointer-events: all;\n border-radius: 0.5rem;\n}\n\n.custom-switch .custom-control-label::after {\n top: calc(0.25rem + 2px);\n left: calc(-2.25rem + 2px);\n width: calc(1rem - 4px);\n height: calc(1rem - 4px);\n background-color: #adb5bd;\n border-radius: 0.5rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-switch .custom-control-label::after {\n transition: none;\n }\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n background-color: #fff;\n -webkit-transform: translateX(0.75rem);\n transform: translateX(0.75rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n vertical-align: middle;\n background: #fff url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") right 0.75rem center/8px 10px no-repeat;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-select:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: 0.75rem;\n background-image: none;\n}\n\n.custom-select:disabled {\n color: #6c757d;\n background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n display: none;\n}\n\n.custom-select:-moz-focusring {\n color: transparent;\n text-shadow: 0 0 0 #495057;\n}\n\n.custom-select-sm {\n height: calc(1.5em + 0.5rem + 2px);\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n padding-left: 0.5rem;\n font-size: 0.875rem;\n}\n\n.custom-select-lg {\n height: calc(1.5em + 1rem + 2px);\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n font-size: 1.25rem;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n margin: 0;\n overflow: hidden;\n opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n border-color: #80bdff;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-file-input[disabled] ~ .custom-file-label,\n.custom-file-input:disabled ~ .custom-file-label {\n background-color: #e9ecef;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 0.75rem;\n overflow: hidden;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.custom-file-label::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: calc(1.5em + 0.75rem);\n padding: 0.375rem 0.75rem;\n line-height: 1.5;\n color: #495057;\n content: \"Browse\";\n background-color: #e9ecef;\n border-left: inherit;\n border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-range {\n width: 100%;\n height: 1.4rem;\n padding: 0;\n background-color: transparent;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.custom-range:focus {\n outline: 0;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-ms-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-moz-focus-outer {\n border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -webkit-appearance: none;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-webkit-slider-thumb {\n -webkit-transition: none;\n transition: none;\n }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -moz-appearance: none;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-moz-range-thumb {\n -moz-transition: none;\n transition: none;\n }\n}\n\n.custom-range::-moz-range-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: 0;\n margin-right: 0.2rem;\n margin-left: 0.2rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n -ms-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-ms-thumb {\n -ms-transition: none;\n transition: none;\n }\n}\n\n.custom-range::-ms-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-ms-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: transparent;\n border-color: transparent;\n border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-fill-upper {\n margin-right: 15px;\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n background-color: #adb5bd;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n background-color: #adb5bd;\n}\n\n.custom-range:disabled::-moz-range-track {\n cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n background-color: #adb5bd;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-control-label::before,\n .custom-file-label,\n .custom-select {\n transition: none;\n }\n}\n\n.nav {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n}\n\n.nav-link:hover, .nav-link:focus {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #6c757d;\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n border-bottom: 1px solid #dee2e6;\n}\n\n.nav-tabs .nav-link {\n margin-bottom: -1px;\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n border-color: #e9ecef #e9ecef #dee2e6;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #6c757d;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #495057;\n background-color: #fff;\n border-color: #dee2e6 #dee2e6 #fff;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #007bff;\n}\n\n.nav-fill > .nav-link,\n.nav-fill .nav-item {\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified > .nav-link,\n.nav-justified .nav-item {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: justify;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n}\n\n.navbar .container,\n.navbar .container-fluid, .navbar .container-sm, .navbar .container-md, .navbar .container-lg, .navbar .container-xl {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: justify;\n justify-content: space-between;\n}\n\n.navbar-brand {\n display: inline-block;\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none;\n}\n\n.navbar-nav {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n float: none;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n -ms-flex-preferred-size: 100%;\n flex-basis: 100%;\n -ms-flex-positive: 1;\n flex-grow: 1;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background-color: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n text-decoration: none;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: 50% / 100% 100% no-repeat;\n}\n\n.navbar-nav-scroll {\n max-height: 75vh;\n overflow-y: auto;\n}\n\n@media (max-width: 575.98px) {\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid, .navbar-expand-sm > .container-sm, .navbar-expand-sm > .container-md, .navbar-expand-sm > .container-lg, .navbar-expand-sm > .container-xl {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid, .navbar-expand-sm > .container-sm, .navbar-expand-sm > .container-md, .navbar-expand-sm > .container-lg, .navbar-expand-sm > .container-xl {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-sm .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-sm .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 767.98px) {\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid, .navbar-expand-md > .container-sm, .navbar-expand-md > .container-md, .navbar-expand-md > .container-lg, .navbar-expand-md > .container-xl {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid, .navbar-expand-md > .container-sm, .navbar-expand-md > .container-md, .navbar-expand-md > .container-lg, .navbar-expand-md > .container-xl {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-md .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-md .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 991.98px) {\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid, .navbar-expand-lg > .container-sm, .navbar-expand-lg > .container-md, .navbar-expand-lg > .container-lg, .navbar-expand-lg > .container-xl {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 992px) {\n .navbar-expand-lg {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid, .navbar-expand-lg > .container-sm, .navbar-expand-lg > .container-md, .navbar-expand-lg > .container-lg, .navbar-expand-lg > .container-xl {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-lg .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-lg .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 1199.98px) {\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid, .navbar-expand-xl > .container-sm, .navbar-expand-xl > .container-md, .navbar-expand-xl > .container-lg, .navbar-expand-xl > .container-xl {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid, .navbar-expand-xl > .container-sm, .navbar-expand-xl > .container-md, .navbar-expand-xl > .container-lg, .navbar-expand-xl > .container-xl {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-xl .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-xl .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid, .navbar-expand > .container-sm, .navbar-expand > .container-md, .navbar-expand > .container-lg, .navbar-expand > .container-xl {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid, .navbar-expand > .container-sm, .navbar-expand > .container-md, .navbar-expand > .container-lg, .navbar-expand > .container-xl {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-nav-scroll {\n overflow: visible;\n}\n\n.navbar-expand .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.5);\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-text a {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #fff;\n}\n\n.navbar-dark .navbar-toggler {\n color: rgba(255, 255, 255, 0.5);\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-text a {\n color: #fff;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n color: #fff;\n}\n\n.card {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.25rem;\n}\n\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n\n.card > .list-group {\n border-top: inherit;\n border-bottom: inherit;\n}\n\n.card > .list-group:first-child {\n border-top-width: 0;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card > .list-group:last-child {\n border-bottom-width: 0;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card > .card-header + .list-group,\n.card > .list-group + .card-footer {\n border-top: 0;\n}\n\n.card-body {\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n min-height: 1px;\n padding: 1.25rem;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n background-color: rgba(0, 0, 0, 0.03);\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: rgba(0, 0, 0, 0.03);\n border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n border-radius: calc(0.25rem - 1px);\n}\n\n.card-img,\n.card-img-top,\n.card-img-bottom {\n -ms-flex-negative: 0;\n flex-shrink: 0;\n width: 100%;\n}\n\n.card-img,\n.card-img-top {\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img,\n.card-img-bottom {\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-deck .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-deck {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n margin-right: -15px;\n margin-left: -15px;\n }\n .card-deck .card {\n -ms-flex: 1 0 0%;\n flex: 1 0 0%;\n margin-right: 15px;\n margin-bottom: 0;\n margin-left: 15px;\n }\n}\n\n.card-group > .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n }\n .card-group > .card {\n -ms-flex: 1 0 0%;\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group > .card:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-top,\n .card-group > .card:not(:last-child) .card-header {\n border-top-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-bottom,\n .card-group > .card:not(:last-child) .card-footer {\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-top,\n .card-group > .card:not(:first-child) .card-header {\n border-top-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-bottom,\n .card-group > .card:not(:first-child) .card-footer {\n border-bottom-left-radius: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n .card-columns {\n -webkit-column-count: 3;\n -moz-column-count: 3;\n column-count: 3;\n -webkit-column-gap: 1.25rem;\n -moz-column-gap: 1.25rem;\n column-gap: 1.25rem;\n orphans: 1;\n widows: 1;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.accordion {\n overflow-anchor: none;\n}\n\n.accordion > .card {\n overflow: hidden;\n}\n\n.accordion > .card:not(:last-of-type) {\n border-bottom: 0;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.accordion > .card:not(:first-of-type) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.accordion > .card > .card-header {\n border-radius: 0;\n margin-bottom: -1px;\n}\n\n.breadcrumb {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n padding: 0.75rem 1rem;\n margin-bottom: 1rem;\n list-style: none;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n padding-left: 0.5rem;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n float: left;\n padding-right: 0.5rem;\n color: #6c757d;\n content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #6c757d;\n}\n\n.pagination {\n display: -ms-flexbox;\n display: flex;\n padding-left: 0;\n list-style: none;\n border-radius: 0.25rem;\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #007bff;\n background-color: #fff;\n border: 1px solid #dee2e6;\n}\n\n.page-link:hover {\n z-index: 2;\n color: #0056b3;\n text-decoration: none;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.page-link:focus {\n z-index: 3;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.page-item:first-child .page-link {\n margin-left: 0;\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n z-index: 3;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.page-item.disabled .page-link {\n color: #6c757d;\n pointer-events: none;\n cursor: auto;\n background-color: #fff;\n border-color: #dee2e6;\n}\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.25em 0.4em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .badge {\n transition: none;\n }\n}\n\na.badge:hover, a.badge:focus {\n text-decoration: none;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-right: 0.6em;\n padding-left: 0.6em;\n border-radius: 10rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #007bff;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n color: #fff;\n background-color: #0062cc;\n}\n\na.badge-primary:focus, a.badge-primary.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #6c757d;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n color: #fff;\n background-color: #545b62;\n}\n\na.badge-secondary:focus, a.badge-secondary.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.badge-success {\n color: #fff;\n background-color: #28a745;\n}\n\na.badge-success:hover, a.badge-success:focus {\n color: #fff;\n background-color: #1e7e34;\n}\n\na.badge-success:focus, a.badge-success.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.badge-info {\n color: #fff;\n background-color: #17a2b8;\n}\n\na.badge-info:hover, a.badge-info:focus {\n color: #fff;\n background-color: #117a8b;\n}\n\na.badge-info:focus, a.badge-info.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.badge-warning {\n color: #212529;\n background-color: #ffc107;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n color: #212529;\n background-color: #d39e00;\n}\n\na.badge-warning:focus, a.badge-warning.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.badge-danger {\n color: #fff;\n background-color: #dc3545;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n color: #fff;\n background-color: #bd2130;\n}\n\na.badge-danger:focus, a.badge-danger.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.badge-light {\n color: #212529;\n background-color: #f8f9fa;\n}\n\na.badge-light:hover, a.badge-light:focus {\n color: #212529;\n background-color: #dae0e5;\n}\n\na.badge-light:focus, a.badge-light.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.badge-dark {\n color: #fff;\n background-color: #343a40;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n color: #fff;\n background-color: #1d2124;\n}\n\na.badge-dark:focus, a.badge-dark.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.jumbotron {\n padding: 2rem 1rem;\n margin-bottom: 2rem;\n background-color: #e9ecef;\n border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n .jumbotron {\n padding: 4rem 2rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n border-radius: 0;\n}\n\n.alert {\n position: relative;\n padding: 0.75rem 1.25rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n padding: 0.75rem 1.25rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #004085;\n background-color: #cce5ff;\n border-color: #b8daff;\n}\n\n.alert-primary hr {\n border-top-color: #9fcdff;\n}\n\n.alert-primary .alert-link {\n color: #002752;\n}\n\n.alert-secondary {\n color: #383d41;\n background-color: #e2e3e5;\n border-color: #d6d8db;\n}\n\n.alert-secondary hr {\n border-top-color: #c8cbcf;\n}\n\n.alert-secondary .alert-link {\n color: #202326;\n}\n\n.alert-success {\n color: #155724;\n background-color: #d4edda;\n border-color: #c3e6cb;\n}\n\n.alert-success hr {\n border-top-color: #b1dfbb;\n}\n\n.alert-success .alert-link {\n color: #0b2e13;\n}\n\n.alert-info {\n color: #0c5460;\n background-color: #d1ecf1;\n border-color: #bee5eb;\n}\n\n.alert-info hr {\n border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n color: #062c33;\n}\n\n.alert-warning {\n color: #856404;\n background-color: #fff3cd;\n border-color: #ffeeba;\n}\n\n.alert-warning hr {\n border-top-color: #ffe8a1;\n}\n\n.alert-warning .alert-link {\n color: #533f03;\n}\n\n.alert-danger {\n color: #721c24;\n background-color: #f8d7da;\n border-color: #f5c6cb;\n}\n\n.alert-danger hr {\n border-top-color: #f1b0b7;\n}\n\n.alert-danger .alert-link {\n color: #491217;\n}\n\n.alert-light {\n color: #818182;\n background-color: #fefefe;\n border-color: #fdfdfe;\n}\n\n.alert-light hr {\n border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n color: #686868;\n}\n\n.alert-dark {\n color: #1b1e21;\n background-color: #d6d8d9;\n border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n color: #040505;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: -ms-flexbox;\n display: flex;\n height: 1rem;\n overflow: hidden;\n line-height: 0;\n font-size: 0.75rem;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.progress-bar {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: center;\n justify-content: center;\n overflow: hidden;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n background-color: #007bff;\n transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n -webkit-animation: 1s linear infinite progress-bar-stripes;\n animation: 1s linear infinite progress-bar-stripes;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n -webkit-animation: none;\n animation: none;\n }\n}\n\n.media {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: start;\n align-items: flex-start;\n}\n\n.media-body {\n -ms-flex: 1;\n flex: 1;\n}\n\n.list-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n border-radius: 0.25rem;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #495057;\n text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #495057;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n color: #212529;\n background-color: #e9ecef;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.75rem 1.25rem;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n\n.list-group-item:last-child {\n border-bottom-right-radius: inherit;\n border-bottom-left-radius: inherit;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.list-group-item + .list-group-item {\n border-top-width: 0;\n}\n\n.list-group-item + .list-group-item.active {\n margin-top: -1px;\n border-top-width: 1px;\n}\n\n.list-group-horizontal {\n -ms-flex-direction: row;\n flex-direction: row;\n}\n\n.list-group-horizontal > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n}\n\n.list-group-horizontal > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n}\n\n.list-group-horizontal > .list-group-item.active {\n margin-top: 0;\n}\n\n.list-group-horizontal > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n}\n\n.list-group-horizontal > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n}\n\n@media (min-width: 576px) {\n .list-group-horizontal-sm {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-sm > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-sm > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-sm > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-sm > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-sm > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-md > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-md > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-md > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-md > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-md > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n\n@media (min-width: 992px) {\n .list-group-horizontal-lg {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-lg > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-lg > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-lg > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-lg > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-lg > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n\n@media (min-width: 1200px) {\n .list-group-horizontal-xl {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-xl > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xl > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-xl > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-xl > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-xl > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n\n.list-group-flush {\n border-radius: 0;\n}\n\n.list-group-flush > .list-group-item {\n border-width: 0 0 1px;\n}\n\n.list-group-flush > .list-group-item:last-child {\n border-bottom-width: 0;\n}\n\n.list-group-item-primary {\n color: #004085;\n background-color: #b8daff;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #004085;\n background-color: #9fcdff;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #004085;\n border-color: #004085;\n}\n\n.list-group-item-secondary {\n color: #383d41;\n background-color: #d6d8db;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #383d41;\n background-color: #c8cbcf;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #383d41;\n border-color: #383d41;\n}\n\n.list-group-item-success {\n color: #155724;\n background-color: #c3e6cb;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #155724;\n background-color: #b1dfbb;\n}\n\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #155724;\n border-color: #155724;\n}\n\n.list-group-item-info {\n color: #0c5460;\n background-color: #bee5eb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #0c5460;\n background-color: #abdde5;\n}\n\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #0c5460;\n border-color: #0c5460;\n}\n\n.list-group-item-warning {\n color: #856404;\n background-color: #ffeeba;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #856404;\n background-color: #ffe8a1;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #856404;\n border-color: #856404;\n}\n\n.list-group-item-danger {\n color: #721c24;\n background-color: #f5c6cb;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #721c24;\n background-color: #f1b0b7;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #721c24;\n border-color: #721c24;\n}\n\n.list-group-item-light {\n color: #818182;\n background-color: #fdfdfe;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #818182;\n background-color: #ececf6;\n}\n\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #818182;\n border-color: #818182;\n}\n\n.list-group-item-dark {\n color: #1b1e21;\n background-color: #c6c8ca;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #1b1e21;\n background-color: #b9bbbe;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #1b1e21;\n border-color: #1b1e21;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: .5;\n}\n\n.close:hover {\n color: #000;\n text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n opacity: .75;\n}\n\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n}\n\na.close.disabled {\n pointer-events: none;\n}\n\n.toast {\n -ms-flex-preferred-size: 350px;\n flex-basis: 350px;\n max-width: 350px;\n font-size: 0.875rem;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);\n opacity: 0;\n border-radius: 0.25rem;\n}\n\n.toast:not(:last-child) {\n margin-bottom: 0.75rem;\n}\n\n.toast.showing {\n opacity: 1;\n}\n\n.toast.show {\n display: block;\n opacity: 1;\n}\n\n.toast.hide {\n display: none;\n}\n\n.toast-header {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n padding: 0.25rem 0.75rem;\n color: #6c757d;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.toast-body {\n padding: 0.75rem;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1050;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.5rem;\n pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n transition: -webkit-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;\n -webkit-transform: translate(0, -50px);\n transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n\n.modal.show .modal-dialog {\n -webkit-transform: none;\n transform: none;\n}\n\n.modal.modal-static .modal-dialog {\n -webkit-transform: scale(1.02);\n transform: scale(1.02);\n}\n\n.modal-dialog-scrollable {\n display: -ms-flexbox;\n display: flex;\n max-height: calc(100% - 1rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 1rem);\n overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n -ms-flex-negative: 0;\n flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n min-height: calc(100% - 1rem);\n}\n\n.modal-dialog-centered::before {\n display: block;\n height: calc(100vh - 1rem);\n height: -webkit-min-content;\n height: -moz-min-content;\n height: min-content;\n content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: center;\n justify-content: center;\n height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n content: none;\n}\n\n.modal-content {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n width: 100%;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #000;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: start;\n align-items: flex-start;\n -ms-flex-pack: justify;\n justify-content: space-between;\n padding: 1rem 1rem;\n border-bottom: 1px solid #dee2e6;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.modal-header .close {\n padding: 1rem 1rem;\n margin: -1rem -1rem -1rem auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.modal-body {\n position: relative;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n padding: 1rem;\n}\n\n.modal-footer {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: end;\n justify-content: flex-end;\n padding: 0.75rem;\n border-top: 1px solid #dee2e6;\n border-bottom-right-radius: calc(0.3rem - 1px);\n border-bottom-left-radius: calc(0.3rem - 1px);\n}\n\n.modal-footer > * {\n margin: 0.25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 1.75rem auto;\n }\n .modal-dialog-scrollable {\n max-height: calc(100% - 3.5rem);\n }\n .modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 3.5rem);\n }\n .modal-dialog-centered {\n min-height: calc(100% - 3.5rem);\n }\n .modal-dialog-centered::before {\n height: calc(100vh - 3.5rem);\n height: -webkit-min-content;\n height: -moz-min-content;\n height: min-content;\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 992px) {\n .modal-lg,\n .modal-xl {\n max-width: 800px;\n }\n}\n\n@media (min-width: 1200px) {\n .modal-xl {\n max-width: 1140px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 0.8rem;\n height: 0.4rem;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n top: 0;\n border-width: 0.4rem 0.4rem 0;\n border-top-color: #000;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n right: 0;\n border-width: 0.4rem 0.4rem 0.4rem 0;\n border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n bottom: 0;\n border-width: 0 0.4rem 0.4rem;\n border-bottom-color: #000;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n left: 0;\n border-width: 0.4rem 0 0.4rem 0.4rem;\n border-left-color: #000;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 0.25rem 0.5rem;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.25rem;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 1rem;\n height: 0.5rem;\n margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 0.5rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n bottom: calc(-0.5rem - 1px);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n bottom: 0;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n bottom: 1px;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: #fff;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n margin-left: 0.5rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n left: calc(-0.5rem - 1px);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n left: 0;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n left: 1px;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: #fff;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 0.5rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n top: calc(-0.5rem - 1px);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n top: 0;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n top: 1px;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: #fff;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 1rem;\n margin-left: -0.5rem;\n content: \"\";\n border-bottom: 1px solid #f7f7f7;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n margin-right: 0.5rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n right: calc(-0.5rem - 1px);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n right: 0;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n right: 1px;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: #fff;\n}\n\n.popover-header {\n padding: 0.5rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 0.5rem 0.75rem;\n color: #212529;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n -ms-touch-action: pan-y;\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n transition: -webkit-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n -webkit-transform: translateX(100%);\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n -webkit-transform: translateX(-100%);\n transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n -webkit-transform: none;\n transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n transition: opacity 0s 0.6s;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-left,\n .carousel-fade .active.carousel-item-right {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n width: 15%;\n padding: 0;\n color: #fff;\n text-align: center;\n background: none;\n border: 0;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none;\n }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: 50% / 100% 100% no-repeat;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-pack: center;\n justify-content: center;\n padding-left: 0;\n margin-right: 15%;\n margin-left: 15%;\n list-style: none;\n}\n\n.carousel-indicators li {\n box-sizing: content-box;\n -ms-flex: 0 1 auto;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #fff;\n background-clip: padding-box;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: .5;\n transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators li {\n transition: none;\n }\n}\n\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n}\n\n@-webkit-keyframes spinner-border {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n@keyframes spinner-border {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: -0.125em;\n border: 0.25em solid currentColor;\n border-right-color: transparent;\n border-radius: 50%;\n -webkit-animation: .75s linear infinite spinner-border;\n animation: .75s linear infinite spinner-border;\n}\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em;\n}\n\n@-webkit-keyframes spinner-grow {\n 0% {\n -webkit-transform: scale(0);\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes spinner-grow {\n 0% {\n -webkit-transform: scale(0);\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: -0.125em;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 0;\n -webkit-animation: .75s linear infinite spinner-grow;\n animation: .75s linear infinite spinner-grow;\n}\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .spinner-border,\n .spinner-grow {\n -webkit-animation-duration: 1.5s;\n animation-duration: 1.5s;\n }\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #007bff !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n background-color: #0062cc !important;\n}\n\n.bg-secondary {\n background-color: #6c757d !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n background-color: #545b62 !important;\n}\n\n.bg-success {\n background-color: #28a745 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n background-color: #1e7e34 !important;\n}\n\n.bg-info {\n background-color: #17a2b8 !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n background-color: #117a8b !important;\n}\n\n.bg-warning {\n background-color: #ffc107 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n background-color: #d39e00 !important;\n}\n\n.bg-danger {\n background-color: #dc3545 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n background-color: #bd2130 !important;\n}\n\n.bg-light {\n background-color: #f8f9fa !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n background-color: #343a40 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n background-color: #1d2124 !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 1px solid #dee2e6 !important;\n}\n\n.border-top {\n border-top: 1px solid #dee2e6 !important;\n}\n\n.border-right {\n border-right: 1px solid #dee2e6 !important;\n}\n\n.border-bottom {\n border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-left {\n border-left: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #007bff !important;\n}\n\n.border-secondary {\n border-color: #6c757d !important;\n}\n\n.border-success {\n border-color: #28a745 !important;\n}\n\n.border-info {\n border-color: #17a2b8 !important;\n}\n\n.border-warning {\n border-color: #ffc107 !important;\n}\n\n.border-danger {\n border-color: #dc3545 !important;\n}\n\n.border-light {\n border-color: #f8f9fa !important;\n}\n\n.border-dark {\n border-color: #343a40 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded-sm {\n border-radius: 0.2rem !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: 50rem !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n}\n\n.d-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-md-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-print-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n}\n\n.flex-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n}\n\n.justify-content-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n}\n\n.align-items-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n}\n\n.align-items-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n}\n\n.align-items-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n}\n\n.align-items-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n}\n\n.align-content-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n}\n\n.align-content-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n}\n\n.align-content-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n}\n\n.align-content-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n}\n\n.align-content-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n}\n\n.align-self-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n}\n\n.align-self-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n}\n\n.align-self-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n}\n\n.align-self-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n}\n\n.align-self-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-sm-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-sm-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-sm-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-sm-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-sm-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-sm-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-sm-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-sm-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-md-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-md-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-md-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-md-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-md-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-md-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-md-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-md-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-md-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-md-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-md-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-md-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-md-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-md-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-md-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-md-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-lg-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-lg-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-lg-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-lg-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-lg-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-lg-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-lg-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-lg-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-xl-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-xl-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-xl-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-xl-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-xl-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-xl-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-xl-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-xl-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 992px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1200px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n.user-select-all {\n -webkit-user-select: all !important;\n -moz-user-select: all !important;\n user-select: all !important;\n}\n\n.user-select-auto {\n -webkit-user-select: auto !important;\n -moz-user-select: auto !important;\n -ms-user-select: auto !important;\n user-select: auto !important;\n}\n\n.user-select-none {\n -webkit-user-select: none !important;\n -moz-user-select: none !important;\n -ms-user-select: none !important;\n user-select: none !important;\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: -webkit-sticky !important;\n position: sticky !important;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n@supports ((position: -webkit-sticky) or (position: sticky)) {\n .sticky-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3rem !important;\n}\n\n.m-n1 {\n margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1rem !important;\n}\n\n.m-n4 {\n margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3rem !important;\n }\n .m-sm-n1 {\n margin: -0.25rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.25rem !important;\n }\n .m-sm-n2 {\n margin: -0.5rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.5rem !important;\n }\n .m-sm-n3 {\n margin: -1rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1rem !important;\n }\n .m-sm-n4 {\n margin: -1.5rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.5rem !important;\n }\n .m-sm-n5 {\n margin: -3rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3rem !important;\n }\n .m-md-n1 {\n margin: -0.25rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.25rem !important;\n }\n .m-md-n2 {\n margin: -0.5rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.5rem !important;\n }\n .m-md-n3 {\n margin: -1rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1rem !important;\n }\n .m-md-n4 {\n margin: -1.5rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.5rem !important;\n }\n .m-md-n5 {\n margin: -3rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3rem !important;\n }\n .m-lg-n1 {\n margin: -0.25rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.25rem !important;\n }\n .m-lg-n2 {\n margin: -0.5rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.5rem !important;\n }\n .m-lg-n3 {\n margin: -1rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1rem !important;\n }\n .m-lg-n4 {\n margin: -1.5rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.5rem !important;\n }\n .m-lg-n5 {\n margin: -3rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3rem !important;\n }\n .m-xl-n1 {\n margin: -0.25rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.25rem !important;\n }\n .m-xl-n2 {\n margin: -0.5rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.5rem !important;\n }\n .m-xl-n3 {\n margin: -1rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1rem !important;\n }\n .m-xl-n4 {\n margin: -1.5rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.5rem !important;\n }\n .m-xl-n5 {\n margin: -3rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n pointer-events: auto;\n content: \"\";\n background-color: rgba(0, 0, 0, 0);\n}\n\n.text-monospace {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 576px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 992px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1200px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-light {\n font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n font-weight: lighter !important;\n}\n\n.font-weight-normal {\n font-weight: 400 !important;\n}\n\n.font-weight-bold {\n font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n font-weight: bolder !important;\n}\n\n.font-italic {\n font-style: italic !important;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #007bff !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n color: #0056b3 !important;\n}\n\n.text-secondary {\n color: #6c757d !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n color: #494f54 !important;\n}\n\n.text-success {\n color: #28a745 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n color: #19692c !important;\n}\n\n.text-info {\n color: #17a2b8 !important;\n}\n\na.text-info:hover, a.text-info:focus {\n color: #0f6674 !important;\n}\n\n.text-warning {\n color: #ffc107 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n color: #ba8b00 !important;\n}\n\n.text-danger {\n color: #dc3545 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n color: #a71d2a !important;\n}\n\n.text-light {\n color: #f8f9fa !important;\n}\n\na.text-light:hover, a.text-light:focus {\n color: #cbd3da !important;\n}\n\n.text-dark {\n color: #343a40 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n color: #121416 !important;\n}\n\n.text-body {\n color: #212529 !important;\n}\n\n.text-muted {\n color: #6c757d !important;\n}\n\n.text-black-50 {\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-break {\n word-break: break-word !important;\n word-wrap: break-word !important;\n}\n\n.text-reset {\n color: inherit !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a:not(.btn) {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 1px solid #adb5bd;\n page-break-inside: avoid;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n @page {\n size: a3;\n }\n body {\n min-width: 992px !important;\n }\n .container {\n min-width: 992px !important;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #dee2e6 !important;\n }\n .table-dark {\n color: inherit;\n }\n .table-dark th,\n .table-dark td,\n .table-dark thead th,\n .table-dark tbody + tbody {\n border-color: #dee2e6;\n }\n .table .thead-dark th {\n color: inherit;\n border-color: #dee2e6;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Future-proof rule: in browsers that support :focus-visible, suppress the focus outline\n// on elements that programmatically receive focus but wouldn't normally show a visible\n// focus outline. In general, this would mean that the outline is only applied if the\n// interaction that led to the element receiving programmatic focus was a keyboard interaction,\n// or the browser has somehow determined that the user is primarily a keyboard user and/or\n// wants focus outlines to always be presented.\n//\n// See https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible\n// and https://developer.paciellogroup.com/blog/2018/03/focus-visible-and-backwards-compatibility/\n[tabindex=\"-1\"]:focus:not(:focus-visible) {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover() {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n color: inherit;\n text-decoration: none;\n\n @include hover() {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n // Disable auto-hiding scrollbar in IE & legacy Edge to avoid overlap,\n // making it impossible to interact with the content\n -ms-overflow-style: scrollbar;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Set the cursor for non-`

\");\n };\n if ($truthy(node['$attr?'](\"manpurpose\"))) {\n result['$<<'](self.$generate_manname_section(node))};\n } else if ($truthy(($truthy($a = node['$header?']()) ? node.$notitle()['$!']() : $a))) {\n \n id_attr = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n result['$<<'](\"\" + \"\" + (node.$header().$title()) + \"\");};\n if ($truthy(($truthy($a = ($truthy($b = ($truthy($c = node['$sections?']()) ? node['$attr?'](\"toc\") : $c)) ? (toc_p = node.$attr(\"toc-placement\"))['$!='](\"macro\") : $b)) ? toc_p['$!='](\"preamble\") : $a))) {\n result['$<<'](\"\" + \"
\\n\" + \"
\" + (node.$attr(\"toc-title\")) + \"
\\n\" + (node.$converter().$convert(node, \"outline\")) + \"\\n\" + \"
\")};\n result['$<<'](node.$content());\n if ($truthy(($truthy($a = node['$footnotes?']()) ? node['$attr?'](\"nofootnotes\")['$!']() : $a))) {\n \n result['$<<'](\"\" + \"
\\n\" + \"\");\n $send(node.$footnotes(), 'each', [], ($$7 = function(footnote){var self = $$7.$$s || this;\n\n \n \n if (footnote == null) {\n footnote = nil;\n };\n return result['$<<'](\"\" + \"
\\n\" + \"\" + (footnote.$index()) + \". \" + (footnote.$text()) + \"\\n\" + \"
\");}, $$7.$$s = self, $$7.$$arity = 1, $$7));\n result['$<<'](\"
\");};\n return result.$join($$($nesting, 'LF'));\n }, $Html5Converter_convert_embedded$6.$$arity = 1);\n \n Opal.def(self, '$convert_outline', $Html5Converter_convert_outline$8 = function $$convert_outline(node, opts) {\n var $a, $b, $$9, self = this, sectnumlevels = nil, toclevels = nil, sections = nil, result = nil;\n\n \n \n if (opts == null) {\n opts = $hash2([], {});\n };\n if ($truthy(node['$sections?']())) {\n } else {\n return nil\n };\n sectnumlevels = ($truthy($a = opts['$[]'](\"sectnumlevels\")) ? $a : ($truthy($b = node.$document().$attributes()['$[]'](\"sectnumlevels\")) ? $b : 3).$to_i());\n toclevels = ($truthy($a = opts['$[]'](\"toclevels\")) ? $a : ($truthy($b = node.$document().$attributes()['$[]'](\"toclevels\")) ? $b : 2).$to_i());\n sections = node.$sections();\n result = [\"\" + \"\");\n return result.$join($$($nesting, 'LF'));\n }, $Html5Converter_convert_outline$8.$$arity = -2);\n \n Opal.def(self, '$convert_section', $Html5Converter_convert_section$10 = function $$convert_section(node) {\n var $a, $b, self = this, doc_attrs = nil, level = nil, title = nil, $case = nil, signifier = nil, id_attr = nil, id = nil, role = nil;\n\n \n doc_attrs = node.$document().$attributes();\n level = node.$level();\n if ($truthy(node.$caption())) {\n title = node.$captioned_title()\n } else if ($truthy(($truthy($a = node.$numbered()) ? $rb_le(level, ($truthy($b = doc_attrs['$[]'](\"sectnumlevels\")) ? $b : 3).$to_i()) : $a))) {\n if ($truthy(($truthy($a = $rb_lt(level, 2)) ? node.$document().$doctype()['$=='](\"book\") : $a))) {\n $case = node.$sectname();\n if (\"chapter\"['$===']($case)) {title = \"\" + ((function() {if ($truthy((signifier = doc_attrs['$[]'](\"chapter-signifier\")))) {\n return \"\" + (signifier) + \" \"\n } else {\n return \"\"\n }; return nil; })()) + (node.$sectnum()) + \" \" + (node.$title())}\n else if (\"part\"['$===']($case)) {title = \"\" + ((function() {if ($truthy((signifier = doc_attrs['$[]'](\"part-signifier\")))) {\n return \"\" + (signifier) + \" \"\n } else {\n return \"\"\n }; return nil; })()) + (node.$sectnum(nil, \":\")) + \" \" + (node.$title())}\n else {title = \"\" + (node.$sectnum()) + \" \" + (node.$title())}\n } else {\n title = \"\" + (node.$sectnum()) + \" \" + (node.$title())\n }\n } else {\n title = node.$title()\n };\n if ($truthy(node.$id())) {\n \n id_attr = \"\" + \" id=\\\"\" + ((id = node.$id())) + \"\\\"\";\n if ($truthy(doc_attrs['$[]'](\"sectlinks\"))) {\n title = \"\" + \"\" + (title) + \"\"};\n if ($truthy(doc_attrs['$[]'](\"sectanchors\"))) {\n if (doc_attrs['$[]'](\"sectanchors\")['$=='](\"after\")) {\n title = \"\" + (title) + \"\"\n } else {\n title = \"\" + \"\" + (title)\n }};\n } else {\n id_attr = \"\"\n };\n if (level['$=='](0)) {\n return \"\" + \"\" + (title) + \"\\n\" + (node.$content())\n } else {\n return \"\" + \"
\\n\" + \"\" + (title) + \"\\n\" + ((function() {if (level['$=='](1)) {\n return \"\" + \"
\\n\" + (node.$content()) + \"\\n\" + \"
\"\n } else {\n return node.$content()\n }; return nil; })()) + \"\\n\" + \"
\"\n };\n }, $Html5Converter_convert_section$10.$$arity = 1);\n \n Opal.def(self, '$convert_admonition', $Html5Converter_convert_admonition$11 = function $$convert_admonition(node) {\n var $a, self = this, id_attr = nil, name = nil, title_element = nil, label = nil, role = nil;\n\n \n id_attr = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n name = node.$attr(\"name\");\n title_element = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"
\" + (node.$title()) + \"
\\n\"\n } else {\n return \"\"\n }; return nil; })();\n if ($truthy(node.$document()['$attr?'](\"icons\"))) {\n if ($truthy(($truthy($a = node.$document()['$attr?'](\"icons\", \"font\")) ? node['$attr?'](\"icon\")['$!']() : $a))) {\n label = \"\" + \"\"\n } else {\n label = \"\" + \"\\\"\"\"\n }\n } else {\n label = \"\" + \"
\" + (node.$attr(\"textlabel\")) + \"
\"\n };\n return \"\" + \"\\n\" + \"\\n\" + \"\\n\" + \"\\n\" + \"\\n\" + \"\\n\" + \"
\\n\" + (label) + \"\\n\" + \"\\n\" + (title_element) + (node.$content()) + \"\\n\" + \"
\\n\" + \"\";\n }, $Html5Converter_convert_admonition$11.$$arity = 1);\n \n Opal.def(self, '$convert_audio', $Html5Converter_convert_audio$12 = function $$convert_audio(node) {\n var $a, self = this, xml = nil, id_attribute = nil, classes = nil, class_attribute = nil, title_element = nil, start_t = nil, end_t = nil, time_anchor = nil;\n\n \n xml = self.xml_mode;\n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n classes = [\"audioblock\", node.$role()].$compact();\n class_attribute = \"\" + \" class=\\\"\" + (classes.$join(\" \")) + \"\\\"\";\n title_element = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"
\" + (node.$title()) + \"
\\n\"\n } else {\n return \"\"\n }; return nil; })();\n start_t = node.$attr(\"start\");\n end_t = node.$attr(\"end\");\n time_anchor = (function() {if ($truthy(($truthy($a = start_t) ? $a : end_t))) {\n return \"\" + \"#t=\" + (($truthy($a = start_t) ? $a : \"\")) + ((function() {if ($truthy(end_t)) {\n return \"\" + \",\" + (end_t)\n } else {\n return \"\"\n }; return nil; })())\n } else {\n return \"\"\n }; return nil; })();\n return \"\" + \"\\n\" + (title_element) + \"
\\n\" + \"\\n\" + \"
\\n\" + \"\";\n }, $Html5Converter_convert_audio$12.$$arity = 1);\n \n Opal.def(self, '$convert_colist', $Html5Converter_convert_colist$13 = function $$convert_colist(node) {\n var $a, $$14, $$15, self = this, result = nil, id_attribute = nil, classes = nil, class_attribute = nil, font_icons = nil, num = nil;\n\n \n result = [];\n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n classes = [\"colist\", node.$style(), node.$role()].$compact();\n class_attribute = \"\" + \" class=\\\"\" + (classes.$join(\" \")) + \"\\\"\";\n result['$<<'](\"\" + \"\");\n if ($truthy(node['$title?']())) {\n result['$<<'](\"\" + \"
\" + (node.$title()) + \"
\")};\n if ($truthy(node.$document()['$attr?'](\"icons\"))) {\n \n result['$<<'](\"\");\n $a = [node.$document()['$attr?'](\"icons\", \"font\"), 0], (font_icons = $a[0]), (num = $a[1]), $a;\n $send(node.$items(), 'each', [], ($$14 = function(item){var self = $$14.$$s || this, num_label = nil;\n if (self.void_element_slash == null) self.void_element_slash = nil;\n\n \n \n if (item == null) {\n item = nil;\n };\n num = $rb_plus(num, 1);\n if ($truthy(font_icons)) {\n num_label = \"\" + \"\" + (num) + \"\"\n } else {\n num_label = \"\" + \"\\\"\"\"\n };\n return result['$<<'](\"\" + \"\\n\" + \"\\n\" + \"\\n\" + \"\");}, $$14.$$s = self, $$14.$$arity = 1, $$14));\n result['$<<'](\"
\" + (num_label) + \"\" + (item.$text()) + ((function() {if ($truthy(item['$blocks?']())) {\n return $rb_plus($$($nesting, 'LF'), item.$content())\n } else {\n return \"\"\n }; return nil; })()) + \"
\");\n } else {\n \n result['$<<'](\"
    \");\n $send(node.$items(), 'each', [], ($$15 = function(item){var self = $$15.$$s || this;\n\n \n \n if (item == null) {\n item = nil;\n };\n return result['$<<'](\"\" + \"
  1. \\n\" + \"

    \" + (item.$text()) + \"

    \" + ((function() {if ($truthy(item['$blocks?']())) {\n return $rb_plus($$($nesting, 'LF'), item.$content())\n } else {\n return \"\"\n }; return nil; })()) + \"\\n\" + \"
  2. \");}, $$15.$$s = self, $$15.$$arity = 1, $$15));\n result['$<<'](\"
\");\n };\n result['$<<'](\"\");\n return result.$join($$($nesting, 'LF'));\n }, $Html5Converter_convert_colist$13.$$arity = 1);\n \n Opal.def(self, '$convert_dlist', $Html5Converter_convert_dlist$16 = function $$convert_dlist(node) {\n var $$17, $a, $$19, $$21, self = this, result = nil, id_attribute = nil, $case = nil, classes = nil, class_attribute = nil, slash = nil, col_style_attribute = nil, dt_style_attribute = nil;\n\n \n result = [];\n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n $case = node.$style();\n if (\"qanda\"['$===']($case)) {classes = [\"qlist\", \"qanda\", node.$role()]}\n else if (\"horizontal\"['$===']($case)) {classes = [\"hdlist\", node.$role()]}\n else {classes = [\"dlist\", node.$style(), node.$role()]};\n class_attribute = \"\" + \" class=\\\"\" + (classes.$compact().$join(\" \")) + \"\\\"\";\n result['$<<'](\"\" + \"\");\n if ($truthy(node['$title?']())) {\n result['$<<'](\"\" + \"
\" + (node.$title()) + \"
\")};\n $case = node.$style();\n if (\"qanda\"['$===']($case)) {\n result['$<<'](\"
    \");\n $send(node.$items(), 'each', [], ($$17 = function(terms, dd){var self = $$17.$$s || this, $$18;\n\n \n \n if (terms == null) {\n terms = nil;\n };\n \n if (dd == null) {\n dd = nil;\n };\n result['$<<'](\"
  1. \");\n $send(terms, 'each', [], ($$18 = function(dt){var self = $$18.$$s || this;\n\n \n \n if (dt == null) {\n dt = nil;\n };\n return result['$<<'](\"\" + \"

    \" + (dt.$text()) + \"

    \");}, $$18.$$s = self, $$18.$$arity = 1, $$18));\n if ($truthy(dd)) {\n \n if ($truthy(dd['$text?']())) {\n result['$<<'](\"\" + \"

    \" + (dd.$text()) + \"

    \")};\n if ($truthy(dd['$blocks?']())) {\n result['$<<'](dd.$content())};};\n return result['$<<'](\"
  2. \");}, $$17.$$s = self, $$17.$$arity = 2, $$17));\n result['$<<'](\"
\");}\n else if (\"horizontal\"['$===']($case)) {\n slash = self.void_element_slash;\n result['$<<'](\"\");\n if ($truthy(($truthy($a = node['$attr?'](\"labelwidth\")) ? $a : node['$attr?'](\"itemwidth\")))) {\n \n result['$<<'](\"\");\n col_style_attribute = (function() {if ($truthy(node['$attr?'](\"labelwidth\"))) {\n return \"\" + \" style=\\\"width: \" + (node.$attr(\"labelwidth\").$chomp(\"%\")) + \"%;\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n result['$<<'](\"\" + \"\");\n col_style_attribute = (function() {if ($truthy(node['$attr?'](\"itemwidth\"))) {\n return \"\" + \" style=\\\"width: \" + (node.$attr(\"itemwidth\").$chomp(\"%\")) + \"%;\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n result['$<<'](\"\" + \"\");\n result['$<<'](\"\");};\n $send(node.$items(), 'each', [], ($$19 = function(terms, dd){var self = $$19.$$s || this, $$20, first_term = nil;\n\n \n \n if (terms == null) {\n terms = nil;\n };\n \n if (dd == null) {\n dd = nil;\n };\n result['$<<'](\"\");\n result['$<<'](\"\" + \"\");\n result['$<<'](\"\");\n return result['$<<'](\"\");}, $$19.$$s = self, $$19.$$arity = 2, $$19));\n result['$<<'](\"
\");\n first_term = true;\n $send(terms, 'each', [], ($$20 = function(dt){var self = $$20.$$s || this;\n\n \n \n if (dt == null) {\n dt = nil;\n };\n if ($truthy(first_term)) {\n } else {\n result['$<<'](\"\" + \"\")\n };\n result['$<<'](dt.$text());\n return (first_term = nil);}, $$20.$$s = self, $$20.$$arity = 1, $$20));\n result['$<<'](\"\");\n if ($truthy(dd)) {\n \n if ($truthy(dd['$text?']())) {\n result['$<<'](\"\" + \"

\" + (dd.$text()) + \"

\")};\n if ($truthy(dd['$blocks?']())) {\n result['$<<'](dd.$content())};};\n result['$<<'](\"
\");}\n else {\n result['$<<'](\"
\");\n dt_style_attribute = (function() {if ($truthy(node.$style())) {\n return \"\"\n } else {\n return \" class=\\\"hdlist1\\\"\"\n }; return nil; })();\n $send(node.$items(), 'each', [], ($$21 = function(terms, dd){var self = $$21.$$s || this, $$22;\n\n \n \n if (terms == null) {\n terms = nil;\n };\n \n if (dd == null) {\n dd = nil;\n };\n $send(terms, 'each', [], ($$22 = function(dt){var self = $$22.$$s || this;\n\n \n \n if (dt == null) {\n dt = nil;\n };\n return result['$<<'](\"\" + \"\" + (dt.$text()) + \"\");}, $$22.$$s = self, $$22.$$arity = 1, $$22));\n if ($truthy(dd)) {\n } else {\n return nil;\n };\n result['$<<'](\"
\");\n if ($truthy(dd['$text?']())) {\n result['$<<'](\"\" + \"

\" + (dd.$text()) + \"

\")};\n if ($truthy(dd['$blocks?']())) {\n result['$<<'](dd.$content())};\n return result['$<<'](\"
\");}, $$21.$$s = self, $$21.$$arity = 2, $$21));\n result['$<<'](\"
\");};\n result['$<<'](\"\");\n return result.$join($$($nesting, 'LF'));\n }, $Html5Converter_convert_dlist$16.$$arity = 1);\n \n Opal.def(self, '$convert_example', $Html5Converter_convert_example$23 = function $$convert_example(node) {\n var self = this, id_attribute = nil, class_attribute = nil, summary_element = nil, title_element = nil, role = nil;\n\n \n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n if ($truthy(node['$option?'](\"collapsible\"))) {\n \n class_attribute = (function() {if ($truthy(node.$role())) {\n return \"\" + \" class=\\\"\" + (node.$role()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n summary_element = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"\" + (node.$title()) + \"\"\n } else {\n return \"Details\"\n }; return nil; })();\n return \"\" + \"\\n\" + (summary_element) + \"\\n\" + \"
\\n\" + (node.$content()) + \"\\n\" + \"
\\n\" + \"\";\n } else {\n \n title_element = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"
\" + (node.$captioned_title()) + \"
\\n\"\n } else {\n return \"\"\n }; return nil; })();\n return \"\" + \"\\n\" + (title_element) + \"
\\n\" + (node.$content()) + \"\\n\" + \"
\\n\" + \"\";\n };\n }, $Html5Converter_convert_example$23.$$arity = 1);\n \n Opal.def(self, '$convert_floating_title', $Html5Converter_convert_floating_title$24 = function $$convert_floating_title(node) {\n var self = this, tag_name = nil, id_attribute = nil, classes = nil;\n\n \n tag_name = \"\" + \"h\" + ($rb_plus(node.$level(), 1));\n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n classes = [node.$style(), node.$role()].$compact();\n return \"\" + \"<\" + (tag_name) + (id_attribute) + \" class=\\\"\" + (classes.$join(\" \")) + \"\\\">\" + (node.$title()) + \"\";\n }, $Html5Converter_convert_floating_title$24.$$arity = 1);\n \n Opal.def(self, '$convert_image', $Html5Converter_convert_image$25 = function $$convert_image(node) {\n var $a, $b, $c, self = this, target = nil, width_attr = nil, height_attr = nil, svg = nil, obj = nil, img = nil, fallback = nil, id_attr = nil, classes = nil, class_attr = nil, title_el = nil;\n\n \n target = node.$attr(\"target\");\n width_attr = (function() {if ($truthy(node['$attr?'](\"width\"))) {\n return \"\" + \" width=\\\"\" + (node.$attr(\"width\")) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n height_attr = (function() {if ($truthy(node['$attr?'](\"height\"))) {\n return \"\" + \" height=\\\"\" + (node.$attr(\"height\")) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n if ($truthy(($truthy($a = ($truthy($b = ($truthy($c = node['$attr?'](\"format\", \"svg\")) ? $c : target['$include?'](\".svg\"))) ? $rb_lt(node.$document().$safe(), $$$($$($nesting, 'SafeMode'), 'SECURE')) : $b)) ? ($truthy($b = (svg = node['$option?'](\"inline\"))) ? $b : (obj = node['$option?'](\"interactive\"))) : $a))) {\n if ($truthy(svg)) {\n img = ($truthy($a = self.$read_svg_contents(node, target)) ? $a : \"\" + \"\" + (node.$alt()) + \"\")\n } else if ($truthy(obj)) {\n \n fallback = (function() {if ($truthy(node['$attr?'](\"fallback\"))) {\n return \"\" + \"\\\"\"\"\n } else {\n return \"\" + \"\" + (node.$alt()) + \"\"\n }; return nil; })();\n img = \"\" + \"\" + (fallback) + \"\";}};\n img = ($truthy($a = img) ? $a : \"\" + \"\\\"\"\");\n if ($truthy(node['$attr?'](\"link\"))) {\n img = \"\" + \"\" + (img) + \"\"};\n id_attr = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n classes = [\"imageblock\"];\n if ($truthy(node['$attr?'](\"float\"))) {\n classes['$<<'](node.$attr(\"float\"))};\n if ($truthy(node['$attr?'](\"align\"))) {\n classes['$<<'](\"\" + \"text-\" + (node.$attr(\"align\")))};\n if ($truthy(node.$role())) {\n classes['$<<'](node.$role())};\n class_attr = \"\" + \" class=\\\"\" + (classes.$join(\" \")) + \"\\\"\";\n title_el = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"\\n
\" + (node.$captioned_title()) + \"
\"\n } else {\n return \"\"\n }; return nil; })();\n return \"\" + \"\\n\" + \"
\\n\" + (img) + \"\\n\" + \"
\" + (title_el) + \"\\n\" + \"\";\n }, $Html5Converter_convert_image$25.$$arity = 1);\n \n Opal.def(self, '$convert_listing', $Html5Converter_convert_listing$26 = function $$convert_listing(node) {\n var $a, self = this, nowrap = nil, lang = nil, syntax_hl = nil, opts = nil, doc_attrs = nil, $writer = nil, pre_open = nil, pre_close = nil, id_attribute = nil, title_element = nil, role = nil;\n\n \n nowrap = ($truthy($a = node['$option?'](\"nowrap\")) ? $a : node.$document()['$attr?'](\"prewrap\")['$!']());\n if (node.$style()['$=='](\"source\")) {\n \n lang = node.$attr(\"language\");\n if ($truthy((syntax_hl = node.$document().$syntax_highlighter()))) {\n \n opts = (function() {if ($truthy(syntax_hl['$highlight?']())) {\n return $hash2([\"css_mode\", \"style\"], {\"css_mode\": ($truthy($a = (doc_attrs = node.$document().$attributes())['$[]'](\"\" + (syntax_hl.$name()) + \"-css\")) ? $a : \"class\").$to_sym(), \"style\": doc_attrs['$[]'](\"\" + (syntax_hl.$name()) + \"-style\")})\n } else {\n return $hash2([], {})\n }; return nil; })();\n \n $writer = [\"nowrap\", nowrap];\n $send(opts, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;\n } else {\n \n pre_open = \"\" + \"
\";\n            pre_close = \"
\";\n };\n } else {\n \n pre_open = \"\" + \"\";\n pre_close = \"\";\n };\n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n title_element = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"
\" + (node.$captioned_title()) + \"
\\n\"\n } else {\n return \"\"\n }; return nil; })();\n return \"\" + \"\\n\" + (title_element) + \"
\\n\" + ((function() {if ($truthy(syntax_hl)) {\n \n return syntax_hl.$format(node, lang, opts);\n } else {\n return $rb_plus($rb_plus(pre_open, ($truthy($a = node.$content()) ? $a : \"\")), pre_close)\n }; return nil; })()) + \"\\n\" + \"
\\n\" + \"\";\n }, $Html5Converter_convert_listing$26.$$arity = 1);\n \n Opal.def(self, '$convert_literal', $Html5Converter_convert_literal$27 = function $$convert_literal(node) {\n var $a, self = this, id_attribute = nil, title_element = nil, nowrap = nil, role = nil;\n\n \n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n title_element = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"
\" + (node.$title()) + \"
\\n\"\n } else {\n return \"\"\n }; return nil; })();\n nowrap = ($truthy($a = node.$document()['$attr?'](\"prewrap\")['$!']()) ? $a : node['$option?'](\"nowrap\"));\n return \"\" + \"\\n\" + (title_element) + \"
\\n\" + \"\" + (node.$content()) + \"\\n\" + \"
\\n\" + \"\";\n }, $Html5Converter_convert_literal$27.$$arity = 1);\n \n Opal.def(self, '$convert_stem', $Html5Converter_convert_stem$28 = function $$convert_stem(node) {\n var $a, $b, $$29, self = this, id_attribute = nil, title_element = nil, style = nil, open = nil, close = nil, equation = nil, br = nil, role = nil;\n\n \n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n title_element = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"
\" + (node.$title()) + \"
\\n\"\n } else {\n return \"\"\n }; return nil; })();\n $b = $$($nesting, 'BLOCK_MATH_DELIMITERS')['$[]']((style = node.$style().$to_sym())), $a = Opal.to_ary($b), (open = ($a[0] == null ? nil : $a[0])), (close = ($a[1] == null ? nil : $a[1])), $b;\n if ($truthy((equation = node.$content()))) {\n \n if ($truthy((($a = style['$=='](\"asciimath\")) ? equation['$include?']($$($nesting, 'LF')) : style['$=='](\"asciimath\")))) {\n \n br = \"\" + ($$($nesting, 'LF')) + \"\";\n equation = $send(equation, 'gsub', [$$($nesting, 'StemBreakRx')], ($$29 = function(){var self = $$29.$$s || this, $c;\n\n return \"\" + (close) + ($rb_times(br, $rb_minus((($c = $gvars['~']) === nil ? nil : $c['$[]'](0)).$count($$($nesting, 'LF')), 1))) + ($$($nesting, 'LF')) + (open)}, $$29.$$s = self, $$29.$$arity = 0, $$29));};\n if ($truthy(($truthy($a = equation['$start_with?'](open)) ? equation['$end_with?'](close) : $a))) {\n } else {\n equation = \"\" + (open) + (equation) + (close)\n };\n } else {\n equation = \"\"\n };\n return \"\" + \"\\n\" + (title_element) + \"
\\n\" + (equation) + \"\\n\" + \"
\\n\" + \"\";\n }, $Html5Converter_convert_stem$28.$$arity = 1);\n \n Opal.def(self, '$convert_olist', $Html5Converter_convert_olist$30 = function $$convert_olist(node) {\n var $$31, self = this, result = nil, id_attribute = nil, classes = nil, class_attribute = nil, type_attribute = nil, keyword = nil, start_attribute = nil, reversed_attribute = nil;\n\n \n result = [];\n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n classes = [\"olist\", node.$style(), node.$role()].$compact();\n class_attribute = \"\" + \" class=\\\"\" + (classes.$join(\" \")) + \"\\\"\";\n result['$<<'](\"\" + \"\");\n if ($truthy(node['$title?']())) {\n result['$<<'](\"\" + \"
\" + (node.$title()) + \"
\")};\n type_attribute = (function() {if ($truthy((keyword = node.$list_marker_keyword()))) {\n return \"\" + \" type=\\\"\" + (keyword) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n start_attribute = (function() {if ($truthy(node['$attr?'](\"start\"))) {\n return \"\" + \" start=\\\"\" + (node.$attr(\"start\")) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n reversed_attribute = (function() {if ($truthy(node['$option?'](\"reversed\"))) {\n \n return self.$append_boolean_attribute(\"reversed\", self.xml_mode);\n } else {\n return \"\"\n }; return nil; })();\n result['$<<'](\"\" + \"
    \");\n $send(node.$items(), 'each', [], ($$31 = function(item){var self = $$31.$$s || this;\n\n \n \n if (item == null) {\n item = nil;\n };\n if ($truthy(item.$id())) {\n result['$<<'](\"\" + \"
  1. \")\n } else if ($truthy(item.$role())) {\n result['$<<'](\"\" + \"
  2. \")\n } else {\n result['$<<'](\"
  3. \")\n };\n result['$<<'](\"\" + \"

    \" + (item.$text()) + \"

    \");\n if ($truthy(item['$blocks?']())) {\n result['$<<'](item.$content())};\n return result['$<<'](\"
  4. \");}, $$31.$$s = self, $$31.$$arity = 1, $$31));\n result['$<<'](\"
\");\n result['$<<'](\"\");\n return result.$join($$($nesting, 'LF'));\n }, $Html5Converter_convert_olist$30.$$arity = 1);\n \n Opal.def(self, '$convert_open', $Html5Converter_convert_open$32 = function $$convert_open(node) {\n var $a, $b, $c, self = this, style = nil, id_attr = nil, title_el = nil, role = nil;\n\n if ((style = node.$style())['$=='](\"abstract\")) {\n if ($truthy((($a = node.$parent()['$=='](node.$document())) ? node.$document().$doctype()['$=='](\"book\") : node.$parent()['$=='](node.$document())))) {\n \n self.$logger().$warn(\"abstract block cannot be used in a document without a title when doctype is book. Excluding block content.\");\n return \"\";\n } else {\n \n id_attr = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n title_el = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"
\" + (node.$title()) + \"
\\n\"\n } else {\n return \"\"\n }; return nil; })();\n return \"\" + \"\\n\" + (title_el) + \"
\\n\" + (node.$content()) + \"\\n\" + \"
\\n\" + \"\";\n }\n } else if ($truthy((($a = style['$=='](\"partintro\")) ? ($truthy($b = ($truthy($c = $rb_gt(node.$level(), 0)) ? $c : node.$parent().$context()['$!='](\"section\"))) ? $b : node.$document().$doctype()['$!='](\"book\")) : style['$=='](\"partintro\")))) {\n \n self.$logger().$error(\"partintro block can only be used when doctype is book and must be a child of a book part. Excluding block content.\");\n return \"\";\n } else {\n \n id_attr = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n title_el = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"
\" + (node.$title()) + \"
\\n\"\n } else {\n return \"\"\n }; return nil; })();\n return \"\" + \"\"\n }, $Html5Converter_convert_page_break$33.$$arity = 1);\n \n Opal.def(self, '$convert_paragraph', $Html5Converter_convert_paragraph$34 = function $$convert_paragraph(node) {\n var self = this, attributes = nil;\n\n \n if ($truthy(node.$role())) {\n attributes = \"\" + ((function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })()) + \" class=\\\"paragraph \" + (node.$role()) + \"\\\"\"\n } else if ($truthy(node.$id())) {\n attributes = \"\" + \" id=\\\"\" + (node.$id()) + \"\\\" class=\\\"paragraph\\\"\"\n } else {\n attributes = \" class=\\\"paragraph\\\"\"\n };\n if ($truthy(node['$title?']())) {\n return \"\" + \"\\n\" + \"
\" + (node.$title()) + \"
\\n\" + \"

\" + (node.$content()) + \"

\\n\" + \"\"\n } else {\n return \"\" + \"\\n\" + \"

\" + (node.$content()) + \"

\\n\" + \"\"\n };\n }, $Html5Converter_convert_paragraph$34.$$arity = 1);\n Opal.alias(self, \"convert_pass\", \"content_only\");\n \n Opal.def(self, '$convert_preamble', $Html5Converter_convert_preamble$35 = function $$convert_preamble(node) {\n var $a, $b, self = this, doc = nil, toc = nil;\n\n \n if ($truthy(($truthy($a = ($truthy($b = (doc = node.$document())['$attr?'](\"toc-placement\", \"preamble\")) ? doc['$sections?']() : $b)) ? doc['$attr?'](\"toc\") : $a))) {\n toc = \"\" + \"\\n\" + \"
\\n\" + \"
\" + (doc.$attr(\"toc-title\")) + \"
\\n\" + (doc.$converter().$convert(doc, \"outline\")) + \"\\n\" + \"
\"\n } else {\n toc = \"\"\n };\n return \"\" + \"
\\n\" + \"
\\n\" + (node.$content()) + \"\\n\" + \"
\" + (toc) + \"\\n\" + \"
\";\n }, $Html5Converter_convert_preamble$35.$$arity = 1);\n \n Opal.def(self, '$convert_quote', $Html5Converter_convert_quote$36 = function $$convert_quote(node) {\n var $a, self = this, id_attribute = nil, classes = nil, class_attribute = nil, title_element = nil, attribution = nil, citetitle = nil, cite_element = nil, attribution_text = nil, attribution_element = nil;\n\n \n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n classes = [\"quoteblock\", node.$role()].$compact();\n class_attribute = \"\" + \" class=\\\"\" + (classes.$join(\" \")) + \"\\\"\";\n title_element = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"\\n
\" + (node.$title()) + \"
\"\n } else {\n return \"\"\n }; return nil; })();\n attribution = (function() {if ($truthy(node['$attr?'](\"attribution\"))) {\n \n return node.$attr(\"attribution\");\n } else {\n return nil\n }; return nil; })();\n citetitle = (function() {if ($truthy(node['$attr?'](\"citetitle\"))) {\n \n return node.$attr(\"citetitle\");\n } else {\n return nil\n }; return nil; })();\n if ($truthy(($truthy($a = attribution) ? $a : citetitle))) {\n \n cite_element = (function() {if ($truthy(citetitle)) {\n return \"\" + \"\" + (citetitle) + \"\"\n } else {\n return \"\"\n }; return nil; })();\n attribution_text = (function() {if ($truthy(attribution)) {\n return \"\" + \"— \" + (attribution) + ((function() {if ($truthy(citetitle)) {\n return \"\" + \"\\n\"\n } else {\n return \"\"\n }; return nil; })())\n } else {\n return \"\"\n }; return nil; })();\n attribution_element = \"\" + \"\\n
\\n\" + (attribution_text) + (cite_element) + \"\\n
\";\n } else {\n attribution_element = \"\"\n };\n return \"\" + \"\" + (title_element) + \"\\n\" + \"
\\n\" + (node.$content()) + \"\\n\" + \"
\" + (attribution_element) + \"\\n\" + \"\";\n }, $Html5Converter_convert_quote$36.$$arity = 1);\n \n Opal.def(self, '$convert_thematic_break', $Html5Converter_convert_thematic_break$37 = function $$convert_thematic_break(node) {\n var self = this;\n\n return \"\" + \"\"\n }, $Html5Converter_convert_thematic_break$37.$$arity = 1);\n \n Opal.def(self, '$convert_sidebar', $Html5Converter_convert_sidebar$38 = function $$convert_sidebar(node) {\n var self = this, id_attribute = nil, title_element = nil, role = nil;\n\n \n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n title_element = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"
\" + (node.$title()) + \"
\\n\"\n } else {\n return \"\"\n }; return nil; })();\n return \"\" + \"\\n\" + \"
\\n\" + (title_element) + (node.$content()) + \"\\n\" + \"
\\n\" + \"\";\n }, $Html5Converter_convert_sidebar$38.$$arity = 1);\n \n Opal.def(self, '$convert_table', $Html5Converter_convert_table$39 = function $$convert_table(node) {\n var $a, $$40, $$41, self = this, result = nil, id_attribute = nil, frame = nil, classes = nil, stripes = nil, styles = nil, autowidth = nil, tablewidth = nil, role = nil, class_attribute = nil, style_attribute = nil, slash = nil;\n\n \n result = [];\n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n if ((frame = node.$attr(\"frame\", \"all\", \"table-frame\"))['$=='](\"topbot\")) {\n frame = \"ends\"};\n classes = [\"tableblock\", \"\" + \"frame-\" + (frame), \"\" + \"grid-\" + (node.$attr(\"grid\", \"all\", \"table-grid\"))];\n if ($truthy((stripes = node.$attr(\"stripes\", nil, \"table-stripes\")))) {\n classes['$<<'](\"\" + \"stripes-\" + (stripes))};\n styles = [];\n if ($truthy(($truthy($a = (autowidth = node['$option?'](\"autowidth\"))) ? node['$attr?'](\"width\")['$!']() : $a))) {\n classes['$<<'](\"fit-content\")\n } else if ((tablewidth = node.$attr(\"tablepcwidth\"))['$=='](100)) {\n classes['$<<'](\"stretch\")\n } else {\n styles['$<<'](\"\" + \"width: \" + (tablewidth) + \"%;\")\n };\n if ($truthy(node['$attr?'](\"float\"))) {\n classes['$<<'](node.$attr(\"float\"))};\n if ($truthy((role = node.$role()))) {\n classes['$<<'](role)};\n class_attribute = \"\" + \" class=\\\"\" + (classes.$join(\" \")) + \"\\\"\";\n style_attribute = (function() {if ($truthy(styles['$empty?']())) {\n return \"\"\n } else {\n return \"\" + \" style=\\\"\" + (styles.$join(\" \")) + \"\\\"\"\n }; return nil; })();\n result['$<<'](\"\" + \"\");\n if ($truthy(node['$title?']())) {\n result['$<<'](\"\" + \"\" + (node.$captioned_title()) + \"\")};\n if ($truthy($rb_gt(node.$attr(\"rowcount\"), 0))) {\n \n slash = self.void_element_slash;\n result['$<<'](\"\");\n if ($truthy(autowidth)) {\n result = $rb_plus(result, $$($nesting, 'Array').$new(node.$columns().$size(), \"\" + \"\"))\n } else {\n $send(node.$columns(), 'each', [], ($$40 = function(col){var self = $$40.$$s || this;\n\n \n \n if (col == null) {\n col = nil;\n };\n return result['$<<']((function() {if ($truthy(col['$option?'](\"autowidth\"))) {\n return \"\" + \"\"\n } else {\n return \"\" + \"\"\n }; return nil; })());}, $$40.$$s = self, $$40.$$arity = 1, $$40))\n };\n result['$<<'](\"\");\n $send(node.$rows().$to_h(), 'each', [], ($$41 = function(tsec, rows){var self = $$41.$$s || this, $$42;\n\n \n \n if (tsec == null) {\n tsec = nil;\n };\n \n if (rows == null) {\n rows = nil;\n };\n if ($truthy(rows['$empty?']())) {\n return nil;};\n result['$<<'](\"\" + \"\");\n $send(rows, 'each', [], ($$42 = function(row){var self = $$42.$$s || this, $$43;\n\n \n \n if (row == null) {\n row = nil;\n };\n result['$<<'](\"\");\n $send(row, 'each', [], ($$43 = function(cell){var self = $$43.$$s || this, $b, cell_content = nil, $case = nil, cell_tag_name = nil, cell_class_attribute = nil, cell_colspan_attribute = nil, cell_rowspan_attribute = nil, cell_style_attribute = nil;\n\n \n \n if (cell == null) {\n cell = nil;\n };\n if (tsec['$=='](\"head\")) {\n cell_content = cell.$text()\n } else {\n $case = cell.$style();\n if (\"asciidoc\"['$===']($case)) {cell_content = \"\" + \"
\" + (cell.$content()) + \"
\"}\n else if (\"literal\"['$===']($case)) {cell_content = \"\" + \"
\" + (cell.$text()) + \"
\"}\n else {cell_content = (function() {if ($truthy((cell_content = cell.$content())['$empty?']())) {\n return \"\"\n } else {\n return \"\" + \"

\" + (cell_content.$join(\"\" + \"

\\n\" + \"

\")) + \"

\"\n }; return nil; })()}\n };\n cell_tag_name = (function() {if ($truthy(($truthy($b = tsec['$=='](\"head\")) ? $b : cell.$style()['$=='](\"header\")))) {\n return \"th\"\n } else {\n return \"td\"\n }; return nil; })();\n cell_class_attribute = \"\" + \" class=\\\"tableblock halign-\" + (cell.$attr(\"halign\")) + \" valign-\" + (cell.$attr(\"valign\")) + \"\\\"\";\n cell_colspan_attribute = (function() {if ($truthy(cell.$colspan())) {\n return \"\" + \" colspan=\\\"\" + (cell.$colspan()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n cell_rowspan_attribute = (function() {if ($truthy(cell.$rowspan())) {\n return \"\" + \" rowspan=\\\"\" + (cell.$rowspan()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n cell_style_attribute = (function() {if ($truthy(node.$document()['$attr?'](\"cellbgcolor\"))) {\n return \"\" + \" style=\\\"background-color: \" + (node.$document().$attr(\"cellbgcolor\")) + \";\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n return result['$<<'](\"\" + \"<\" + (cell_tag_name) + (cell_class_attribute) + (cell_colspan_attribute) + (cell_rowspan_attribute) + (cell_style_attribute) + \">\" + (cell_content) + \"\");}, $$43.$$s = self, $$43.$$arity = 1, $$43));\n return result['$<<'](\"\");}, $$42.$$s = self, $$42.$$arity = 1, $$42));\n return result['$<<'](\"\" + \"
\");}, $$41.$$s = self, $$41.$$arity = 2, $$41));};\n result['$<<'](\"\");\n return result.$join($$($nesting, 'LF'));\n }, $Html5Converter_convert_table$39.$$arity = 1);\n \n Opal.def(self, '$convert_toc', $Html5Converter_convert_toc$44 = function $$convert_toc(node) {\n var $a, $b, self = this, doc = nil, id_attr = nil, title_id_attr = nil, title = nil, levels = nil, role = nil;\n\n \n if ($truthy(($truthy($a = ($truthy($b = (doc = node.$document())['$attr?'](\"toc-placement\", \"macro\")) ? doc['$sections?']() : $b)) ? doc['$attr?'](\"toc\") : $a))) {\n } else {\n return \"\"\n };\n if ($truthy(node.$id())) {\n \n id_attr = \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\";\n title_id_attr = \"\" + \" id=\\\"\" + (node.$id()) + \"title\\\"\";\n } else {\n \n id_attr = \" id=\\\"toc\\\"\";\n title_id_attr = \" id=\\\"toctitle\\\"\";\n };\n title = (function() {if ($truthy(node['$title?']())) {\n return node.$title()\n } else {\n \n return doc.$attr(\"toc-title\");\n }; return nil; })();\n levels = (function() {if ($truthy(node['$attr?'](\"levels\"))) {\n return node.$attr(\"levels\").$to_i()\n } else {\n return nil\n }; return nil; })();\n role = (function() {if ($truthy(node['$role?']())) {\n return node.$role()\n } else {\n \n return doc.$attr(\"toc-class\", \"toc\");\n }; return nil; })();\n return \"\" + \"\\n\" + \"\" + (title) + \"\\n\" + (doc.$converter().$convert(doc, \"outline\", $hash2([\"toclevels\"], {\"toclevels\": levels}))) + \"\\n\" + \"\";\n }, $Html5Converter_convert_toc$44.$$arity = 1);\n \n Opal.def(self, '$convert_ulist', $Html5Converter_convert_ulist$45 = function $$convert_ulist(node) {\n var $$46, self = this, result = nil, id_attribute = nil, div_classes = nil, marker_checked = nil, marker_unchecked = nil, checklist = nil, ul_class_attribute = nil;\n\n \n result = [];\n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n div_classes = [\"ulist\", node.$style(), node.$role()].$compact();\n marker_checked = (marker_unchecked = \"\");\n if ($truthy((checklist = node['$option?'](\"checklist\")))) {\n \n div_classes.$unshift(div_classes.$shift(), \"checklist\");\n ul_class_attribute = \" class=\\\"checklist\\\"\";\n if ($truthy(node['$option?'](\"interactive\"))) {\n if ($truthy(self.xml_mode)) {\n \n marker_checked = \" \";\n marker_unchecked = \" \";\n } else {\n \n marker_checked = \" \";\n marker_unchecked = \" \";\n }\n } else if ($truthy(node.$document()['$attr?'](\"icons\", \"font\"))) {\n \n marker_checked = \" \";\n marker_unchecked = \" \";\n } else {\n \n marker_checked = \"✓ \";\n marker_unchecked = \"❏ \";\n };\n } else {\n ul_class_attribute = (function() {if ($truthy(node.$style())) {\n return \"\" + \" class=\\\"\" + (node.$style()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })()\n };\n result['$<<'](\"\" + \"\");\n if ($truthy(node['$title?']())) {\n result['$<<'](\"\" + \"
\" + (node.$title()) + \"
\")};\n result['$<<'](\"\" + \"\");\n $send(node.$items(), 'each', [], ($$46 = function(item){var self = $$46.$$s || this, $a;\n\n \n \n if (item == null) {\n item = nil;\n };\n if ($truthy(item.$id())) {\n result['$<<'](\"\" + \"
  • \")\n } else if ($truthy(item.$role())) {\n result['$<<'](\"\" + \"
  • \")\n } else {\n result['$<<'](\"
  • \")\n };\n if ($truthy(($truthy($a = checklist) ? item['$attr?'](\"checkbox\") : $a))) {\n result['$<<'](\"\" + \"

    \" + ((function() {if ($truthy(item['$attr?'](\"checked\"))) {\n return marker_checked\n } else {\n return marker_unchecked\n }; return nil; })()) + (item.$text()) + \"

    \")\n } else {\n result['$<<'](\"\" + \"

    \" + (item.$text()) + \"

    \")\n };\n if ($truthy(item['$blocks?']())) {\n result['$<<'](item.$content())};\n return result['$<<'](\"
  • \");}, $$46.$$s = self, $$46.$$arity = 1, $$46));\n result['$<<'](\"\");\n result['$<<'](\"\");\n return result.$join($$($nesting, 'LF'));\n }, $Html5Converter_convert_ulist$45.$$arity = 1);\n \n Opal.def(self, '$convert_verse', $Html5Converter_convert_verse$47 = function $$convert_verse(node) {\n var $a, self = this, id_attribute = nil, classes = nil, class_attribute = nil, title_element = nil, attribution = nil, citetitle = nil, cite_element = nil, attribution_text = nil, attribution_element = nil;\n\n \n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n classes = [\"verseblock\", node.$role()].$compact();\n class_attribute = \"\" + \" class=\\\"\" + (classes.$join(\" \")) + \"\\\"\";\n title_element = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"\\n
    \" + (node.$title()) + \"
    \"\n } else {\n return \"\"\n }; return nil; })();\n attribution = (function() {if ($truthy(node['$attr?'](\"attribution\"))) {\n \n return node.$attr(\"attribution\");\n } else {\n return nil\n }; return nil; })();\n citetitle = (function() {if ($truthy(node['$attr?'](\"citetitle\"))) {\n \n return node.$attr(\"citetitle\");\n } else {\n return nil\n }; return nil; })();\n if ($truthy(($truthy($a = attribution) ? $a : citetitle))) {\n \n cite_element = (function() {if ($truthy(citetitle)) {\n return \"\" + \"\" + (citetitle) + \"\"\n } else {\n return \"\"\n }; return nil; })();\n attribution_text = (function() {if ($truthy(attribution)) {\n return \"\" + \"— \" + (attribution) + ((function() {if ($truthy(citetitle)) {\n return \"\" + \"\\n\"\n } else {\n return \"\"\n }; return nil; })())\n } else {\n return \"\"\n }; return nil; })();\n attribution_element = \"\" + \"\\n
    \\n\" + (attribution_text) + (cite_element) + \"\\n
    \";\n } else {\n attribution_element = \"\"\n };\n return \"\" + \"\" + (title_element) + \"\\n\" + \"
    \" + (node.$content()) + \"
    \" + (attribution_element) + \"\\n\" + \"\";\n }, $Html5Converter_convert_verse$47.$$arity = 1);\n \n Opal.def(self, '$convert_video', $Html5Converter_convert_video$48 = function $$convert_video(node) {\n var $a, $b, self = this, xml = nil, id_attribute = nil, classes = nil, class_attribute = nil, title_element = nil, width_attribute = nil, height_attribute = nil, $case = nil, asset_uri_scheme = nil, start_anchor = nil, delimiter = nil, autoplay_param = nil, loop_param = nil, muted_param = nil, rel_param_val = nil, start_param = nil, end_param = nil, has_loop_param = nil, mute_param = nil, controls_param = nil, fs_param = nil, fs_attribute = nil, modest_param = nil, theme_param = nil, hl_param = nil, target = nil, list = nil, list_param = nil, playlist = nil, poster_attribute = nil, val = nil, preload_attribute = nil, start_t = nil, end_t = nil, time_anchor = nil;\n\n \n xml = self.xml_mode;\n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n classes = [\"videoblock\"];\n if ($truthy(node['$attr?'](\"float\"))) {\n classes['$<<'](node.$attr(\"float\"))};\n if ($truthy(node['$attr?'](\"align\"))) {\n classes['$<<'](\"\" + \"text-\" + (node.$attr(\"align\")))};\n if ($truthy(node.$role())) {\n classes['$<<'](node.$role())};\n class_attribute = \"\" + \" class=\\\"\" + (classes.$join(\" \")) + \"\\\"\";\n title_element = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"\\n
    \" + (node.$title()) + \"
    \"\n } else {\n return \"\"\n }; return nil; })();\n width_attribute = (function() {if ($truthy(node['$attr?'](\"width\"))) {\n return \"\" + \" width=\\\"\" + (node.$attr(\"width\")) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n height_attribute = (function() {if ($truthy(node['$attr?'](\"height\"))) {\n return \"\" + \" height=\\\"\" + (node.$attr(\"height\")) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n return (function() {$case = node.$attr(\"poster\");\n if (\"vimeo\"['$===']($case)) {\n if ($truthy((asset_uri_scheme = node.$document().$attr(\"asset-uri-scheme\", \"https\"))['$empty?']())) {\n } else {\n asset_uri_scheme = \"\" + (asset_uri_scheme) + \":\"\n };\n start_anchor = (function() {if ($truthy(node['$attr?'](\"start\"))) {\n return \"\" + \"#at=\" + (node.$attr(\"start\"))\n } else {\n return \"\"\n }; return nil; })();\n delimiter = [\"?\"];\n autoplay_param = (function() {if ($truthy(node['$option?'](\"autoplay\"))) {\n return \"\" + (($truthy($a = delimiter.$pop()) ? $a : \"&\")) + \"autoplay=1\"\n } else {\n return \"\"\n }; return nil; })();\n loop_param = (function() {if ($truthy(node['$option?'](\"loop\"))) {\n return \"\" + (($truthy($a = delimiter.$pop()) ? $a : \"&\")) + \"loop=1\"\n } else {\n return \"\"\n }; return nil; })();\n muted_param = (function() {if ($truthy(node['$option?'](\"muted\"))) {\n return \"\" + (($truthy($a = delimiter.$pop()) ? $a : \"&\")) + \"muted=1\"\n } else {\n return \"\"\n }; return nil; })();\n return \"\" + \"\" + (title_element) + \"\\n\" + \"
    \\n\" + \"\\n\" + \"
    \\n\" + \"\";}\n else if (\"youtube\"['$===']($case)) {\n if ($truthy((asset_uri_scheme = node.$document().$attr(\"asset-uri-scheme\", \"https\"))['$empty?']())) {\n } else {\n asset_uri_scheme = \"\" + (asset_uri_scheme) + \":\"\n };\n rel_param_val = (function() {if ($truthy(node['$option?'](\"related\"))) {\n return 1\n } else {\n return 0\n }; return nil; })();\n start_param = (function() {if ($truthy(node['$attr?'](\"start\"))) {\n return \"\" + \"&start=\" + (node.$attr(\"start\"))\n } else {\n return \"\"\n }; return nil; })();\n end_param = (function() {if ($truthy(node['$attr?'](\"end\"))) {\n return \"\" + \"&end=\" + (node.$attr(\"end\"))\n } else {\n return \"\"\n }; return nil; })();\n autoplay_param = (function() {if ($truthy(node['$option?'](\"autoplay\"))) {\n return \"&autoplay=1\"\n } else {\n return \"\"\n }; return nil; })();\n loop_param = (function() {if ($truthy((has_loop_param = node['$option?'](\"loop\")))) {\n return \"&loop=1\"\n } else {\n return \"\"\n }; return nil; })();\n mute_param = (function() {if ($truthy(node['$option?'](\"muted\"))) {\n return \"&mute=1\"\n } else {\n return \"\"\n }; return nil; })();\n controls_param = (function() {if ($truthy(node['$option?'](\"nocontrols\"))) {\n return \"&controls=0\"\n } else {\n return \"\"\n }; return nil; })();\n if ($truthy(node['$option?'](\"nofullscreen\"))) {\n \n fs_param = \"&fs=0\";\n fs_attribute = \"\";\n } else {\n \n fs_param = \"\";\n fs_attribute = self.$append_boolean_attribute(\"allowfullscreen\", xml);\n };\n modest_param = (function() {if ($truthy(node['$option?'](\"modest\"))) {\n return \"&modestbranding=1\"\n } else {\n return \"\"\n }; return nil; })();\n theme_param = (function() {if ($truthy(node['$attr?'](\"theme\"))) {\n return \"\" + \"&theme=\" + (node.$attr(\"theme\"))\n } else {\n return \"\"\n }; return nil; })();\n hl_param = (function() {if ($truthy(node['$attr?'](\"lang\"))) {\n return \"\" + \"&hl=\" + (node.$attr(\"lang\"))\n } else {\n return \"\"\n }; return nil; })();\n $b = node.$attr(\"target\").$split(\"/\", 2), $a = Opal.to_ary($b), (target = ($a[0] == null ? nil : $a[0])), (list = ($a[1] == null ? nil : $a[1])), $b;\n if ($truthy((list = ($truthy($a = list) ? $a : node.$attr(\"list\"))))) {\n list_param = \"\" + \"&list=\" + (list)\n } else {\n \n $b = target.$split(\",\", 2), $a = Opal.to_ary($b), (target = ($a[0] == null ? nil : $a[0])), (playlist = ($a[1] == null ? nil : $a[1])), $b;\n if ($truthy((playlist = ($truthy($a = playlist) ? $a : node.$attr(\"playlist\"))))) {\n list_param = \"\" + \"&playlist=\" + (playlist)\n } else {\n list_param = (function() {if ($truthy(has_loop_param)) {\n return \"\" + \"&playlist=\" + (target)\n } else {\n return \"\"\n }; return nil; })()\n };\n };\n return \"\" + \"\" + (title_element) + \"\\n\" + \"
    \\n\" + \"\\n\" + \"
    \\n\" + \"\";}\n else {\n poster_attribute = (function() {if ($truthy((val = node.$attr(\"poster\"))['$nil_or_empty?']())) {\n return \"\"\n } else {\n return \"\" + \" poster=\\\"\" + (node.$media_uri(val)) + \"\\\"\"\n }; return nil; })();\n preload_attribute = (function() {if ($truthy((val = node.$attr(\"preload\"))['$nil_or_empty?']())) {\n return \"\"\n } else {\n return \"\" + \" preload=\\\"\" + (val) + \"\\\"\"\n }; return nil; })();\n start_t = node.$attr(\"start\");\n end_t = node.$attr(\"end\");\n time_anchor = (function() {if ($truthy(($truthy($a = start_t) ? $a : end_t))) {\n return \"\" + \"#t=\" + (($truthy($a = start_t) ? $a : \"\")) + ((function() {if ($truthy(end_t)) {\n return \"\" + \",\" + (end_t)\n } else {\n return \"\"\n }; return nil; })())\n } else {\n return \"\"\n }; return nil; })();\n return \"\" + \"\" + (title_element) + \"\\n\" + \"
    \\n\" + \"\\n\" + \"
    \\n\" + \"\";}})();\n }, $Html5Converter_convert_video$48.$$arity = 1);\n \n Opal.def(self, '$convert_inline_anchor', $Html5Converter_convert_inline_anchor$49 = function $$convert_inline_anchor(node) {\n var $a, $b, self = this, $case = nil, path = nil, attrs = nil, text = nil, ref = nil, refid = nil, top = nil, outer = nil;\n\n return (function() {$case = node.$type();\n if (\"xref\"['$===']($case)) {\n if ($truthy((path = node.$attributes()['$[]'](\"path\")))) {\n \n attrs = self.$append_link_constraint_attrs(node, (function() {if ($truthy(node.$role())) {\n return [\"\" + \" class=\\\"\" + (node.$role()) + \"\\\"\"]\n } else {\n return []\n }; return nil; })()).$join();\n text = ($truthy($a = node.$text()) ? $a : path);\n } else {\n \n attrs = (function() {if ($truthy(node.$role())) {\n return \"\" + \" class=\\\"\" + (node.$role()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n if ($truthy((text = node.$text()))) {\n } else if ($truthy($$($nesting, 'AbstractNode')['$===']((ref = ($truthy($a = (self.refs = ($truthy($b = self.refs) ? $b : node.$document().$catalog()['$[]'](\"refs\")))['$[]']((refid = node.$attributes()['$[]'](\"refid\")))) ? $a : (function() {if ($truthy(refid['$nil_or_empty?']())) {\n \n return (top = self.$get_root_document(node));\n } else {\n return nil\n }; return nil; })()))))) {\n if ($truthy(($truthy($a = (self.resolving_xref = ($truthy($b = self.resolving_xref) ? $b : (outer = true)))) ? outer : $a))) {\n \n if ($truthy((text = ref.$xreftext(node.$attr(\"xrefstyle\", nil, true))))) {\n if ($truthy(text['$include?'](\"\" + (text) + \"\";}\n else if (\"ref\"['$===']($case)) {return \"\" + \"\"}\n else if (\"link\"['$===']($case)) {\n attrs = (function() {if ($truthy(node.$id())) {\n return [\"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"]\n } else {\n return []\n }; return nil; })();\n if ($truthy(node.$role())) {\n attrs['$<<'](\"\" + \" class=\\\"\" + (node.$role()) + \"\\\"\")};\n if ($truthy(node['$attr?'](\"title\"))) {\n attrs['$<<'](\"\" + \" title=\\\"\" + (node.$attr(\"title\")) + \"\\\"\")};\n return \"\" + \"\" + (node.$text()) + \"\";}\n else if (\"bibref\"['$===']($case)) {return \"\" + \"[\" + (($truthy($a = node.$reftext()) ? $a : node.$id())) + \"]\"}\n else {\n self.$logger().$warn(\"\" + \"unknown anchor type: \" + (node.$type().$inspect()));\n return nil;}})()\n }, $Html5Converter_convert_inline_anchor$49.$$arity = 1);\n \n Opal.def(self, '$convert_inline_break', $Html5Converter_convert_inline_break$50 = function $$convert_inline_break(node) {\n var self = this;\n\n return \"\" + (node.$text()) + \"\"\n }, $Html5Converter_convert_inline_break$50.$$arity = 1);\n \n Opal.def(self, '$convert_inline_button', $Html5Converter_convert_inline_button$51 = function $$convert_inline_button(node) {\n var self = this;\n\n return \"\" + \"\" + (node.$text()) + \"\"\n }, $Html5Converter_convert_inline_button$51.$$arity = 1);\n \n Opal.def(self, '$convert_inline_callout', $Html5Converter_convert_inline_callout$52 = function $$convert_inline_callout(node) {\n var self = this, src = nil, guard = nil;\n\n if ($truthy(node.$document()['$attr?'](\"icons\", \"font\"))) {\n return \"\" + \"(\" + (node.$text()) + \")\"\n } else if ($truthy(node.$document()['$attr?'](\"icons\"))) {\n \n src = node.$icon_uri(\"\" + \"callouts/\" + (node.$text()));\n return \"\" + \"\\\"\"\";\n } else if ($truthy($$$('::', 'Array')['$===']((guard = node.$attributes()['$[]'](\"guard\"))))) {\n return \"\" + \"<!--(\" + (node.$text()) + \")-->\"\n } else {\n return \"\" + (guard) + \"(\" + (node.$text()) + \")\"\n }\n }, $Html5Converter_convert_inline_callout$52.$$arity = 1);\n \n Opal.def(self, '$convert_inline_footnote', $Html5Converter_convert_inline_footnote$53 = function $$convert_inline_footnote(node) {\n var self = this, index = nil, id_attr = nil;\n\n if ($truthy((index = node.$attr(\"index\")))) {\n if (node.$type()['$=='](\"xref\")) {\n return \"\" + \"[\" + (index) + \"]\"\n } else {\n \n id_attr = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"_footnote_\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n return \"\" + \"[\" + (index) + \"]\";\n }\n } else if (node.$type()['$=='](\"xref\")) {\n return \"\" + \"[\" + (node.$text()) + \"]\"\n } else {\n return nil\n }\n }, $Html5Converter_convert_inline_footnote$53.$$arity = 1);\n \n Opal.def(self, '$convert_inline_image', $Html5Converter_convert_inline_image$54 = function $$convert_inline_image(node) {\n var $a, $b, $$55, $c, $d, self = this, type = nil, class_attr_val = nil, title_attr = nil, img = nil, target = nil, attrs = nil, svg = nil, obj = nil, fallback = nil, role = nil;\n\n \n if ($truthy((($a = (type = ($truthy($b = node.$type()) ? $b : \"image\"))['$=='](\"icon\")) ? node.$document()['$attr?'](\"icons\", \"font\") : (type = ($truthy($b = node.$type()) ? $b : \"image\"))['$=='](\"icon\")))) {\n \n class_attr_val = \"\" + \"fa fa-\" + (node.$target());\n $send($hash2([\"size\", \"rotate\", \"flip\"], {\"size\": \"fa-\", \"rotate\": \"fa-rotate-\", \"flip\": \"fa-flip-\"}), 'each', [], ($$55 = function(key, prefix){var self = $$55.$$s || this;\n\n \n \n if (key == null) {\n key = nil;\n };\n \n if (prefix == null) {\n prefix = nil;\n };\n if ($truthy(node['$attr?'](key))) {\n return (class_attr_val = \"\" + (class_attr_val) + \" \" + (prefix) + (node.$attr(key)))\n } else {\n return nil\n };}, $$55.$$s = self, $$55.$$arity = 2, $$55));\n title_attr = (function() {if ($truthy(node['$attr?'](\"title\"))) {\n return \"\" + \" title=\\\"\" + (node.$attr(\"title\")) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n img = \"\" + \"\";\n } else if ($truthy((($a = type['$=='](\"icon\")) ? node.$document()['$attr?'](\"icons\")['$!']() : type['$=='](\"icon\")))) {\n img = \"\" + \"[\" + (node.$alt()) + \"]\"\n } else {\n \n target = node.$target();\n attrs = [];\n if ($truthy(node['$attr?'](\"width\"))) {\n attrs['$<<'](\"\" + \" width=\\\"\" + (node.$attr(\"width\")) + \"\\\"\")};\n if ($truthy(node['$attr?'](\"height\"))) {\n attrs['$<<'](\"\" + \" height=\\\"\" + (node.$attr(\"height\")) + \"\\\"\")};\n if ($truthy(node['$attr?'](\"title\"))) {\n attrs['$<<'](\"\" + \" title=\\\"\" + (node.$attr(\"title\")) + \"\\\"\")};\n attrs = (function() {if ($truthy(attrs['$empty?']())) {\n return \"\"\n } else {\n return attrs.$join()\n }; return nil; })();\n if ($truthy(($truthy($a = ($truthy($b = ($truthy($c = type['$!='](\"icon\")) ? ($truthy($d = node['$attr?'](\"format\", \"svg\")) ? $d : target['$include?'](\".svg\")) : $c)) ? $rb_lt(node.$document().$safe(), $$$($$($nesting, 'SafeMode'), 'SECURE')) : $b)) ? ($truthy($b = (svg = node['$option?'](\"inline\"))) ? $b : (obj = node['$option?'](\"interactive\"))) : $a))) {\n if ($truthy(svg)) {\n img = ($truthy($a = self.$read_svg_contents(node, target)) ? $a : \"\" + \"\" + (node.$alt()) + \"\")\n } else if ($truthy(obj)) {\n \n fallback = (function() {if ($truthy(node['$attr?'](\"fallback\"))) {\n return \"\" + \"\\\"\"\"\n } else {\n return \"\" + \"\" + (node.$alt()) + \"\"\n }; return nil; })();\n img = \"\" + \"\" + (fallback) + \"\";}};\n img = ($truthy($a = img) ? $a : \"\" + \"\\\"\"\");\n };\n if ($truthy(node['$attr?'](\"link\"))) {\n img = \"\" + \"\" + (img) + \"\"};\n if ($truthy((role = node.$role()))) {\n if ($truthy(node['$attr?'](\"float\"))) {\n class_attr_val = \"\" + (type) + \" \" + (node.$attr(\"float\")) + \" \" + (role)\n } else {\n class_attr_val = \"\" + (type) + \" \" + (role)\n }\n } else if ($truthy(node['$attr?'](\"float\"))) {\n class_attr_val = \"\" + (type) + \" \" + (node.$attr(\"float\"))\n } else {\n class_attr_val = type\n };\n return \"\" + \"\" + (img) + \"\";\n }, $Html5Converter_convert_inline_image$54.$$arity = 1);\n \n Opal.def(self, '$convert_inline_indexterm', $Html5Converter_convert_inline_indexterm$56 = function $$convert_inline_indexterm(node) {\n var self = this;\n\n if (node.$type()['$=='](\"visible\")) {\n return node.$text()\n } else {\n return \"\"\n }\n }, $Html5Converter_convert_inline_indexterm$56.$$arity = 1);\n \n Opal.def(self, '$convert_inline_kbd', $Html5Converter_convert_inline_kbd$57 = function $$convert_inline_kbd(node) {\n var self = this, keys = nil;\n\n if ((keys = node.$attr(\"keys\")).$size()['$=='](1)) {\n return \"\" + \"\" + (keys['$[]'](0)) + \"\"\n } else {\n return \"\" + \"\" + (keys.$join(\"+\")) + \"\"\n }\n }, $Html5Converter_convert_inline_kbd$57.$$arity = 1);\n \n Opal.def(self, '$convert_inline_menu', $Html5Converter_convert_inline_menu$58 = function $$convert_inline_menu(node) {\n var self = this, caret = nil, submenu_joiner = nil, menu = nil, submenus = nil, menuitem = nil;\n\n \n caret = (function() {if ($truthy(node.$document()['$attr?'](\"icons\", \"font\"))) {\n return \"  \"\n } else {\n return \"  \"\n }; return nil; })();\n submenu_joiner = \"\" + \"\" + (caret) + \"\";\n menu = node.$attr(\"menu\");\n if ($truthy((submenus = node.$attr(\"submenus\"))['$empty?']())) {\n if ($truthy((menuitem = node.$attr(\"menuitem\")))) {\n return \"\" + \"\" + (menu) + \"\" + (caret) + \"\" + (menuitem) + \"\"\n } else {\n return \"\" + \"\" + (menu) + \"\"\n }\n } else {\n return \"\" + \"\" + (menu) + \"\" + (caret) + \"\" + (submenus.$join(submenu_joiner)) + \"\" + (caret) + \"\" + (node.$attr(\"menuitem\")) + \"\"\n };\n }, $Html5Converter_convert_inline_menu$58.$$arity = 1);\n \n Opal.def(self, '$convert_inline_quoted', $Html5Converter_convert_inline_quoted$59 = function $$convert_inline_quoted(node) {\n var $a, $b, self = this, open = nil, close = nil, tag = nil, class_attr = nil;\n\n \n $b = $$($nesting, 'QUOTE_TAGS')['$[]'](node.$type()), $a = Opal.to_ary($b), (open = ($a[0] == null ? nil : $a[0])), (close = ($a[1] == null ? nil : $a[1])), (tag = ($a[2] == null ? nil : $a[2])), $b;\n if ($truthy(node.$id())) {\n \n class_attr = (function() {if ($truthy(node.$role())) {\n return \"\" + \" class=\\\"\" + (node.$role()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n if ($truthy(tag)) {\n return \"\" + (open.$chop()) + \" id=\\\"\" + (node.$id()) + \"\\\"\" + (class_attr) + \">\" + (node.$text()) + (close)\n } else {\n return \"\" + \"\" + (open) + (node.$text()) + (close) + \"\"\n };\n } else if ($truthy(node.$role())) {\n if ($truthy(tag)) {\n return \"\" + (open.$chop()) + \" class=\\\"\" + (node.$role()) + \"\\\">\" + (node.$text()) + (close)\n } else {\n return \"\" + \"\" + (open) + (node.$text()) + (close) + \"\"\n }\n } else {\n return \"\" + (open) + (node.$text()) + (close)\n };\n }, $Html5Converter_convert_inline_quoted$59.$$arity = 1);\n \n Opal.def(self, '$read_svg_contents', $Html5Converter_read_svg_contents$60 = function $$read_svg_contents(node, target) {\n var $$61, self = this, svg = nil, old_start_tag = nil, new_start_tag = nil, start_tag_match = nil;\n\n \n if ($truthy((svg = node.$read_contents(target, $hash2([\"start\", \"normalize\", \"label\", \"warn_if_empty\"], {\"start\": node.$document().$attr(\"imagesdir\"), \"normalize\": true, \"label\": \"SVG\", \"warn_if_empty\": true}))))) {\n \n if ($truthy(svg['$empty?']())) {\n return nil};\n if ($truthy(svg['$start_with?'](\"\");}, $$61.$$s = self, $$61.$$arity = 1, $$61));\n if ($truthy(new_start_tag)) {\n svg = \"\" + (new_start_tag) + (svg['$[]'](Opal.Range.$new(old_start_tag.$length(), -1, false)))};};\n return svg;\n }, $Html5Converter_read_svg_contents$60.$$arity = 2);\n self.$private();\n \n Opal.def(self, '$append_boolean_attribute', $Html5Converter_append_boolean_attribute$62 = function $$append_boolean_attribute(name, xml) {\n var self = this;\n\n if ($truthy(xml)) {\n return \"\" + \" \" + (name) + \"=\\\"\" + (name) + \"\\\"\"\n } else {\n return \"\" + \" \" + (name)\n }\n }, $Html5Converter_append_boolean_attribute$62.$$arity = 2);\n \n Opal.def(self, '$append_link_constraint_attrs', $Html5Converter_append_link_constraint_attrs$63 = function $$append_link_constraint_attrs(node, attrs) {\n var $a, self = this, rel = nil, window = nil;\n\n \n \n if (attrs == null) {\n attrs = [];\n };\n if ($truthy(node['$option?'](\"nofollow\"))) {\n rel = \"nofollow\"};\n if ($truthy((window = node.$attributes()['$[]'](\"window\")))) {\n \n attrs['$<<'](\"\" + \" target=\\\"\" + (window) + \"\\\"\");\n if ($truthy(($truthy($a = window['$=='](\"_blank\")) ? $a : node['$option?'](\"noopener\")))) {\n attrs['$<<']((function() {if ($truthy(rel)) {\n return \"\" + \" rel=\\\"\" + (rel) + \" noopener\\\"\"\n } else {\n return \" rel=\\\"noopener\\\"\"\n }; return nil; })())};\n } else if ($truthy(rel)) {\n attrs['$<<'](\"\" + \" rel=\\\"\" + (rel) + \"\\\"\")};\n return attrs;\n }, $Html5Converter_append_link_constraint_attrs$63.$$arity = -2);\n \n Opal.def(self, '$encode_attribute_value', $Html5Converter_encode_attribute_value$64 = function $$encode_attribute_value(val) {\n var self = this;\n\n if ($truthy(val['$include?'](\"\\\"\"))) {\n \n return val.$gsub(\"\\\"\", \""\");\n } else {\n return val\n }\n }, $Html5Converter_encode_attribute_value$64.$$arity = 1);\n \n Opal.def(self, '$generate_manname_section', $Html5Converter_generate_manname_section$65 = function $$generate_manname_section(node) {\n var $a, self = this, manname_title = nil, next_section = nil, next_section_title = nil, manname_id_attr = nil, manname_id = nil;\n\n \n manname_title = node.$attr(\"manname-title\", \"Name\");\n if ($truthy(($truthy($a = (next_section = node.$sections()['$[]'](0))) ? (next_section_title = next_section.$title())['$=='](next_section_title.$upcase()) : $a))) {\n manname_title = manname_title.$upcase()};\n manname_id_attr = (function() {if ($truthy((manname_id = node.$attr(\"manname-id\")))) {\n return \"\" + \" id=\\\"\" + (manname_id) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n return \"\" + \"\" + (manname_title) + \"\\n\" + \"
    \\n\" + \"

    \" + (node.$attr(\"mannames\").$join(\", \")) + \" - \" + (node.$attr(\"manpurpose\")) + \"

    \\n\" + \"
    \";\n }, $Html5Converter_generate_manname_section$65.$$arity = 1);\n \n Opal.def(self, '$get_root_document', $Html5Converter_get_root_document$66 = function $$get_root_document(node) {\n var $a, self = this;\n\n \n while ($truthy((node = node.$document())['$nested?']())) {\n node = node.$parent_document()\n };\n return node;\n }, $Html5Converter_get_root_document$66.$$arity = 1);\n \n Opal.def(self, '$method_missing', $Html5Converter_method_missing$67 = function $$method_missing(id, $a) {\n var $post_args, args, $b, $iter = $Html5Converter_method_missing$67.$$p, $yield = $iter || nil, self = this, name = nil, $zuper = nil, $zuper_i = nil, $zuper_ii = nil;\n\n if ($iter) $Html5Converter_method_missing$67.$$p = null;\n // Prepare super implicit arguments\n for($zuper_i = 0, $zuper_ii = arguments.length, $zuper = new Array($zuper_ii); $zuper_i < $zuper_ii; $zuper_i++) {\n $zuper[$zuper_i] = arguments[$zuper_i];\n }\n \n \n $post_args = Opal.slice.call(arguments, 1, arguments.length);\n \n args = $post_args;;\n if ($truthy(($truthy($b = (name = id.$to_s())['$start_with?'](\"convert_\")['$!']()) ? self['$handles?'](name) : $b))) {\n \n return $send(self, 'send', [\"\" + \"convert_\" + (name)].concat(Opal.to_a(args)));\n } else {\n return $send(self, Opal.find_super_dispatcher(self, 'method_missing', $Html5Converter_method_missing$67, false), $zuper, $iter)\n };\n }, $Html5Converter_method_missing$67.$$arity = -2);\n return (Opal.def(self, '$respond_to_missing?', $Html5Converter_respond_to_missing$ques$68 = function(id, $a) {\n var $post_args, options, $b, self = this, name = nil;\n\n \n \n $post_args = Opal.slice.call(arguments, 1, arguments.length);\n \n options = $post_args;;\n return ($truthy($b = (name = id.$to_s())['$start_with?'](\"convert_\")['$!']()) ? self['$handles?'](name) : $b);\n }, $Html5Converter_respond_to_missing$ques$68.$$arity = -2), nil) && 'respond_to_missing?';\n })($$($nesting, 'Converter'), $$$($$($nesting, 'Converter'), 'Base'), $nesting)\n })($nesting[0], $nesting)\n};\n\n/* Generated by Opal 0.11.99.dev */\nOpal.modules[\"asciidoctor/extensions\"] = function(Opal) {\n function $rb_minus(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs - rhs : lhs['$-'](rhs);\n }\n function $rb_plus(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs + rhs : lhs['$+'](rhs);\n }\n function $rb_gt(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs > rhs : lhs['$>'](rhs);\n }\n function $rb_lt(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs < rhs : lhs['$<'](rhs);\n }\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice, $module = Opal.module, $klass = Opal.klass, $truthy = Opal.truthy, $hash2 = Opal.hash2, $send = Opal.send, $hash = Opal.hash;\n\n Opal.add_stubs(['$==', '$[]=', '$config', '$-', '$const_defined?', '$singleton_class?', '$include', '$const_get', '$extend', '$attr_reader', '$merge', '$class', '$update', '$raise', '$document', '$doctype', '$[]', '$+', '$level', '$delete', '$>', '$casecmp', '$new', '$title=', '$sectname=', '$special=', '$fetch', '$numbered=', '$!', '$key?', '$attr?', '$special', '$numbered', '$generate_id', '$title', '$id=', '$update_attributes', '$tr', '$basename', '$create_block', '$assign_caption', '$===', '$parse_blocks', '$empty?', '$include?', '$sub_attributes', '$parse', '$each', '$define_method', '$unshift', '$shift', '$send', '$size', '$binding', '$receiver', '$define_singleton_method', '$instance_exec', '$to_proc', '$call', '$option', '$flatten', '$respond_to?', '$to_s', '$partition', '$to_i', '$<<', '$compact', '$inspect', '$attr_accessor', '$to_set', '$match?', '$resolve_regexp', '$method', '$register', '$values', '$groups', '$arity', '$activate', '$add_document_processor', '$any?', '$select', '$add_syntax_processor', '$to_sym', '$instance_variable_get', '$kind', '$private', '$join', '$map', '$split', '$capitalize', '$instance_variable_set', '$resolve_args', '$enable_dsl', '$singleton_class', '$process_block_given?', '$source_location', '$freeze', '$resolve_class', '$<', '$update_config', '$as_symbol', '$name', '$name=', '$pop', '$-@', '$next_auto_id', '$generate_name']);\n \n if ($$($nesting, 'RUBY_ENGINE')['$=='](\"opal\")) {\n } else {\n nil\n };\n return (function($base, $parent_nesting) {\n var self = $module($base, 'Asciidoctor');\n\n var $nesting = [self].concat($parent_nesting);\n\n (function($base, $parent_nesting) {\n var self = $module($base, 'Extensions');\n\n var $nesting = [self].concat($parent_nesting);\n\n \n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Processor');\n\n var $nesting = [self].concat($parent_nesting), $Processor_initialize$4, $Processor_update_config$5, $Processor_process$6, $Processor_create_section$7, $Processor_create_block$8, $Processor_create_list$9, $Processor_create_list_item$10, $Processor_create_image_block$11, $Processor_create_inline$12, $Processor_parse_content$13, $Processor_parse_attributes$14, $Processor$15;\n\n self.$$prototype.config = nil;\n \n (function(self, $parent_nesting) {\n var $nesting = [self].concat($parent_nesting), $config$1, $option$2, $enable_dsl$3;\n\n \n \n Opal.def(self, '$config', $config$1 = function $$config() {\n var $a, self = this;\n if (self.config == null) self.config = nil;\n\n return (self.config = ($truthy($a = self.config) ? $a : $hash2([], {})))\n }, $config$1.$$arity = 0);\n \n Opal.def(self, '$option', $option$2 = function $$option(key, default_value) {\n var self = this, $writer = nil;\n\n \n $writer = [key, default_value];\n $send(self.$config(), '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];\n }, $option$2.$$arity = 2);\n \n Opal.def(self, '$enable_dsl', $enable_dsl$3 = function $$enable_dsl() {\n var self = this;\n\n if ($truthy(self['$const_defined?'](\"DSL\"))) {\n if ($truthy(self['$singleton_class?']())) {\n return self.$include(self.$const_get(\"DSL\"))\n } else {\n return self.$extend(self.$const_get(\"DSL\"))\n }\n } else {\n return nil\n }\n }, $enable_dsl$3.$$arity = 0);\n return Opal.alias(self, \"use_dsl\", \"enable_dsl\");\n })(Opal.get_singleton_class(self), $nesting);\n self.$attr_reader(\"config\");\n \n Opal.def(self, '$initialize', $Processor_initialize$4 = function $$initialize(config) {\n var self = this;\n\n \n \n if (config == null) {\n config = $hash2([], {});\n };\n return (self.config = self.$class().$config().$merge(config));\n }, $Processor_initialize$4.$$arity = -1);\n \n Opal.def(self, '$update_config', $Processor_update_config$5 = function $$update_config(config) {\n var self = this;\n\n return self.config.$update(config)\n }, $Processor_update_config$5.$$arity = 1);\n \n Opal.def(self, '$process', $Processor_process$6 = function $$process($a) {\n var $post_args, args, self = this;\n\n \n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + ($$($nesting, 'Processor')) + \" subclass \" + (self.$class()) + \" must implement the #\" + (\"process\") + \" method\");\n }, $Processor_process$6.$$arity = -1);\n \n Opal.def(self, '$create_section', $Processor_create_section$7 = function $$create_section(parent, title, attrs, opts) {\n var $a, self = this, doc = nil, book = nil, doctype = nil, level = nil, style = nil, sectname = nil, special = nil, sect = nil, $writer = nil, id = nil;\n\n \n \n if (opts == null) {\n opts = $hash2([], {});\n };\n doc = parent.$document();\n book = (doctype = doc.$doctype())['$=='](\"book\");\n level = ($truthy($a = opts['$[]'](\"level\")) ? $a : $rb_plus(parent.$level(), 1));\n if ($truthy((style = attrs.$delete(\"style\")))) {\n if ($truthy(($truthy($a = book) ? style['$=='](\"abstract\") : $a))) {\n $a = [\"chapter\", 1], (sectname = $a[0]), (level = $a[1]), $a\n } else {\n \n $a = [style, true], (sectname = $a[0]), (special = $a[1]), $a;\n if (level['$=='](0)) {\n level = 1};\n }\n } else if ($truthy(book)) {\n sectname = (function() {if (level['$=='](0)) {\n return \"part\"\n } else {\n \n if ($truthy($rb_gt(level, 1))) {\n return \"section\"\n } else {\n return \"chapter\"\n };\n }; return nil; })()\n } else if ($truthy((($a = doctype['$=='](\"manpage\")) ? title.$casecmp(\"synopsis\")['$=='](0) : doctype['$=='](\"manpage\")))) {\n $a = [\"synopsis\", true], (sectname = $a[0]), (special = $a[1]), $a\n } else {\n sectname = \"section\"\n };\n sect = $$($nesting, 'Section').$new(parent, level);\n $a = [title, sectname], sect['$title=']($a[0]), sect['$sectname=']($a[1]), $a;\n if ($truthy(special)) {\n \n \n $writer = [true];\n $send(sect, 'special=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;\n if ($truthy(opts.$fetch(\"numbered\", style['$=='](\"appendix\")))) {\n \n $writer = [true];\n $send(sect, 'numbered=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];\n } else if ($truthy(($truthy($a = opts['$key?'](\"numbered\")['$!']()) ? doc['$attr?'](\"sectnums\", \"all\") : $a))) {\n \n $writer = [(function() {if ($truthy(($truthy($a = book) ? level['$=='](1) : $a))) {\n return \"chapter\"\n } else {\n return true\n }; return nil; })()];\n $send(sect, 'numbered=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];};\n } else if ($truthy($rb_gt(level, 0))) {\n if ($truthy(opts.$fetch(\"numbered\", doc['$attr?'](\"sectnums\")))) {\n \n $writer = [(function() {if ($truthy(sect.$special())) {\n return ($truthy($a = parent.$numbered()) ? true : $a)\n } else {\n return true\n }; return nil; })()];\n $send(sect, 'numbered=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];}\n } else if ($truthy(opts.$fetch(\"numbered\", ($truthy($a = book) ? doc['$attr?'](\"partnums\") : $a)))) {\n \n $writer = [true];\n $send(sect, 'numbered=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];};\n if ((id = attrs['$[]'](\"id\"))['$=='](false)) {\n attrs.$delete(\"id\")\n } else {\n \n $writer = [(($writer = [\"id\", ($truthy($a = id) ? $a : (function() {if ($truthy(doc['$attr?'](\"sectids\"))) {\n \n return $$($nesting, 'Section').$generate_id(sect.$title(), doc);\n } else {\n return nil\n }; return nil; })())]), $send(attrs, '[]=', Opal.to_a($writer)), $writer[$rb_minus($writer[\"length\"], 1)])];\n $send(sect, 'id=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];\n };\n sect.$update_attributes(attrs);\n return sect;\n }, $Processor_create_section$7.$$arity = -4);\n \n Opal.def(self, '$create_block', $Processor_create_block$8 = function $$create_block(parent, context, source, attrs, opts) {\n var self = this;\n\n \n \n if (opts == null) {\n opts = $hash2([], {});\n };\n return $$($nesting, 'Block').$new(parent, context, $hash2([\"source\", \"attributes\"], {\"source\": source, \"attributes\": attrs}).$merge(opts));\n }, $Processor_create_block$8.$$arity = -5);\n \n Opal.def(self, '$create_list', $Processor_create_list$9 = function $$create_list(parent, context, attrs) {\n var self = this, list = nil;\n\n \n \n if (attrs == null) {\n attrs = nil;\n };\n list = $$($nesting, 'List').$new(parent, context);\n if ($truthy(attrs)) {\n list.$update_attributes(attrs)};\n return list;\n }, $Processor_create_list$9.$$arity = -3);\n \n Opal.def(self, '$create_list_item', $Processor_create_list_item$10 = function $$create_list_item(parent, text) {\n var self = this;\n\n \n \n if (text == null) {\n text = nil;\n };\n return $$($nesting, 'ListItem').$new(parent, text);\n }, $Processor_create_list_item$10.$$arity = -2);\n \n Opal.def(self, '$create_image_block', $Processor_create_image_block$11 = function $$create_image_block(parent, attrs, opts) {\n var $a, self = this, target = nil, $writer = nil, title = nil, block = nil;\n\n \n \n if (opts == null) {\n opts = $hash2([], {});\n };\n if ($truthy((target = attrs['$[]'](\"target\")))) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"Unable to create an image block, target attribute is required\")\n };\n ($truthy($a = attrs['$[]'](\"alt\")) ? $a : (($writer = [\"alt\", (($writer = [\"default-alt\", $$($nesting, 'Helpers').$basename(target, true).$tr(\"_-\", \" \")]), $send(attrs, '[]=', Opal.to_a($writer)), $writer[$rb_minus($writer[\"length\"], 1)])]), $send(attrs, '[]=', Opal.to_a($writer)), $writer[$rb_minus($writer[\"length\"], 1)]));\n title = (function() {if ($truthy(attrs['$key?'](\"title\"))) {\n \n return attrs.$delete(\"title\");\n } else {\n return nil\n }; return nil; })();\n block = self.$create_block(parent, \"image\", nil, attrs, opts);\n if ($truthy(title)) {\n \n \n $writer = [title];\n $send(block, 'title=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;\n block.$assign_caption(attrs.$delete(\"caption\"), \"figure\");};\n return block;\n }, $Processor_create_image_block$11.$$arity = -3);\n \n Opal.def(self, '$create_inline', $Processor_create_inline$12 = function $$create_inline(parent, context, text, opts) {\n var self = this;\n\n \n \n if (opts == null) {\n opts = $hash2([], {});\n };\n return $$($nesting, 'Inline').$new(parent, context, text, (function() {if (context['$=='](\"quoted\")) {\n \n return $hash2([\"type\"], {\"type\": \"unquoted\"}).$merge(opts);\n } else {\n return opts\n }; return nil; })());\n }, $Processor_create_inline$12.$$arity = -4);\n \n Opal.def(self, '$parse_content', $Processor_parse_content$13 = function $$parse_content(parent, content, attributes) {\n var self = this, reader = nil;\n\n \n \n if (attributes == null) {\n attributes = nil;\n };\n reader = (function() {if ($truthy($$($nesting, 'Reader')['$==='](content))) {\n return content\n } else {\n \n return $$($nesting, 'Reader').$new(content);\n }; return nil; })();\n $$($nesting, 'Parser').$parse_blocks(reader, parent, attributes);\n return parent;\n }, $Processor_parse_content$13.$$arity = -3);\n \n Opal.def(self, '$parse_attributes', $Processor_parse_attributes$14 = function $$parse_attributes(block, attrlist, opts) {\n var $a, self = this;\n\n \n \n if (opts == null) {\n opts = $hash2([], {});\n };\n if ($truthy((function() {if ($truthy(attrlist)) {\n return attrlist['$empty?']()\n } else {\n return true\n }; return nil; })())) {\n return $hash2([], {})};\n if ($truthy(($truthy($a = opts['$[]'](\"sub_attributes\")) ? attrlist['$include?']($$($nesting, 'ATTR_REF_HEAD')) : $a))) {\n attrlist = block.$sub_attributes(attrlist)};\n return $$($nesting, 'AttributeList').$new(attrlist).$parse(($truthy($a = opts['$[]'](\"positional_attributes\")) ? $a : []));\n }, $Processor_parse_attributes$14.$$arity = -3);\n return $send([[\"create_paragraph\", \"create_block\", \"paragraph\"], [\"create_open_block\", \"create_block\", \"open\"], [\"create_example_block\", \"create_block\", \"example\"], [\"create_pass_block\", \"create_block\", \"pass\"], [\"create_listing_block\", \"create_block\", \"listing\"], [\"create_literal_block\", \"create_block\", \"literal\"], [\"create_anchor\", \"create_inline\", \"anchor\"], [\"create_inline_pass\", \"create_inline\", \"quoted\"]], 'each', [], ($Processor$15 = function(method_name, delegate_method_name, context){var self = $Processor$15.$$s || this, $$16;\n\n \n \n if (method_name == null) {\n method_name = nil;\n };\n \n if (delegate_method_name == null) {\n delegate_method_name = nil;\n };\n \n if (context == null) {\n context = nil;\n };\n return $send(self, 'define_method', [method_name], ($$16 = function($a){var self = $$16.$$s || this, $post_args, args;\n\n \n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n args.$unshift(args.$shift(), context);\n return $send(self, 'send', [delegate_method_name].concat(Opal.to_a(args)));}, $$16.$$s = self, $$16.$$arity = -1, $$16));}, $Processor$15.$$s = self, $Processor$15.$$arity = 3, $Processor$15));\n })($nesting[0], null, $nesting);\n (function($base, $parent_nesting) {\n var self = $module($base, 'ProcessorDsl');\n\n var $nesting = [self].concat($parent_nesting), $ProcessorDsl_option$17, $ProcessorDsl_process$18, $ProcessorDsl_process_block_given$ques$20;\n\n \n \n Opal.def(self, '$option', $ProcessorDsl_option$17 = function $$option(key, value) {\n var self = this, $writer = nil;\n\n \n $writer = [key, value];\n $send(self.$config(), '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];\n }, $ProcessorDsl_option$17.$$arity = 2);\n \n Opal.def(self, '$process', $ProcessorDsl_process$18 = function $$process($a) {\n var $iter = $ProcessorDsl_process$18.$$p, block = $iter || nil, $post_args, args, $b, $$19, self = this, context = nil;\n if (self.process_block == null) self.process_block = nil;\n\n if ($iter) $ProcessorDsl_process$18.$$p = null;\n \n \n if ($iter) $ProcessorDsl_process$18.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n if ((block !== nil)) {\n \n if ($truthy(args['$empty?']())) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"wrong number of arguments (given \" + (args.$size()) + \", expected 0)\")\n };\n if ($truthy(($truthy($b = block.$binding()) ? self['$=='](block.$binding().$receiver()) : $b))) {\n } else {\n \n context = self;\n $send(block, 'define_singleton_method', [\"call\"], ($$19 = function($c){var self = $$19.$$s || this, $post_args, m_args;\n\n \n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n m_args = $post_args;;\n return $send(context, 'instance_exec', Opal.to_a(m_args), block.$to_proc());}, $$19.$$s = self, $$19.$$arity = -1, $$19));\n };\n return (self.process_block = block);\n } else if ($truthy((($b = self['process_block'], $b != null && $b !== nil) ? 'instance-variable' : nil))) {\n return $send(self.process_block, 'call', Opal.to_a(args))\n } else {\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + (self.$class()) + \" #\" + (\"process\") + \" method called before being registered\")\n };\n }, $ProcessorDsl_process$18.$$arity = -1);\n \n Opal.def(self, '$process_block_given?', $ProcessorDsl_process_block_given$ques$20 = function() {\n var $a, self = this;\n\n return (($a = self['process_block'], $a != null && $a !== nil) ? 'instance-variable' : nil)\n }, $ProcessorDsl_process_block_given$ques$20.$$arity = 0);\n })($nesting[0], $nesting);\n (function($base, $parent_nesting) {\n var self = $module($base, 'DocumentProcessorDsl');\n\n var $nesting = [self].concat($parent_nesting), $DocumentProcessorDsl_prefer$21;\n\n \n self.$include($$($nesting, 'ProcessorDsl'));\n \n Opal.def(self, '$prefer', $DocumentProcessorDsl_prefer$21 = function $$prefer() {\n var self = this;\n\n return self.$option(\"position\", \">>\")\n }, $DocumentProcessorDsl_prefer$21.$$arity = 0);\n })($nesting[0], $nesting);\n (function($base, $parent_nesting) {\n var self = $module($base, 'SyntaxProcessorDsl');\n\n var $nesting = [self].concat($parent_nesting), $SyntaxProcessorDsl_named$22, $SyntaxProcessorDsl_content_model$23, $SyntaxProcessorDsl_positional_attributes$24, $SyntaxProcessorDsl_default_attributes$25, $SyntaxProcessorDsl_resolve_attributes$26;\n\n \n self.$include($$($nesting, 'ProcessorDsl'));\n \n Opal.def(self, '$named', $SyntaxProcessorDsl_named$22 = function $$named(value) {\n var self = this;\n\n if ($truthy($$($nesting, 'Processor')['$==='](self))) {\n return (self.name = value)\n } else {\n return self.$option(\"name\", value)\n }\n }, $SyntaxProcessorDsl_named$22.$$arity = 1);\n \n Opal.def(self, '$content_model', $SyntaxProcessorDsl_content_model$23 = function $$content_model(value) {\n var self = this;\n\n return self.$option(\"content_model\", value)\n }, $SyntaxProcessorDsl_content_model$23.$$arity = 1);\n Opal.alias(self, \"parse_content_as\", \"content_model\");\n \n Opal.def(self, '$positional_attributes', $SyntaxProcessorDsl_positional_attributes$24 = function $$positional_attributes($a) {\n var $post_args, value, self = this;\n\n \n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n value = $post_args;;\n return self.$option(\"positional_attrs\", value.$flatten());\n }, $SyntaxProcessorDsl_positional_attributes$24.$$arity = -1);\n Opal.alias(self, \"name_positional_attributes\", \"positional_attributes\");\n Opal.alias(self, \"positional_attrs\", \"positional_attributes\");\n \n Opal.def(self, '$default_attributes', $SyntaxProcessorDsl_default_attributes$25 = function $$default_attributes(value) {\n var self = this;\n\n return self.$option(\"default_attrs\", value)\n }, $SyntaxProcessorDsl_default_attributes$25.$$arity = 1);\n Opal.alias(self, \"default_attrs\", \"default_attributes\");\n \n Opal.def(self, '$resolve_attributes', $SyntaxProcessorDsl_resolve_attributes$26 = function $$resolve_attributes($a) {\n var $post_args, args, $b, $$27, $$28, self = this, $case = nil, names = nil, defaults = nil;\n\n \n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n if ($truthy($rb_gt(args.$size(), 1))) {\n } else if ($truthy((args = args.$fetch(0, true))['$respond_to?'](\"to_sym\"))) {\n args = [args]};\n return (function() {$case = args;\n if (true['$===']($case)) {\n self.$option(\"positional_attrs\", []);\n return self.$option(\"default_attrs\", $hash2([], {}));}\n else if ($$$('::', 'Array')['$===']($case)) {\n $b = [[], $hash2([], {})], (names = $b[0]), (defaults = $b[1]), $b;\n $send(args, 'each', [], ($$27 = function(arg){var self = $$27.$$s || this, $c, $d, name = nil, _ = nil, value = nil, idx = nil, $writer = nil;\n\n \n \n if (arg == null) {\n arg = nil;\n };\n if ($truthy((arg = arg.$to_s())['$include?'](\"=\"))) {\n \n $d = arg.$partition(\"=\"), $c = Opal.to_ary($d), (name = ($c[0] == null ? nil : $c[0])), (_ = ($c[1] == null ? nil : $c[1])), (value = ($c[2] == null ? nil : $c[2])), $d;\n if ($truthy(name['$include?'](\":\"))) {\n \n $d = name.$partition(\":\"), $c = Opal.to_ary($d), (idx = ($c[0] == null ? nil : $c[0])), (_ = ($c[1] == null ? nil : $c[1])), (name = ($c[2] == null ? nil : $c[2])), $d;\n idx = (function() {if (idx['$=='](\"@\")) {\n return names.$size()\n } else {\n return idx.$to_i()\n }; return nil; })();\n \n $writer = [idx, name];\n $send(names, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;};\n \n $writer = [name, value];\n $send(defaults, '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];;\n } else if ($truthy(arg['$include?'](\":\"))) {\n \n $d = arg.$partition(\":\"), $c = Opal.to_ary($d), (idx = ($c[0] == null ? nil : $c[0])), (_ = ($c[1] == null ? nil : $c[1])), (name = ($c[2] == null ? nil : $c[2])), $d;\n idx = (function() {if (idx['$=='](\"@\")) {\n return names.$size()\n } else {\n return idx.$to_i()\n }; return nil; })();\n \n $writer = [idx, name];\n $send(names, '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];;\n } else {\n return names['$<<'](arg)\n };}, $$27.$$s = self, $$27.$$arity = 1, $$27));\n self.$option(\"positional_attrs\", names.$compact());\n return self.$option(\"default_attrs\", defaults);}\n else if ($$$('::', 'Hash')['$===']($case)) {\n $b = [[], $hash2([], {})], (names = $b[0]), (defaults = $b[1]), $b;\n $send(args, 'each', [], ($$28 = function(key, val){var self = $$28.$$s || this, $c, $d, name = nil, idx = nil, _ = nil, $writer = nil;\n\n \n \n if (key == null) {\n key = nil;\n };\n \n if (val == null) {\n val = nil;\n };\n if ($truthy((name = key.$to_s())['$include?'](\":\"))) {\n \n $d = name.$partition(\":\"), $c = Opal.to_ary($d), (idx = ($c[0] == null ? nil : $c[0])), (_ = ($c[1] == null ? nil : $c[1])), (name = ($c[2] == null ? nil : $c[2])), $d;\n idx = (function() {if (idx['$=='](\"@\")) {\n return names.$size()\n } else {\n return idx.$to_i()\n }; return nil; })();\n \n $writer = [idx, name];\n $send(names, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;};\n if ($truthy(val)) {\n \n $writer = [name, val];\n $send(defaults, '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];\n } else {\n return nil\n };}, $$28.$$s = self, $$28.$$arity = 2, $$28));\n self.$option(\"positional_attrs\", names.$compact());\n return self.$option(\"default_attrs\", defaults);}\n else {return self.$raise($$$('::', 'ArgumentError'), \"\" + \"unsupported attributes specification for macro: \" + (args.$inspect()))}})();\n }, $SyntaxProcessorDsl_resolve_attributes$26.$$arity = -1);\n Opal.alias(self, \"resolves_attributes\", \"resolve_attributes\");\n })($nesting[0], $nesting);\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Preprocessor');\n\n var $nesting = [self].concat($parent_nesting), $Preprocessor_process$29;\n\n return (Opal.def(self, '$process', $Preprocessor_process$29 = function $$process(document, reader) {\n var self = this;\n\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + ($$($nesting, 'Preprocessor')) + \" subclass \" + (self.$class()) + \" must implement the #\" + (\"process\") + \" method\")\n }, $Preprocessor_process$29.$$arity = 2), nil) && 'process'\n })($nesting[0], $$($nesting, 'Processor'), $nesting);\n Opal.const_set($$($nesting, 'Preprocessor'), 'DSL', $$($nesting, 'DocumentProcessorDsl'));\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'TreeProcessor');\n\n var $nesting = [self].concat($parent_nesting), $TreeProcessor_process$30;\n\n return (Opal.def(self, '$process', $TreeProcessor_process$30 = function $$process(document) {\n var self = this;\n\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + ($$($nesting, 'TreeProcessor')) + \" subclass \" + (self.$class()) + \" must implement the #\" + (\"process\") + \" method\")\n }, $TreeProcessor_process$30.$$arity = 1), nil) && 'process'\n })($nesting[0], $$($nesting, 'Processor'), $nesting);\n Opal.const_set($$($nesting, 'TreeProcessor'), 'DSL', $$($nesting, 'DocumentProcessorDsl'));\n Opal.const_set($nesting[0], 'Treeprocessor', $$($nesting, 'TreeProcessor'));\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Postprocessor');\n\n var $nesting = [self].concat($parent_nesting), $Postprocessor_process$31;\n\n return (Opal.def(self, '$process', $Postprocessor_process$31 = function $$process(document, output) {\n var self = this;\n\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + ($$($nesting, 'Postprocessor')) + \" subclass \" + (self.$class()) + \" must implement the #\" + (\"process\") + \" method\")\n }, $Postprocessor_process$31.$$arity = 2), nil) && 'process'\n })($nesting[0], $$($nesting, 'Processor'), $nesting);\n Opal.const_set($$($nesting, 'Postprocessor'), 'DSL', $$($nesting, 'DocumentProcessorDsl'));\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'IncludeProcessor');\n\n var $nesting = [self].concat($parent_nesting), $IncludeProcessor_process$32, $IncludeProcessor_handles$ques$33;\n\n \n \n Opal.def(self, '$process', $IncludeProcessor_process$32 = function $$process(document, reader, target, attributes) {\n var self = this;\n\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + ($$($nesting, 'IncludeProcessor')) + \" subclass \" + (self.$class()) + \" must implement the #\" + (\"process\") + \" method\")\n }, $IncludeProcessor_process$32.$$arity = 4);\n return (Opal.def(self, '$handles?', $IncludeProcessor_handles$ques$33 = function(target) {\n var self = this;\n\n return true\n }, $IncludeProcessor_handles$ques$33.$$arity = 1), nil) && 'handles?';\n })($nesting[0], $$($nesting, 'Processor'), $nesting);\n (function($base, $parent_nesting) {\n var self = $module($base, 'IncludeProcessorDsl');\n\n var $nesting = [self].concat($parent_nesting), $IncludeProcessorDsl_handles$ques$34;\n\n \n self.$include($$($nesting, 'DocumentProcessorDsl'));\n \n Opal.def(self, '$handles?', $IncludeProcessorDsl_handles$ques$34 = function($a) {\n var $iter = $IncludeProcessorDsl_handles$ques$34.$$p, block = $iter || nil, $post_args, args, $b, self = this;\n if (self.handles_block == null) self.handles_block = nil;\n\n if ($iter) $IncludeProcessorDsl_handles$ques$34.$$p = null;\n \n \n if ($iter) $IncludeProcessorDsl_handles$ques$34.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n if ((block !== nil)) {\n \n if ($truthy(args['$empty?']())) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"wrong number of arguments (given \" + (args.$size()) + \", expected 0)\")\n };\n return (self.handles_block = block);\n } else if ($truthy((($b = self['handles_block'], $b != null && $b !== nil) ? 'instance-variable' : nil))) {\n return self.handles_block.$call(args['$[]'](0))\n } else {\n return true\n };\n }, $IncludeProcessorDsl_handles$ques$34.$$arity = -1);\n })($nesting[0], $nesting);\n Opal.const_set($$($nesting, 'IncludeProcessor'), 'DSL', $$($nesting, 'IncludeProcessorDsl'));\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'DocinfoProcessor');\n\n var $nesting = [self].concat($parent_nesting), $DocinfoProcessor_initialize$35, $DocinfoProcessor_process$36;\n\n self.$$prototype.config = nil;\n \n \n Opal.def(self, '$initialize', $DocinfoProcessor_initialize$35 = function $$initialize(config) {\n var $a, $iter = $DocinfoProcessor_initialize$35.$$p, $yield = $iter || nil, self = this, $writer = nil;\n\n if ($iter) $DocinfoProcessor_initialize$35.$$p = null;\n \n \n if (config == null) {\n config = $hash2([], {});\n };\n $send(self, Opal.find_super_dispatcher(self, 'initialize', $DocinfoProcessor_initialize$35, false), [config], null);\n return ($truthy($a = self.config['$[]'](\"location\")) ? $a : (($writer = [\"location\", \"head\"]), $send(self.config, '[]=', Opal.to_a($writer)), $writer[$rb_minus($writer[\"length\"], 1)]));\n }, $DocinfoProcessor_initialize$35.$$arity = -1);\n return (Opal.def(self, '$process', $DocinfoProcessor_process$36 = function $$process(document) {\n var self = this;\n\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + ($$($nesting, 'DocinfoProcessor')) + \" subclass \" + (self.$class()) + \" must implement the #\" + (\"process\") + \" method\")\n }, $DocinfoProcessor_process$36.$$arity = 1), nil) && 'process';\n })($nesting[0], $$($nesting, 'Processor'), $nesting);\n (function($base, $parent_nesting) {\n var self = $module($base, 'DocinfoProcessorDsl');\n\n var $nesting = [self].concat($parent_nesting), $DocinfoProcessorDsl_at_location$37;\n\n \n self.$include($$($nesting, 'DocumentProcessorDsl'));\n \n Opal.def(self, '$at_location', $DocinfoProcessorDsl_at_location$37 = function $$at_location(value) {\n var self = this;\n\n return self.$option(\"location\", value)\n }, $DocinfoProcessorDsl_at_location$37.$$arity = 1);\n })($nesting[0], $nesting);\n Opal.const_set($$($nesting, 'DocinfoProcessor'), 'DSL', $$($nesting, 'DocinfoProcessorDsl'));\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'BlockProcessor');\n\n var $nesting = [self].concat($parent_nesting), $BlockProcessor_initialize$38, $BlockProcessor_process$39;\n\n self.$$prototype.config = nil;\n \n self.$attr_accessor(\"name\");\n \n Opal.def(self, '$initialize', $BlockProcessor_initialize$38 = function $$initialize(name, config) {\n var $a, $iter = $BlockProcessor_initialize$38.$$p, $yield = $iter || nil, self = this, $case = nil, $writer = nil;\n\n if ($iter) $BlockProcessor_initialize$38.$$p = null;\n \n \n if (name == null) {\n name = nil;\n };\n \n if (config == null) {\n config = $hash2([], {});\n };\n $send(self, Opal.find_super_dispatcher(self, 'initialize', $BlockProcessor_initialize$38, false), [config], null);\n self.name = ($truthy($a = name) ? $a : self.config['$[]'](\"name\"));\n $case = self.config['$[]'](\"contexts\");\n if ($$$('::', 'NilClass')['$===']($case)) {($truthy($a = self.config['$[]'](\"contexts\")) ? $a : (($writer = [\"contexts\", [\"open\", \"paragraph\"].$to_set()]), $send(self.config, '[]=', Opal.to_a($writer)), $writer[$rb_minus($writer[\"length\"], 1)]))}\n else if ($$$('::', 'Symbol')['$===']($case)) {\n $writer = [\"contexts\", [self.config['$[]'](\"contexts\")].$to_set()];\n $send(self.config, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];}\n else {\n $writer = [\"contexts\", self.config['$[]'](\"contexts\").$to_set()];\n $send(self.config, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];};\n return ($truthy($a = self.config['$[]'](\"content_model\")) ? $a : (($writer = [\"content_model\", \"compound\"]), $send(self.config, '[]=', Opal.to_a($writer)), $writer[$rb_minus($writer[\"length\"], 1)]));\n }, $BlockProcessor_initialize$38.$$arity = -1);\n return (Opal.def(self, '$process', $BlockProcessor_process$39 = function $$process(parent, reader, attributes) {\n var self = this;\n\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + ($$($nesting, 'BlockProcessor')) + \" subclass \" + (self.$class()) + \" must implement the #\" + (\"process\") + \" method\")\n }, $BlockProcessor_process$39.$$arity = 3), nil) && 'process';\n })($nesting[0], $$($nesting, 'Processor'), $nesting);\n (function($base, $parent_nesting) {\n var self = $module($base, 'BlockProcessorDsl');\n\n var $nesting = [self].concat($parent_nesting), $BlockProcessorDsl_contexts$40;\n\n \n self.$include($$($nesting, 'SyntaxProcessorDsl'));\n \n Opal.def(self, '$contexts', $BlockProcessorDsl_contexts$40 = function $$contexts($a) {\n var $post_args, value, self = this;\n\n \n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n value = $post_args;;\n return self.$option(\"contexts\", value.$flatten().$to_set());\n }, $BlockProcessorDsl_contexts$40.$$arity = -1);\n Opal.alias(self, \"on_contexts\", \"contexts\");\n Opal.alias(self, \"on_context\", \"contexts\");\n Opal.alias(self, \"bind_to\", \"contexts\");\n })($nesting[0], $nesting);\n Opal.const_set($$($nesting, 'BlockProcessor'), 'DSL', $$($nesting, 'BlockProcessorDsl'));\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'MacroProcessor');\n\n var $nesting = [self].concat($parent_nesting), $MacroProcessor_initialize$41, $MacroProcessor_process$42;\n\n self.$$prototype.config = nil;\n \n self.$attr_accessor(\"name\");\n \n Opal.def(self, '$initialize', $MacroProcessor_initialize$41 = function $$initialize(name, config) {\n var $a, $iter = $MacroProcessor_initialize$41.$$p, $yield = $iter || nil, self = this, $writer = nil;\n\n if ($iter) $MacroProcessor_initialize$41.$$p = null;\n \n \n if (name == null) {\n name = nil;\n };\n \n if (config == null) {\n config = $hash2([], {});\n };\n $send(self, Opal.find_super_dispatcher(self, 'initialize', $MacroProcessor_initialize$41, false), [config], null);\n self.name = ($truthy($a = name) ? $a : self.config['$[]'](\"name\"));\n return ($truthy($a = self.config['$[]'](\"content_model\")) ? $a : (($writer = [\"content_model\", \"attributes\"]), $send(self.config, '[]=', Opal.to_a($writer)), $writer[$rb_minus($writer[\"length\"], 1)]));\n }, $MacroProcessor_initialize$41.$$arity = -1);\n return (Opal.def(self, '$process', $MacroProcessor_process$42 = function $$process(parent, target, attributes) {\n var self = this;\n\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + ($$($nesting, 'MacroProcessor')) + \" subclass \" + (self.$class()) + \" must implement the #\" + (\"process\") + \" method\")\n }, $MacroProcessor_process$42.$$arity = 3), nil) && 'process';\n })($nesting[0], $$($nesting, 'Processor'), $nesting);\n (function($base, $parent_nesting) {\n var self = $module($base, 'MacroProcessorDsl');\n\n var $nesting = [self].concat($parent_nesting), $MacroProcessorDsl_resolve_attributes$43;\n\n \n self.$include($$($nesting, 'SyntaxProcessorDsl'));\n \n Opal.def(self, '$resolve_attributes', $MacroProcessorDsl_resolve_attributes$43 = function $$resolve_attributes($a) {\n var $post_args, args, $b, $iter = $MacroProcessorDsl_resolve_attributes$43.$$p, $yield = $iter || nil, self = this, $zuper = nil, $zuper_i = nil, $zuper_ii = nil;\n\n if ($iter) $MacroProcessorDsl_resolve_attributes$43.$$p = null;\n // Prepare super implicit arguments\n for($zuper_i = 0, $zuper_ii = arguments.length, $zuper = new Array($zuper_ii); $zuper_i < $zuper_ii; $zuper_i++) {\n $zuper[$zuper_i] = arguments[$zuper_i];\n }\n \n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n if ($truthy((($b = args.$size()['$=='](1)) ? args['$[]'](0)['$!']() : args.$size()['$=='](1)))) {\n return self.$option(\"content_model\", \"text\")\n } else {\n \n $send(self, Opal.find_super_dispatcher(self, 'resolve_attributes', $MacroProcessorDsl_resolve_attributes$43, false), $zuper, $iter);\n return self.$option(\"content_model\", \"attributes\");\n };\n }, $MacroProcessorDsl_resolve_attributes$43.$$arity = -1);\n Opal.alias(self, \"resolves_attributes\", \"resolve_attributes\");\n })($nesting[0], $nesting);\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'BlockMacroProcessor');\n\n var $nesting = [self].concat($parent_nesting), $BlockMacroProcessor_name$44;\n\n self.$$prototype.name = nil;\n return (Opal.def(self, '$name', $BlockMacroProcessor_name$44 = function $$name() {\n var self = this;\n\n \n if ($truthy($$($nesting, 'MacroNameRx')['$match?'](self.name.$to_s()))) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"invalid name for block macro: \" + (self.name))\n };\n return self.name;\n }, $BlockMacroProcessor_name$44.$$arity = 0), nil) && 'name'\n })($nesting[0], $$($nesting, 'MacroProcessor'), $nesting);\n Opal.const_set($$($nesting, 'BlockMacroProcessor'), 'DSL', $$($nesting, 'MacroProcessorDsl'));\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'InlineMacroProcessor');\n\n var $nesting = [self].concat($parent_nesting), $InlineMacroProcessor_regexp$45, $InlineMacroProcessor_resolve_regexp$46;\n\n self.$$prototype.config = self.$$prototype.name = nil;\n \n (Opal.class_variable_set($nesting[0], '@@rx_cache', $hash2([], {})));\n \n Opal.def(self, '$regexp', $InlineMacroProcessor_regexp$45 = function $$regexp() {\n var $a, self = this, $writer = nil;\n\n return ($truthy($a = self.config['$[]'](\"regexp\")) ? $a : (($writer = [\"regexp\", self.$resolve_regexp(self.name.$to_s(), self.config['$[]'](\"format\"))]), $send(self.config, '[]=', Opal.to_a($writer)), $writer[$rb_minus($writer[\"length\"], 1)]))\n }, $InlineMacroProcessor_regexp$45.$$arity = 0);\n return (Opal.def(self, '$resolve_regexp', $InlineMacroProcessor_resolve_regexp$46 = function $$resolve_regexp(name, format) {\n var $a, $b, self = this, $writer = nil;\n\n \n if ($truthy($$($nesting, 'MacroNameRx')['$match?'](name))) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"invalid name for inline macro: \" + (name))\n };\n return ($truthy($a = (($b = $nesting[0].$$cvars['@@rx_cache']) == null ? nil : $b)['$[]']([name, format])) ? $a : (($writer = [[name, format], new RegExp(\"\" + \"\\\\\\\\?\" + (name) + \":\" + ((function() {if (format['$=='](\"short\")) {\n return \"(){0}\"\n } else {\n return \"(\\\\S+?)\"\n }; return nil; })()) + \"\\\\[(|\" + ($$($nesting, 'CC_ANY')) + \"*?[^\\\\\\\\])\\\\]\")]), $send((($b = $nesting[0].$$cvars['@@rx_cache']) == null ? nil : $b), '[]=', Opal.to_a($writer)), $writer[$rb_minus($writer[\"length\"], 1)]));\n }, $InlineMacroProcessor_resolve_regexp$46.$$arity = 2), nil) && 'resolve_regexp';\n })($nesting[0], $$($nesting, 'MacroProcessor'), $nesting);\n (function($base, $parent_nesting) {\n var self = $module($base, 'InlineMacroProcessorDsl');\n\n var $nesting = [self].concat($parent_nesting), $InlineMacroProcessorDsl_format$47, $InlineMacroProcessorDsl_match$48;\n\n \n self.$include($$($nesting, 'MacroProcessorDsl'));\n \n Opal.def(self, '$format', $InlineMacroProcessorDsl_format$47 = function $$format(value) {\n var self = this;\n\n return self.$option(\"format\", value)\n }, $InlineMacroProcessorDsl_format$47.$$arity = 1);\n Opal.alias(self, \"match_format\", \"format\");\n Opal.alias(self, \"using_format\", \"format\");\n \n Opal.def(self, '$match', $InlineMacroProcessorDsl_match$48 = function $$match(value) {\n var self = this;\n\n return self.$option(\"regexp\", value)\n }, $InlineMacroProcessorDsl_match$48.$$arity = 1);\n })($nesting[0], $nesting);\n Opal.const_set($$($nesting, 'InlineMacroProcessor'), 'DSL', $$($nesting, 'InlineMacroProcessorDsl'));\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Extension');\n\n var $nesting = [self].concat($parent_nesting), $Extension_initialize$49;\n\n \n self.$attr_reader(\"kind\");\n self.$attr_reader(\"config\");\n self.$attr_reader(\"instance\");\n return (Opal.def(self, '$initialize', $Extension_initialize$49 = function $$initialize(kind, instance, config) {\n var self = this;\n\n \n self.kind = kind;\n self.instance = instance;\n return (self.config = config);\n }, $Extension_initialize$49.$$arity = 3), nil) && 'initialize';\n })($nesting[0], null, $nesting);\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'ProcessorExtension');\n\n var $nesting = [self].concat($parent_nesting), $ProcessorExtension_initialize$50;\n\n \n self.$attr_reader(\"process_method\");\n return (Opal.def(self, '$initialize', $ProcessorExtension_initialize$50 = function $$initialize(kind, instance, process_method) {\n var $a, $iter = $ProcessorExtension_initialize$50.$$p, $yield = $iter || nil, self = this;\n\n if ($iter) $ProcessorExtension_initialize$50.$$p = null;\n \n \n if (process_method == null) {\n process_method = nil;\n };\n $send(self, Opal.find_super_dispatcher(self, 'initialize', $ProcessorExtension_initialize$50, false), [kind, instance, instance.$config()], null);\n return (self.process_method = ($truthy($a = process_method) ? $a : instance.$method(\"process\")));\n }, $ProcessorExtension_initialize$50.$$arity = -3), nil) && 'initialize';\n })($nesting[0], $$($nesting, 'Extension'), $nesting);\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Group');\n\n var $nesting = [self].concat($parent_nesting), $Group_activate$52;\n\n \n (function(self, $parent_nesting) {\n var $nesting = [self].concat($parent_nesting), $register$51;\n\n return (Opal.def(self, '$register', $register$51 = function $$register(name) {\n var self = this;\n\n \n \n if (name == null) {\n name = nil;\n };\n return $$($nesting, 'Extensions').$register(name, self);\n }, $register$51.$$arity = -1), nil) && 'register'\n })(Opal.get_singleton_class(self), $nesting);\n return (Opal.def(self, '$activate', $Group_activate$52 = function $$activate(registry) {\n var self = this;\n\n return self.$raise($$$('::', 'NotImplementedError'))\n }, $Group_activate$52.$$arity = 1), nil) && 'activate';\n })($nesting[0], null, $nesting);\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Registry');\n\n var $nesting = [self].concat($parent_nesting), $Registry_initialize$53, $Registry_activate$54, $Registry_preprocessor$56, $Registry_preprocessors$ques$57, $Registry_preprocessors$58, $Registry_tree_processor$59, $Registry_tree_processors$ques$60, $Registry_tree_processors$61, $Registry_postprocessor$62, $Registry_postprocessors$ques$63, $Registry_postprocessors$64, $Registry_include_processor$65, $Registry_include_processors$ques$66, $Registry_include_processors$67, $Registry_docinfo_processor$68, $Registry_docinfo_processors$ques$69, $Registry_docinfo_processors$71, $Registry_block$73, $Registry_blocks$ques$74, $Registry_registered_for_block$ques$75, $Registry_find_block_extension$76, $Registry_block_macro$77, $Registry_block_macros$ques$78, $Registry_registered_for_block_macro$ques$79, $Registry_find_block_macro_extension$80, $Registry_inline_macro$81, $Registry_inline_macros$ques$82, $Registry_registered_for_inline_macro$ques$83, $Registry_find_inline_macro_extension$84, $Registry_inline_macros$85, $Registry_prefer$86, $Registry_add_document_processor$87, $Registry_add_syntax_processor$89, $Registry_resolve_args$91, $Registry_as_symbol$92;\n\n self.$$prototype.groups = self.$$prototype.preprocessor_extensions = self.$$prototype.tree_processor_extensions = self.$$prototype.postprocessor_extensions = self.$$prototype.include_processor_extensions = self.$$prototype.docinfo_processor_extensions = self.$$prototype.block_extensions = self.$$prototype.block_macro_extensions = self.$$prototype.inline_macro_extensions = nil;\n \n self.$attr_reader(\"document\");\n self.$attr_reader(\"groups\");\n \n Opal.def(self, '$initialize', $Registry_initialize$53 = function $$initialize(groups) {\n var self = this;\n\n \n \n if (groups == null) {\n groups = $hash2([], {});\n };\n self.groups = groups;\n self.preprocessor_extensions = (self.tree_processor_extensions = (self.postprocessor_extensions = (self.include_processor_extensions = (self.docinfo_processor_extensions = (self.block_extensions = (self.block_macro_extensions = (self.inline_macro_extensions = nil)))))));\n return (self.document = nil);\n }, $Registry_initialize$53.$$arity = -1);\n \n Opal.def(self, '$activate', $Registry_activate$54 = function $$activate(document) {\n var $$55, self = this, ext_groups = nil;\n\n \n self.document = document;\n if ($truthy((ext_groups = $rb_plus($$($nesting, 'Extensions').$groups().$values(), self.groups.$values()))['$empty?']())) {\n } else {\n $send(ext_groups, 'each', [], ($$55 = function(group){var self = $$55.$$s || this, $case = nil;\n\n \n \n if (group == null) {\n group = nil;\n };\n return (function() {$case = group;\n if ($$$('::', 'Proc')['$===']($case)) {return (function() {$case = group.$arity();\n if ((0)['$===']($case) || (-1)['$===']($case)) {return $send(self, 'instance_exec', [], group.$to_proc())}\n else if ((1)['$===']($case)) {return group.$call(self)}\n else { return nil }})()}\n else if ($$$('::', 'Class')['$===']($case)) {return group.$new().$activate(self)}\n else {return group.$activate(self)}})();}, $$55.$$s = self, $$55.$$arity = 1, $$55))\n };\n return self;\n }, $Registry_activate$54.$$arity = 1);\n \n Opal.def(self, '$preprocessor', $Registry_preprocessor$56 = function $$preprocessor($a) {\n var $iter = $Registry_preprocessor$56.$$p, block = $iter || nil, $post_args, args, self = this;\n\n if ($iter) $Registry_preprocessor$56.$$p = null;\n \n \n if ($iter) $Registry_preprocessor$56.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n return $send(self, 'add_document_processor', [\"preprocessor\", args], block.$to_proc());\n }, $Registry_preprocessor$56.$$arity = -1);\n \n Opal.def(self, '$preprocessors?', $Registry_preprocessors$ques$57 = function() {\n var self = this;\n\n return self.preprocessor_extensions['$!']()['$!']()\n }, $Registry_preprocessors$ques$57.$$arity = 0);\n \n Opal.def(self, '$preprocessors', $Registry_preprocessors$58 = function $$preprocessors() {\n var self = this;\n\n return self.preprocessor_extensions\n }, $Registry_preprocessors$58.$$arity = 0);\n \n Opal.def(self, '$tree_processor', $Registry_tree_processor$59 = function $$tree_processor($a) {\n var $iter = $Registry_tree_processor$59.$$p, block = $iter || nil, $post_args, args, self = this;\n\n if ($iter) $Registry_tree_processor$59.$$p = null;\n \n \n if ($iter) $Registry_tree_processor$59.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n return $send(self, 'add_document_processor', [\"tree_processor\", args], block.$to_proc());\n }, $Registry_tree_processor$59.$$arity = -1);\n \n Opal.def(self, '$tree_processors?', $Registry_tree_processors$ques$60 = function() {\n var self = this;\n\n return self.tree_processor_extensions['$!']()['$!']()\n }, $Registry_tree_processors$ques$60.$$arity = 0);\n \n Opal.def(self, '$tree_processors', $Registry_tree_processors$61 = function $$tree_processors() {\n var self = this;\n\n return self.tree_processor_extensions\n }, $Registry_tree_processors$61.$$arity = 0);\n Opal.alias(self, \"treeprocessor\", \"tree_processor\");\n Opal.alias(self, \"treeprocessors?\", \"tree_processors?\");\n Opal.alias(self, \"treeprocessors\", \"tree_processors\");\n \n Opal.def(self, '$postprocessor', $Registry_postprocessor$62 = function $$postprocessor($a) {\n var $iter = $Registry_postprocessor$62.$$p, block = $iter || nil, $post_args, args, self = this;\n\n if ($iter) $Registry_postprocessor$62.$$p = null;\n \n \n if ($iter) $Registry_postprocessor$62.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n return $send(self, 'add_document_processor', [\"postprocessor\", args], block.$to_proc());\n }, $Registry_postprocessor$62.$$arity = -1);\n \n Opal.def(self, '$postprocessors?', $Registry_postprocessors$ques$63 = function() {\n var self = this;\n\n return self.postprocessor_extensions['$!']()['$!']()\n }, $Registry_postprocessors$ques$63.$$arity = 0);\n \n Opal.def(self, '$postprocessors', $Registry_postprocessors$64 = function $$postprocessors() {\n var self = this;\n\n return self.postprocessor_extensions\n }, $Registry_postprocessors$64.$$arity = 0);\n \n Opal.def(self, '$include_processor', $Registry_include_processor$65 = function $$include_processor($a) {\n var $iter = $Registry_include_processor$65.$$p, block = $iter || nil, $post_args, args, self = this;\n\n if ($iter) $Registry_include_processor$65.$$p = null;\n \n \n if ($iter) $Registry_include_processor$65.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n return $send(self, 'add_document_processor', [\"include_processor\", args], block.$to_proc());\n }, $Registry_include_processor$65.$$arity = -1);\n \n Opal.def(self, '$include_processors?', $Registry_include_processors$ques$66 = function() {\n var self = this;\n\n return self.include_processor_extensions['$!']()['$!']()\n }, $Registry_include_processors$ques$66.$$arity = 0);\n \n Opal.def(self, '$include_processors', $Registry_include_processors$67 = function $$include_processors() {\n var self = this;\n\n return self.include_processor_extensions\n }, $Registry_include_processors$67.$$arity = 0);\n \n Opal.def(self, '$docinfo_processor', $Registry_docinfo_processor$68 = function $$docinfo_processor($a) {\n var $iter = $Registry_docinfo_processor$68.$$p, block = $iter || nil, $post_args, args, self = this;\n\n if ($iter) $Registry_docinfo_processor$68.$$p = null;\n \n \n if ($iter) $Registry_docinfo_processor$68.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n return $send(self, 'add_document_processor', [\"docinfo_processor\", args], block.$to_proc());\n }, $Registry_docinfo_processor$68.$$arity = -1);\n \n Opal.def(self, '$docinfo_processors?', $Registry_docinfo_processors$ques$69 = function(location) {\n var $$70, self = this;\n\n \n \n if (location == null) {\n location = nil;\n };\n if ($truthy(self.docinfo_processor_extensions)) {\n if ($truthy(location)) {\n return $send(self.docinfo_processor_extensions, 'any?', [], ($$70 = function(ext){var self = $$70.$$s || this;\n\n \n \n if (ext == null) {\n ext = nil;\n };\n return ext.$config()['$[]'](\"location\")['$=='](location);}, $$70.$$s = self, $$70.$$arity = 1, $$70))\n } else {\n return true\n }\n } else {\n return false\n };\n }, $Registry_docinfo_processors$ques$69.$$arity = -1);\n \n Opal.def(self, '$docinfo_processors', $Registry_docinfo_processors$71 = function $$docinfo_processors(location) {\n var $$72, self = this;\n\n \n \n if (location == null) {\n location = nil;\n };\n if ($truthy(self.docinfo_processor_extensions)) {\n if ($truthy(location)) {\n return $send(self.docinfo_processor_extensions, 'select', [], ($$72 = function(ext){var self = $$72.$$s || this;\n\n \n \n if (ext == null) {\n ext = nil;\n };\n return ext.$config()['$[]'](\"location\")['$=='](location);}, $$72.$$s = self, $$72.$$arity = 1, $$72))\n } else {\n return self.docinfo_processor_extensions\n }\n } else {\n return nil\n };\n }, $Registry_docinfo_processors$71.$$arity = -1);\n \n Opal.def(self, '$block', $Registry_block$73 = function $$block($a) {\n var $iter = $Registry_block$73.$$p, block = $iter || nil, $post_args, args, self = this;\n\n if ($iter) $Registry_block$73.$$p = null;\n \n \n if ($iter) $Registry_block$73.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n return $send(self, 'add_syntax_processor', [\"block\", args], block.$to_proc());\n }, $Registry_block$73.$$arity = -1);\n \n Opal.def(self, '$blocks?', $Registry_blocks$ques$74 = function() {\n var self = this;\n\n return self.block_extensions['$!']()['$!']()\n }, $Registry_blocks$ques$74.$$arity = 0);\n \n Opal.def(self, '$registered_for_block?', $Registry_registered_for_block$ques$75 = function(name, context) {\n var self = this, ext = nil;\n\n if ($truthy((ext = self.block_extensions['$[]'](name.$to_sym())))) {\n if ($truthy(ext.$config()['$[]'](\"contexts\")['$include?'](context))) {\n return ext\n } else {\n return false\n }\n } else {\n return false\n }\n }, $Registry_registered_for_block$ques$75.$$arity = 2);\n \n Opal.def(self, '$find_block_extension', $Registry_find_block_extension$76 = function $$find_block_extension(name) {\n var self = this;\n\n return self.block_extensions['$[]'](name.$to_sym())\n }, $Registry_find_block_extension$76.$$arity = 1);\n \n Opal.def(self, '$block_macro', $Registry_block_macro$77 = function $$block_macro($a) {\n var $iter = $Registry_block_macro$77.$$p, block = $iter || nil, $post_args, args, self = this;\n\n if ($iter) $Registry_block_macro$77.$$p = null;\n \n \n if ($iter) $Registry_block_macro$77.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n return $send(self, 'add_syntax_processor', [\"block_macro\", args], block.$to_proc());\n }, $Registry_block_macro$77.$$arity = -1);\n \n Opal.def(self, '$block_macros?', $Registry_block_macros$ques$78 = function() {\n var self = this;\n\n return self.block_macro_extensions['$!']()['$!']()\n }, $Registry_block_macros$ques$78.$$arity = 0);\n \n Opal.def(self, '$registered_for_block_macro?', $Registry_registered_for_block_macro$ques$79 = function(name) {\n var self = this, ext = nil;\n\n if ($truthy((ext = self.block_macro_extensions['$[]'](name.$to_sym())))) {\n return ext\n } else {\n return false\n }\n }, $Registry_registered_for_block_macro$ques$79.$$arity = 1);\n \n Opal.def(self, '$find_block_macro_extension', $Registry_find_block_macro_extension$80 = function $$find_block_macro_extension(name) {\n var self = this;\n\n return self.block_macro_extensions['$[]'](name.$to_sym())\n }, $Registry_find_block_macro_extension$80.$$arity = 1);\n \n Opal.def(self, '$inline_macro', $Registry_inline_macro$81 = function $$inline_macro($a) {\n var $iter = $Registry_inline_macro$81.$$p, block = $iter || nil, $post_args, args, self = this;\n\n if ($iter) $Registry_inline_macro$81.$$p = null;\n \n \n if ($iter) $Registry_inline_macro$81.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n return $send(self, 'add_syntax_processor', [\"inline_macro\", args], block.$to_proc());\n }, $Registry_inline_macro$81.$$arity = -1);\n \n Opal.def(self, '$inline_macros?', $Registry_inline_macros$ques$82 = function() {\n var self = this;\n\n return self.inline_macro_extensions['$!']()['$!']()\n }, $Registry_inline_macros$ques$82.$$arity = 0);\n \n Opal.def(self, '$registered_for_inline_macro?', $Registry_registered_for_inline_macro$ques$83 = function(name) {\n var self = this, ext = nil;\n\n if ($truthy((ext = self.inline_macro_extensions['$[]'](name.$to_sym())))) {\n return ext\n } else {\n return false\n }\n }, $Registry_registered_for_inline_macro$ques$83.$$arity = 1);\n \n Opal.def(self, '$find_inline_macro_extension', $Registry_find_inline_macro_extension$84 = function $$find_inline_macro_extension(name) {\n var self = this;\n\n return self.inline_macro_extensions['$[]'](name.$to_sym())\n }, $Registry_find_inline_macro_extension$84.$$arity = 1);\n \n Opal.def(self, '$inline_macros', $Registry_inline_macros$85 = function $$inline_macros() {\n var self = this;\n\n return self.inline_macro_extensions.$values()\n }, $Registry_inline_macros$85.$$arity = 0);\n \n Opal.def(self, '$prefer', $Registry_prefer$86 = function $$prefer($a) {\n var $iter = $Registry_prefer$86.$$p, block = $iter || nil, $post_args, args, self = this, extension = nil, arg0 = nil, extensions_store = nil;\n\n if ($iter) $Registry_prefer$86.$$p = null;\n \n \n if ($iter) $Registry_prefer$86.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n extension = (function() {if ($truthy($$($nesting, 'ProcessorExtension')['$===']((arg0 = args.$shift())))) {\n return arg0\n } else {\n \n return $send(self, 'send', [arg0].concat(Opal.to_a(args)), block.$to_proc());\n }; return nil; })();\n extensions_store = self.$instance_variable_get((((\"\" + \"@\") + (extension.$kind())) + \"_extensions\").$to_sym());\n extensions_store.$unshift(extensions_store.$delete(extension));\n return extension;\n }, $Registry_prefer$86.$$arity = -1);\n self.$private();\n \n Opal.def(self, '$add_document_processor', $Registry_add_document_processor$87 = function $$add_document_processor(kind, args) {\n var $iter = $Registry_add_document_processor$87.$$p, block = $iter || nil, $$88, $a, $b, $c, self = this, kind_name = nil, kind_class_symbol = nil, kind_class = nil, kind_java_class = nil, kind_store = nil, config = nil, processor = nil, extension = nil, processor_class = nil, processor_instance = nil;\n\n if ($iter) $Registry_add_document_processor$87.$$p = null;\n \n \n if ($iter) $Registry_add_document_processor$87.$$p = null;;\n kind_name = kind.$to_s().$tr(\"_\", \" \");\n kind_class_symbol = $send(kind_name.$split(), 'map', [], ($$88 = function(it){var self = $$88.$$s || this;\n\n \n \n if (it == null) {\n it = nil;\n };\n return it.$capitalize();}, $$88.$$s = self, $$88.$$arity = 1, $$88)).$join().$to_sym();\n kind_class = $$($nesting, 'Extensions').$const_get(kind_class_symbol, false);\n kind_java_class = (function() {if ($truthy((($a = $$$('::', 'AsciidoctorJ', 'skip_raise')) ? 'constant' : nil))) {\n \n return $$$($$$('::', 'AsciidoctorJ'), 'Extensions').$const_get(kind_class_symbol, false);\n } else {\n return nil\n }; return nil; })();\n kind_store = ($truthy($b = self.$instance_variable_get((((\"\" + \"@\") + (kind)) + \"_extensions\").$to_sym())) ? $b : self.$instance_variable_set((((\"\" + \"@\") + (kind)) + \"_extensions\").$to_sym(), []));\n if ((block !== nil)) {\n \n config = self.$resolve_args(args, 1);\n (processor = kind_class.$new(config)).$singleton_class().$enable_dsl();\n if (block.$arity()['$=='](0)) {\n $send(processor, 'instance_exec', [], block.$to_proc())\n } else {\n Opal.yield1(block, processor)\n };\n if ($truthy(processor['$process_block_given?']())) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"No block specified to process \" + (kind_name) + \" extension at \" + (block.$source_location()))\n };\n processor.$freeze();\n extension = $$($nesting, 'ProcessorExtension').$new(kind, processor);\n } else {\n \n $c = self.$resolve_args(args, 2), $b = Opal.to_ary($c), (processor = ($b[0] == null ? nil : $b[0])), (config = ($b[1] == null ? nil : $b[1])), $c;\n if ($truthy((processor_class = $$($nesting, 'Helpers').$resolve_class(processor)))) {\n \n if ($truthy(($truthy($b = $rb_lt(processor_class, kind_class)) ? $b : ($truthy($c = kind_java_class) ? $rb_lt(processor_class, kind_java_class) : $c)))) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"Invalid type for \" + (kind_name) + \" extension: \" + (processor))\n };\n processor_instance = processor_class.$new(config);\n processor_instance.$freeze();\n extension = $$($nesting, 'ProcessorExtension').$new(kind, processor_instance);\n } else if ($truthy(($truthy($b = kind_class['$==='](processor)) ? $b : ($truthy($c = kind_java_class) ? kind_java_class['$==='](processor) : $c)))) {\n \n processor.$update_config(config);\n processor.$freeze();\n extension = $$($nesting, 'ProcessorExtension').$new(kind, processor);\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"Invalid arguments specified for registering \" + (kind_name) + \" extension: \" + (args))\n };\n };\n if (extension.$config()['$[]'](\"position\")['$=='](\">>\")) {\n \n kind_store.$unshift(extension);\n } else {\n \n kind_store['$<<'](extension);\n };\n return extension;\n }, $Registry_add_document_processor$87.$$arity = 2);\n \n Opal.def(self, '$add_syntax_processor', $Registry_add_syntax_processor$89 = function $$add_syntax_processor(kind, args) {\n var $iter = $Registry_add_syntax_processor$89.$$p, block = $iter || nil, $$90, $a, $b, $c, self = this, kind_name = nil, kind_class_symbol = nil, kind_class = nil, kind_java_class = nil, kind_store = nil, name = nil, config = nil, processor = nil, $writer = nil, processor_class = nil, processor_instance = nil;\n\n if ($iter) $Registry_add_syntax_processor$89.$$p = null;\n \n \n if ($iter) $Registry_add_syntax_processor$89.$$p = null;;\n kind_name = kind.$to_s().$tr(\"_\", \" \");\n kind_class_symbol = $send(kind_name.$split(), 'map', [], ($$90 = function(it){var self = $$90.$$s || this;\n\n \n \n if (it == null) {\n it = nil;\n };\n return it.$capitalize();}, $$90.$$s = self, $$90.$$arity = 1, $$90))['$<<'](\"Processor\").$join().$to_sym();\n kind_class = $$($nesting, 'Extensions').$const_get(kind_class_symbol, false);\n kind_java_class = (function() {if ($truthy((($a = $$$('::', 'AsciidoctorJ', 'skip_raise')) ? 'constant' : nil))) {\n \n return $$$($$$('::', 'AsciidoctorJ'), 'Extensions').$const_get(kind_class_symbol, false);\n } else {\n return nil\n }; return nil; })();\n kind_store = ($truthy($b = self.$instance_variable_get((((\"\" + \"@\") + (kind)) + \"_extensions\").$to_sym())) ? $b : self.$instance_variable_set((((\"\" + \"@\") + (kind)) + \"_extensions\").$to_sym(), $hash2([], {})));\n if ((block !== nil)) {\n \n $c = self.$resolve_args(args, 2), $b = Opal.to_ary($c), (name = ($b[0] == null ? nil : $b[0])), (config = ($b[1] == null ? nil : $b[1])), $c;\n (processor = kind_class.$new(self.$as_symbol(name), config)).$singleton_class().$enable_dsl();\n if (block.$arity()['$=='](0)) {\n $send(processor, 'instance_exec', [], block.$to_proc())\n } else {\n Opal.yield1(block, processor)\n };\n if ($truthy((name = self.$as_symbol(processor.$name())))) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"No name specified for \" + (kind_name) + \" extension at \" + (block.$source_location()))\n };\n if ($truthy(processor['$process_block_given?']())) {\n } else {\n self.$raise($$$('::', 'NoMethodError'), \"\" + \"No block specified to process \" + (kind_name) + \" extension at \" + (block.$source_location()))\n };\n processor.$freeze();\n \n $writer = [name, $$($nesting, 'ProcessorExtension').$new(kind, processor)];\n $send(kind_store, '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];;\n } else {\n \n $c = self.$resolve_args(args, 3), $b = Opal.to_ary($c), (processor = ($b[0] == null ? nil : $b[0])), (name = ($b[1] == null ? nil : $b[1])), (config = ($b[2] == null ? nil : $b[2])), $c;\n if ($truthy((processor_class = $$($nesting, 'Helpers').$resolve_class(processor)))) {\n \n if ($truthy(($truthy($b = $rb_lt(processor_class, kind_class)) ? $b : ($truthy($c = kind_java_class) ? $rb_lt(processor_class, kind_java_class) : $c)))) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"Class specified for \" + (kind_name) + \" extension does not inherit from \" + (kind_class) + \": \" + (processor))\n };\n processor_instance = processor_class.$new(self.$as_symbol(name), config);\n if ($truthy((name = self.$as_symbol(processor_instance.$name())))) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"No name specified for \" + (kind_name) + \" extension: \" + (processor))\n };\n processor_instance.$freeze();\n \n $writer = [name, $$($nesting, 'ProcessorExtension').$new(kind, processor_instance)];\n $send(kind_store, '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];;\n } else if ($truthy(($truthy($b = kind_class['$==='](processor)) ? $b : ($truthy($c = kind_java_class) ? kind_java_class['$==='](processor) : $c)))) {\n \n processor.$update_config(config);\n if ($truthy((name = (function() {if ($truthy(name)) {\n \n \n $writer = [self.$as_symbol(name)];\n $send(processor, 'name=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];;\n } else {\n \n return self.$as_symbol(processor.$name());\n }; return nil; })()))) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"No name specified for \" + (kind_name) + \" extension: \" + (processor))\n };\n processor.$freeze();\n \n $writer = [name, $$($nesting, 'ProcessorExtension').$new(kind, processor)];\n $send(kind_store, '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];;\n } else {\n return self.$raise($$$('::', 'ArgumentError'), \"\" + \"Invalid arguments specified for registering \" + (kind_name) + \" extension: \" + (args))\n };\n };\n }, $Registry_add_syntax_processor$89.$$arity = 2);\n \n Opal.def(self, '$resolve_args', $Registry_resolve_args$91 = function $$resolve_args(args, expect) {\n var self = this, opts = nil, missing = nil;\n\n \n opts = (function() {if ($truthy($$$('::', 'Hash')['$==='](args['$[]'](-1)))) {\n return args.$pop()\n } else {\n return $hash2([], {})\n }; return nil; })();\n if (expect['$=='](1)) {\n return opts};\n if ($truthy($rb_gt((missing = $rb_minus($rb_minus(expect, 1), args.$size())), 0))) {\n args = $rb_plus(args, $$$('::', 'Array').$new(missing))\n } else if ($truthy($rb_lt(missing, 0))) {\n args.$pop(missing['$-@']())};\n args['$<<'](opts);\n return args;\n }, $Registry_resolve_args$91.$$arity = 2);\n return (Opal.def(self, '$as_symbol', $Registry_as_symbol$92 = function $$as_symbol(name) {\n var self = this;\n\n if ($truthy(name)) {\n return name.$to_sym()\n } else {\n return nil\n }\n }, $Registry_as_symbol$92.$$arity = 1), nil) && 'as_symbol';\n })($nesting[0], null, $nesting);\n (function(self, $parent_nesting) {\n var $nesting = [self].concat($parent_nesting), $generate_name$93, $next_auto_id$94, $groups$95, $create$96, $register$97, $unregister_all$98, $unregister$99;\n\n \n \n Opal.def(self, '$generate_name', $generate_name$93 = function $$generate_name() {\n var self = this;\n\n return \"\" + \"extgrp\" + (self.$next_auto_id())\n }, $generate_name$93.$$arity = 0);\n \n Opal.def(self, '$next_auto_id', $next_auto_id$94 = function $$next_auto_id() {\n var $a, self = this;\n if (self.auto_id == null) self.auto_id = nil;\n\n \n self.auto_id = ($truthy($a = self.auto_id) ? $a : -1);\n return (self.auto_id = $rb_plus(self.auto_id, 1));\n }, $next_auto_id$94.$$arity = 0);\n \n Opal.def(self, '$groups', $groups$95 = function $$groups() {\n var $a, self = this;\n if (self.groups == null) self.groups = nil;\n\n return (self.groups = ($truthy($a = self.groups) ? $a : $hash2([], {})))\n }, $groups$95.$$arity = 0);\n \n Opal.def(self, '$create', $create$96 = function $$create(name) {\n var $iter = $create$96.$$p, block = $iter || nil, $a, self = this;\n\n if ($iter) $create$96.$$p = null;\n \n \n if ($iter) $create$96.$$p = null;;\n \n if (name == null) {\n name = nil;\n };\n if ((block !== nil)) {\n return $$($nesting, 'Registry').$new($hash(($truthy($a = name) ? $a : self.$generate_name()), block))\n } else {\n return $$($nesting, 'Registry').$new()\n };\n }, $create$96.$$arity = -1);\n \n Opal.def(self, '$register', $register$97 = function $$register($a) {\n var $iter = $register$97.$$p, block = $iter || nil, $post_args, args, $b, self = this, argc = nil, resolved_group = nil, group = nil, name = nil, $writer = nil;\n\n if ($iter) $register$97.$$p = null;\n \n \n if ($iter) $register$97.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n argc = args.$size();\n if ((block !== nil)) {\n resolved_group = block\n } else if ($truthy((group = args.$pop()))) {\n resolved_group = ($truthy($b = $$($nesting, 'Helpers').$resolve_class(group)) ? $b : group)\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"Extension group to register not specified\")\n };\n name = ($truthy($b = args.$pop()) ? $b : self.$generate_name());\n if ($truthy(args['$empty?']())) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"Wrong number of arguments (\" + (argc) + \" for 1..2)\")\n };\n \n $writer = [name.$to_sym(), resolved_group];\n $send(self.$groups(), '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];;\n }, $register$97.$$arity = -1);\n \n Opal.def(self, '$unregister_all', $unregister_all$98 = function $$unregister_all() {\n var self = this;\n\n \n self.groups = $hash2([], {});\n return nil;\n }, $unregister_all$98.$$arity = 0);\n return (Opal.def(self, '$unregister', $unregister$99 = function $$unregister($a) {\n var $post_args, names, $$100, self = this;\n\n \n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n names = $post_args;;\n $send(names, 'each', [], ($$100 = function(group){var self = $$100.$$s || this;\n if (self.groups == null) self.groups = nil;\n\n \n \n if (group == null) {\n group = nil;\n };\n return self.groups.$delete(group.$to_sym());}, $$100.$$s = self, $$100.$$arity = 1, $$100));\n return nil;\n }, $unregister$99.$$arity = -1), nil) && 'unregister';\n })(Opal.get_singleton_class(self), $nesting);\n })($nesting[0], $nesting)\n })($nesting[0], $nesting);\n};\n\n/* Generated by Opal 0.11.99.dev */\nOpal.modules[\"asciidoctor/js/asciidoctor_ext/stylesheet\"] = function(Opal) {\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice, $module = Opal.module, $klass = Opal.klass, $truthy = Opal.truthy;\n\n Opal.add_stubs(['$rstrip', '$read', '$join']);\n return (function($base, $parent_nesting) {\n var self = $module($base, 'Asciidoctor');\n\n var $nesting = [self].concat($parent_nesting);\n\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Stylesheets');\n\n var $nesting = [self].concat($parent_nesting), $Stylesheets_primary_stylesheet_data$1;\n\n self.$$prototype.primary_stylesheet_data = nil;\n return (Opal.def(self, '$primary_stylesheet_data', $Stylesheets_primary_stylesheet_data$1 = function $$primary_stylesheet_data() {\n var $a, self = this;\n\n return (self.primary_stylesheet_data = ($truthy($a = self.primary_stylesheet_data) ? $a : $$$('::', 'IO').$read($$$('::', 'File').$join(\"css\", \"asciidoctor.css\")).$rstrip()))\n }, $Stylesheets_primary_stylesheet_data$1.$$arity = 0), nil) && 'primary_stylesheet_data'\n })($nesting[0], null, $nesting)\n })($nesting[0], $nesting)\n};\n\n/* Generated by Opal 0.11.99.dev */\nOpal.modules[\"asciidoctor/js/asciidoctor_ext/document\"] = function(Opal) {\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice, $module = Opal.module, $klass = Opal.klass;\n\n return (function($base, $parent_nesting) {\n var self = $module($base, 'Asciidoctor');\n\n var $nesting = [self].concat($parent_nesting);\n\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Document');\n\n var $nesting = [self].concat($parent_nesting), $Document_fill_datetime_attributes$1;\n\n return (Opal.def(self, '$fill_datetime_attributes', $Document_fill_datetime_attributes$1 = function $$fill_datetime_attributes(attrs, input_mtime) {\n var self = this;\n\n \n var $truthy = Opal.truthy\n var $falsy = Opal.falsy\n var nil = Opal.nil\n var utc_offset\n var source_date_epoch\n\n var getYear = function (time, utc_offset) {\n return utc_offset === 0 ? time.getUTCFullYear() : time.getFullYear()\n }\n var getMonth = function (time, utc_offset) {\n return utc_offset === 0 ? time.getUTCMonth() : time.getMonth()\n }\n var getDay = function (time, utc_offset) {\n return utc_offset === 0 ? time.getUTCDate() : time.getDate()\n }\n var getHours = function (time, utc_offset) {\n return utc_offset === 0 ? time.getUTCHours() : time.getHours()\n }\n\n var now = new Date()\n // See https://reproducible-builds.org/specs/source-date-epoch/\n if (Opal.const_get_qualified('::', 'ENV')['$key?']('SOURCE_DATE_EPOCH')) {\n now.setTime(parseInt(Opal.const_get_qualified('::', 'ENV')['$[]']('SOURCE_DATE_EPOCH')) * 1000)\n source_date_epoch = now\n utc_offset = 0 // utc\n } else {\n utc_offset = -now.getTimezoneOffset() / 60 // local date\n }\n // localdate and localyear\n if ($truthy((localdate = attrs['$[]']('localdate')))) {\n if ($falsy(localyear = attrs['$[]']('localyear'))) {\n localyear = localdate.indexOf('-') === 4 ? localdate.substring(0, 4) : nil\n attrs['$[]=']('localyear', localyear)\n }\n } else {\n var now_year = getYear(now, utc_offset).toString()\n var now_month = ('0' + (getMonth(now, utc_offset) + 1)).slice(-2)\n var now_day = ('0' + getDay(now, utc_offset)).slice(-2)\n localdate = now_year + '-' + now_month + '-' + now_day\n attrs['$[]=']('localdate', localdate)\n localyear = now_year\n attrs['$[]=']('localyear', now_year)\n }\n // localtime\n if ($falsy((localtime = attrs['$[]']('localtime')))) {\n var hours = ('0' + (getHours(now, utc_offset))).slice(-2)\n var minutes = ('0' + (now.getMinutes())).slice(-2)\n var seconds = ('0' + (now.getSeconds())).slice(-2)\n var utc_offset_format\n if (utc_offset === 0) {\n utc_offset_format = 'UTC'\n } else if (utc_offset > 0) {\n utc_offset_format = ('+0' + (utc_offset * 100)).slice(-5)\n } else {\n utc_offset_format = ('-0' + (-utc_offset * 100)).slice(-5)\n }\n localtime = hours + ':' + minutes + ':' + seconds + ' ' + utc_offset_format\n attrs['$[]=']('localtime', localtime)\n }\n // localdatetime\n if ($falsy((localdatetime = attrs['$[]']('localdatetime')))) {\n localdatetime = localdate + ' ' + localtime\n attrs['$[]=']('localdatetime', localdatetime)\n }\n\n // docdate, doctime and docdatetime should default to localdate, localtime and localdatetime if not otherwise set\n if ($truthy(source_date_epoch)) {\n input_mtime = source_date_epoch\n } else if ($truthy(input_mtime)) {\n utc_offset = -input_mtime.getTimezoneOffset() / 60\n } else {\n input_mtime = now\n }\n\n // docdate and docyear\n if ($truthy(docdate = attrs['$[]']('docdate'))) {\n attrs['$[]=']('docyear', docdate.indexOf('-') === 4 ? docdate.substring(0, 4) : nil)\n } else {\n var mtime_year = getYear(input_mtime, utc_offset).toString()\n var mtime_month = ('0' + (getMonth(input_mtime, utc_offset) + 1)).slice(-2)\n var mtime_day = ('0' + (getDay(input_mtime, utc_offset))).slice(-2)\n docdate = mtime_year + '-' + mtime_month + '-' + mtime_day\n attrs['$[]=']('docdate', docdate)\n if ($falsy(attrs['$[]']('docyear'))) {\n attrs['$[]=']('docyear', mtime_year)\n }\n }\n // doctime\n if ($falsy(doctime = attrs['$[]']('doctime'))) {\n var mtime_hours = ('0' + (getHours(input_mtime, utc_offset))).slice(-2)\n var mtime_minutes = ('0' + (input_mtime.getMinutes())).slice(-2)\n var mtime_seconds = ('0' + (input_mtime.getSeconds())).slice(-2)\n if (utc_offset === 0) {\n utc_offset_format = 'UTC'\n } else if (utc_offset > 0) {\n utc_offset_format = ('+0' + (utc_offset * 100)).slice(-5)\n } else {\n utc_offset_format = ('-0' + (-utc_offset * 100)).slice(-5)\n }\n doctime = mtime_hours + ':' + mtime_minutes + ':' + mtime_seconds + ' ' + utc_offset_format\n attrs['$[]=']('doctime', doctime)\n }\n // docdatetime\n if ($falsy(attrs['$[]']('docdatetime'))) {\n attrs['$[]=']('docdatetime', docdate + ' ' + doctime)\n }\n return nil\n \n }, $Document_fill_datetime_attributes$1.$$arity = 2), nil) && 'fill_datetime_attributes'\n })($nesting[0], $$($nesting, 'AbstractBlock'), $nesting)\n })($nesting[0], $nesting)\n};\n\n/* Generated by Opal 0.11.99.dev */\nOpal.modules[\"asciidoctor/js/asciidoctor_ext/substitutors\"] = function(Opal) {\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice, $module = Opal.module;\n\n return (function($base, $parent_nesting) {\n var self = $module($base, 'Asciidoctor');\n\n var $nesting = [self].concat($parent_nesting);\n\n (function($base, $parent_nesting) {\n var self = $module($base, 'Substitutors');\n\n var $nesting = [self].concat($parent_nesting), $Substitutors_sub_placeholder$1;\n\n \n Opal.def(self, '$sub_placeholder', $Substitutors_sub_placeholder$1 = function $$sub_placeholder(format_string, replacement) {\n var self = this;\n\n return format_string.replace('%s', replacement);\n }, $Substitutors_sub_placeholder$1.$$arity = 2)\n })($nesting[0], $nesting)\n })($nesting[0], $nesting)\n};\n\n/* Generated by Opal 0.11.99.dev */\nOpal.modules[\"asciidoctor/js/asciidoctor_ext/parser\"] = function(Opal) {\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice, $module = Opal.module, $klass = Opal.klass, $truthy = Opal.truthy;\n\n return (function($base, $parent_nesting) {\n var self = $module($base, 'Asciidoctor');\n\n var $nesting = [self].concat($parent_nesting);\n\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Parser');\n\n var $nesting = [self].concat($parent_nesting), $Parser_uniform$ques$1, $Parser_uniform$ques$2;\n\n if ($truthy(String.prototype.repeat)) {\n return (Opal.defs(self, '$uniform?', $Parser_uniform$ques$1 = function(str, chr, len) {\n var self = this;\n\n return chr.repeat(len) === str;\n }, $Parser_uniform$ques$1.$$arity = 3), nil) && 'uniform?'\n } else {\n return (Opal.defs(self, '$uniform?', $Parser_uniform$ques$2 = function(str, chr, len) {\n var self = this;\n\n return Array.apply(null, { length: len }).map(function () { return chr }).join('') === str;\n }, $Parser_uniform$ques$2.$$arity = 3), nil) && 'uniform?'\n }\n })($nesting[0], null, $nesting)\n })($nesting[0], $nesting)\n};\n\n/* Generated by Opal 0.11.99.dev */\nOpal.modules[\"asciidoctor/js/asciidoctor_ext/syntax_highlighter\"] = function(Opal) {\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice, $module = Opal.module, $truthy = Opal.truthy;\n\n Opal.add_stubs(['$key?', '$registry', '$[]', '$include?', '$include', '$empty?', '$debug', '$logger', '$join', '$keys']);\n return (function($base, $parent_nesting) {\n var self = $module($base, 'Asciidoctor');\n\n var $nesting = [self].concat($parent_nesting);\n\n (function($base, $parent_nesting) {\n var self = $module($base, 'SyntaxHighlighter');\n\n var $nesting = [self].concat($parent_nesting);\n\n (function($base, $parent_nesting) {\n var self = $module($base, 'Factory');\n\n var $nesting = [self].concat($parent_nesting), $Factory_for$1;\n\n \n Opal.def(self, '$for', $Factory_for$1 = function(name) {\n var self = this;\n\n if ($truthy(self.$registry()['$key?'](name))) {\n return self.$registry()['$[]'](name)\n } else {\n \n if ($truthy(self['$include?']($$($nesting, 'Logging')))) {\n } else {\n self.$include($$($nesting, 'Logging'))\n };\n if ($truthy(self.$registry()['$empty?']())) {\n self.$logger().$debug(\"no syntax highlighter available, functionality disabled.\")\n } else {\n self.$logger().$debug(\"\" + \"syntax highlighter named '\" + (name) + \"' is not available, must be one of: '\" + (self.$registry().$keys().$join(\"', '\")) + \"'.\")\n };\n return nil;\n }\n }, $Factory_for$1.$$arity = 1)\n })($nesting[0], $nesting)\n })($nesting[0], $nesting)\n })($nesting[0], $nesting)\n};\n\n/* Generated by Opal 0.11.99.dev */\nOpal.modules[\"asciidoctor/js/asciidoctor_ext\"] = function(Opal) {\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice;\n\n Opal.add_stubs(['$require']);\n \n self.$require(\"asciidoctor/js/asciidoctor_ext/stylesheet\");\n self.$require(\"asciidoctor/js/asciidoctor_ext/document\");\n self.$require(\"asciidoctor/js/asciidoctor_ext/substitutors\");\n self.$require(\"asciidoctor/js/asciidoctor_ext/parser\");\n self.$require(\"asciidoctor/js/asciidoctor_ext/syntax_highlighter\");\n \n// Load specific runtime\nself.$require(\"asciidoctor/js/asciidoctor_ext/browser\");\n;\n};\n\n/* Generated by Opal 0.11.99.dev */\nOpal.modules[\"asciidoctor/js/opal_ext/logger\"] = function(Opal) {\n function $rb_lt(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs < rhs : lhs['$<'](rhs);\n }\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice, $klass = Opal.klass, $truthy = Opal.truthy;\n\n Opal.add_stubs(['$chr', '$rjust', '$message_as_string', '$<', '$write', '$call', '$[]']);\n return (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Logger');\n\n var $nesting = [self].concat($parent_nesting), $Logger_add$2;\n\n self.$$prototype.level = self.$$prototype.progname = self.$$prototype.pipe = self.$$prototype.formatter = nil;\n \n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Formatter');\n\n var $nesting = [self].concat($parent_nesting), $Formatter_call$1;\n\n return (Opal.def(self, '$call', $Formatter_call$1 = function $$call(severity, time, progname, msg) {\n var self = this, time_format = nil;\n\n \n time_format = time.getFullYear() + '-' + ('0'+(time.getMonth()+1)).slice(-2) + '-' + ('0'+time.getDate()).slice(-2) + 'T' + ('0'+time.getHours()).slice(-2) + ':' + ('0'+time.getMinutes()).slice(-2) + ':' + ('0'+time.getSeconds()).slice(-2) + '.' + ('00' + new Date().getMilliseconds() * 1000).slice(-6);\n return \"\" + (severity.$chr()) + \", [\" + (time_format) + \"] \" + (severity.$rjust(5)) + \" -- \" + (progname) + \": \" + (self.$message_as_string(msg));\n }, $Formatter_call$1.$$arity = 4), nil) && 'call'\n })($nesting[0], null, $nesting);\n return (Opal.def(self, '$add', $Logger_add$2 = function $$add(severity, message, progname) {\n var $iter = $Logger_add$2.$$p, block = $iter || nil, $a, self = this;\n\n if ($iter) $Logger_add$2.$$p = null;\n \n \n if ($iter) $Logger_add$2.$$p = null;;\n \n if (message == null) {\n message = nil;\n };\n \n if (progname == null) {\n progname = nil;\n };\n if ($truthy($rb_lt((severity = ($truthy($a = severity) ? $a : $$($nesting, 'UNKNOWN'))), self.level))) {\n return true};\n progname = ($truthy($a = progname) ? $a : self.progname);\n if ($truthy(message)) {\n } else if ((block !== nil)) {\n message = Opal.yieldX(block, [])\n } else {\n \n message = progname;\n progname = self.progname;\n };\n self.pipe.$write(self.formatter.$call(($truthy($a = $$($nesting, 'SEVERITY_LABELS')['$[]'](severity)) ? $a : \"ANY\"), new Date(), progname, message));\n return true;\n }, $Logger_add$2.$$arity = -2), nil) && 'add';\n })($nesting[0], null, $nesting)\n};\n\n/* Generated by Opal 0.11.99.dev */\nOpal.modules[\"asciidoctor/js/postscript\"] = function(Opal) {\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice;\n\n Opal.add_stubs(['$require']);\n \n self.$require(\"asciidoctor/converter/composite\");\n self.$require(\"asciidoctor/converter/html5\");\n self.$require(\"asciidoctor/extensions\");\n self.$require(\"asciidoctor/js/asciidoctor_ext\");\n return self.$require(\"asciidoctor/js/opal_ext/logger\");\n};\n\n/* Generated by Opal 0.11.99.dev */\n(function(Opal) {\n function $rb_minus(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs - rhs : lhs['$-'](rhs);\n }\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice, $module = Opal.module, $send = Opal.send, $truthy = Opal.truthy, $hash2 = Opal.hash2;\n\n Opal.add_stubs(['$require', '$==', '$to_h', '$sort', '$map', '$constants', '$const_get', '$downcase', '$to_s', '$<=>', '$upcase', '$[]', '$values', '$new', '$attr_reader', '$instance_variable_set', '$send', '$singleton_class', '$<<', '$define', '$dirname', '$absolute_path', '$__dir__', '$join', '$home', '$pwd', '$to_set', '$tap', '$each', '$chr', '$each_key', '$slice', '$[]=', '$-', '$length', '$merge', '$default=', '$drop', '$insert']);\n \n self.$require(\"set\");\n if ($$($nesting, 'RUBY_ENGINE')['$=='](\"opal\")) {\n self.$require(\"asciidoctor/js\")\n } else {\n nil\n };\n (function($base, $parent_nesting) {\n var self = $module($base, 'Asciidoctor');\n\n var $nesting = [self].concat($parent_nesting), $a, $b, $Asciidoctor$7, $Asciidoctor$9, $Asciidoctor$11, $Asciidoctor$13, $writer = nil;\n\n \n Opal.const_set($nesting[0], 'RUBY_ENGINE_OPAL', Opal.const_set($nesting[0], 'RUBY_ENGINE', $$$('::', 'RUBY_ENGINE'))['$=='](\"opal\"));\n (function($base, $parent_nesting) {\n var self = $module($base, 'SafeMode');\n\n var $nesting = [self].concat($parent_nesting), $SafeMode$1, $SafeMode$2, $SafeMode_value_for_name$3, $SafeMode_name_for_value$4, $SafeMode_names$5;\n\n \n Opal.const_set($nesting[0], 'UNSAFE', 0);\n Opal.const_set($nesting[0], 'SAFE', 1);\n Opal.const_set($nesting[0], 'SERVER', 10);\n Opal.const_set($nesting[0], 'SECURE', 20);\n self.names_by_value = $send($send(self.$constants(false), 'map', [], ($SafeMode$1 = function(sym){var self = $SafeMode$1.$$s || this;\n\n \n \n if (sym == null) {\n sym = nil;\n };\n return [self.$const_get(sym), sym.$to_s().$downcase()];}, $SafeMode$1.$$s = self, $SafeMode$1.$$arity = 1, $SafeMode$1)), 'sort', [], ($SafeMode$2 = function($mlhs_tmp1, $mlhs_tmp2){var self = $SafeMode$2.$$s || this, $a, $b, a = nil, b = nil;\n\n \n \n if ($mlhs_tmp1 == null) {\n $mlhs_tmp1 = nil;\n };\n \n if ($mlhs_tmp2 == null) {\n $mlhs_tmp2 = nil;\n };\n $b = $mlhs_tmp1, $a = Opal.to_ary($b), (a = ($a[0] == null ? nil : $a[0])), $b;\n $b = $mlhs_tmp2, $a = Opal.to_ary($b), (b = ($a[0] == null ? nil : $a[0])), $b;\n return a['$<=>'](b);}, $SafeMode$2.$$s = self, $SafeMode$2.$$arity = 2, $SafeMode$2.$$has_top_level_mlhs_arg = true, $SafeMode$2)).$to_h();\n Opal.defs(self, '$value_for_name', $SafeMode_value_for_name$3 = function $$value_for_name(name) {\n var self = this;\n\n return self.$const_get(name.$upcase(), false)\n }, $SafeMode_value_for_name$3.$$arity = 1);\n Opal.defs(self, '$name_for_value', $SafeMode_name_for_value$4 = function $$name_for_value(value) {\n var self = this;\n if (self.names_by_value == null) self.names_by_value = nil;\n\n return self.names_by_value['$[]'](value)\n }, $SafeMode_name_for_value$4.$$arity = 1);\n Opal.defs(self, '$names', $SafeMode_names$5 = function $$names() {\n var self = this;\n if (self.names_by_value == null) self.names_by_value = nil;\n\n return self.names_by_value.$values()\n }, $SafeMode_names$5.$$arity = 0);\n })($nesting[0], $nesting);\n (function($base, $parent_nesting) {\n var self = $module($base, 'Compliance');\n\n var $nesting = [self].concat($parent_nesting);\n\n \n self.keys = $$$('::', 'Set').$new();\n (function(self, $parent_nesting) {\n var $nesting = [self].concat($parent_nesting), $define$6;\n\n \n self.$attr_reader(\"keys\");\n return (Opal.def(self, '$define', $define$6 = function $$define(key, value) {\n var self = this;\n if (self.keys == null) self.keys = nil;\n\n \n self.$instance_variable_set(\"\" + \"@\" + (key), value);\n self.$singleton_class().$send(\"attr_accessor\", key);\n self.keys['$<<'](key);\n return nil;\n }, $define$6.$$arity = 2), nil) && 'define';\n })(Opal.get_singleton_class(self), $nesting);\n self.$define(\"block_terminates_paragraph\", true);\n self.$define(\"strict_verbatim_paragraphs\", true);\n self.$define(\"underline_style_section_titles\", true);\n self.$define(\"unwrap_standalone_preamble\", true);\n self.$define(\"attribute_missing\", \"skip\");\n self.$define(\"attribute_undefined\", \"drop-line\");\n self.$define(\"shorthand_property_syntax\", true);\n self.$define(\"natural_xrefs\", true);\n self.$define(\"unique_id_start_index\", 2);\n self.$define(\"markdown_syntax\", true);\n })($nesting[0], $nesting);\n if ($truthy((($a = $$($nesting, 'ROOT_DIR', 'skip_raise')) ? 'constant' : nil))) {\n } else {\n Opal.const_set($nesting[0], 'ROOT_DIR', $$$('::', 'File').$dirname($$$('::', 'File').$absolute_path(self.$__dir__())))\n };\n Opal.const_set($nesting[0], 'LIB_DIR', $$$('::', 'File').$join($$($nesting, 'ROOT_DIR'), \"lib\"));\n Opal.const_set($nesting[0], 'DATA_DIR', $$$('::', 'File').$join($$($nesting, 'ROOT_DIR'), \"data\"));\n Opal.const_set($nesting[0], 'USER_HOME', (function() { try {\n return $$$('::', 'Dir').$home()\n } catch ($err) {\n if (Opal.rescue($err, [$$($nesting, 'StandardError')])) {\n try {\n \n return ($truthy($b = $$$('::', 'ENV')['$[]'](\"HOME\")) ? $b : $$$('::', 'Dir').$pwd());\n } finally { Opal.pop_exception() }\n } else { throw $err; }\n }})());\n Opal.const_set($nesting[0], 'LF', \"\\n\");\n Opal.const_set($nesting[0], 'NULL', \"\\u0000\");\n Opal.const_set($nesting[0], 'TAB', \"\\t\");\n Opal.const_set($nesting[0], 'MAX_INT', 9007199254740991);\n Opal.const_set($nesting[0], 'UTF_8', $$$($$$('::', 'Encoding'), 'UTF_8'));\n Opal.const_set($nesting[0], 'BOM_BYTES_UTF_8', [239, 187, 191]);\n Opal.const_set($nesting[0], 'BOM_BYTES_UTF_16LE', [255, 254]);\n Opal.const_set($nesting[0], 'BOM_BYTES_UTF_16BE', [254, 255]);\n Opal.const_set($nesting[0], 'FILE_READ_MODE', (function() {if ($truthy($$($nesting, 'RUBY_ENGINE_OPAL'))) {\n return \"r\"\n } else {\n return \"rb:utf-8:utf-8\"\n }; return nil; })());\n Opal.const_set($nesting[0], 'URI_READ_MODE', $$($nesting, 'FILE_READ_MODE'));\n Opal.const_set($nesting[0], 'FILE_WRITE_MODE', (function() {if ($truthy($$($nesting, 'RUBY_ENGINE_OPAL'))) {\n return \"w\"\n } else {\n return \"w:utf-8\"\n }; return nil; })());\n Opal.const_set($nesting[0], 'DEFAULT_DOCTYPE', \"article\");\n Opal.const_set($nesting[0], 'DEFAULT_BACKEND', \"html5\");\n Opal.const_set($nesting[0], 'DEFAULT_STYLESHEET_KEYS', [\"\", \"DEFAULT\"].$to_set());\n Opal.const_set($nesting[0], 'DEFAULT_STYLESHEET_NAME', \"asciidoctor.css\");\n Opal.const_set($nesting[0], 'BACKEND_ALIASES', $hash2([\"html\", \"docbook\"], {\"html\": \"html5\", \"docbook\": \"docbook5\"}));\n Opal.const_set($nesting[0], 'DEFAULT_PAGE_WIDTHS', $hash2([\"docbook\"], {\"docbook\": 425}));\n Opal.const_set($nesting[0], 'DEFAULT_EXTENSIONS', $hash2([\"html\", \"docbook\", \"pdf\", \"epub\", \"manpage\", \"asciidoc\"], {\"html\": \".html\", \"docbook\": \".xml\", \"pdf\": \".pdf\", \"epub\": \".epub\", \"manpage\": \".man\", \"asciidoc\": \".adoc\"}));\n Opal.const_set($nesting[0], 'ASCIIDOC_EXTENSIONS', $hash2([\".adoc\", \".asciidoc\", \".asc\", \".ad\", \".txt\"], {\".adoc\": true, \".asciidoc\": true, \".asc\": true, \".ad\": true, \".txt\": true}));\n Opal.const_set($nesting[0], 'SETEXT_SECTION_LEVELS', $hash2([\"=\", \"-\", \"~\", \"^\", \"+\"], {\"=\": 0, \"-\": 1, \"~\": 2, \"^\": 3, \"+\": 4}));\n Opal.const_set($nesting[0], 'ADMONITION_STYLES', [\"NOTE\", \"TIP\", \"IMPORTANT\", \"WARNING\", \"CAUTION\"].$to_set());\n Opal.const_set($nesting[0], 'ADMONITION_STYLE_HEADS', $send($$$('::', 'Set').$new(), 'tap', [], ($Asciidoctor$7 = function(accum){var self = $Asciidoctor$7.$$s || this, $$8;\n\n \n \n if (accum == null) {\n accum = nil;\n };\n return $send($$($nesting, 'ADMONITION_STYLES'), 'each', [], ($$8 = function(s){var self = $$8.$$s || this;\n\n \n \n if (s == null) {\n s = nil;\n };\n return accum['$<<'](s.$chr());}, $$8.$$s = self, $$8.$$arity = 1, $$8));}, $Asciidoctor$7.$$s = self, $Asciidoctor$7.$$arity = 1, $Asciidoctor$7)));\n Opal.const_set($nesting[0], 'PARAGRAPH_STYLES', [\"comment\", \"example\", \"literal\", \"listing\", \"normal\", \"open\", \"pass\", \"quote\", \"sidebar\", \"source\", \"verse\", \"abstract\", \"partintro\"].$to_set());\n Opal.const_set($nesting[0], 'VERBATIM_STYLES', [\"literal\", \"listing\", \"source\", \"verse\"].$to_set());\n Opal.const_set($nesting[0], 'DELIMITED_BLOCKS', $hash2([\"--\", \"----\", \"....\", \"====\", \"****\", \"____\", \"++++\", \"|===\", \",===\", \":===\", \"!===\", \"////\", \"```\"], {\"--\": [\"open\", [\"comment\", \"example\", \"literal\", \"listing\", \"pass\", \"quote\", \"sidebar\", \"source\", \"verse\", \"admonition\", \"abstract\", \"partintro\"].$to_set()], \"----\": [\"listing\", [\"literal\", \"source\"].$to_set()], \"....\": [\"literal\", [\"listing\", \"source\"].$to_set()], \"====\": [\"example\", [\"admonition\"].$to_set()], \"****\": [\"sidebar\", $$$('::', 'Set').$new()], \"____\": [\"quote\", [\"verse\"].$to_set()], \"++++\": [\"pass\", [\"stem\", \"latexmath\", \"asciimath\"].$to_set()], \"|===\": [\"table\", $$$('::', 'Set').$new()], \",===\": [\"table\", $$$('::', 'Set').$new()], \":===\": [\"table\", $$$('::', 'Set').$new()], \"!===\": [\"table\", $$$('::', 'Set').$new()], \"////\": [\"comment\", $$$('::', 'Set').$new()], \"```\": [\"fenced_code\", $$$('::', 'Set').$new()]}));\n Opal.const_set($nesting[0], 'DELIMITED_BLOCK_HEADS', $send($hash2([], {}), 'tap', [], ($Asciidoctor$9 = function(accum){var self = $Asciidoctor$9.$$s || this, $$10;\n\n \n \n if (accum == null) {\n accum = nil;\n };\n return $send($$($nesting, 'DELIMITED_BLOCKS'), 'each_key', [], ($$10 = function(k){var self = $$10.$$s || this, $writer = nil;\n\n \n \n if (k == null) {\n k = nil;\n };\n $writer = [k.$slice(0, 2), true];\n $send(accum, '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];}, $$10.$$s = self, $$10.$$arity = 1, $$10));}, $Asciidoctor$9.$$s = self, $Asciidoctor$9.$$arity = 1, $Asciidoctor$9)));\n Opal.const_set($nesting[0], 'DELIMITED_BLOCK_TAILS', $send($hash2([], {}), 'tap', [], ($Asciidoctor$11 = function(accum){var self = $Asciidoctor$11.$$s || this, $$12;\n\n \n \n if (accum == null) {\n accum = nil;\n };\n return $send($$($nesting, 'DELIMITED_BLOCKS'), 'each_key', [], ($$12 = function(k){var self = $$12.$$s || this, $writer = nil;\n\n \n \n if (k == null) {\n k = nil;\n };\n if (k.$length()['$=='](4)) {\n \n $writer = [k, k['$[]']($rb_minus(k.$length(), 1))];\n $send(accum, '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];\n } else {\n return nil\n };}, $$12.$$s = self, $$12.$$arity = 1, $$12));}, $Asciidoctor$11.$$s = self, $Asciidoctor$11.$$arity = 1, $Asciidoctor$11)));\n Opal.const_set($nesting[0], 'CAPTION_ATTRIBUTE_NAMES', $hash2([\"example\", \"figure\", \"listing\", \"table\"], {\"example\": \"example-caption\", \"figure\": \"figure-caption\", \"listing\": \"listing-caption\", \"table\": \"table-caption\"}));\n Opal.const_set($nesting[0], 'LAYOUT_BREAK_CHARS', $hash2([\"'\", \"<\"], {\"'\": \"thematic_break\", \"<\": \"page_break\"}));\n Opal.const_set($nesting[0], 'MARKDOWN_THEMATIC_BREAK_CHARS', $hash2([\"-\", \"*\", \"_\"], {\"-\": \"thematic_break\", \"*\": \"thematic_break\", \"_\": \"thematic_break\"}));\n Opal.const_set($nesting[0], 'HYBRID_LAYOUT_BREAK_CHARS', $$($nesting, 'LAYOUT_BREAK_CHARS').$merge($$($nesting, 'MARKDOWN_THEMATIC_BREAK_CHARS')));\n Opal.const_set($nesting[0], 'NESTABLE_LIST_CONTEXTS', [\"ulist\", \"olist\", \"dlist\"]);\n Opal.const_set($nesting[0], 'ORDERED_LIST_STYLES', [\"arabic\", \"loweralpha\", \"lowerroman\", \"upperalpha\", \"upperroman\"]);\n Opal.const_set($nesting[0], 'ORDERED_LIST_KEYWORDS', $hash2([\"loweralpha\", \"lowerroman\", \"upperalpha\", \"upperroman\"], {\"loweralpha\": \"a\", \"lowerroman\": \"i\", \"upperalpha\": \"A\", \"upperroman\": \"I\"}));\n Opal.const_set($nesting[0], 'ATTR_REF_HEAD', \"{\");\n Opal.const_set($nesting[0], 'LIST_CONTINUATION', \"+\");\n Opal.const_set($nesting[0], 'HARD_LINE_BREAK', \" +\");\n Opal.const_set($nesting[0], 'LINE_CONTINUATION', \" \\\\\");\n Opal.const_set($nesting[0], 'LINE_CONTINUATION_LEGACY', \" +\");\n Opal.const_set($nesting[0], 'BLOCK_MATH_DELIMITERS', $hash2([\"asciimath\", \"latexmath\"], {\"asciimath\": [\"\\\\$\", \"\\\\$\"], \"latexmath\": [\"\\\\[\", \"\\\\]\"]}));\n Opal.const_set($nesting[0], 'INLINE_MATH_DELIMITERS', $hash2([\"asciimath\", \"latexmath\"], {\"asciimath\": [\"\\\\$\", \"\\\\$\"], \"latexmath\": [\"\\\\(\", \"\\\\)\"]}));\n \n $writer = [\"asciimath\"];\n $send(Opal.const_set($nesting[0], 'STEM_TYPE_ALIASES', $hash2([\"latexmath\", \"latex\", \"tex\"], {\"latexmath\": \"latexmath\", \"latex\": \"latexmath\", \"tex\": \"latexmath\"})), 'default=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;\n Opal.const_set($nesting[0], 'FONT_AWESOME_VERSION', \"4.7.0\");\n Opal.const_set($nesting[0], 'HIGHLIGHT_JS_VERSION', \"9.18.3\");\n Opal.const_set($nesting[0], 'MATHJAX_VERSION', \"2.7.9\");\n Opal.const_set($nesting[0], 'DEFAULT_ATTRIBUTES', $hash2([\"appendix-caption\", \"appendix-refsig\", \"caution-caption\", \"chapter-refsig\", \"example-caption\", \"figure-caption\", \"important-caption\", \"last-update-label\", \"note-caption\", \"part-refsig\", \"prewrap\", \"sectids\", \"section-refsig\", \"table-caption\", \"tip-caption\", \"toc-placement\", \"toc-title\", \"untitled-label\", \"version-label\", \"warning-caption\"], {\"appendix-caption\": \"Appendix\", \"appendix-refsig\": \"Appendix\", \"caution-caption\": \"Caution\", \"chapter-refsig\": \"Chapter\", \"example-caption\": \"Example\", \"figure-caption\": \"Figure\", \"important-caption\": \"Important\", \"last-update-label\": \"Last updated\", \"note-caption\": \"Note\", \"part-refsig\": \"Part\", \"prewrap\": \"\", \"sectids\": \"\", \"section-refsig\": \"Section\", \"table-caption\": \"Table\", \"tip-caption\": \"Tip\", \"toc-placement\": \"auto\", \"toc-title\": \"Table of Contents\", \"untitled-label\": \"Untitled\", \"version-label\": \"Version\", \"warning-caption\": \"Warning\"}));\n Opal.const_set($nesting[0], 'FLEXIBLE_ATTRIBUTES', [\"sectnums\"]);\n Opal.const_set($nesting[0], 'INTRINSIC_ATTRIBUTES', $hash2([\"startsb\", \"endsb\", \"vbar\", \"caret\", \"asterisk\", \"tilde\", \"plus\", \"backslash\", \"backtick\", \"blank\", \"empty\", \"sp\", \"two-colons\", \"two-semicolons\", \"nbsp\", \"deg\", \"zwsp\", \"quot\", \"apos\", \"lsquo\", \"rsquo\", \"ldquo\", \"rdquo\", \"wj\", \"brvbar\", \"pp\", \"cpp\", \"amp\", \"lt\", \"gt\"], {\"startsb\": \"[\", \"endsb\": \"]\", \"vbar\": \"|\", \"caret\": \"^\", \"asterisk\": \"*\", \"tilde\": \"~\", \"plus\": \"+\", \"backslash\": \"\\\\\", \"backtick\": \"`\", \"blank\": \"\", \"empty\": \"\", \"sp\": \" \", \"two-colons\": \"::\", \"two-semicolons\": \";;\", \"nbsp\": \" \", \"deg\": \"°\", \"zwsp\": \"​\", \"quot\": \""\", \"apos\": \"'\", \"lsquo\": \"‘\", \"rsquo\": \"’\", \"ldquo\": \"“\", \"rdquo\": \"”\", \"wj\": \"⁠\", \"brvbar\": \"¦\", \"pp\": \"++\", \"cpp\": \"C++\", \"amp\": \"&\", \"lt\": \"<\", \"gt\": \">\"}));\n if ($$($nesting, 'RUBY_ENGINE')['$=='](\"opal\")) {\n } else {\n nil\n };\n Opal.const_set($nesting[0], 'QUOTE_SUBS', $send($hash2([], {}), 'tap', [], ($Asciidoctor$13 = function(accum){var self = $Asciidoctor$13.$$s || this, normal = nil, compat = nil;\n\n \n \n if (accum == null) {\n accum = nil;\n };\n \n $writer = [false, (normal = [[\"strong\", \"unconstrained\", new RegExp(\"\" + \"\\\\\\\\?(?:\\\\[([^\\\\]]+)\\\\])?\\\\*\\\\*(\" + ($$($nesting, 'CC_ALL')) + \"+?)\\\\*\\\\*\", 'm')], [\"strong\", \"constrained\", new RegExp(\"\" + \"(^|[^\" + ($$($nesting, 'CC_WORD')) + \";:}])(?:\\\\[([^\\\\]]+)\\\\])?\\\\*(\\\\S|\\\\S\" + ($$($nesting, 'CC_ALL')) + \"*?\\\\S)\\\\*(?!\" + ($$($nesting, 'CG_WORD')) + \")\", 'm')], [\"double\", \"constrained\", new RegExp(\"\" + \"(^|[^\" + ($$($nesting, 'CC_WORD')) + \";:}])(?:\\\\[([^\\\\]]+)\\\\])?\\\"`(\\\\S|\\\\S\" + ($$($nesting, 'CC_ALL')) + \"*?\\\\S)`\\\"(?!\" + ($$($nesting, 'CG_WORD')) + \")\", 'm')], [\"single\", \"constrained\", new RegExp(\"\" + \"(^|[^\" + ($$($nesting, 'CC_WORD')) + \";:`}])(?:\\\\[([^\\\\]]+)\\\\])?'`(\\\\S|\\\\S\" + ($$($nesting, 'CC_ALL')) + \"*?\\\\S)`'(?!\" + ($$($nesting, 'CG_WORD')) + \")\", 'm')], [\"monospaced\", \"unconstrained\", new RegExp(\"\" + \"\\\\\\\\?(?:\\\\[([^\\\\]]+)\\\\])?``(\" + ($$($nesting, 'CC_ALL')) + \"+?)``\", 'm')], [\"monospaced\", \"constrained\", new RegExp(\"\" + \"(^|[^\" + ($$($nesting, 'CC_WORD')) + \";:\\\"'`}])(?:\\\\[([^\\\\]]+)\\\\])?`(\\\\S|\\\\S\" + ($$($nesting, 'CC_ALL')) + \"*?\\\\S)`(?![\" + ($$($nesting, 'CC_WORD')) + \"\\\"'`])\", 'm')], [\"emphasis\", \"unconstrained\", new RegExp(\"\" + \"\\\\\\\\?(?:\\\\[([^\\\\]]+)\\\\])?__(\" + ($$($nesting, 'CC_ALL')) + \"+?)__\", 'm')], [\"emphasis\", \"constrained\", new RegExp(\"\" + \"(^|[^\" + ($$($nesting, 'CC_WORD')) + \";:}])(?:\\\\[([^\\\\]]+)\\\\])?_(\\\\S|\\\\S\" + ($$($nesting, 'CC_ALL')) + \"*?\\\\S)_(?!\" + ($$($nesting, 'CG_WORD')) + \")\", 'm')], [\"mark\", \"unconstrained\", new RegExp(\"\" + \"\\\\\\\\?(?:\\\\[([^\\\\]]+)\\\\])?##(\" + ($$($nesting, 'CC_ALL')) + \"+?)##\", 'm')], [\"mark\", \"constrained\", new RegExp(\"\" + \"(^|[^\" + ($$($nesting, 'CC_WORD')) + \"&;:}])(?:\\\\[([^\\\\]]+)\\\\])?#(\\\\S|\\\\S\" + ($$($nesting, 'CC_ALL')) + \"*?\\\\S)#(?!\" + ($$($nesting, 'CG_WORD')) + \")\", 'm')], [\"superscript\", \"unconstrained\", /\\\\?(?:\\[([^\\]]+)\\])?\\^(\\S+?)\\^/], [\"subscript\", \"unconstrained\", /\\\\?(?:\\[([^\\]]+)\\])?~(\\S+?)~/]])];\n $send(accum, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;\n \n $writer = [true, (compat = normal.$drop(0))];\n $send(accum, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;\n \n $writer = [2, [\"double\", \"constrained\", new RegExp(\"\" + \"(^|[^\" + ($$($nesting, 'CC_WORD')) + \";:}])(?:\\\\[([^\\\\]]+)\\\\])?``(\\\\S|\\\\S\" + ($$($nesting, 'CC_ALL')) + \"*?\\\\S)''(?!\" + ($$($nesting, 'CG_WORD')) + \")\", 'm')]];\n $send(compat, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;\n \n $writer = [3, [\"single\", \"constrained\", new RegExp(\"\" + \"(^|[^\" + ($$($nesting, 'CC_WORD')) + \";:}])(?:\\\\[([^\\\\]]+)\\\\])?`(\\\\S|\\\\S\" + ($$($nesting, 'CC_ALL')) + \"*?\\\\S)'(?!\" + ($$($nesting, 'CG_WORD')) + \")\", 'm')]];\n $send(compat, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;\n \n $writer = [4, [\"monospaced\", \"unconstrained\", new RegExp(\"\" + \"\\\\\\\\?(?:\\\\[([^\\\\]]+)\\\\])?\\\\+\\\\+(\" + ($$($nesting, 'CC_ALL')) + \"+?)\\\\+\\\\+\", 'm')]];\n $send(compat, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;\n \n $writer = [5, [\"monospaced\", \"constrained\", new RegExp(\"\" + \"(^|[^\" + ($$($nesting, 'CC_WORD')) + \";:}])(?:\\\\[([^\\\\]]+)\\\\])?\\\\+(\\\\S|\\\\S\" + ($$($nesting, 'CC_ALL')) + \"*?\\\\S)\\\\+(?!\" + ($$($nesting, 'CG_WORD')) + \")\", 'm')]];\n $send(compat, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;\n return compat.$insert(3, [\"emphasis\", \"constrained\", new RegExp(\"\" + \"(^|[^\" + ($$($nesting, 'CC_WORD')) + \";:}])(?:\\\\[([^\\\\]]+)\\\\])?'(\\\\S|\\\\S\" + ($$($nesting, 'CC_ALL')) + \"*?\\\\S)'(?!\" + ($$($nesting, 'CG_WORD')) + \")\", 'm')]);}, $Asciidoctor$13.$$s = self, $Asciidoctor$13.$$arity = 1, $Asciidoctor$13)));\n Opal.const_set($nesting[0], 'REPLACEMENTS', [[/\\\\?\\(C\\)/, \"©\", \"none\"], [/\\\\?\\(R\\)/, \"®\", \"none\"], [/\\\\?\\(TM\\)/, \"™\", \"none\"], [/(?: |\\n|^|\\\\)--(?: |\\n|$)/, \" — \", \"none\"], [new RegExp(\"\" + \"(\" + ($$($nesting, 'CG_WORD')) + \")\\\\\\\\?--(?=\" + ($$($nesting, 'CG_WORD')) + \")\"), \"—​\", \"leading\"], [/\\\\?\\.\\.\\./, \"…​\", \"none\"], [/\\\\?`'/, \"’\", \"none\"], [new RegExp(\"\" + \"(\" + ($$($nesting, 'CG_ALNUM')) + \")\\\\\\\\?'(?=\" + ($$($nesting, 'CG_ALPHA')) + \")\"), \"’\", \"leading\"], [/\\\\?->/, \"→\", \"none\"], [/\\\\?=>/, \"⇒\", \"none\"], [/\\\\?<-/, \"←\", \"none\"], [/\\\\?<=/, \"⇐\", \"none\"], [/\\\\?(&)amp;((?:[a-zA-Z][a-zA-Z]+\\d{0,2}|#\\d\\d\\d{0,4}|#x[\\da-fA-F][\\da-fA-F][\\da-fA-F]{0,3});)/, \"\", \"bounding\"]]);\n if ($$($nesting, 'RUBY_ENGINE')['$=='](\"opal\")) {\n } else {\n nil\n };\n if ($$($nesting, 'RUBY_ENGINE')['$=='](\"opal\")) {\n } else {\n nil\n };\n })($nesting[0], $nesting);\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/core_ext\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/helpers\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/logging\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/rx\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/substitutors\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/version\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/abstract_node\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/abstract_block\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/attribute_list\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/block\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/callouts\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/converter\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/document\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/inline\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/list\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/parser\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/path_resolver\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/reader\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/section\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/stylesheets\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/table\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/writer\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/load\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/convert\");\n if ($$($nesting, 'RUBY_ENGINE')['$=='](\"opal\")) {\n \n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/syntax_highlighter\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/timings\");\n return self.$require(\"asciidoctor/js/postscript\");\n } else {\n return nil\n };\n})(Opal);\n\n\n/* global Opal */\n\n/**\n * Convert a JSON to an (Opal) Hash.\n * @private\n */\nvar toHash = function (object) {\n return object && !object.$$is_hash ? Opal.hash2(Object.keys(object), object) : object\n}\n\n/**\n * Convert an (Opal) Hash to JSON.\n * @private\n */\nvar fromHash = function (hash) {\n var object = {}\n if (hash) {\n var stringMap = hash.$$smap\n for (var stringMapKey in stringMap) {\n var stringMapValue = stringMap[stringMapKey]\n object[stringMapKey] = stringMapValue === Opal.nil ? undefined : stringMapValue\n }\n var numericMap = hash.$$map\n if (numericMap) {\n var positional = []\n for (var numericMapKey in numericMap) {\n var entry = numericMap[numericMapKey]\n var numericMapValue = entry.value\n var index = entry.key - 1\n positional[index] = numericMapValue === Opal.nil ? undefined : numericMapValue\n }\n if (positional.length > 0) {\n object.$positional = positional\n }\n }\n }\n return object\n}\n\nvar fromHashKeys = function (hash) {\n var object = {}\n if (hash) {\n var data = hash.$$keys\n for (var key in data) {\n var value = data[key].value\n object[key.toString()] = value === Opal.nil ? undefined : value\n }\n }\n return object\n}\n\n/**\n * @private\n */\nvar prepareOptions = function (options) {\n options = toHash(options)\n if (options) {\n var attrs = options['$[]']('attributes')\n if (attrs && typeof attrs === 'object' && attrs.constructor.name === 'Object') {\n options = options.$dup()\n options['$[]=']('attributes', toHash(attrs))\n }\n }\n return options\n}\n\nfunction initializeClass (superClass, className, functions, defaultFunctions, argProxyFunctions) {\n var scope = Opal.klass(Opal.Object, superClass, className, function () { })\n var postConstructFunction\n var initializeFunction\n var constructorFunction\n var defaultFunctionsOverridden = {}\n for (var functionName in functions) {\n if (Object.prototype.hasOwnProperty.call(functions, functionName)) {\n (function (functionName) {\n var userFunction = functions[functionName]\n if (functionName === 'postConstruct') {\n postConstructFunction = userFunction\n } else if (functionName === 'initialize') {\n initializeFunction = userFunction\n } else if (functionName === 'constructor') {\n constructorFunction = userFunction\n } else {\n if (defaultFunctions && Object.prototype.hasOwnProperty.call(defaultFunctions, functionName)) {\n defaultFunctionsOverridden[functionName] = true\n }\n Opal.def(scope, '$' + functionName, function () {\n var args\n if (argProxyFunctions && Object.prototype.hasOwnProperty.call(argProxyFunctions, functionName)) {\n args = argProxyFunctions[functionName](arguments)\n } else {\n args = arguments\n }\n return userFunction.apply(this, args)\n })\n }\n }(functionName))\n }\n }\n var initialize\n if (typeof constructorFunction === 'function') {\n initialize = function () {\n var args = Array.from(arguments)\n for (var i = 0; i < args.length; i++) {\n // convert all (Opal) Hash arguments to JSON.\n if (typeof args[i] === 'object' && '$$smap' in args[i]) {\n args[i] = fromHash(args[i])\n }\n }\n args.unshift(null)\n var result = new (Function.prototype.bind.apply(constructorFunction, args)) // eslint-disable-line\n Object.assign(this, result)\n if (typeof postConstructFunction === 'function') {\n postConstructFunction.bind(this)()\n }\n }\n } else if (typeof initializeFunction === 'function') {\n initialize = function () {\n var args = Array.from(arguments)\n for (var i = 0; i < args.length; i++) {\n // convert all (Opal) Hash arguments to JSON.\n if (typeof args[i] === 'object' && '$$smap' in args[i]) {\n args[i] = fromHash(args[i])\n }\n }\n initializeFunction.apply(this, args)\n if (typeof postConstructFunction === 'function') {\n postConstructFunction.bind(this)()\n }\n }\n } else {\n initialize = function () {\n Opal.send(this, Opal.find_super_dispatcher(this, 'initialize', initialize))\n if (typeof postConstructFunction === 'function') {\n postConstructFunction.bind(this)()\n }\n }\n }\n Opal.def(scope, '$initialize', initialize)\n Opal.def(scope, 'super', function (func) {\n if (typeof func === 'function') {\n Opal.send(this, Opal.find_super_dispatcher(this, func.name, func))\n } else {\n // Bind the initialize function to super();\n var argumentsList = Array.from(arguments)\n for (var i = 0; i < argumentsList.length; i++) {\n // convert all (Opal) Hash arguments to JSON.\n if (typeof argumentsList[i] === 'object') {\n argumentsList[i] = toHash(argumentsList[i])\n }\n }\n Opal.send(this, Opal.find_super_dispatcher(this, 'initialize', initialize), argumentsList)\n }\n })\n if (defaultFunctions) {\n for (var defaultFunctionName in defaultFunctions) {\n if (Object.prototype.hasOwnProperty.call(defaultFunctions, defaultFunctionName) && !Object.prototype.hasOwnProperty.call(defaultFunctionsOverridden, defaultFunctionName)) {\n (function (defaultFunctionName) {\n var defaultFunction = defaultFunctions[defaultFunctionName]\n Opal.def(scope, '$' + defaultFunctionName, function () {\n return defaultFunction.apply(this, arguments)\n })\n }(defaultFunctionName))\n }\n }\n }\n return scope\n}\n\n// Asciidoctor API\n\n/**\n * @namespace\n * @description\n * The main application interface (API) for Asciidoctor.\n * This API provides methods to parse AsciiDoc content and convert it to various output formats using built-in or third-party converters.\n *\n * An AsciiDoc document can be as simple as a single line of content,\n * though it more commonly starts with a document header that declares the document title and document attribute definitions.\n * The document header is then followed by zero or more section titles, optionally nested, to organize the paragraphs, blocks, lists, etc. of the document.\n *\n * By default, the processor converts the AsciiDoc document to HTML 5 using a built-in converter.\n * However, this behavior can be changed by specifying a different backend (e.g., +docbook+).\n * A backend is a keyword for an output format (e.g., DocBook).\n * That keyword, in turn, is used to select a converter, which carries out the request to convert the document to that format.\n *\n * @example\n * asciidoctor.convertFile('document.adoc', { 'safe': 'safe' }) // Convert an AsciiDoc file\n *\n * asciidoctor.convert(\"I'm using *Asciidoctor* version {asciidoctor-version}.\", { 'safe': 'safe' }) // Convert an AsciiDoc string\n *\n * const doc = asciidoctor.loadFile('document.adoc', { 'safe': 'safe' }) // Parse an AsciiDoc file into a document object\n *\n * const doc = asciidoctor.load(\"= Document Title\\n\\nfirst paragraph\\n\\nsecond paragraph\", { 'safe': 'safe' }) // Parse an AsciiDoc string into a document object\n */\nvar Asciidoctor = Opal.Asciidoctor.$$class\n\n/**\n * Get Asciidoctor core version number.\n *\n * @returns {string} - the version number of Asciidoctor core.\n * @memberof Asciidoctor\n */\nAsciidoctor.prototype.getCoreVersion = function () {\n return this.$$const.VERSION\n}\n\n/**\n * Get Asciidoctor.js runtime environment information.\n *\n * @returns {Object} - the runtime environment including the ioModule, the platform, the engine and the framework.\n * @memberof Asciidoctor\n */\nAsciidoctor.prototype.getRuntime = function () {\n return {\n ioModule: Opal.const_get_qualified('::', 'JAVASCRIPT_IO_MODULE'),\n platform: Opal.const_get_qualified('::', 'JAVASCRIPT_PLATFORM'),\n engine: Opal.const_get_qualified('::', 'JAVASCRIPT_ENGINE'),\n framework: Opal.const_get_qualified('::', 'JAVASCRIPT_FRAMEWORK')\n }\n}\n\n/**\n * Parse the AsciiDoc source input into an {@link Document} and convert it to the specified backend format.\n *\n * Accepts input as a Buffer or String.\n *\n * @param {string|Buffer} input - AsciiDoc input as String or Buffer\n * @param {Object} options - a JSON of options to control processing (default: {})\n * @returns {string|Document} - the {@link Document} object if the converted String is written to a file,\n * otherwise the converted String\n * @example\n * var input = '= Hello, AsciiDoc!\\n' +\n * 'Guillaume Grossetie \\n\\n' +\n * 'An introduction to http://asciidoc.org[AsciiDoc].\\n\\n' +\n * '== First Section\\n\\n' +\n * '* item 1\\n' +\n * '* item 2\\n';\n *\n * var html = asciidoctor.convert(input);\n * @memberof Asciidoctor\n */\nAsciidoctor.prototype.convert = function (input, options) {\n if (typeof input === 'object' && input.constructor.name === 'Buffer') {\n input = input.toString('utf8')\n }\n var result = this.$convert(input, prepareOptions(options))\n return result === Opal.nil ? '' : result\n}\n\n/**\n * Parse the AsciiDoc source input into an {@link Document} and convert it to the specified backend format.\n *\n * @param {string} filename - source filename\n * @param {Object} options - a JSON of options to control processing (default: {})\n * @returns {string|Document} - the {@link Document} object if the converted String is written to a file,\n * otherwise the converted String\n * @example\n * var html = asciidoctor.convertFile('./document.adoc');\n * @memberof Asciidoctor\n */\nAsciidoctor.prototype.convertFile = function (filename, options) {\n return this.$convert_file(filename, prepareOptions(options))\n}\n\n/**\n * Parse the AsciiDoc source input into an {@link Document}\n *\n * Accepts input as a Buffer or String.\n *\n * @param {string|Buffer} input - AsciiDoc input as String or Buffer\n * @param {Object} options - a JSON of options to control processing (default: {})\n * @returns {Document} - the {@link Document} object\n * @memberof Asciidoctor\n */\nAsciidoctor.prototype.load = function (input, options) {\n if (typeof input === 'object' && input.constructor.name === 'Buffer') {\n input = input.toString('utf8')\n }\n return this.$load(input, prepareOptions(options))\n}\n\n/**\n * Parse the contents of the AsciiDoc source file into an {@link Document}\n *\n * @param {string} filename - source filename\n * @param {Object} options - a JSON of options to control processing (default: {})\n * @returns {Document} - the {@link Document} object\n * @memberof Asciidoctor\n */\nAsciidoctor.prototype.loadFile = function (filename, options) {\n return this.$load_file(filename, prepareOptions(options))\n}\n\n// AbstractBlock API\n\n/**\n * @namespace\n * @extends AbstractNode\n */\nvar AbstractBlock = Opal.Asciidoctor.AbstractBlock\n\n/**\n * Append a block to this block's list of child blocks.\n * @param {AbstractBlock} block - the block to append\n * @returns {AbstractBlock} - the parent block to which this block was appended.\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.append = function (block) {\n this.$append(block)\n return this\n}\n\n/**\n * Get the String title of this Block with title substitions applied\n *\n * The following substitutions are applied to block and section titles:\n *\n * specialcharacters, quotes, replacements, macros, attributes and post_replacements\n *\n * @returns {string} - the converted String title for this Block, or undefined if the title is not set.\n * @example\n * block.title // \"Foo 3^ # {two-colons} Bar(1)\"\n * block.getTitle(); // \"Foo 3^ # :: Bar(1)\"\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getTitle = function () {\n var title = this.$title()\n return title === Opal.nil ? undefined : title\n}\n\n/**\n * Set the String block title.\n *\n * @param {string} title - The block title\n * @returns {string} - the new String title assigned to this Block.\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.setTitle = function (title) {\n title = typeof title === 'undefined' ? Opal.nil : title\n return this['$title='](title)\n}\n\n/**\n * Generate and assign caption to block if not already assigned.\n *\n * If the block has a title and a caption prefix is available for this block,\n * then build a caption from this information, assign it a number and store it\n * to the caption attribute on the block.\n *\n * If a caption has already been assigned to this block, do nothing.\n *\n * The parts of a complete caption are: . \n * This partial caption represents the part the precedes the title.\n *\n * @param {string} value - the String caption to assign to this block or nil to use document attribute.\n * @param {string} captionContext - the String context to use when resolving caption-related attributes.\n * If not provided, the name of the context for this block is used. Only certain contexts allow the caption to be looked up.\n *\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.assignCaption = function (value, captionContext) {\n value = typeof value === 'undefined' ? Opal.nil : value\n captionContext = typeof captionContext === 'undefined' ? null : captionContext\n this.$assign_caption(value, captionContext)\n}\n\n/**\n * Convenience method that returns the interpreted title of the Block\n * with the caption prepended.\n * Concatenates the value of this Block's caption instance variable and the\n * return value of this Block's title method. No space is added between the\n * two values. If the Block does not have a caption, the interpreted title is\n * returned.\n *\n * @returns {string} - the converted String title prefixed with the caption, or just the converted String title if no caption is set\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getCaptionedTitle = function () {\n return this.$captioned_title()\n}\n\n/**\n * Get the style (block type qualifier) for this block.\n *\n * @returns {string} - the style for this block\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getStyle = function () {\n var style = this.style\n return style === Opal.nil ? undefined : style\n}\n\n/**\n * Set the style for this block.\n *\n * @param {string} style - Style\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.setStyle = function (style) {\n this.style = style\n}\n\n/**\n * Get the location in the AsciiDoc source where this block begins.\n *\n * @returns {string} - the style for this block\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getSourceLocation = function () {\n var sourceLocation = this.source_location\n if (sourceLocation === Opal.nil) {\n return undefined\n }\n sourceLocation.getFile = function () {\n var file = this.file\n return file === Opal.nil ? undefined : file\n }\n sourceLocation.getDirectory = function () {\n var dir = this.dir\n return dir === Opal.nil ? undefined : dir\n }\n sourceLocation.getPath = function () {\n var path = this.path\n return path === Opal.nil ? undefined : path\n }\n sourceLocation.getLineNumber = function () {\n var lineno = this.lineno\n return lineno === Opal.nil ? undefined : lineno\n }\n return sourceLocation\n}\n\n/**\n * Get the caption for this block.\n *\n * @returns {string} - the caption for this block\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getCaption = function () {\n var caption = this.$caption()\n return caption === Opal.nil ? undefined : caption\n}\n\n/**\n * Set the caption for this block.\n *\n * @param {string} caption - Caption\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.setCaption = function (caption) {\n this.caption = typeof caption === 'undefined' ? Opal.nil : caption\n}\n\n/**\n * Get the level of this section or the section level in which this block resides.\n *\n * @returns {number} - the level (Integer) of this section\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getLevel = function () {\n var level = this.level\n return level === Opal.nil ? undefined : level\n}\n\n/**\n * Get the substitution keywords to be applied to the contents of this block.\n *\n * @returns {Array<string>} - the list of {string} substitution keywords associated with this block.\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getSubstitutions = function () {\n return this.subs\n}\n\n/**\n * Check whether a given substitution keyword is present in the substitutions for this block.\n *\n * @returns {boolean} - whether the substitution is present on this block.\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.hasSubstitution = function (substitution) {\n return this['$sub?'](substitution)\n}\n\n/**\n * Remove the specified substitution keyword from the list of substitutions for this block.\n *\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.removeSubstitution = function (substitution) {\n this.$remove_sub(substitution)\n}\n\n/**\n * Checks if the {@link AbstractBlock} contains any child blocks.\n *\n * @returns {boolean} - whether the {@link AbstractBlock} has child blocks.\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.hasBlocks = function () {\n return this.blocks.length > 0\n}\n\n/**\n * Get the list of {@link AbstractBlock} sub-blocks for this block.\n *\n * @returns {Array<AbstractBlock>} - a list of {@link AbstractBlock} sub-blocks\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getBlocks = function () {\n return this.blocks\n}\n\n/**\n * Get the converted result of the child blocks by converting the children appropriate to content model that this block supports.\n *\n * @returns {string} - the converted result of the child blocks\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getContent = function () {\n return this.$content()\n}\n\n/**\n * Get the converted content for this block.\n * If the block has child blocks, the content method should cause them to be converted\n * and returned as content that can be included in the parent block's template.\n *\n * @returns {string} - the converted String content for this block\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.convert = function () {\n return this.$convert()\n}\n\n/**\n * Query for all descendant block-level nodes in the document tree\n * that match the specified selector (context, style, id, and/or role).\n * If a function block is given, it's used as an additional filter.\n * If no selector or function block is supplied, all block-level nodes in the tree are returned.\n * @param {Object} [selector]\n * @param {function} [block]\n * @example\n * doc.findBy({'context': 'section'});\n * // => { level: 0, title: \"Hello, AsciiDoc!\", blocks: 0 }\n * // => { level: 1, title: \"First Section\", blocks: 1 }\n *\n * doc.findBy({'context': 'section'}, function (section) { return section.getLevel() === 1; });\n * // => { level: 1, title: \"First Section\", blocks: 1 }\n *\n * doc.findBy({'context': 'listing', 'style': 'source'});\n * // => { context: :listing, content_model: :verbatim, style: \"source\", lines: 1 }\n *\n * @returns {Array<AbstractBlock>} - a list of block-level nodes that match the filter or an empty list if no matches are found\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.findBy = function (selector, block) {\n if (typeof block === 'undefined' && typeof selector === 'function') {\n return Opal.send(this, 'find_by', null, selector)\n } else if (typeof block === 'function') {\n return Opal.send(this, 'find_by', [toHash(selector)], block)\n } else {\n return this.$find_by(toHash(selector))\n }\n}\n\n/**\n * Get the source line number where this block started.\n * @returns {number} - the source line number where this block started\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getLineNumber = function () {\n var lineno = this.$lineno()\n return lineno === Opal.nil ? undefined : lineno\n}\n\n/**\n * Check whether this block has any child Section objects.\n * Only applies to Document and Section instances.\n * @returns {boolean} - true if this block has child Section objects, otherwise false\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.hasSections = function () {\n // REMIND: call directly the underlying method \"$sections?\"\n // once https://github.com/asciidoctor/asciidoctor/pull/3591 is merged and a new version is released.\n // return this['$sections?']()\n return this.next_section_index !== Opal.nil && this.next_section_index > 0\n}\n\n/**\n * Get the Array of child Section objects.\n * Only applies to Document and Section instances.\n * @memberof AbstractBlock\n * @returns {Array<Section>} - an {Array} of {@link Section} objects\n */\nAbstractBlock.prototype.getSections = function () {\n return this.$sections()\n}\n\n/**\n * Get the numeral of this block (if section, relative to parent, otherwise absolute).\n * Only assigned to section if automatic section numbering is enabled.\n * Only assigned to formal block (block with title) if corresponding caption attribute is present.\n * If the section is an appendix, the numeral is a letter (starting with A).\n * @returns {string} - the numeral\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getNumeral = function () {\n return this.$numeral()\n}\n\n/**\n * Set the numeral of this block.\n * @param {string} value - The numeral value\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.setNumeral = function (value) {\n this['$numeral='](value)\n}\n\n/**\n * A convenience method that checks whether the title of this block is defined.\n *\n * @returns {boolean} - a {boolean} indicating whether this block has a title.\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.hasTitle = function () {\n return this['$title?']()\n}\n\n/**\n * Returns the converted alt text for this block image.\n * @returns {string} - the {string} value of the alt attribute with XML special character and replacement substitutions applied.\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getAlt = function () {\n return this.$alt()\n}\n\n// Section API\n\n/**\n * @description\n * Methods for managing sections of AsciiDoc content in a document.\n *\n * @example\n * <pre>\n * section = asciidoctor.Section.create()\n * section.setTitle('Section 1')\n * section.setId('sect1')\n * section.getBlocks().length // 0\n * section.getId() // \"sect1\"\n * section.append(newBlock)\n * section.getBlocks().length // 1\n * </pre>\n * @namespace\n * @extends AbstractBlock\n */\nvar Section = Opal.Asciidoctor.Section\n\n/**\n * Create a {Section} object.\n * @param {AbstractBlock} [parent] - The parent AbstractBlock. If set, must be a Document or Section object (default: undefined)\n * @param {number} [level] - The Integer level of this section (default: 1 more than parent level or 1 if parent not defined)\n * @param {boolean} [numbered] - A Boolean indicating whether numbering is enabled for this Section (default: false)\n * @param {Object} [opts] - An optional JSON of options (default: {})\n * @returns {Section} - a new {Section} object\n * @memberof Section\n */\nSection.create = function (parent, level, numbered, opts) {\n if (opts && opts.attributes) {\n opts.attributes = toHash(opts.attributes)\n }\n return this.$new(parent, level, numbered, toHash(opts))\n}\n\n/**\n * Set the level of this section or the section level in which this block resides.\n * @param {number} level - Level (Integer)\n * @memberof AbstractBlock\n */\nSection.prototype.setLevel = function (level) {\n this.level = level\n}\n\n/**\n * Get the 0-based index order of this section within the parent block.\n * @returns {number}\n * @memberof Section\n */\nSection.prototype.getIndex = function () {\n return this.index\n}\n\n/**\n * Set the 0-based index order of this section within the parent block.\n * @param {string} index - The index order of this section\n * @memberof Section\n */\nSection.prototype.setIndex = function (index) {\n this.index = index\n}\n\n/**\n * Get the section name of this section.\n * @returns {string|undefined}\n * @memberof Section\n */\nSection.prototype.getSectionName = function () {\n var sectname = this.sectname\n return sectname === Opal.nil ? undefined : sectname\n}\n\n/**\n * Set the section name of this section.\n * @param {string} value - The section name\n * @memberof Section\n */\nSection.prototype.setSectionName = function (value) {\n this.sectname = value\n}\n\n/**\n * Get the flag to indicate whether this is a special section or a child of one.\n * @returns {boolean}\n * @memberof Section\n */\nSection.prototype.isSpecial = function () {\n return this.special\n}\n\n/**\n * Set the flag to indicate whether this is a special section or a child of one.\n * @param {boolean} value - A flag to indicated if this is a special section\n * @memberof Section\n */\nSection.prototype.setSpecial = function (value) {\n this.special = value\n}\n\n/**\n * Get the state of the numbered attribute at this section (need to preserve for creating TOC).\n * @returns {boolean}\n * @memberof Section\n */\nSection.prototype.isNumbered = function () {\n return this.numbered\n}\n\n/**\n * Get the caption for this section (only relevant for appendices).\n * @returns {string}\n * @memberof Section\n */\nSection.prototype.getCaption = function () {\n var value = this.caption\n return value === Opal.nil ? undefined : value\n}\n\n/**\n * Get the name of the Section (title)\n * @returns {string}\n * @see {@link AbstractBlock#getTitle}\n * @memberof Section\n */\nSection.prototype.getName = function () {\n return this.getTitle()\n}\n\n/**\n * @description\n * Methods for managing AsciiDoc content blocks.\n *\n * @example\n * block = asciidoctor.Block.create(parent, 'paragraph', {source: '_This_ is a <test>'})\n * block.getContent()\n * // \"<em>This</em> is a <test>\"\n *\n * @namespace\n * @extends AbstractBlock\n */\nvar Block = Opal.Asciidoctor.Block\n\n/**\n * Create a {Block} object.\n * @param {AbstractBlock} parent - The parent {AbstractBlock} with a compound content model to which this {Block} will be appended.\n * @param {string} context - The context name for the type of content (e.g., \"paragraph\").\n * @param {Object} [opts] - a JSON of options to customize block initialization: (default: {})\n * @param {string} opts.content_model - indicates whether blocks can be nested in this {Block} (\"compound\"),\n * otherwise how the lines should be processed (\"simple\", \"verbatim\", \"raw\", \"empty\"). (default: \"simple\")\n * @param {Object} opts.attributes - a JSON of attributes (key/value pairs) to assign to this {Block}. (default: {})\n * @param {string|Array<string>} opts.source - a String or {Array} of raw source for this {Block}. (default: undefined)\n *\n * IMPORTANT: If you don't specify the `subs` option, you must explicitly call the `commit_subs` method to resolve and assign the substitutions\n * to this block (which are resolved from the `subs` attribute, if specified, or the default substitutions based on this block's context).\n * If you want to use the default subs for a block, pass the option `subs: \"default\"`.\n * You can override the default subs using the `default_subs` option.\n *\n * @returns {Block} - a new {Block} object\n * @memberof Block\n */\nBlock.create = function (parent, context, opts) {\n if (opts && opts.attributes) {\n opts.attributes = toHash(opts.attributes)\n }\n return this.$new(parent, context, toHash(opts))\n}\n\n/**\n * Get the source of this block.\n * @returns {string} - the String source of this block.\n * @memberof Block\n */\nBlock.prototype.getSource = function () {\n return this.$source()\n}\n\n/**\n * Get the source lines of this block.\n * @returns {Array<string>} - the String {Array} of source lines for this block.\n * @memberof Block\n */\nBlock.prototype.getSourceLines = function () {\n return this.lines\n}\n\n// AbstractNode API\n\n/**\n * @namespace\n * @description\n * An abstract base class that provides state and methods for managing a node of AsciiDoc content.\n * The state and methods on this class are common to all content segments in an AsciiDoc document.\n */\nvar AbstractNode = Opal.Asciidoctor.AbstractNode\n\n/**\n * Apply the specified substitutions to the text.\n * If no substitutions are specified, the following substitutions are applied:\n * <code>specialcharacters</code>, <code>quotes</code>, <code>attributes</code>, <code>replacements</code>, <code>macros</code>, and <code>post_replacements</code>.\n *\n * @param {string|Array<string>} text - The String or String Array of text to process; must not be undefined.\n * @param {Array<string>} [subs] - The substitutions to perform; must be an Array or undefined.\n * @returns {string|Array<string>} - a String or String Array to match the type of the text argument with substitutions applied.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.applySubstitutions = function (text, subs) {\n return this.$apply_subs(text, subs)\n}\n\n/**\n * Resolve the list of comma-delimited subs against the possible options.\n *\n * @param {string} subs - The comma-delimited String of substitution names or aliases.\n * @param {string} [type] - A String representing the context for which the subs are being resolved (default: 'block').\n * @param {Array<string>} [defaults] - An Array of substitutions to start with when computing incremental substitutions (default: undefined).\n * @param {string} [subject] - The String to use in log messages to communicate the subject for which subs are being resolved (default: undefined)\n *\n * @returns {Array<string>} - An Array of Strings representing the substitution operation or nothing if no subs are found.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.resolveSubstitutions = function (subs, type, defaults, subject) {\n if (typeof type === 'undefined') {\n type = 'block'\n }\n if (typeof defaults === 'undefined') {\n defaults = Opal.nil\n }\n if (typeof subject === 'undefined') {\n subject = Opal.nil\n }\n const value = this.$resolve_subs(subs, type, defaults, subject)\n return value === Opal.nil ? undefined : value\n}\n\n/**\n * Call {@link AbstractNode#resolveSubstitutions} for the 'block' type.\n *\n * @see {@link AbstractNode#resolveSubstitutions}\n */\nAbstractNode.prototype.resolveBlockSubstitutions = function (subs, defaults, subject) {\n return this.resolveSubstitutions(subs, 'block', defaults, subject)\n}\n\n/**\n * Call {@link AbstractNode#resolveSubstitutions} for the 'inline' type with the subject set as passthrough macro.\n *\n * @see {@link AbstractNode#resolveSubstitutions}\n */\nAbstractNode.prototype.resolvePassSubstitutions = function (subs) {\n return this.resolveSubstitutions(subs, 'inline', undefined, 'passthrough macro')\n}\n\n/**\n * @returns {string} - the String name of this node\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getNodeName = function () {\n return this.node_name\n}\n\n/**\n * @returns {Object} - the JSON of attributes for this node\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getAttributes = function () {\n return fromHash(this.attributes)\n}\n\n/**\n * Get the value of the specified attribute.\n * If the attribute is not found on this node, fallback_name is set, and this node is not the Document node, get the value of the specified attribute from the Document node.\n *\n * Look for the specified attribute in the attributes on this node and return the value of the attribute, if found.\n * Otherwise, if fallback_name is set (default: same as name) and this node is not the Document node, look for that attribute on the Document node and return its value, if found.\n * Otherwise, return the default value (default: undefined).\n *\n * @param {string} name - The String of the attribute to resolve.\n * @param {*} [defaultValue] - The {Object} value to return if the attribute is not found (default: undefined).\n * @param {string} [fallbackName] - The String of the attribute to resolve on the Document if the attribute is not found on this node (default: same as name).\n *\n * @returns {*} - the {Object} value (typically a String) of the attribute or defaultValue if the attribute is not found.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getAttribute = function (name, defaultValue, fallbackName) {\n var value = this.$attr(name, defaultValue, fallbackName)\n return value === Opal.nil ? undefined : value\n}\n\n/**\n * Check whether the specified attribute is present on this node.\n *\n * @param {string} name - The String of the attribute to resolve.\n * @returns {boolean} - true if the attribute is present, otherwise false\n * @memberof AbstractNode\n */\nAbstractNode.prototype.hasAttribute = function (name) {\n return name in this.attributes.$$smap\n}\n\n/**\n * Check if the specified attribute is defined using the same logic as {AbstractNode#getAttribute}, optionally performing acomparison with the expected value if specified.\n *\n * Look for the specified attribute in the attributes on this node.\n * If not found, fallback_name is specified (default: same as name), and this node is not the Document node, look for that attribute on the Document node.\n * In either case, if the attribute is found, and the comparison value is truthy, return whether the two values match.\n * Otherwise, return whether the attribute was found.\n *\n * @param {string} name - The String name of the attribute to resolve.\n * @param {*} [expectedValue] - The expected Object value of the attribute (default: undefined).\n * @param {string} fallbackName - The String of the attribute to resolve on the Document if the attribute is not found on this node (default: same as name).\n *\n * @returns {boolean} - a Boolean indicating whether the attribute exists and, if a truthy comparison value is specified, whether the value of the attribute matches the comparison value.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.isAttribute = function (name, expectedValue, fallbackName) {\n var result = this['$attr?'](name, expectedValue, fallbackName)\n return result === Opal.nil ? false : result\n}\n\n/**\n * Assign the value to the attribute name for the current node.\n *\n * @param {string} name - The String attribute name to assign\n * @param {*} value - The Object value to assign to the attribute (default: '')\n * @param {boolean} overwrite - A Boolean indicating whether to assign the attribute if currently present in the attributes JSON (default: true)\n *\n * @returns {boolean} - a Boolean indicating whether the assignment was performed\n * @memberof AbstractNode\n */\nAbstractNode.prototype.setAttribute = function (name, value, overwrite) {\n if (typeof overwrite === 'undefined') overwrite = true\n return this.$set_attr(name, value, overwrite)\n}\n\n/**\n * Remove the attribute from the current node.\n * @param {string} name - The String attribute name to remove\n * @returns {string} - the previous {string} value, or undefined if the attribute was not present.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.removeAttribute = function (name) {\n var value = this.$remove_attr(name)\n return value === Opal.nil ? undefined : value\n}\n\n/**\n * Get the {@link Document} to which this node belongs.\n *\n * @returns {Document} - the {@link Document} object to which this node belongs.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getDocument = function () {\n return this.document\n}\n\n/**\n * Get the {@link AbstractNode} to which this node is attached.\n *\n * @memberof AbstractNode\n * @returns {AbstractNode} - the {@link AbstractNode} object to which this node is attached,\n * or undefined if this node has no parent.\n */\nAbstractNode.prototype.getParent = function () {\n var parent = this.parent\n return parent === Opal.nil ? undefined : parent\n}\n\n/**\n * @returns {boolean} - true if this {AbstractNode} is an instance of {Inline}\n * @memberof AbstractNode\n */\nAbstractNode.prototype.isInline = function () {\n return this['$inline?']()\n}\n\n/**\n * @returns {boolean} - true if this {AbstractNode} is an instance of {Block}\n * @memberof AbstractNode\n */\nAbstractNode.prototype.isBlock = function () {\n return this['$block?']()\n}\n\n/**\n * Checks if the role attribute is set on this node and, if an expected value is given, whether the space-separated role matches that value.\n *\n * @param {string} expectedValue - The expected String value of the role (optional, default: undefined)\n *\n * @returns {boolean} - a Boolean indicating whether the role attribute is set on this node and, if an expected value is given, whether the space-separated role matches that value.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.isRole = function (expectedValue) {\n return this['$role?'](expectedValue)\n}\n\n/**\n * Retrieves the space-separated String role for this node.\n *\n * @returns {string} - the role as a space-separated String.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getRole = function () {\n return this.$role()\n}\n\n/**\n * Checks if the specified role is present in the list of roles for this node.\n *\n * @param {string} name - The String name of the role to find.\n *\n * @returns {boolean} - a Boolean indicating whether this node has the specified role.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.hasRole = function (name) {\n return this['$has_role?'](name)\n}\n\n/**\n * Retrieves the String role names for this node as an Array.\n *\n * @returns {Array<string>} - the role names as a String {Array}, which is empty if the role attribute is absent on this node.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getRoles = function () {\n return this.$roles()\n}\n\n/**\n * Adds the given role directly to this node.\n *\n * @param {string} name - The name of the role to add\n *\n * @returns {boolean} - a Boolean indicating whether the role was added.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.addRole = function (name) {\n return this.$add_role(name)\n}\n\n/**\n * Public: Removes the given role directly from this node.\n *\n * @param {string} name - The name of the role to remove\n *\n * @returns {boolean} - a Boolean indicating whether the role was removed.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.removeRole = function (name) {\n return this.$remove_role(name)\n}\n\n/**\n * A convenience method that checks if the reftext attribute is defined.\n * @returns {boolean} - A Boolean indicating whether the reftext attribute is defined\n * @memberof AbstractNode\n */\nAbstractNode.prototype.isReftext = function () {\n return this['$reftext?']()\n}\n\n/**\n * A convenience method that returns the value of the reftext attribute with substitutions applied.\n * @returns {string|undefined} - the value of the reftext attribute with substitutions applied.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getReftext = function () {\n var reftext = this.$reftext()\n return reftext === Opal.nil ? undefined : reftext\n}\n\n/**\n * @returns {string} - Get the context name for this node\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getContext = function () {\n var context = this.context\n // Automatically convert Opal pseudo-symbol to String\n return typeof context === 'string' ? context : context.toString()\n}\n\n/**\n * @returns {string} - the String id of this node\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getId = function () {\n var id = this.id\n return id === Opal.nil ? undefined : id\n}\n\n/**\n * @param {string} id - the String id of this node\n * @memberof AbstractNode\n */\nAbstractNode.prototype.setId = function (id) {\n this.id = id\n}\n\n/**\n * A convenience method to check if the specified option attribute is enabled on the current node.\n * Check if the option is enabled. This method simply checks to see if the <name>-option attribute is defined on the current node.\n *\n * @param {string} name - the String name of the option\n *\n * @return {boolean} - a Boolean indicating whether the option has been specified\n * @memberof AbstractNode\n */\nAbstractNode.prototype.isOption = function (name) {\n return this['$option?'](name)\n}\n\n/**\n * Set the specified option on this node.\n * This method sets the specified option on this node by setting the <name>-option attribute.\n *\n * @param {string} name - the String name of the option\n *\n * @memberof AbstractNode\n */\nAbstractNode.prototype.setOption = function (name) {\n return this.$set_option(name)\n}\n\n/**\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getIconUri = function (name) {\n return this.$icon_uri(name)\n}\n\n/**\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getMediaUri = function (target, assetDirKey) {\n return this.$media_uri(target, assetDirKey)\n}\n\n/**\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getImageUri = function (targetImage, assetDirKey) {\n return this.$image_uri(targetImage, assetDirKey)\n}\n\n/**\n * Get the {Converter} instance being used to convert the current {Document}.\n * @returns {Object}\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getConverter = function () {\n return this.$converter()\n}\n\n/**\n * @memberof AbstractNode\n */\nAbstractNode.prototype.readContents = function (target, options) {\n return this.$read_contents(target, toHash(options))\n}\n\n/**\n * Read the contents of the file at the specified path.\n * This method assumes that the path is safe to read.\n * It checks that the file is readable before attempting to read it.\n *\n * @param path - the {string} path from which to read the contents\n * @param {Object} options - a JSON {Object} of options to control processing (default: {})\n * @param {boolean} options.warn_on_failure - a {boolean} that controls whether a warning is issued if the file cannot be read (default: false)\n * @param {boolean} options.normalize - a {boolean} that controls whether the lines are normalized and coerced to UTF-8 (default: false)\n *\n * @returns {string} - the String content of the file at the specified path, or undefined if the file does not exist.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.readAsset = function (path, options) {\n var result = this.$read_asset(path, toHash(options))\n return result === Opal.nil ? undefined : result\n}\n\n/**\n * @memberof AbstractNode\n */\nAbstractNode.prototype.normalizeWebPath = function (target, start, preserveTargetUri) {\n return this.$normalize_web_path(target, start, preserveTargetUri)\n}\n\n/**\n * @memberof AbstractNode\n */\nAbstractNode.prototype.normalizeSystemPath = function (target, start, jail, options) {\n return this.$normalize_system_path(target, start, jail, toHash(options))\n}\n\n/**\n * @memberof AbstractNode\n */\nAbstractNode.prototype.normalizeAssetPath = function (assetRef, assetName, autoCorrect) {\n return this.$normalize_asset_path(assetRef, assetName, autoCorrect)\n}\n\n// Document API\n\n/**\n * The {@link Document} class represents a parsed AsciiDoc document.\n *\n * Document is the root node of a parsed AsciiDoc document.<br/>\n * It provides an abstract syntax tree (AST) that represents the structure of the AsciiDoc document\n * from which the Document object was parsed.\n *\n * Although the constructor can be used to create an empty document object,\n * more commonly, you'll load the document object from AsciiDoc source\n * using the primary API methods on {@link Asciidoctor}.\n * When using one of these APIs, you almost always want to set the safe mode to 'safe' (or 'unsafe')\n * to enable all of Asciidoctor's features.\n *\n * <pre>\n * var doc = Asciidoctor.load('= Hello, AsciiDoc!', { 'safe': 'safe' })\n * // => Asciidoctor::Document { doctype: \"article\", doctitle: \"Hello, AsciiDoc!\", blocks: 0 }\n * </pre>\n *\n * Instances of this class can be used to extract information from the document or alter its structure.\n * As such, the Document object is most often used in extensions and by integrations.\n *\n * The most basic usage of the Document object is to retrieve the document's title.\n *\n * <pre>\n * var source = '= Document Title'\n * var doc = asciidoctor.load(source, { 'safe': 'safe' })\n * console.log(doc.getTitle()) // 'Document Title'\n * </pre>\n *\n * You can also use the Document object to access document attributes defined in the header, such as the author and doctype.\n * @namespace\n * @extends AbstractBlock\n */\nvar Document = Opal.Asciidoctor.Document\n\n/**\n * Returns a JSON {Object} of references captured by the processor.\n *\n * @returns {Object} - a JSON {Object} of {AbstractNode} in the document.\n * @memberof Document\n */\nDocument.prototype.getRefs = function () {\n return fromHash(this.catalog.$$smap.refs)\n}\n\n/**\n * Returns an {Array} of {Document/ImageReference} captured by the processor.\n *\n * @returns {Array<ImageReference>} - an {Array} of {Document/ImageReference} in the document.\n * Will return an empty array if the option \"catalog_assets: true\" was not defined on the processor.\n * @memberof Document\n */\nDocument.prototype.getImages = function () {\n return this.catalog.$$smap.images\n}\n\n/**\n * Returns an {Array} of links captured by the processor.\n *\n * @returns {Array<string>} - an {Array} of links in the document.\n * Will return an empty array if:\n * - the function was called before the document was converted\n * - the option \"catalog_assets: true\" was not defined on the processor\n * @memberof Document\n */\nDocument.prototype.getLinks = function () {\n return this.catalog.$$smap.links\n}\n\n/**\n * @returns {boolean} - true if the document has footnotes otherwise false\n * @memberof Document\n */\nDocument.prototype.hasFootnotes = function () {\n return this['$footnotes?']()\n}\n\n/**\n * Returns an {Array} of {Document/Footnote} captured by the processor.\n *\n * @returns {Array<Footnote>} - an {Array} of {Document/Footnote} in the document.\n * Will return an empty array if the function was called before the document was converted.\n * @memberof Document\n */\nDocument.prototype.getFootnotes = function () {\n return this.$footnotes()\n}\n\n/**\n * Returns the level-0 {Section} (i.e. the document title).\n * Only stores the title, not the header attributes.\n *\n * @returns {string} - the level-0 {Section}.\n * @memberof Document\n */\nDocument.prototype.getHeader = function () {\n return this.header\n}\n\n/**\n * @memberof Document\n */\nDocument.prototype.setAttribute = function (name, value) {\n return this.$set_attribute(name, value)\n}\n\n/**\n\n * @memberof Document\n */\nDocument.prototype.removeAttribute = function (name) {\n this.attributes.$delete(name)\n this.attribute_overrides.$delete(name)\n}\n\n/**\n * Convert the AsciiDoc document using the templates loaded by the Converter.\n * If a \"template_dir\" is not specified, or a template is missing, the converter will fall back to using the appropriate built-in template.\n *\n * @param {Object} [options] - a JSON of options to control processing (default: {})\n *\n * @returns {string}\n * @memberof Document\n */\nDocument.prototype.convert = function (options) {\n var result = this.$convert(toHash(options))\n return result === Opal.nil ? '' : result\n}\n\n/**\n * Write the output to the specified file.\n *\n * If the converter responds to \"write\", delegate the work of writing the file to that method.\n * Otherwise, write the output the specified file.\n *\n * @param {string} output\n * @param {string} target\n *\n * @memberof Document\n */\nDocument.prototype.write = function (output, target) {\n return this.$write(output, target)\n}\n\n/**\n * @returns {string} - the full name of the author as a String\n * @memberof Document\n */\nDocument.prototype.getAuthor = function () {\n return this.$author()\n}\n\n/**\n * @returns {string}\n * @memberof Document\n */\nDocument.prototype.getSource = function () {\n return this.$source()\n}\n\n/**\n * @returns {Array<string>}\n * @memberof Document\n */\nDocument.prototype.getSourceLines = function () {\n return this.$source_lines()\n}\n\n/**\n * @returns {boolean}\n * @memberof Document\n */\nDocument.prototype.isNested = function () {\n return this['$nested?']()\n}\n\n/**\n * @returns {boolean}\n * @memberof Document\n */\nDocument.prototype.isEmbedded = function () {\n return this['$embedded?']()\n}\n\n/**\n * @returns {boolean}\n * @memberof Document\n */\nDocument.prototype.hasExtensions = function () {\n return this['$extensions?']()\n}\n\n/**\n * Get the value of the doctype attribute for this document.\n * @returns {string}\n * @memberof Document\n */\nDocument.prototype.getDoctype = function () {\n return this.doctype\n}\n\n/**\n * Get the value of the backend attribute for this document.\n * @returns {string}\n * @memberof Document\n */\nDocument.prototype.getBackend = function () {\n return this.backend\n}\n\n/**\n * @returns {boolean}\n * @memberof Document\n */\nDocument.prototype.isBasebackend = function (base) {\n return this['$basebackend?'](base)\n}\n\n/**\n * Get the title explicitly defined in the document attributes.\n * @returns {string}\n * @see {@link AbstractNode#getAttributes}\n * @memberof Document\n */\nDocument.prototype.getTitle = function () {\n var title = this.$title()\n return title === Opal.nil ? undefined : title\n}\n\n/**\n * Set the title on the document header\n *\n * Set the title of the document header to the specified value.\n * If the header does not exist, it is first created.\n *\n * @param {string} title - the String title to assign as the title of the document header\n *\n * @returns {string} - the new String title assigned to the document header\n * @memberof Document\n */\nDocument.prototype.setTitle = function (title) {\n return this['$title='](title)\n}\n\n/**\n * @returns {Document/Title} - a {@link Document/Title}\n * @memberof Document\n */\nDocument.prototype.getDocumentTitle = function (options) {\n var doctitle = this.$doctitle(toHash(options))\n return doctitle === Opal.nil ? undefined : doctitle\n}\n\n/**\n * @see {@link Document#getDocumentTitle}\n * @memberof Document\n */\nDocument.prototype.getDoctitle = Document.prototype.getDocumentTitle\n\n/**\n * Get the document catalog JSON object.\n * @returns {Object}\n * @memberof Document\n */\nDocument.prototype.getCatalog = function () {\n return fromHash(this.catalog)\n}\n\n/**\n *\n * @returns {Object}\n * @see Document#getCatalog\n * @memberof Document\n */\nDocument.prototype.getReferences = Document.prototype.getCatalog\n\n/**\n * Get the document revision date from document header (document attribute <code>revdate</code>).\n * @returns {string}\n * @memberof Document\n */\nDocument.prototype.getRevisionDate = function () {\n return this.getAttribute('revdate')\n}\n\n/**\n * @see Document#getRevisionDate\n * @returns {string}\n * @memberof Document\n */\nDocument.prototype.getRevdate = function () {\n return this.getRevisionDate()\n}\n\n/**\n * Get the document revision number from document header (document attribute <code>revnumber</code>).\n * @returns {string}\n * @memberof Document\n */\nDocument.prototype.getRevisionNumber = function () {\n return this.getAttribute('revnumber')\n}\n\n/**\n * Get the document revision remark from document header (document attribute <code>revremark</code>).\n * @returns {string}\n * @memberof Document\n */\nDocument.prototype.getRevisionRemark = function () {\n return this.getAttribute('revremark')\n}\n\n/**\n * Assign a value to the specified attribute in the document header.\n *\n * The assignment will be visible when the header attributes are restored,\n * typically between processor phases (e.g., between parse and convert).\n *\n * @param {string} name - The {string} attribute name to assign\n * @param {Object} value - The {Object} value to assign to the attribute (default: '')\n * @param {boolean} overwrite - A {boolean} indicating whether to assign the attribute\n * if already present in the attributes Hash (default: true)\n *\n * @returns {boolean} - true if the assignment was performed otherwise false\n * @memberof Document\n */\nDocument.prototype.setHeaderAttribute = function (name, value, overwrite) {\n if (typeof overwrite === 'undefined') overwrite = true\n if (typeof value === 'undefined') value = ''\n return this.$set_header_attribute(name, value, overwrite)\n}\n\n/**\n * Convenience method to retrieve the authors of this document as an {Array} of {Document/Author} objects.\n *\n * This method is backed by the author-related attributes on the document.\n *\n * @returns {Array<Author>} - an {Array} of {Document/Author} objects.\n * @memberof Document\n */\nDocument.prototype.getAuthors = function () {\n return this.$authors()\n}\n\n// Document.Footnote API\n\n/**\n * @namespace\n * @module Document/Footnote\n */\nvar Footnote = Document.Footnote\n\n/**\n * @returns {number} - the footnote's index\n * @memberof Document/Footnote\n */\nFootnote.prototype.getIndex = function () {\n var index = this.$$data.index\n return index === Opal.nil ? undefined : index\n}\n\n/**\n * @returns {number} - the footnote's id\n * @memberof Document/Footnote\n */\nFootnote.prototype.getId = function () {\n var id = this.$$data.id\n return id === Opal.nil ? undefined : id\n}\n\n/**\n * @returns {string} - the footnote's text\n * @memberof Document/Footnote\n */\nFootnote.prototype.getText = function () {\n var text = this.$$data.text\n return text === Opal.nil ? undefined : text\n}\n\n// Document.ImageReference API\n\n/**\n * @class\n * @module Document/ImageReference\n */\nvar ImageReference = Document.ImageReference\n\n/**\n * @returns {string} - the image's target\n * @memberof Document/ImageReference\n */\nImageReference.prototype.getTarget = function () {\n return this.$$data.target\n}\n\n/**\n * @returns {string} - the image's directory (imagesdir attribute)\n * @memberof Document/ImageReference\n */\nImageReference.prototype.getImagesDirectory = function () {\n var value = this.$$data.imagesdir\n return value === Opal.nil ? undefined : value\n}\n\n// Document.Author API\n\n/**\n * The Author class represents information about an author extracted from document attributes.\n * @namespace\n * @module Document/Author\n */\nvar Author = Document.Author\n\n/**\n * @returns {string} - the author's full name\n * @memberof Document/Author\n */\nAuthor.prototype.getName = function () {\n var name = this.$$data.name\n return name === Opal.nil ? undefined : name\n}\n\n/**\n * @returns {string} - the author's first name\n * @memberof Document/Author\n */\nAuthor.prototype.getFirstName = function () {\n var firstName = this.$$data.firstname\n return firstName === Opal.nil ? undefined : firstName\n}\n\n/**\n * @returns {string} - the author's middle name (or undefined if the author has no middle name)\n * @memberof Document/Author\n */\nAuthor.prototype.getMiddleName = function () {\n var middleName = this.$$data.middlename\n return middleName === Opal.nil ? undefined : middleName\n}\n\n/**\n * @returns {string} - the author's last name\n * @memberof Document/Author\n */\nAuthor.prototype.getLastName = function () {\n var lastName = this.$$data.lastname\n return lastName === Opal.nil ? undefined : lastName\n}\n\n/**\n * @returns {string} - the author's initials (by default based on the author's name)\n * @memberof Document/Author\n */\nAuthor.prototype.getInitials = function () {\n var initials = this.$$data.initials\n return initials === Opal.nil ? undefined : initials\n}\n\n/**\n * @returns {string} - the author's email\n * @memberof Document/Author\n */\nAuthor.prototype.getEmail = function () {\n var email = this.$$data.email\n return email === Opal.nil ? undefined : email\n}\n\n// private constructor\nDocument.RevisionInfo = function (date, number, remark) {\n this.date = date\n this.number = number\n this.remark = remark\n}\n\n/**\n * @class\n * @namespace\n * @module Document/RevisionInfo\n */\nvar RevisionInfo = Document.RevisionInfo\n\n/**\n * Get the document revision date from document header (document attribute <code>revdate</code>).\n * @returns {string}\n * @memberof Document/RevisionInfo\n */\nRevisionInfo.prototype.getDate = function () {\n return this.date\n}\n\n/**\n * Get the document revision number from document header (document attribute <code>revnumber</code>).\n * @returns {string}\n * @memberof Document/RevisionInfo\n */\nRevisionInfo.prototype.getNumber = function () {\n return this.number\n}\n\n/**\n * Get the document revision remark from document header (document attribute <code>revremark</code>).\n * A short summary of changes in this document revision.\n * @returns {string}\n * @memberof Document/RevisionInfo\n */\nRevisionInfo.prototype.getRemark = function () {\n return this.remark\n}\n\n/**\n * @returns {boolean} - true if the revision info is empty (ie. not defined), otherwise false\n * @memberof Document/RevisionInfo\n */\nRevisionInfo.prototype.isEmpty = function () {\n return this.date === undefined && this.number === undefined && this.remark === undefined\n}\n\n// SafeMode API\n\n/**\n * @namespace\n */\nvar SafeMode = Opal.Asciidoctor.SafeMode\n\n/**\n * @param {string} name - the name of the security level\n * @returns {number} - the integer value of the corresponding security level\n */\nSafeMode.getValueForName = function (name) {\n return this.$value_for_name(name)\n}\n\n/**\n * @param {number} value - the integer value of the security level\n * @returns {string} - the name of the corresponding security level\n */\nSafeMode.getNameForValue = function (value) {\n var name = this.$name_for_value(value)\n return name === Opal.nil ? undefined : name\n}\n\n/**\n * @returns {Array<string>} - the String {Array} of security levels\n */\nSafeMode.getNames = function () {\n return this.$names()\n}\n\n// Callouts API\n\n/**\n * Maintains a catalog of callouts and their associations.\n * @namespace\n */\nvar Callouts = Opal.Asciidoctor.Callouts\n\n/**\n * Create a new Callouts.\n * @returns {Callouts} - a new Callouts\n * @memberof Callouts\n */\nCallouts.create = function () {\n return this.$new()\n}\n\n/**\n * Register a new callout for the given list item ordinal.\n * Generates a unique id for this callout based on the index of the next callout list in the document and the index of this callout since the end of the last callout list.\n *\n * @param {number} ordinal - the Integer ordinal (1-based) of the list item to which this callout is to be associated\n * @returns {string} - The unique String id of this callout\n * @example\n * callouts = asciidoctor.Callouts.create()\n * callouts.register(1)\n * // => \"CO1-1\"\n * callouts.nextList()\n * callouts.register(2)\n * // => \"CO2-1\"\n * @memberof Callouts\n */\n\nCallouts.prototype.register = function (ordinal) {\n return this.$register(ordinal)\n}\n/**\n * Get the next callout index in the document.\n *\n * Reads the next callout index in the document and advances the pointer.\n * This method is used during conversion to retrieve the unique id of the callout that was generated during parsing.\n *\n * @returns {string} - The unique String id of the next callout in the document\n * @memberof Callouts\n */\nCallouts.prototype.readNextId = function () {\n return this.$read_next_id()\n}\n\n/**\n * et a space-separated list of callout ids for the specified list item.\n * @param {number} ordinal - the Integer ordinal (1-based) of the list item for which to retrieve the callouts\n * @returns {string} - a space-separated String of callout ids associated with the specified list item\n * @memberof Callouts\n */\nCallouts.prototype.getCalloutIds = function (ordinal) {\n return this.$callout_ids(ordinal)\n}\n\n/**\n * @memberof Callouts\n */\nCallouts.prototype.getLists = function () {\n var lists = this.lists\n if (lists && lists.length > 0) {\n for (var i = 0; i < lists.length; i++) {\n var list = lists[i]\n if (list && list.length > 0) {\n for (var j = 0; j < list.length; j++) {\n if (typeof list[j] === 'object' && '$$smap' in list[j]) {\n list[j] = fromHash(list[j])\n }\n }\n }\n }\n }\n return lists\n}\n\n/**\n * @memberof Callouts\n */\nCallouts.prototype.getListIndex = function () {\n return this.list_index\n}\n\n/**\n * The current list for which callouts are being collected.\n * @returns {Array} - The Array of callouts at the position of the list index pointer\n * @memberof Callouts\n */\nCallouts.prototype.getCurrentList = function () {\n var currentList = this.$current_list()\n if (currentList && currentList.length > 0) {\n for (var i = 0; i < currentList.length; i++) {\n if (typeof currentList[i] === 'object' && '$$smap' in currentList[i]) {\n currentList[i] = fromHash(currentList[i])\n }\n }\n }\n return currentList\n}\n\n/**\n * Advance to the next callout list in the document.\n * @memberof Callouts\n */\nCallouts.prototype.nextList = function () {\n return this.$nextList()\n}\n\n/**\n * Rewind the list index pointer, intended to be used when switching from the parsing to conversion phase.\n * @memberof Callouts\n */\nCallouts.prototype.rewind = function () {\n return this.$rewind()\n}\n\n/**\n * @returns {Document/RevisionInfo} - a {@link Document/RevisionInfo}\n * @memberof Document\n */\nDocument.prototype.getRevisionInfo = function () {\n return new Document.RevisionInfo(this.getRevisionDate(), this.getRevisionNumber(), this.getRevisionRemark())\n}\n\n/**\n * @returns {boolean} - true if the document contains revision info, otherwise false\n * @memberof Document\n */\nDocument.prototype.hasRevisionInfo = function () {\n var revisionInfo = this.getRevisionInfo()\n return !revisionInfo.isEmpty()\n}\n\n/**\n * @returns {boolean}\n * @memberof Document\n */\nDocument.prototype.getNotitle = function () {\n return this.$notitle()\n}\n\n/**\n * @returns {boolean}\n * @memberof Document\n */\nDocument.prototype.getNoheader = function () {\n return this.$noheader()\n}\n\n/**\n * @returns {boolean}\n * @memberof Document\n */\nDocument.prototype.getNofooter = function () {\n return this.$nofooter()\n}\n\n/**\n * @returns {boolean}\n * @memberof Document\n */\nDocument.prototype.hasHeader = function () {\n return this['$header?']()\n}\n\n/**\n * Replay attribute assignments at the block level.\n *\n * <i>This method belongs to an internal API that deals with how attributes are managed by the processor.</i>\n * If you understand why this group of methods are necessary, and what they do, feel free to use them.\n * <strong>However, keep in mind they are subject to change at any time.</strong>\n *\n * @param {Object} blockAttributes - A JSON of attributes\n * @memberof Document\n */\nDocument.prototype.playbackAttributes = function (blockAttributes) {\n blockAttributes = toHash(blockAttributes)\n if (blockAttributes) {\n var attrEntries = blockAttributes['$[]']('attribute_entries')\n if (attrEntries && Array.isArray(attrEntries)) {\n var result = []\n for (var i = 0; i < attrEntries.length; i++) {\n var attrEntryObject = attrEntries[i]\n if (attrEntryObject && typeof attrEntryObject === 'object' && attrEntryObject.constructor.name === 'Object') {\n attrEntryObject.$name = function () {\n return this.name\n }\n attrEntryObject.$value = function () {\n return this.value\n }\n attrEntryObject.$negate = function () {\n return this.negate\n }\n }\n result.push(attrEntryObject)\n }\n blockAttributes['$[]=']('attribute_entries', result)\n }\n }\n this.$playback_attributes(blockAttributes)\n}\n\n/**\n * Delete the specified attribute from the document if the name is not locked.\n * If the attribute is locked, false is returned.\n * Otherwise, the attribute is deleted.\n *\n * @param {string} name - the String attribute name\n *\n * @returns {boolean} - true if the attribute was deleted, false if it was not because it's locked\n * @memberof Document\n */\nDocument.prototype.deleteAttribute = function (name) {\n return this.$delete_attribute(name)\n}\n\n/**\n * Determine if the attribute has been locked by being assigned in document options.\n *\n * @param {string} key - The attribute key to check\n *\n * @returns {boolean} - true if the attribute is locked, false otherwise\n * @memberof Document\n */\nDocument.prototype.isAttributeLocked = function (key) {\n return this['$attribute_locked?'](key)\n}\n\n/**\n * Restore the attributes to the previously saved state (attributes in header).\n *\n * @memberof Document\n */\nDocument.prototype.restoreAttributes = function () {\n return this.$restore_attributes()\n}\n\n/**\n * Parse the AsciiDoc source stored in the {Reader} into an abstract syntax tree.\n *\n * If the data parameter is not nil, create a new {PreprocessorReader} and assigned it to the reader property of this object.\n * Otherwise, continue with the reader that was created when the {Document} was instantiated.\n * Pass the reader to {Parser.parse} to parse the source data into an abstract syntax tree.\n *\n * If parsing has already been performed, this method returns without performing any processing.\n *\n * @param {string|Array<string>} [data] - The optional replacement AsciiDoc source data as a String or String Array. (default: undefined)\n *\n * @returns {Document} - this {Document}\n * @memberof Document\n */\nDocument.prototype.parse = function (data) {\n return this.$parse(data)\n}\n\n/**\n * @memberof Document\n */\nDocument.prototype.getDocinfo = function (docinfoLocation, suffix) {\n return this.$docinfo(docinfoLocation, suffix)\n}\n\n/**\n * @param {string} [docinfoLocation] - A {string} for checking docinfo extensions at a given location (head or footer) (default: head)\n * @returns {boolean}\n * @memberof Document\n */\nDocument.prototype.hasDocinfoProcessors = function (docinfoLocation) {\n return this['$docinfo_processors?'](docinfoLocation)\n}\n\n/**\n * Increment the specified counter and store it in the block's attributes.\n *\n * @param {string} counterName - the String name of the counter attribute\n * @param {Block} block - the {Block} on which to save the counter\n *\n * @returns {number} - the next number in the sequence for the specified counter\n * @memberof Document\n */\nDocument.prototype.incrementAndStoreCounter = function (counterName, block) {\n return this.$increment_and_store_counter(counterName, block)\n}\n\n/**\n * @deprecated Please use {Document#incrementAndStoreCounter} method.\n * @memberof Document\n */\nDocument.prototype.counterIncrement = Document.prototype.incrementAndStoreCounter\n\n/**\n * Get the named counter and take the next number in the sequence.\n *\n * @param {string} name - the String name of the counter\n * @param {string|number} seed - the initial value as a String or Integer\n *\n * @returns {number} the next number in the sequence for the specified counter\n * @memberof Document\n */\nDocument.prototype.counter = function (name, seed) {\n return this.$counter(name, seed)\n}\n\n/**\n * A read-only integer value indicating the level of security that should be enforced while processing this document.\n * The value must be set in the Document constructor using the \"safe\" option.\n *\n * A value of 0 (UNSAFE) disables any of the security features enforced by Asciidoctor.\n *\n * A value of 1 (SAFE) closely parallels safe mode in AsciiDoc.\n * In particular, it prevents access to files which reside outside of the parent directory of the source file and disables any macro other than the include directive.\n *\n * A value of 10 (SERVER) disallows the document from setting attributes that would affect the conversion of the document,\n * in addition to all the security features of SafeMode.SAFE.\n * For instance, this level forbids changing the backend or source-highlighter using an attribute defined in the source document header.\n * This is the most fundamental level of security for server deployments (hence the name).\n *\n * A value of 20 (SECURE) disallows the document from attempting to read files from the file system and including the contents of them into the document,\n * in addition to all the security features of SafeMode.SECURE.\n * In particular, it disallows use of the include::[] directive and the embedding of binary content (data uri), stylesheets and JavaScripts referenced by the document.\n * (Asciidoctor and trusted extensions may still be allowed to embed trusted content into the document).\n *\n * Since Asciidoctor is aiming for wide adoption, 20 (SECURE) is the default value and is recommended for server deployments.\n *\n * A value of 100 (PARANOID) is planned to disallow the use of passthrough macros and prevents the document from setting any known attributes,\n * in addition to all the security features of SafeMode.SECURE.\n * Please note that this level is not currently implemented (and therefore not enforced)!\n *\n * @returns {number} - An integer value indicating the level of security\n * @memberof Document\n */\nDocument.prototype.getSafe = function () {\n return this.safe\n}\n\n/**\n * Get the Boolean AsciiDoc compatibility mode.\n * Enabling this attribute activates the following syntax changes:\n *\n * * single quotes as constrained emphasis formatting marks\n * * single backticks parsed as inline literal, formatted as monospace\n * * single plus parsed as constrained, monospaced inline formatting\n * * double plus parsed as constrained, monospaced inline formatting\n *\n * @returns {boolean}\n * @memberof Document\n */\nDocument.prototype.getCompatMode = function () {\n return this.compat_mode\n}\n\n/**\n * Get the Boolean flag that indicates whether source map information should be tracked by the parser.\n * @returns {boolean}\n * @memberof Document\n */\nDocument.prototype.getSourcemap = function () {\n var sourcemap = this.sourcemap\n return sourcemap === Opal.nil ? false : sourcemap\n}\n\n/**\n * Set the Boolean flag that indicates whether source map information should be tracked by the parser.\n * @param {boolean} value\n * @memberof Document\n */\nDocument.prototype.setSourcemap = function (value) {\n this.sourcemap = value\n}\n\n/**\n * Get the JSON of document counters.\n * @returns {Object}\n * @memberof Document\n */\nDocument.prototype.getCounters = function () {\n return fromHash(this.counters)\n}\n\n/**\n * @returns {Object}\n * @memberof Document\n */\nDocument.prototype.getCallouts = function () {\n return this.$callouts()\n}\n\n/**\n * Get the String base directory for converting this document.\n *\n * Defaults to directory of the source file.\n * If the source is a string, defaults to the current directory.\n * @returns {string}\n * @memberof Document\n */\nDocument.prototype.getBaseDir = function () {\n return this.base_dir\n}\n\n/**\n * Get the JSON of resolved options used to initialize this {Document}.\n * @returns {Object}\n * @memberof Document\n */\nDocument.prototype.getOptions = function () {\n return fromHash(this.options)\n}\n\n/**\n * Get the outfilesuffix defined at the end of the header.\n * @returns {string}\n * @memberof Document\n */\nDocument.prototype.getOutfilesuffix = function () {\n return this.outfilesuffix\n}\n\n/**\n * Get a reference to the parent Document of this nested document.\n * @returns {Document|undefined}\n * @memberof Document\n */\nDocument.prototype.getParentDocument = function () {\n var parentDocument = this.parent_document\n return parentDocument === Opal.nil ? undefined : parentDocument\n}\n\n/**\n * Get the {Reader} associated with this document.\n * @returns {Object}\n * @memberof Document\n */\nDocument.prototype.getReader = function () {\n return this.reader\n}\n\n/**\n * Get the {Converter} instance being used to convert the current {Document}.\n * @returns {Object}\n * @memberof Document\n */\nDocument.prototype.getConverter = function () {\n return this.converter\n}\n\n/**\n * Get the activated {Extensions.Registry} associated with this document.\n * @returns {Extensions/Registry}\n * @memberof Document\n */\nDocument.prototype.getExtensions = function () {\n var extensions = this.extensions\n return extensions === Opal.nil ? undefined : extensions\n}\n\n// Document.Title API\n\n/**\n * A partitioned title (i.e., title & subtitle).\n * @namespace\n * @module Document/Title\n */\nvar Title = Document.Title\n\n/**\n * @returns {string}\n * @memberof Document/Title\n */\nTitle.prototype.getMain = function () {\n return this.main\n}\n\n/**\n * @returns {string}\n * @memberof Document/Title\n */\nTitle.prototype.getCombined = function () {\n return this.combined\n}\n\n/**\n * @returns {string}\n * @memberof Document/Title\n */\nTitle.prototype.getSubtitle = function () {\n var subtitle = this.subtitle\n return subtitle === Opal.nil ? undefined : subtitle\n}\n\n/**\n * @returns {boolean}\n * @memberof Document/Title\n */\nTitle.prototype.isSanitized = function () {\n var sanitized = this['$sanitized?']()\n return sanitized === Opal.nil ? false : sanitized\n}\n\n/**\n * @returns {boolean}\n * @memberof Document/Title\n */\nTitle.prototype.hasSubtitle = function () {\n return this['$subtitle?']()\n}\n\n// Inline API\n\n/**\n * Methods for managing inline elements in AsciiDoc block.\n * @namespace\n * @extends AbstractNode\n */\nvar Inline = Opal.Asciidoctor.Inline\n\n/**\n * Create a new Inline element.\n * @param {AbstractBlock} parent\n * @param {string} context\n * @param {string|undefined} text\n * @param {Object|undefined} opts\n * @returns {Inline} - a new Inline element\n * @memberof Inline\n */\nInline.create = function (parent, context, text, opts) {\n return this.$new(parent, context, text, prepareOptions(opts))\n}\n\n/**\n * Get the converted content for this inline node.\n *\n * @returns {string} - the converted String content for this inline node\n * @memberof Inline\n */\nInline.prototype.convert = function () {\n return this.$convert()\n}\n\n/**\n * Get the converted String text of this Inline node, if applicable.\n *\n * @returns {string|undefined} - the converted String text for this Inline node, or undefined if not applicable for this node.\n * @memberof Inline\n */\nInline.prototype.getText = function () {\n var text = this.$text()\n return text === Opal.nil ? undefined : text\n}\n\n/**\n * Get the String sub-type (aka qualifier) of this Inline node.\n *\n * This value is used to distinguish different variations of the same node\n * category, such as different types of anchors.\n *\n * @returns {string} - the string sub-type of this Inline node.\n * @memberof Inline\n */\nInline.prototype.getType = function () {\n return this.$type()\n}\n\n/**\n * Get the primary String target of this Inline node.\n *\n * @returns {string|undefined} - the string target of this Inline node.\n * @memberof Inline\n */\nInline.prototype.getTarget = function () {\n var target = this.$target()\n return target === Opal.nil ? undefined : target\n}\n\n/**\n * Returns the converted alt text for this inline image.\n *\n * @returns {string} - the String value of the alt attribute.\n * @memberof Inline\n */\nInline.prototype.getAlt = function () {\n return this.$alt()\n}\n\n// List API\n\n/**\n * Methods for managing AsciiDoc lists (ordered, unordered and description lists).\n * @namespace\n * @extends AbstractBlock\n */\nvar List = Opal.Asciidoctor.List\n\n/**\n * Checks if the {@link List} contains any child {@link ListItem}.\n *\n * @memberof List\n * @returns {boolean} - whether the {@link List} has child {@link ListItem}.\n */\nList.prototype.hasItems = function () {\n return this['$items?']()\n}\n\n/**\n * Get the Array of {@link ListItem} nodes for this {@link List}.\n *\n * @returns {Array<ListItem>} - an Array of {@link ListItem} nodes.\n * @memberof List\n */\nList.prototype.getItems = function () {\n return this.blocks\n}\n\n// ListItem API\n\n/**\n * Methods for managing items for AsciiDoc olists, ulist, and dlists.\n *\n * In a description list (dlist), each item is a tuple that consists of a 2-item Array of ListItem terms and a ListItem description (i.e., [[term, term, ...], desc].\n * If a description is not set, then the second entry in the tuple is nil.\n * @namespace\n * @extends AbstractBlock\n */\nvar ListItem = Opal.Asciidoctor.ListItem\n\n/**\n * Get the converted String text of this {@link ListItem} node.\n *\n * @returns {string} - the converted String text for this {@link ListItem} node.\n * @memberof ListItem\n */\nListItem.prototype.getText = function () {\n return this.$text()\n}\n\n/**\n * Set the String source text of this {@link ListItem} node.\n *\n * @returns {string} - the new String text assigned to this {@link ListItem}\n * @memberof ListItem\n */\nListItem.prototype.setText = function (text) {\n return this['$text='](text)\n}\n\n/**\n * A convenience method that checks whether the text of this {@link ListItem} is not blank (i.e. not undefined or empty string).\n *\n * @returns {boolean} - whether the text is not blank\n * @memberof ListItem\n */\nListItem.prototype.hasText = function () {\n return this['$text?']()\n}\n\n/**\n * Get the {string} used to mark this {@link ListItem}.\n *\n * @returns {string}\n * @memberof ListItem\n */\nListItem.prototype.getMarker = function () {\n return this.marker\n}\n\n/**\n * Set the {string} used to mark this {@link ListItem}.\n *\n * @param {string} marker - the {string} used to mark this {@link ListItem}\n * @memberof ListItem\n */\nListItem.prototype.setMarker = function (marker) {\n this.marker = marker\n}\n\n/**\n * Get the {@link List} to which this {@link ListItem} is attached.\n *\n * @returns {List} - the {@link List} object to which this {@link ListItem} is attached,\n * or undefined if this node has no parent.\n * @memberof ListItem\n */\nListItem.prototype.getList = function () {\n return this.$list()\n}\n\n/**\n * @see {@link ListItem#getList}\n * @memberof ListItem\n */\nListItem.prototype.getParent = ListItem.prototype.getList\n\n// Reader API\n\n/** @namespace */\nvar Reader = Opal.Asciidoctor.Reader\n\n/**\n * Push source onto the front of the reader and switch the context based on the file, document-relative path and line information given.\n *\n * This method is typically used in an IncludeProcessor to add source read from the target specified.\n *\n * @param {string} data\n * @param {string|undefined} file\n * @param {string|undefined} path\n * @param {number} lineno - The line number\n * @param {Object} attributes - a JSON of attributes\n * @returns {Reader} - this {Reader} object.\n * @memberof Reader\n */\nReader.prototype.pushInclude = function (data, file, path, lineno, attributes) {\n return this.$push_include(data, file, path, lineno, toHash(attributes))\n}\n\n/**\n * Get the current location of the reader's cursor, which encapsulates the file, dir, path, and lineno of the file being read.\n *\n * @returns {Cursor}\n * @memberof Reader\n */\nReader.prototype.getCursor = function () {\n return this.$cursor()\n}\n\n/**\n * Get the remaining unprocessed lines, without consuming them, as an {Array} of {string}.\n *\n * Lines will not be consumed from the Reader (ie. you will be able to read these lines again).\n *\n * @returns {Array<string>} - the remaining unprocessed lines as an {Array} of {string}.\n * @memberof Reader\n */\nReader.prototype.getLines = function () {\n return this.$lines()\n}\n\n/**\n * Get the remaining unprocessed lines, without consuming them, as a {string}.\n *\n * Lines will not be consumed from the Reader (ie. you will be able to read these lines again).\n *\n * @returns {string} - the remaining unprocessed lines as a {string} (joined by linefeed characters).\n * @memberof Reader\n */\nReader.prototype.getString = function () {\n return this.$string()\n}\n\n/**\n * Check whether there are any lines left to read.\n * If a previous call to this method resulted in a value of false, immediately returned the cached value.\n * Otherwise, delegate to peekLine to determine if there is a next line available.\n *\n * @returns {boolean} - true if there are more lines, false if there are not.\n * @memberof Reader\n */\nReader.prototype.hasMoreLines = function () {\n return this['$has_more_lines?']()\n}\n\n/**\n * Check whether this reader is empty (contains no lines).\n *\n * @returns {boolean} - true if there are no more lines to peek, otherwise false.\n * @memberof Reader\n */\nReader.prototype.isEmpty = function () {\n return this['$empty?']()\n}\n\n/**\n * Peek at the next line.\n * Processes the line if not already marked as processed, but does not consume it (ie. you will be able to read this line again).\n *\n * This method will probe the reader for more lines.\n * If there is a next line that has not previously been visited, the line is passed to the Reader#processLine method to be initialized.\n * This call gives sub-classes the opportunity to do preprocessing.\n * If the return value of the Reader#processLine is undefined, the data is assumed to be changed and Reader#peekLine is invoked again to perform further processing.\n *\n * If hasMoreLines is called immediately before peekLine, the direct flag is implicitly true (since the line is flagged as visited).\n *\n * @param {boolean} direct - A {boolean} flag to bypasses the check for more lines and immediately returns the first element of the internal lines {Array}. (default: false)\n * @returns {string} - the next line as a {string} if there are lines remaining.\n * @memberof Reader\n */\nReader.prototype.peekLine = function (direct) {\n direct = direct || false\n var line = this.$peek_line(direct)\n return line === Opal.nil ? undefined : line\n}\n\n/**\n * Consume, preprocess, and return the next line.\n *\n * Line will be consumed from the Reader (ie. you won't be able to read this line again).\n *\n * @returns {string} - the next line as a {string} if data is present.\n * @memberof Reader\n */\nReader.prototype.readLine = function () {\n var line = this.$read_line()\n return line === Opal.nil ? undefined : line\n}\n\n/**\n * Consume, preprocess, and return the remaining lines.\n *\n * This method calls Reader#readLine repeatedly until all lines are consumed and returns the lines as an {Array} of {string}.\n * This method differs from Reader#getLines in that it processes each line in turn, hence triggering any preprocessors implemented in sub-classes.\n *\n * Lines will be consumed from the Reader (ie. you won't be able to read these lines again).\n *\n * @returns {Array<string>} - the lines read as an {Array} of {string}.\n * @memberof Reader\n */\nReader.prototype.readLines = function () {\n return this.$read_lines()\n}\n\n/**\n * Consume, preprocess, and return the remaining lines joined as a {string}.\n *\n * Delegates to Reader#readLines, then joins the result.\n *\n * Lines will be consumed from the Reader (ie. you won't be able to read these lines again).\n *\n * @returns {string} - the lines read joined as a {string}\n * @memberof Reader\n */\nReader.prototype.read = function () {\n return this.$read()\n}\n\n/**\n * Advance to the next line by discarding the line at the front of the stack.\n *\n * @returns {boolean} - a Boolean indicating whether there was a line to discard.\n * @memberof Reader\n */\nReader.prototype.advance = function () {\n return this.$advance()\n}\n\n// Cursor API\n\n/** @namespace */\nvar Cursor = Opal.Asciidoctor.Reader.Cursor\n\n/**\n * Get the file associated to the cursor.\n * @returns {string|undefined}\n * @memberof Cursor\n */\nCursor.prototype.getFile = function () {\n var file = this.file\n return file === Opal.nil ? undefined : file\n}\n\n/**\n * Get the directory associated to the cursor.\n * @returns {string|undefined} - the directory associated to the cursor\n * @memberof Cursor\n */\nCursor.prototype.getDirectory = function () {\n var dir = this.dir\n return dir === Opal.nil ? undefined : dir\n}\n\n/**\n * Get the path associated to the cursor.\n * @returns {string|undefined} - the path associated to the cursor (or '<stdin>')\n * @memberof Cursor\n */\nCursor.prototype.getPath = function () {\n var path = this.path\n return path === Opal.nil ? undefined : path\n}\n\n/**\n * Get the line number of the cursor.\n * @returns {number|undefined} - the line number of the cursor\n * @memberof Cursor\n */\nCursor.prototype.getLineNumber = function () {\n return this.lineno\n}\n\n// Logger API (available in Asciidoctor 1.5.7+)\n\nfunction initializeLoggerFormatterClass (className, functions) {\n var superclass = Opal.const_get_qualified(Opal.Logger, 'Formatter')\n return initializeClass(superclass, className, functions, {}, {\n call: function (args) {\n for (var i = 0; i < args.length; i++) {\n // convert all (Opal) Hash arguments to JSON.\n if (typeof args[i] === 'object' && '$$smap' in args[i]) {\n args[i] = fromHash(args[i])\n }\n }\n return args\n }\n })\n}\n\nfunction initializeLoggerClass (className, functions) {\n var superClass = Opal.const_get_qualified(Opal.Asciidoctor, 'Logger')\n return initializeClass(superClass, className, functions, {}, {\n add: function (args) {\n if (args.length >= 2 && typeof args[2] === 'object' && '$$smap' in args[2]) {\n var message = args[2]\n var messageObject = fromHash(message)\n messageObject.getText = function () {\n return this.text\n }\n messageObject.getSourceLocation = function () {\n return this.source_location\n }\n messageObject.$inspect = function () {\n var sourceLocation = this.getSourceLocation()\n if (sourceLocation) {\n return sourceLocation.getPath() + ': line ' + sourceLocation.getLineNumber() + ': ' + this.getText()\n } else {\n return this.getText()\n }\n }\n args[2] = messageObject\n }\n if (args.length >= 1) {\n args[1] = args[1] === Opal.nil ? undefined : args[1]\n }\n return args\n }\n })\n}\n\n/**\n * @namespace\n */\nvar LoggerManager = Opal.const_get_qualified(Opal.Asciidoctor, 'LoggerManager', true)\n\n// Alias\nOpal.Asciidoctor.LoggerManager = LoggerManager\n\n/**\n * @memberof LoggerManager\n */\nLoggerManager.getLogger = function () {\n return this.$logger()\n}\n\n/**\n * @memberof LoggerManager\n */\nLoggerManager.setLogger = function (logger) {\n this['$logger='](logger)\n}\n\n/**\n * @memberof LoggerManager\n */\nLoggerManager.newLogger = function (name, functions) {\n return initializeLoggerClass(name, functions).$new()\n}\n\n/**\n * @memberof LoggerManager\n */\nLoggerManager.newFormatter = function (name, functions) {\n return initializeLoggerFormatterClass(name, functions).$new()\n}\n\n/**\n * @namespace\n */\nvar LoggerSeverity = Opal.const_get_qualified(Opal.Logger, 'Severity', true)\n\n// Alias\nOpal.Asciidoctor.LoggerSeverity = LoggerSeverity\n\n/**\n * @memberof LoggerSeverity\n */\nLoggerSeverity.get = function (severity) {\n return LoggerSeverity.$constants()[severity]\n}\n\n/**\n * @namespace\n */\nvar LoggerFormatter = Opal.const_get_qualified(Opal.Logger, 'Formatter', true)\n\n// Alias\nOpal.Asciidoctor.LoggerFormatter = LoggerFormatter\n\n/**\n * @memberof LoggerFormatter\n */\nLoggerFormatter.prototype.call = function (severity, time, programName, message) {\n return this.$call(LoggerSeverity.get(severity), time, programName, message)\n}\n\n/**\n * @namespace\n */\nvar MemoryLogger = Opal.const_get_qualified(Opal.Asciidoctor, 'MemoryLogger', true)\n\n// Alias\nOpal.Asciidoctor.MemoryLogger = MemoryLogger\n\n/**\n * Create a new MemoryLogger.\n * @returns {MemoryLogger} - a MemoryLogger\n * @memberof MemoryLogger\n */\nMemoryLogger.create = function () {\n return this.$new()\n}\n\n/**\n * @returns {Array<Object>} - a list of messages\n * @memberof MemoryLogger\n */\nMemoryLogger.prototype.getMessages = function () {\n var messages = this.messages\n var result = []\n for (var i = 0; i < messages.length; i++) {\n var message = messages[i]\n var messageObject = fromHash(message)\n if (typeof messageObject.message === 'string') {\n messageObject.getText = function () {\n return this.message\n }\n } else {\n // also convert the message attribute\n messageObject.message = fromHash(messageObject.message)\n messageObject.getText = function () {\n return this.message.text\n }\n }\n messageObject.getSeverity = function () {\n return this.severity.toString()\n }\n messageObject.getSourceLocation = function () {\n return this.message.source_location\n }\n result.push(messageObject)\n }\n return result\n}\n\nvar Logging = Opal.const_get_qualified(Opal.Asciidoctor, 'Logging', true)\n\nOpal.Asciidoctor.Logging = Logging\n\nLogging.getLogger = function () {\n return LoggerManager.$logger()\n}\n\nLogging.createLogMessage = function (text, context) {\n return Logging.prototype.$message_with_context(text, toHash(context))\n}\n\n// alias\n\n/**\n * @memberof Reader\n */\nReader.prototype.getLogger = Logging.getLogger\n/**\n * @memberof Reader\n */\nReader.prototype.createLogMessage = Logging.createLogMessage\n\n/**\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getLogger = Logging.getLogger\n/**\n * @memberof AbstractNode\n */\nAbstractNode.prototype.createLogMessage = Logging.createLogMessage\n\n/**\n * @namespace\n */\nvar Logger = Opal.const_get_qualified(Opal.Asciidoctor, 'Logger', true)\n\n// Alias\nOpal.Asciidoctor.Logger = Logger\n\n/**\n * @returns {number|undefined} - the maximum severity\n * @memberof Logger\n */\nLogger.prototype.getMaxSeverity = function () {\n var result = this.max_severity\n return result === Opal.nil ? undefined : result\n}\n/**\n * @returns {LoggerFormatter} - the formatter\n * @memberof Logger\n */\nLogger.prototype.getFormatter = function () {\n return this.formatter\n}\n/**\n * @param {LoggerFormatter} formatter - the formatter\n * @memberof Logger\n */\nLogger.prototype.setFormatter = function (formatter) {\n this.formatter = formatter\n}\n/**\n * @returns {number} - the logging severity threshold\n * @memberof Logger\n */\nLogger.prototype.getLevel = function () {\n return this.level\n}\n/**\n * @param {number} level - the logging severity threshold\n * @memberof Logger\n */\nLogger.prototype.setLevel = function (level) {\n this.level = level\n}\n/**\n * @returns {string} - the program name\n * @memberof Logger\n */\nLogger.prototype.getProgramName = function () {\n return this.progname\n}\n/**\n * @param {string} programName - the program name\n * @memberof Logger\n */\nLogger.prototype.setProgramName = function (programName) {\n this.progname = programName\n}\n\nvar RubyLogger = Opal.const_get_qualified('::', 'Logger')\n\nvar log = function (logger, level, message) {\n logger['$' + level](message)\n}\nRubyLogger.prototype.add = function (severity, message, programName) {\n var severityValue = typeof severity === 'string' ? LoggerSeverity[severity.toUpperCase()] : severity\n this.$add(severityValue, message, programName)\n}\nRubyLogger.prototype.log = RubyLogger.prototype.add\nRubyLogger.prototype.debug = function (message) {\n log(this, 'debug', message)\n}\nRubyLogger.prototype.info = function (message) {\n log(this, 'info', message)\n}\nRubyLogger.prototype.warn = function (message) {\n log(this, 'warn', message)\n}\nRubyLogger.prototype.error = function (message) {\n log(this, 'error', message)\n}\nRubyLogger.prototype.fatal = function (message) {\n log(this, 'fatal', message)\n}\nRubyLogger.prototype.isDebugEnabled = function () {\n return this['$debug?']()\n}\nRubyLogger.prototype.isInfoEnabled = function () {\n return this['$info?']()\n}\nRubyLogger.prototype.isWarnEnabled = function () {\n return this['$warn?']()\n}\nRubyLogger.prototype.isErrorEnabled = function () {\n return this['$error?']()\n}\nRubyLogger.prototype.isFatalEnabled = function () {\n return this['$fatal?']()\n}\n\n/**\n * @namespace\n */\nvar NullLogger = Opal.const_get_qualified(Opal.Asciidoctor, 'NullLogger', true)\n\n// Alias\nOpal.Asciidoctor.NullLogger = NullLogger\n\n/**\n * Create a new NullLogger.\n * @returns {NullLogger} - a NullLogger\n * @memberof NullLogger\n */\nNullLogger.create = function () {\n return this.$new()\n}\n\n/**\n * @returns {number|undefined} - the maximum severity\n * @memberof NullLogger\n */\nNullLogger.prototype.getMaxSeverity = function () {\n return this.max_severity\n}\n\n// Alias\nOpal.Asciidoctor.StopIteration = Opal.StopIteration\n\n/**\n * @namespace\n */\nvar Timings = Opal.const_get_qualified(Opal.Asciidoctor, 'Timings', true)\n\n// Alias\nOpal.Asciidoctor.Timings = Timings\n\n/**\n * Create a new Timings.\n * @returns {Timings} - a Timings\n * @memberof Timings\n */\nTimings.create = function () {\n return this.$new()\n}\n\n/**\n * Print a report to the specified output.\n * The report will include:\n * - the time to read and parse source\n * - the time to convert document\n * - the total time (read, parse and convert)\n * @param {RubyLogger|console|Object} [to] - an optional output (by default stdout)\n * @param {string} [subject] - an optional subject (usually the file name)\n * @memberof Timings\n */\nTimings.prototype.printReport = function (to, subject) {\n var outputFunction\n if (to) {\n if (typeof to.$add === 'function') {\n outputFunction = function (message) {\n to.$add(1, message)\n }\n } else if (typeof to.log === 'function') {\n outputFunction = to.log\n } else if (typeof to.write === 'function') {\n outputFunction = function (message) {\n to.write(message, 'utf-8')\n }\n } else {\n throw new Error('The output should be a Stream (with a write function), an object with a log function or a Ruby Logger (with a add function)')\n }\n } else {\n outputFunction = function (message) {\n Opal.gvars.stdout.$write(message)\n }\n }\n if (subject) {\n outputFunction('Input file: ' + subject)\n }\n outputFunction(' Time to read and parse source: ' + this.$read_parse().toFixed(2))\n outputFunction(' Time to convert document: ' + this.$convert().toFixed(2))\n outputFunction(' Total time (read, parse and convert): ' + this.$read_parse_convert().toFixed(2))\n}\n\n/**\n * @namespace\n * @description\n * This API is experimental and subject to change.\n *\n * A pluggable adapter for integrating a syntax (aka code) highlighter into AsciiDoc processing.\n *\n * There are two types of syntax highlighter adapters. The first performs syntax highlighting during the convert phase.\n * This adapter type must define a \"handlesHighlighting\" method that returns true.\n * The companion \"highlight\" method will then be called to handle the \"specialcharacters\" substitution for source blocks.\n *\n * The second assumes syntax highlighting is performed on the client (e.g., when the HTML document is loaded).\n * This adapter type must define a \"hasDocinfo\" method that returns true.\n * The companion \"docinfo\" method will then be called to insert markup into the output document.\n * The docinfo functionality is available to both adapter types.\n *\n * Asciidoctor.js provides several a built-in adapter for highlight.js.\n * Additional adapters can be registered using SyntaxHighlighter.register.\n */\nvar SyntaxHighlighter = Opal.const_get_qualified(Opal.Asciidoctor, 'SyntaxHighlighter', true)\n\n// Alias\nOpal.Asciidoctor.SyntaxHighlighter = SyntaxHighlighter\n\n/**\n * Associates the syntax highlighter class or object with the specified names.\n *\n * @description This API is experimental and subject to change.\n *\n * @param {string|Array} names - A {string} name or an {Array} of {string} names\n * @param functions - A list of functions representing a {SyntaxHighlighter} or a {SyntaxHighlighter} class to instantiate\n * @memberof SyntaxHighlighter\n */\nSyntaxHighlighter.register = function (names, functions) {\n var name = typeof names === 'string' ? names : names[0]\n if (typeof functions === 'function') {\n var classObject = functions\n var prototype = classObject.prototype\n var properties = Object.getOwnPropertyNames(prototype)\n functions = {}\n for (var propertyIdx in properties) {\n var propertyName = properties[propertyIdx]\n functions[propertyName] = prototype[propertyName]\n }\n }\n var scope = initializeClass(SyntaxHighlighterBase, name, functions, {}, {\n format: function (args) {\n if (args.length >= 2 && typeof args[2] === 'object' && '$$smap' in args[2]) {\n args[2] = fromHash(args[2])\n }\n if (args.length >= 1) {\n args[1] = args[1] === Opal.nil ? undefined : args[1]\n }\n return args\n },\n highlight: function (args) {\n if (args.length >= 3 && typeof args[3] === 'object' && '$$smap' in args[3]) {\n var opts = args[3]\n opts = fromHash(opts)\n for (var key in opts) {\n var value = opts[key]\n if (key === 'callouts') {\n var callouts = fromHashKeys(value)\n for (var idx in callouts) {\n var callout = callouts[idx]\n for (var i = 0; i < callout.length; i++) {\n var items = callout[i]\n for (var j = 0; j < items.length; j++) {\n items[j] = items[j] === Opal.nil ? undefined : items[j]\n }\n }\n }\n opts[key] = callouts\n } else {\n opts[key] = value === Opal.nil ? undefined : value\n }\n }\n args[3] = opts\n }\n if (args.length >= 2) {\n args[2] = args[2] === Opal.nil ? undefined : args[2]\n }\n return args\n }\n })\n for (var functionName in functions) {\n if (Object.prototype.hasOwnProperty.call(functions, functionName)) {\n (function (functionName) {\n var userFunction = functions[functionName]\n if (functionName === 'handlesHighlighting') {\n Opal.def(scope, '$highlight?', function () {\n return userFunction.call()\n })\n } else if (functionName === 'hasDocinfo') {\n Opal.def(scope, '$docinfo?', function (location) {\n return userFunction.apply(this, [location])\n })\n }\n }(functionName))\n }\n }\n Opal.def(scope, '$name', function () {\n return name\n })\n SyntaxHighlighter.$register(scope, names)\n return scope\n}\n\n/**\n * Retrieves the syntax highlighter class or object registered for the specified name.\n *\n * @description This API is experimental and subject to change.\n *\n * @param {string} name - The {string} name of the syntax highlighter to retrieve.\n * @returns {SyntaxHighlighter} - the {SyntaxHighlighter} registered for this name.\n * @memberof SyntaxHighlighter\n */\nSyntaxHighlighter.get = function (name) {\n var result = SyntaxHighlighter.$for(name)\n return result === Opal.nil ? undefined : result\n}\n\n/**\n * @deprecated Please use {SyntaxHighlighter#get} method as \"for\" is a reserved keyword.\n */\nSyntaxHighlighter.for = SyntaxHighlighter.get\n\n/**\n * @namespace\n */\nvar SyntaxHighlighterBase = Opal.const_get_qualified(SyntaxHighlighter, 'Base', true)\n\n// Alias\nOpal.Asciidoctor.SyntaxHighlighterBase = SyntaxHighlighterBase\n\n/**\n * Statically register the current class in the registry for the specified names.\n *\n * @description This API is experimental and subject to change.\n *\n * @param {string|Array<string>} names - A {string} name or an {Array} of {string} names\n * @memberof SyntaxHighlighterBase\n */\nSyntaxHighlighterBase.prototype.registerFor = function (names) {\n SyntaxHighlighter.$register(this, names)\n}\n\n// Table API\n\n/**\n * Methods for managing AsciiDoc tables.\n * @namespace\n * @extends AbstractBlock\n */\nvar Table = Opal.Asciidoctor.Table\n\n/**\n * Create a new Table element.\n * @param {AbstractBlock} parent\n * @param {Object|undefined} attributes\n * @returns {Table} - a new {Table} object\n */\nTable.create = function (parent, attributes) {\n return this.$new(parent, toHash(attributes))\n}\n\n/**\n * Get the caption of the table.\n * @returns {string}\n * @memberof Table\n */\nTable.prototype.getCaption = function () {\n return this.caption\n}\n\n/**\n * Get the rows of this table.\n * @returns {Table.Rows} - an {Table.Rows} object with the members \"head\", \"body\" and \"foot\"\n * @memberof Table\n */\nTable.prototype.getRows = function () {\n return this.rows\n}\n\n/**\n * Get the columns of this table.\n * @returns {Array<Column>}\n * @memberof Table\n */\nTable.prototype.getColumns = function () {\n return this.columns\n}\n\n/**\n * Get the head rows of this table.\n * @returns {Array<Array<Cell>>} - an Array of Array of Cell\n * @memberof Table\n */\nTable.prototype.getHeadRows = function () {\n return this.rows.head\n}\n\n/**\n * Check if the table has a head rows.\n * @returns {boolean}\n * @memberof Table\n */\nTable.prototype.hasHeadRows = function () {\n return this.rows !== Opal.nil && this.rows.head.length > 0\n}\n\n/**\n * Get the body rows of this table.\n * @returns {Array<Array<Cell>>} - an Array of Array of Cell\n * @memberof Table\n */\nTable.prototype.getBodyRows = function () {\n return this.rows.body\n}\n\n/**\n * Check if the table has a body rows.\n * @returns {boolean}\n */\nTable.prototype.hasBodyRows = function () {\n return this.rows !== Opal.nil && this.rows.body.length > 0\n}\n\n/**\n * Get the foot rows of this table.\n * @returns {Array<Array<Cell>>} - an Array of Array of Cell\n * @memberof Table\n */\nTable.prototype.getFootRows = function () {\n return this.rows.foot\n}\n\n/**\n * Check if the table has a foot rows.\n * @returns {boolean}\n */\nTable.prototype.hasFootRows = function () {\n return this.rows !== Opal.nil && this.rows.foot.length > 0\n}\n\n/**\n * Check if the table has a header option set.\n * @returns {boolean}\n * @memberof Table\n */\nTable.prototype.hasHeaderOption = function () {\n return this.has_header_option\n}\n\n/**\n * Check if the table has the footer option set.\n * @returns {boolean}\n * @memberof Table\n */\nTable.prototype.hasFooterOption = function () {\n var footerOption = this.getAttributes()['footer-option']\n return footerOption === ''\n}\n\n/**\n * Check if the table has the autowidth option set.\n * @returns {boolean}\n * @memberof Table\n */\nTable.prototype.hasAutowidthOption = function () {\n var autowidthOption = this.getAttributes()['autowidth-option']\n return autowidthOption === ''\n}\n\n/**\n * Get the number of rows in the table.\n * Please note that the header and footer rows are also counted.\n * @returns {number|undefined}\n * @memberof Table\n */\nTable.prototype.getRowCount = function () {\n return this.getAttribute('rowcount')\n}\n\n/**\n * Set the number of rows in the table.\n * Please note that the header and footer rows are also counted.\n * @param {number} value - the value\n * @memberof Table\n */\nTable.prototype.setRowCount = function (value) {\n this.setAttribute('rowcount', value)\n}\n\n/**\n * Get the number of columns in the table.\n * @returns {number|undefined}\n * @memberof Table\n */\nTable.prototype.getColumnCount = function () {\n return this.getAttribute('colcount')\n}\n\n/**\n * Set the number of columns in the table.\n * @param {number} value - the value\n * @memberof Table\n */\nTable.prototype.setColumnCount = function (value) {\n this.setAttribute('colcount', value)\n}\n\n// Rows\n\n/**\n * @namespace\n */\nvar Rows = Opal.Asciidoctor.Table.Rows\n\n/**\n * Create a new Rows element.\n * @param {array<array<Cell>>} head\n * @param {array<array<Cell>>} foot\n * @param {array<array<Cell>>} body\n * @returns Rows\n */\nRows.create = function (head, foot, body) {\n return this.$new(head, foot, body)\n}\n\n/**\n * Get head rows.\n * @returns {array<array<Cell>>}\n */\nRows.prototype.getHead = function () {\n return this.head\n}\n\n/**\n * Get foot rows.\n * @returns {array<array<Cell>>}\n */\nRows.prototype.getFoot = function () {\n return this.foot\n}\n\n/**\n * Get body rows.\n * @returns {array<array<Cell>>}\n */\nRows.prototype.getBody = function () {\n return this.body\n}\n\n/**\n * Retrieve the rows grouped by section as a nested Array.\n *\n * Creates a 2-dimensional array of two element entries.\n * The first element is the section name as a string.\n * The second element is the Array of rows in that section.\n * The entries are in document order (head, foot, body).\n * @returns {[[string, array<array<Cell>>], [string, array<array<Cell>>], [string, array<array<Cell>>]]}\n */\nRows.prototype.bySection = function () {\n return [['head', this.head], ['body', this.body], ['foot', this.foot]]\n}\n\n// Table Column\n\n/**\n * Methods to manage the columns of an AsciiDoc table.\n * In particular, it keeps track of the column specs.\n * @namespace\n * @extends AbstractNode\n */\nvar Column = Opal.Asciidoctor.Table.Column\n\n/**\n * Create a new Column element.\n * @param {Table} table\n * @param {number} index\n * @param {Object|undefined} attributes\n * @returns Column\n */\nColumn.create = function (table, index, attributes) {\n return this.$new(table, index, toHash(attributes))\n}\n\n/**\n * Get the column number of this cell.\n * @returns {number|undefined}\n * @memberof Column\n */\nColumn.prototype.getColumnNumber = function () {\n return this.getAttribute('colnumber')\n}\n\n/**\n * Get the width of this cell.\n * @returns {string|undefined}\n * @memberof Column\n */\nColumn.prototype.getWidth = function () {\n return this.getAttribute('width')\n}\n\n/**\n * Get the horizontal align of this cell.\n * @returns {string|undefined}\n * @memberof Column\n */\nColumn.prototype.getHorizontalAlign = function () {\n return this.getAttribute('halign')\n}\n\n/**\n * Get the vertical align of this cell.\n * @returns {string|undefined}\n * @memberof Column\n */\nColumn.prototype.getVerticalAlign = function () {\n return this.getAttribute('valign')\n}\n\n/**\n * Get the style of this cell.\n * @returns {string}\n * @memberof Column\n */\nColumn.prototype.getStyle = function () {\n var style = this.style\n return style === Opal.nil ? undefined : style\n}\n\n// Table Cell\n\n/**\n * Methods for managing the cells in an AsciiDoc table.\n * @namespace\n * @extends AbstractBlock\n */\nvar Cell = Opal.Asciidoctor.Table.Cell\n\n/**\n * Create a new Cell element\n * @param {Column} column\n * @param {string} cellText\n * @param {Object|undefined} attributes\n * @param {Object|undefined} opts\n * @returns {Cell}\n */\nCell.create = function (column, cellText, attributes, opts) {\n return this.$new(column, cellText, toHash(attributes), toHash(opts))\n}\n\n/**\n * Get the column span of this {@link Cell} node.\n * @returns {number} - An Integer of the number of columns this cell will span (default: undefined)\n * @memberof Cell\n */\nCell.prototype.getColumnSpan = function () {\n var colspan = this.colspan\n return colspan === Opal.nil ? undefined : colspan\n}\n\n/**\n * Set the column span of this {@link Cell} node.\n * @param {number} value\n * @returns {number} - The new colspan value\n * @memberof Cell\n */\nCell.prototype.setColumnSpan = function (value) {\n return this['$colspan='](value)\n}\n\n/**\n * Get the row span of this {@link Cell} node\n * @returns {number|undefined} - An Integer of the number of rows this cell will span (default: undefined)\n * @memberof Cell\n */\nCell.prototype.getRowSpan = function () {\n var rowspan = this.rowspan\n return rowspan === Opal.nil ? undefined : rowspan\n}\n\n/**\n * Set the row span of this {@link Cell} node\n * @param {number} value\n * @returns {number} - The new rowspan value\n * @memberof Cell\n */\nCell.prototype.setRowSpan = function (value) {\n return this['$rowspan='](value)\n}\n\n/**\n * Get the content of the cell.\n * This method should not be used for cells in the head row or that have the literal style.\n * @returns {string}\n * @memberof Cell\n */\nCell.prototype.getContent = function () {\n return this.$content()\n}\n\n/**\n * Get the text of the cell.\n * @returns {string}\n * @memberof Cell\n */\nCell.prototype.getText = function () {\n return this.$text()\n}\n\n/**\n * Get the source of the cell.\n * @returns {string}\n * @memberof Cell\n */\nCell.prototype.getSource = function () {\n return this.$source()\n}\n\n/**\n * Get the lines of the cell.\n * @returns {Array<string>}\n * @memberof Cell\n */\nCell.prototype.getLines = function () {\n return this.$lines()\n}\n\n/**\n * Get the line number of the cell.\n * @returns {number|undefined}\n * @memberof Cell\n */\nCell.prototype.getLineNumber = function () {\n var lineno = this.$lineno()\n return lineno === Opal.nil ? undefined : lineno\n}\n\n/**\n * Get the source file of the cell.\n * @returns {string|undefined}\n * @memberof Cell\n */\nCell.prototype.getFile = function () {\n var file = this.$file()\n return file === Opal.nil ? undefined : file\n}\n\n/**\n * Get the style of the cell.\n * @returns {string|undefined}\n * @memberof Cell\n */\nCell.prototype.getStyle = function () {\n var style = this.$style()\n return style === Opal.nil ? undefined : style\n}\n\n/**\n * Get the column of this cell.\n * @returns {Column|undefined}\n * @memberof Cell\n */\nCell.prototype.getColumn = function () {\n var column = this.$column()\n return column === Opal.nil ? undefined : column\n}\n\n/**\n * Get the width of this cell.\n * @returns {string|undefined}\n * @memberof Cell\n */\nCell.prototype.getWidth = function () {\n return this.getAttribute('width')\n}\n\n/**\n * Get the column width in percentage of this cell.\n * @returns {string|undefined}\n * @memberof Cell\n */\nCell.prototype.getColumnPercentageWidth = function () {\n return this.getAttribute('colpcwidth')\n}\n\n/**\n * Get the nested {Document} of this cell when style is 'asciidoc'.\n * @returns {Document|undefined} - the nested {Document}\n * @memberof Cell\n */\nCell.prototype.getInnerDocument = function () {\n var innerDocument = this.inner_document\n return innerDocument === Opal.nil ? undefined : innerDocument\n}\n\n// Templates\n\n/**\n * @description\n * This API is experimental and subject to change.\n *\n * Please note that this API is currently only available in a Node environment.\n * We recommend to use a custom converter if you are running in the browser.\n *\n * @namespace\n * @module Converter/TemplateConverter\n */\nvar TemplateConverter = Opal.Asciidoctor.Converter.TemplateConverter\n\nif (TemplateConverter) {\n // Alias\n Opal.Asciidoctor.TemplateConverter = TemplateConverter\n\n /**\n * Create a new TemplateConverter.\n * @param {string} backend - the backend name\n * @param templateDirectories - a list of template directories\n * @param {Object} opts - a JSON of options\n * @param {string} opts.template_engine - the name of the template engine\n * @param {Object} [opts.template_cache] - an optional template cache\n * @param {Object} [opts.template_cache.scans] - a JSON of template objects keyed by template name keyed by path patterns\n * @param {Object} [opts.template_cache.templates] - a JSON of template objects keyed by file paths\n * @returns {TemplateConverter}\n * @memberof Converter/TemplateConverter\n */\n TemplateConverter.create = function (backend, templateDirectories, opts) {\n if (opts && opts.template_cache) {\n opts.template_cache = toHash(opts.template_cache)\n }\n this.$new(backend, templateDirectories, toHash(opts))\n }\n\n /**\n * @returns {Object} - The global cache\n * @memberof Converter/TemplateConverter\n */\n TemplateConverter.getCache = function () {\n var caches = fromHash(this.caches)\n if (caches) {\n if (caches.scans) {\n caches.scans = fromHash(caches.scans)\n for (var key in caches.scans) {\n caches.scans[key] = fromHash(caches.scans[key])\n }\n }\n if (caches.templates) {\n caches.templates = fromHash(caches.templates)\n }\n }\n return caches\n }\n\n /**\n * Clear the global cache.\n * @memberof Converter/TemplateConverter\n */\n TemplateConverter.clearCache = function () {\n this.$clear_caches()\n }\n\n /**\n * Convert an {AbstractNode} to the backend format using the named template.\n *\n * Looks for a template that matches the value of the template name or,\n * if the template name is not specified, the value of the {@see AbstractNode.getNodeName} function.\n *\n * @param {AbstractNode} node - the AbstractNode to convert\n * @param {string} templateName - the {string} name of the template to use, or the node name of the node if a template name is not specified. (optional, default: undefined)\n * @param {Object} opts - an optional JSON that is passed as local variables to the template. (optional, default: undefined)\n * @returns {string} - The {string} result from rendering the template\n * @memberof Converter/TemplateConverter\n */\n TemplateConverter.prototype.convert = function (node, templateName, opts) {\n return this.$convert(node, templateName, toHash(opts))\n }\n\n /**\n * Checks whether there is a template registered with the specified name.\n *\n * @param {string} name - the {string} template name\n * @returns {boolean} - a {boolean} that indicates whether a template is registered for the specified template name.\n * @memberof Converter/TemplateConverter\n */\n TemplateConverter.prototype.handles = function (name) {\n return this['$handles?'](name)\n }\n\n /**\n * Retrieves the templates that this converter manages.\n *\n * @returns {Object} - a JSON of template objects keyed by template name\n * @memberof Converter/TemplateConverter\n */\n TemplateConverter.prototype.getTemplates = function () {\n return fromHash(this.$templates())\n }\n\n /**\n * Registers a template with this converter.\n *\n * @param {string} name - the {string} template name\n * @param {Object} template - the template object to register\n * @returns {Object} - the template object\n * @memberof Converter/TemplateConverter\n */\n TemplateConverter.prototype.register = function (name, template) {\n return this.$register(name, template)\n }\n\n /**\n * @namespace\n * @description\n * This API is experimental and subject to change.\n *\n * Please note that this API is currently only available in a Node environment.\n * We recommend to use a custom converter if you are running in the browser.\n *\n * A pluggable adapter for integrating a template engine into the built-in template converter.\n */\n var TemplateEngine = {}\n TemplateEngine.registry = {}\n\n // Alias\n Opal.Asciidoctor.TemplateEngine = TemplateEngine\n\n /**\n * Register a template engine adapter for the given names.\n * @param {string|Array} names - a {string} name or an {Array} of {string} names\n * @param {Object} templateEngineAdapter - a template engine adapter instance\n * @example\n * const fs = require('fs')\n * class DotTemplateEngineAdapter {\n * constructor () {\n * this.doT = require('dot')\n * }\n * compile (file, _) {\n * const templateFn = this.doT.template(fs.readFileSync(file, 'utf8'))\n * return {\n * render: templateFn\n * }\n * }\n * }\n * asciidoctor.TemplateEngine.register('dot, new DotTemplateEngineAdapter())\n * @memberof TemplateEngine\n */\n TemplateEngine.register = function (names, templateEngineAdapter) {\n if (typeof names === 'string') {\n this.registry[names] = templateEngineAdapter\n } else {\n // array\n for (var i = 0; i < names.length; i++) {\n var name = names[i]\n this.registry[name] = templateEngineAdapter\n }\n }\n }\n}\n\n/* global Opal, fromHash, toHash, initializeClass */\n// Extensions API\n\n/**\n * @private\n */\nvar toBlock = function (block) {\n // arity is a mandatory field\n block.$$arity = block.length\n return block\n}\n\nvar registerExtension = function (registry, type, processor, name) {\n if (typeof processor === 'object' || processor.$$is_class) {\n // processor is an instance or a class\n return registry['$' + type](processor, name)\n } else {\n // processor is a function/lambda\n return Opal.send(registry, type, name && [name], toBlock(processor))\n }\n}\n\n/**\n * @namespace\n * @description\n * Extensions provide a way to participate in the parsing and converting\n * phases of the AsciiDoc processor or extend the AsciiDoc syntax.\n *\n * The various extensions participate in AsciiDoc processing as follows:\n *\n * 1. After the source lines are normalized, {{@link Extensions/Preprocessor}}s modify or replace\n * the source lines before parsing begins. {{@link Extensions/IncludeProcessor}}s are used to\n * process include directives for targets which they claim to handle.\n * 2. The Parser parses the block-level content into an abstract syntax tree.\n * Custom blocks and block macros are processed by associated {{@link Extensions/BlockProcessor}}s\n * and {{@link Extensions/BlockMacroProcessor}}s, respectively.\n * 3. {{@link Extensions/TreeProcessor}}s are run on the abstract syntax tree.\n * 4. Conversion of the document begins, at which point inline markup is processed\n * and converted. Custom inline macros are processed by associated {InlineMacroProcessor}s.\n * 5. {{@link Extensions/Postprocessor}}s modify or replace the converted document.\n * 6. The output is written to the output stream.\n *\n * Extensions may be registered globally using the {Extensions.register} method\n * or added to a custom {Registry} instance and passed as an option to a single\n * Asciidoctor processor.\n *\n * @example\n * asciidoctor.Extensions.register(function () {\n * this.block(function () {\n * var self = this;\n * self.named('shout');\n * self.onContext('paragraph');\n * self.process(function (parent, reader) {\n * var lines = reader.getLines().map(function (l) { return l.toUpperCase(); });\n * return self.createBlock(parent, 'paragraph', lines);\n * });\n * });\n * });\n */\nvar Extensions = Opal.const_get_qualified(Opal.Asciidoctor, 'Extensions')\n\n// Alias\nOpal.Asciidoctor.Extensions = Extensions\n\n/**\n * Create a new {@link Extensions/Registry}.\n * @param {string} name\n * @param {function} block\n * @memberof Extensions\n * @returns {Extensions/Registry} - returns a {@link Extensions/Registry}\n */\nExtensions.create = function (name, block) {\n if (typeof name === 'function' && typeof block === 'undefined') {\n return Opal.send(this, 'create', null, toBlock(name))\n } else if (typeof block === 'function') {\n return Opal.send(this, 'create', [name], toBlock(block))\n } else {\n return this.$create()\n }\n}\n\n/**\n * @memberof Extensions\n */\nExtensions.register = function (name, block) {\n if (typeof name === 'function' && typeof block === 'undefined') {\n return Opal.send(this, 'register', null, toBlock(name))\n } else {\n return Opal.send(this, 'register', [name], toBlock(block))\n }\n}\n\n/**\n * Get statically-registered extension groups.\n * @memberof Extensions\n */\nExtensions.getGroups = function () {\n return fromHash(this.$groups())\n}\n\n/**\n * Unregister all statically-registered extension groups.\n * @memberof Extensions\n */\nExtensions.unregisterAll = function () {\n this.$unregister_all()\n}\n\n/**\n * Unregister the specified statically-registered extension groups.\n *\n * NOTE Opal cannot delete an entry from a Hash that is indexed by symbol, so\n * we have to resort to using low-level operations in this method.\n *\n * @memberof Extensions\n */\nExtensions.unregister = function () {\n var names = Array.prototype.concat.apply([], arguments)\n var groups = this.$groups()\n var groupNameIdx = {}\n for (var i = 0, groupSymbolNames = groups.$$keys; i < groupSymbolNames.length; i++) {\n var groupSymbolName = groupSymbolNames[i]\n groupNameIdx[groupSymbolName.toString()] = groupSymbolName\n }\n for (var j = 0; j < names.length; j++) {\n var groupStringName = names[j]\n if (groupStringName in groupNameIdx) Opal.hash_delete(groups, groupNameIdx[groupStringName])\n }\n}\n\n/**\n * @namespace\n * @module Extensions/Registry\n */\nvar Registry = Extensions.Registry\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.getGroups = Extensions.getGroups\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.unregisterAll = function () {\n this.groups = Opal.hash()\n}\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.unregister = Extensions.unregister\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.prefer = function (name, processor) {\n if (arguments.length === 1) {\n processor = name\n name = null\n }\n if (typeof processor === 'object' || processor.$$is_class) {\n // processor is an instance or a class\n return this.$prefer(name, processor)\n } else {\n // processor is a function/lambda\n return Opal.send(this, 'prefer', name && [name], toBlock(processor))\n }\n}\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.block = function (name, processor) {\n if (arguments.length === 1) {\n processor = name\n name = null\n }\n return registerExtension(this, 'block', processor, name)\n}\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.inlineMacro = function (name, processor) {\n if (arguments.length === 1) {\n processor = name\n name = null\n }\n return registerExtension(this, 'inline_macro', processor, name)\n}\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.includeProcessor = function (name, processor) {\n if (arguments.length === 1) {\n processor = name\n name = null\n }\n return registerExtension(this, 'include_processor', processor, name)\n}\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.blockMacro = function (name, processor) {\n if (arguments.length === 1) {\n processor = name\n name = null\n }\n return registerExtension(this, 'block_macro', processor, name)\n}\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.treeProcessor = function (name, processor) {\n if (arguments.length === 1) {\n processor = name\n name = null\n }\n return registerExtension(this, 'tree_processor', processor, name)\n}\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.postprocessor = function (name, processor) {\n if (arguments.length === 1) {\n processor = name\n name = null\n }\n return registerExtension(this, 'postprocessor', processor, name)\n}\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.preprocessor = function (name, processor) {\n if (arguments.length === 1) {\n processor = name\n name = null\n }\n return registerExtension(this, 'preprocessor', processor, name)\n}\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.docinfoProcessor = function (name, processor) {\n if (arguments.length === 1) {\n processor = name\n name = null\n }\n return registerExtension(this, 'docinfo_processor', processor, name)\n}\n\n/**\n * Checks whether any {{@link Extensions/Preprocessor}} extensions have been registered.\n *\n * @memberof Extensions/Registry\n * @returns a {boolean} indicating whether any {{@link Extensions/Preprocessor}} extensions are registered.\n */\nRegistry.prototype.hasPreprocessors = function () {\n return this['$preprocessors?']()\n}\n\n/**\n * Checks whether any {{@link Extensions/TreeProcessor}} extensions have been registered.\n *\n * @memberof Extensions/Registry\n * @returns a {boolean} indicating whether any {{@link Extensions/TreeProcessor}} extensions are registered.\n */\nRegistry.prototype.hasTreeProcessors = function () {\n return this['$tree_processors?']()\n}\n\n/**\n * Checks whether any {{@link Extensions/IncludeProcessor}} extensions have been registered.\n *\n * @memberof Extensions/Registry\n * @returns a {boolean} indicating whether any {{@link Extensions/IncludeProcessor}} extensions are registered.\n */\nRegistry.prototype.hasIncludeProcessors = function () {\n return this['$include_processors?']()\n}\n\n/**\n * Checks whether any {{@link Extensions/Postprocessor}} extensions have been registered.\n *\n * @memberof Extensions/Registry\n * @returns a {boolean} indicating whether any {{@link Extensions/Postprocessor}} extensions are registered.\n */\nRegistry.prototype.hasPostprocessors = function () {\n return this['$postprocessors?']()\n}\n\n/**\n * Checks whether any {{@link Extensions/DocinfoProcessor}} extensions have been registered.\n *\n * @memberof Extensions/Registry\n * @param location - A {string} for selecting docinfo extensions at a given location (head or footer) (default: undefined)\n * @returns a {boolean} indicating whether any {{@link Extensions/DocinfoProcessor}} extensions are registered.\n */\nRegistry.prototype.hasDocinfoProcessors = function (location) {\n return this['$docinfo_processors?'](location)\n}\n\n/**\n * Checks whether any {{@link Extensions/BlockProcessor}} extensions have been registered.\n *\n * @memberof Extensions/Registry\n * @returns a {boolean} indicating whether any {{@link Extensions/BlockProcessor}} extensions are registered.\n */\nRegistry.prototype.hasBlocks = function () {\n return this['$blocks?']()\n}\n\n/**\n * Checks whether any {{@link Extensions/BlockMacroProcessor}} extensions have been registered.\n *\n * @memberof Extensions/Registry\n * @returns a {boolean} indicating whether any {{@link Extensions/BlockMacroProcessor}} extensions are registered.\n */\nRegistry.prototype.hasBlockMacros = function () {\n return this['$block_macros?']()\n}\n\n/**\n * Checks whether any {{@link Extensions/InlineMacroProcessor}} extensions have been registered.\n *\n * @memberof Extensions/Registry\n * @returns a {boolean} indicating whether any {{@link Extensions/InlineMacroProcessor}} extensions are registered.\n */\nRegistry.prototype.hasInlineMacros = function () {\n return this['$inline_macros?']()\n}\n\n/**\n * Retrieves the Extension proxy objects for all the {{@link Extensions/Preprocessor}} instances stored in this registry.\n *\n * @memberof Extensions/Registry\n * @returns an {array} of Extension proxy objects.\n */\nRegistry.prototype.getPreprocessors = function () {\n return this.$preprocessors()\n}\n\n/**\n * Retrieves the Extension proxy objects for all the {{@link Extensions/TreeProcessor}} instances stored in this registry.\n *\n * @memberof Extensions/Registry\n * @returns an {array} of Extension proxy objects.\n */\nRegistry.prototype.getTreeProcessors = function () {\n return this.$tree_processors()\n}\n\n/**\n * Retrieves the Extension proxy objects for all the {{@link Extensions/IncludeProcessor}} instances stored in this registry.\n *\n * @memberof Extensions/Registry\n * @returns an {array} of Extension proxy objects.\n */\nRegistry.prototype.getIncludeProcessors = function () {\n return this.$include_processors()\n}\n\n/**\n * Retrieves the Extension proxy objects for all the {{@link Extensions/Postprocessor}} instances stored in this registry.\n *\n * @memberof Extensions/Registry\n * @returns an {array} of Extension proxy objects.\n */\nRegistry.prototype.getPostprocessors = function () {\n return this.$postprocessors()\n}\n\n/**\n * Retrieves the Extension proxy objects for all the {{@link Extensions/DocinfoProcessor}} instances stored in this registry.\n *\n * @memberof Extensions/Registry\n * @param location - A {string} for selecting docinfo extensions at a given location (head or footer) (default: undefined)\n * @returns an {array} of Extension proxy objects.\n */\nRegistry.prototype.getDocinfoProcessors = function (location) {\n return this.$docinfo_processors(location)\n}\n\n/**\n * Retrieves the Extension proxy objects for all the {{@link Extensions/BlockProcessor}} instances stored in this registry.\n *\n * @memberof Extensions/Registry\n * @returns an {array} of Extension proxy objects.\n */\nRegistry.prototype.getBlocks = function () {\n return this.block_extensions.$values()\n}\n\n/**\n * Retrieves the Extension proxy objects for all the {{@link Extensions/BlockMacroProcessor}} instances stored in this registry.\n *\n * @memberof Extensions/Registry\n * @returns an {array} of Extension proxy objects.\n */\nRegistry.prototype.getBlockMacros = function () {\n return this.block_macro_extensions.$values()\n}\n\n/**\n * Retrieves the Extension proxy objects for all the {{@link Extensions/InlineMacroProcessor}} instances stored in this registry.\n *\n * @memberof Extensions/Registry\n * @returns an {array} of Extension proxy objects.\n */\nRegistry.prototype.getInlineMacros = function () {\n return this.$inline_macros()\n}\n\n/**\n * Get any {{@link Extensions/InlineMacroProcessor}} extensions are registered to handle the specified inline macro name.\n *\n * @param name - the {string} inline macro name\n * @memberof Extensions/Registry\n * @returns the Extension proxy object for the {{@link Extensions/InlineMacroProcessor}} that matches the inline macro name or undefined if no match is found.\n */\nRegistry.prototype.getInlineMacroFor = function (name) {\n var result = this['$registered_for_inline_macro?'](name)\n return result === false ? undefined : result\n}\n\n/**\n * Get any {{@link Extensions/BlockProcessor}} extensions are registered to handle the specified block name appearing on the specified context.\n * @param name - the {string} block name\n * @param context - the context of the block: paragraph, open... (optional)\n * @memberof Extensions/Registry\n * @returns the Extension proxy object for the {{@link Extensions/BlockProcessor}} that matches the block name and context or undefined if no match is found.\n */\nRegistry.prototype.getBlockFor = function (name, context) {\n if (typeof context === 'undefined') {\n var ext = this.$find_block_extension(name)\n return ext === Opal.nil ? undefined : ext\n }\n var result = this['$registered_for_block?'](name, context)\n return result === false ? undefined : result\n}\n\n/**\n * Get any {{@link Extensions/BlockMacroProcessor}} extensions are registered to handle the specified macro name.\n *\n * @param name - the {string} macro name\n * @memberof Extensions/Registry\n * @returns the Extension proxy object for the {{@link Extensions/BlockMacroProcessor}} that matches the macro name or undefined if no match is found.\n */\nRegistry.prototype.getBlockMacroFor = function (name) {\n var result = this['$registered_for_block_macro?'](name)\n return result === false ? undefined : result\n}\n\n/**\n * @namespace\n * @module Extensions/Processor\n */\nvar Processor = Extensions.Processor\n\n/**\n * The extension will be added to the beginning of the list for that extension type. (default is append).\n * @memberof Extensions/Processor\n * @deprecated Please use the <code>prefer</pre> function on the {@link Extensions/Registry},\n * the {@link Extensions/IncludeProcessor},\n * the {@link Extensions/TreeProcessor},\n * the {@link Extensions/Postprocessor},\n * the {@link Extensions/Preprocessor}\n * or the {@link Extensions/DocinfoProcessor}\n */\nProcessor.prototype.prepend = function () {\n this.$option('position', '>>')\n}\n\n/**\n * @memberof Extensions/Processor\n */\nProcessor.prototype.process = function (block) {\n var handler = {\n apply: function (target, thisArg, argumentsList) {\n for (var i = 0; i < argumentsList.length; i++) {\n // convert all (Opal) Hash arguments to JSON.\n if (typeof argumentsList[i] === 'object' && '$$smap' in argumentsList[i]) {\n argumentsList[i] = fromHash(argumentsList[i])\n }\n }\n return target.apply(thisArg, argumentsList)\n }\n }\n var blockProxy = new Proxy(block, handler)\n return Opal.send(this, 'process', null, toBlock(blockProxy))\n}\n\n/**\n * @param {string} name\n * @memberof Extensions/Processor\n */\nProcessor.prototype.named = function (name) {\n return this.$named(name)\n}\n\n/**\n * Creates a block and links it to the specified parent.\n *\n * @param {Block|Section|Document} parent - The parent Block (Block, Section, or Document) of this new block.\n * @param {string} context\n * @param {string|Array<string>} source\n * @param {Object|undefined} attrs - A JSON of attributes\n * @param {Object|undefined} opts - A JSON of options\n * @return {Block}\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createBlock = function (parent, context, source, attrs, opts) {\n return this.$create_block(parent, context, source, toHash(attrs), toHash(opts))\n}\n\n/**\n * Creates a list block node and links it to the specified parent.\n *\n * @param parent - The parent Block (Block, Section, or Document) of this new list block.\n * @param {string} context - The list context (e.g., ulist, olist, colist, dlist)\n * @param {Object} attrs - An object of attributes to set on this list block\n * @returns {List}\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createList = function (parent, context, attrs) {\n return this.$create_list(parent, context, toHash(attrs))\n}\n\n/**\n * Creates a list item node and links it to the specified parent.\n *\n * @param {List} parent - The parent {List} of this new list item block.\n * @param {string} text - The text of the list item.\n * @returns {ListItem}\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createListItem = function (parent, text) {\n return this.$create_list_item(parent, text)\n}\n\n/**\n * Creates an image block node and links it to the specified parent.\n * @param {Block|Section|Document} parent - The parent Block of this new image block.\n * @param {Object} attrs - A JSON of attributes\n * @param {string} attrs.target - the target attribute to set the source of the image.\n * @param {string} attrs.alt - the alt attribute to specify an alternative text for the image.\n * @param {Object} opts - A JSON of options\n * @returns {Block}\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createImageBlock = function (parent, attrs, opts) {\n return this.$create_image_block(parent, toHash(attrs), toHash(opts))\n}\n\n/**\n * Creates a paragraph block and links it to the specified parent.\n *\n * @param {Block|Section|Document} parent - The parent Block (Block, Section, or Document) of this new block.\n * @param {string|Array<string>} source - The source\n * @param {Object|undefined} attrs - An object of attributes to set on this block\n * @param {Object|undefined} opts - An object of options to set on this block\n * @returns {Block} - a paragraph {Block}\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createParagraph = function (parent, source, attrs, opts) {\n return this.$create_paragraph(parent, source, toHash(attrs), toHash(opts))\n}\n\n/**\n * Creates an open block and links it to the specified parent.\n *\n * @param {Block|Section|Document} parent - The parent Block (Block, Section, or Document) of this new block.\n * @param {string|Array<string>} source - The source\n * @param {Object|undefined} attrs - An object of attributes to set on this block\n * @param {Object|undefined} opts - An object of options to set on this block\n * @returns {Block} - an open {Block}\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createOpenBlock = function (parent, source, attrs, opts) {\n return this.$create_open_block(parent, source, toHash(attrs), toHash(opts))\n}\n\n/**\n * Creates an example block and links it to the specified parent.\n *\n * @param {Block|Section|Document} parent - The parent Block (Block, Section, or Document) of this new block.\n * @param {string|Array<string>} source - The source\n * @param {Object|undefined} attrs - An object of attributes to set on this block\n * @param {Object|undefined} opts - An object of options to set on this block\n * @returns {Block} - an example {Block}\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createExampleBlock = function (parent, source, attrs, opts) {\n return this.$create_example_block(parent, source, toHash(attrs), toHash(opts))\n}\n\n/**\n * Creates a literal block and links it to the specified parent.\n *\n * @param {Block|Section|Document} parent - The parent Block (Block, Section, or Document) of this new block.\n * @param {string|Array<string>} source - The source\n * @param {Object|undefined} attrs - An object of attributes to set on this block\n * @param {Object|undefined} opts - An object of options to set on this block\n * @returns {Block} - a literal {Block}\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createPassBlock = function (parent, source, attrs, opts) {\n return this.$create_pass_block(parent, source, toHash(attrs), toHash(opts))\n}\n\n/**\n * Creates a listing block and links it to the specified parent.\n *\n * @param {Block|Section|Document} parent - The parent Block (Block, Section, or Document) of this new block.\n * @param {string|Array<string>} source - The source\n * @param {Object|undefined} attrs - An object of attributes to set on this block\n * @param {Object|undefined} opts - An object of options to set on this block\n * @returns {Block} - a listing {Block}\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createListingBlock = function (parent, source, attrs, opts) {\n return this.$create_listing_block(parent, source, toHash(attrs), toHash(opts))\n}\n\n/**\n * Creates a literal block and links it to the specified parent.\n *\n * @param {Block|Section|Document} parent - The parent Block (Block, Section, or Document) of this new block.\n * @param {string|Array<string>} source - The source\n * @param {Object|undefined} attrs - An object of attributes to set on this block\n * @param {Object|undefined} opts - An object of options to set on this block\n * @returns {Block} - a literal {Block}\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createLiteralBlock = function (parent, source, attrs, opts) {\n return this.$create_literal_block(parent, source, toHash(attrs), toHash(opts))\n}\n\n/**\n * Creates an inline anchor and links it to the specified parent.\n *\n * @param {Block|Section|Document} parent - The parent Block (Block, Section, or Document) of this new block.\n * @param {string} text - The text\n * @param {Object|undefined} opts - An object of options to set on this block\n * @returns {Inline} - an {Inline} anchor\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createAnchor = function (parent, text, opts) {\n if (opts && opts.attributes) {\n opts.attributes = toHash(opts.attributes)\n }\n return this.$create_anchor(parent, text, toHash(opts))\n}\n\n/**\n * Creates an inline pass and links it to the specified parent.\n *\n * @param {Block|Section|Document} parent - The parent Block (Block, Section, or Document) of this new block.\n * @param {string} text - The text\n * @param {Object|undefined} opts - An object of options to set on this block\n * @returns {Inline} - an {Inline} pass\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createInlinePass = function (parent, text, opts) {\n if (opts && opts.attributes) {\n opts.attributes = toHash(opts.attributes)\n }\n return this.$create_inline_pass(parent, text, toHash(opts))\n}\n\n/**\n * Creates an inline node and links it to the specified parent.\n *\n * @param {Block|Section|Document} parent - The parent Block of this new inline node.\n * @param {string} context - The context name\n * @param {string} text - The text\n * @param {Object|undefined} opts - A JSON of options\n * @returns {Inline} - an {Inline} node\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createInline = function (parent, context, text, opts) {\n if (opts && opts.attributes) {\n opts.attributes = toHash(opts.attributes)\n }\n return this.$create_inline(parent, context, text, toHash(opts))\n}\n\n/**\n * Parses blocks in the content and attaches the block to the parent.\n * @param {AbstractBlock} parent - the parent block\n * @param {string|Array<string>} content - the content\n * @param {Object|undefined} attrs - an object of attributes\n * @returns {AbstractNode} - The parent node into which the blocks are parsed.\n * @memberof Extensions/Processor\n */\nProcessor.prototype.parseContent = function (parent, content, attrs) {\n return this.$parse_content(parent, content, attrs)\n}\n\n/**\n * Parses the attrlist String into a JSON of attributes\n * @param {AbstractBlock} block - the current AbstractBlock or the parent AbstractBlock if there is no current block (used for applying subs)\n * @param {string} attrlist - the list of attributes as a String\n * @param {Object|undefined} opts - an optional JSON of options to control processing:\n * - positional_attributes: an Array of attribute names to map positional arguments to (optional, default: [])\n * - sub_attributes: enables attribute substitution on the attrlist argument (optional, default: false)\n *\n * @returns - a JSON of parsed attributes\n * @memberof Extensions/Processor\n */\nProcessor.prototype.parseAttributes = function (block, attrlist, opts) {\n if (opts && opts.attributes) {\n opts.attributes = toHash(opts.attributes)\n }\n return fromHash(this.$parse_attributes(block, attrlist, toHash(opts)))\n}\n\n/**\n * @param {string|Array<string>} value - Name of a positional attribute or an Array of positional attribute names\n * @memberof Extensions/Processor\n */\nProcessor.prototype.positionalAttributes = function (value) {\n return this.$positional_attrs(value)\n}\n\n/**\n * Specify how to resolve attributes.\n *\n * @param {string|Array<string>|Object|boolean} [value] - A specification to resolve attributes.\n * @memberof Extensions/Processor\n */\nProcessor.prototype.resolveAttributes = function (value) {\n if (typeof value === 'object' && !Array.isArray(value)) {\n return this.$resolves_attributes(toHash(value))\n }\n if (arguments.length > 1) {\n return this.$resolves_attributes(Array.prototype.slice.call(arguments))\n }\n if (typeof value === 'undefined') {\n // Convert to nil otherwise an exception is thrown at:\n // https://github.com/asciidoctor/asciidoctor/blob/0bcb4addc17b307f62975aad203fb556a1bcd8a5/lib/asciidoctor/extensions.rb#L583\n //\n // if args.size == 1 && !args[0]\n //\n // In the above Ruby code, args[0] is undefined and Opal will try to call the function \"!\" on an undefined object.\n return this.$resolves_attributes(Opal.nil)\n }\n return this.$resolves_attributes(value)\n}\n\n/**\n * @deprecated Please use the <code>resolveAttributes</pre> function on the {@link Extensions/Processor}.\n * @memberof Extensions/Processor\n * @see {Processor#resolveAttributes}\n */\nProcessor.prototype.resolvesAttributes = Processor.prototype.resolveAttributes\n\n/**\n * Get the configuration JSON for this processor instance.\n * @memberof Extensions/Processor\n */\nProcessor.prototype.getConfig = function () {\n return fromHash(this.config)\n}\n\n/**\n * @memberof Extensions/Processor\n */\nProcessor.prototype.option = function (key, value) {\n this.$option(key, value)\n}\n\n/**\n * @namespace\n * @module Extensions/BlockProcessor\n */\nvar BlockProcessor = Extensions.BlockProcessor\n\n/**\n * @param {Object} value - a JSON of default values for attributes\n * @memberof Extensions/BlockProcessor\n */\nBlockProcessor.prototype.defaultAttributes = function (value) {\n this.$default_attributes(toHash(value))\n}\n\n/**\n * @param {string} context - A context name\n * @memberof Extensions/BlockProcessor\n */\nBlockProcessor.prototype.onContext = function (context) {\n return this.$on_context(context)\n}\n\n/**\n * @param {...string} contexts - A list of context names\n * @memberof Extensions/BlockProcessor\n */\nBlockProcessor.prototype.onContexts = function (contexts) {\n return this.$on_contexts(Array.prototype.slice.call(arguments))\n}\n\n/**\n * @returns {string}\n * @memberof Extensions/BlockProcessor\n */\nBlockProcessor.prototype.getName = function () {\n var name = this.name\n return name === Opal.nil ? undefined : name\n}\n\n/**\n * @param {string} value\n * @memberof Extensions/BlockProcessor\n */\nBlockProcessor.prototype.parseContentAs = function (value) {\n this.$parse_content_as(value)\n}\n\n/**\n * @namespace\n * @module Extensions/BlockMacroProcessor\n */\nvar BlockMacroProcessor = Extensions.BlockMacroProcessor\n\n/**\n * @param {Object} value - a JSON of default values for attributes\n * @memberof Extensions/BlockMacroProcessor\n */\nBlockMacroProcessor.prototype.defaultAttributes = function (value) {\n this.$default_attributes(toHash(value))\n}\n\n/**\n * @returns {string} - the block macro name\n * @memberof Extensions/BlockMacroProcessor\n */\nBlockMacroProcessor.prototype.getName = function () {\n var name = this.name\n return name === Opal.nil ? undefined : name\n}\n\n/**\n * @param {string} value\n * @memberof Extensions/BlockMacroProcessor\n */\nBlockMacroProcessor.prototype.parseContentAs = function (value) {\n this.$parse_content_as(value)\n}\n\n/**\n * @namespace\n * @module Extensions/InlineMacroProcessor\n */\nvar InlineMacroProcessor = Extensions.InlineMacroProcessor\n\n/**\n * @param {Object} value - a JSON of default values for attributes\n * @memberof Extensions/InlineMacroProcessor\n */\nInlineMacroProcessor.prototype.defaultAttributes = function (value) {\n this.$default_attributes(toHash(value))\n}\n\n/**\n * @returns {string} - the inline macro name\n * @memberof Extensions/InlineMacroProcessor\n */\nInlineMacroProcessor.prototype.getName = function () {\n var name = this.name\n return name === Opal.nil ? undefined : name\n}\n\n/**\n * @param {string} value\n * @memberof Extensions/InlineMacroProcessor\n */\nInlineMacroProcessor.prototype.parseContentAs = function (value) {\n this.$parse_content_as(value)\n}\n\n/**\n * @param {string} value\n * @memberof Extensions/InlineMacroProcessor\n */\nInlineMacroProcessor.prototype.matchFormat = function (value) {\n this.$match_format(value)\n}\n\n/**\n * @param {RegExp} value\n * @memberof Extensions/InlineMacroProcessor\n */\nInlineMacroProcessor.prototype.match = function (value) {\n this.$match(value)\n}\n\n/**\n * @namespace\n * @module Extensions/IncludeProcessor\n */\nvar IncludeProcessor = Extensions.IncludeProcessor\n\n/**\n * @memberof Extensions/IncludeProcessor\n */\nIncludeProcessor.prototype.handles = function (block) {\n return Opal.send(this, 'handles?', null, toBlock(block))\n}\n\n/**\n * @memberof Extensions/IncludeProcessor\n */\nIncludeProcessor.prototype.prefer = function () {\n this.$prefer()\n}\n\n/**\n * @namespace\n * @module Extensions/TreeProcessor\n */\nvar TreeProcessor = Extensions.TreeProcessor\n\n/**\n * @memberof Extensions/TreeProcessor\n */\nTreeProcessor.prototype.prefer = function () {\n this.$prefer()\n}\n\n/**\n * @namespace\n * @module Extensions/Postprocessor\n */\nvar Postprocessor = Extensions.Postprocessor\n\n/**\n * @memberof Extensions/Postprocessor\n */\nPostprocessor.prototype.prefer = function () {\n this.$prefer()\n}\n\n/**\n * @namespace\n * @module Extensions/Preprocessor\n */\nvar Preprocessor = Extensions.Preprocessor\n\n/**\n * @memberof Extensions/Preprocessor\n */\nPreprocessor.prototype.prefer = function () {\n this.$prefer()\n}\n\n/**\n * @namespace\n * @module Extensions/DocinfoProcessor\n */\nvar DocinfoProcessor = Extensions.DocinfoProcessor\n\n/**\n * @memberof Extensions/DocinfoProcessor\n */\nDocinfoProcessor.prototype.prefer = function () {\n this.$prefer()\n}\n\n/**\n * @param {string} value - The docinfo location (\"head\", \"header\" or \"footer\")\n * @memberof Extensions/DocinfoProcessor\n */\nDocinfoProcessor.prototype.atLocation = function (value) {\n this.$at_location(value)\n}\n\nfunction initializeProcessorClass (superclassName, className, functions) {\n var superClass = Opal.const_get_qualified(Extensions, superclassName)\n return initializeClass(superClass, className, functions, {\n 'handles?': function () {\n return true\n }\n })\n}\n\n// Postprocessor\n\n/**\n * Create a postprocessor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.createPostprocessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return initializeProcessorClass('Postprocessor', name, functions)\n}\n\n/**\n * Create and instantiate a postprocessor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.newPostprocessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return this.createPostprocessor(name, functions).$new()\n}\n\n// Preprocessor\n\n/**\n * Create a preprocessor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.createPreprocessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return initializeProcessorClass('Preprocessor', name, functions)\n}\n\n/**\n * Create and instantiate a preprocessor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.newPreprocessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return this.createPreprocessor(name, functions).$new()\n}\n\n// Tree Processor\n\n/**\n * Create a tree processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.createTreeProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return initializeProcessorClass('TreeProcessor', name, functions)\n}\n\n/**\n * Create and instantiate a tree processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.newTreeProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return this.createTreeProcessor(name, functions).$new()\n}\n\n// Include Processor\n\n/**\n * Create an include processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.createIncludeProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return initializeProcessorClass('IncludeProcessor', name, functions)\n}\n\n/**\n * Create and instantiate an include processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.newIncludeProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return this.createIncludeProcessor(name, functions).$new()\n}\n\n// Docinfo Processor\n\n/**\n * Create a Docinfo processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.createDocinfoProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return initializeProcessorClass('DocinfoProcessor', name, functions)\n}\n\n/**\n * Create and instantiate a Docinfo processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.newDocinfoProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return this.createDocinfoProcessor(name, functions).$new()\n}\n\n// Block Processor\n\n/**\n * Create a block processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.createBlockProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return initializeProcessorClass('BlockProcessor', name, functions)\n}\n\n/**\n * Create and instantiate a block processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.newBlockProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return this.createBlockProcessor(name, functions).$new()\n}\n\n// Inline Macro Processor\n\n/**\n * Create an inline macro processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.createInlineMacroProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return initializeProcessorClass('InlineMacroProcessor', name, functions)\n}\n\n/**\n * Create and instantiate an inline macro processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.newInlineMacroProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return this.createInlineMacroProcessor(name, functions).$new()\n}\n\n// Block Macro Processor\n\n/**\n * Create a block macro processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.createBlockMacroProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return initializeProcessorClass('BlockMacroProcessor', name, functions)\n}\n\n/**\n * Create and instantiate a block macro processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.newBlockMacroProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return this.createBlockMacroProcessor(name, functions).$new()\n}\n\n// Converter API\n\n/**\n * @namespace\n * @module Converter\n */\nvar Converter = Opal.const_get_qualified(Opal.Asciidoctor, 'Converter')\n\n// Alias\nOpal.Asciidoctor.Converter = Converter\n\n/**\n * Convert the specified node.\n *\n * @param {AbstractNode} node - the AbstractNode to convert\n * @param {string} transform - an optional String transform that hints at\n * which transformation should be applied to this node.\n * @param {Object} opts - a JSON of options that provide additional hints about how to convert the node (default: {})\n * @returns the {Object} result of the conversion, typically a {string}.\n * @memberof Converter\n */\nConverter.prototype.convert = function (node, transform, opts) {\n return this.$convert(node, transform, toHash(opts))\n}\n\n/**\n * Create an instance of the converter bound to the specified backend.\n *\n * @param {string} backend - look for a converter bound to this keyword.\n * @param {Object} opts - a JSON of options to pass to the converter (default: {})\n * @returns {Converter} - a converter instance for converting nodes in an Asciidoctor AST.\n * @memberof Converter\n */\nConverter.create = function (backend, opts) {\n return this.$create(backend, toHash(opts))\n}\n\n// Converter Factory API\n\n/**\n * @namespace\n * @module Converter/Factory\n */\nvar ConverterFactory = Opal.Asciidoctor.Converter.Factory\n\nvar ConverterBase = Opal.Asciidoctor.Converter.Base\n\n// Alias\nOpal.Asciidoctor.ConverterFactory = ConverterFactory\n\nvar ConverterBackendTraits = Opal.Asciidoctor.Converter.BackendTraits\n\n// Alias\nOpal.Asciidoctor.ConverterBackendTraits = ConverterBackendTraits\n\n/**\n * Register a custom converter in the global converter factory to handle conversion to the specified backends.\n * If the backend value is an asterisk, the converter is used to handle any backend that does not have an explicit converter.\n *\n * @param converter - The Converter instance to register\n * @param backends {Array} - A {string} {Array} of backend names that this converter should be registered to handle (optional, default: ['*'])\n * @return {*} - Returns nothing\n * @memberof Converter/Factory\n */\nConverterFactory.register = function (converter, backends) {\n var object\n var buildBackendTraitsFromObject = function (obj) {\n return Object.assign({},\n obj.basebackend ? { basebackend: obj.basebackend } : {},\n obj.outfilesuffix ? { outfilesuffix: obj.outfilesuffix } : {},\n obj.filetype ? { filetype: obj.filetype } : {},\n obj.htmlsyntax ? { htmlsyntax: obj.htmlsyntax } : {},\n obj.supports_templates ? { supports_templates: obj.supports_templates } : {}\n )\n }\n var assignBackendTraitsToInstance = function (obj, instance) {\n if (obj.backend_traits) {\n instance.backend_traits = toHash(obj.backend_traits)\n } else if (obj.backendTraits) {\n instance.backend_traits = toHash(obj.backendTraits)\n } else if (obj.basebackend || obj.outfilesuffix || obj.filetype || obj.htmlsyntax || obj.supports_templates) {\n instance.backend_traits = toHash(buildBackendTraitsFromObject(obj))\n }\n }\n var bridgeHandlesMethodToInstance = function (obj, instance) {\n bridgeMethodToInstance(obj, instance, '$handles?', 'handles', function () {\n return true\n })\n }\n var bridgeComposedMethodToInstance = function (obj, instance) {\n bridgeMethodToInstance(obj, instance, '$composed', 'composed')\n }\n var bridgeMethodToInstance = function (obj, instance, methodName, functionName, defaultImplementation) {\n if (typeof obj[methodName] === 'undefined') {\n if (typeof obj[functionName] === 'function') {\n instance[methodName] = obj[functionName]\n } else if (defaultImplementation) {\n instance[methodName] = defaultImplementation\n }\n }\n }\n var addRespondToMethod = function (instance) {\n if (typeof instance['$respond_to?'] !== 'function') {\n instance['$respond_to?'] = function (name) {\n return typeof this[name] === 'function'\n }\n }\n }\n if (typeof converter === 'function') {\n // Class\n object = initializeClass(ConverterBase, converter.constructor.name, {\n initialize: function (backend, opts) {\n var self = this\n var result = new converter(backend, opts) // eslint-disable-line\n Object.assign(this, result)\n assignBackendTraitsToInstance(result, self)\n var propertyNames = Object.getOwnPropertyNames(converter.prototype)\n for (var i = 0; i < propertyNames.length; i++) {\n var propertyName = propertyNames[i]\n if (propertyName !== 'constructor') {\n self[propertyName] = result[propertyName]\n }\n }\n if (typeof result.$convert === 'undefined' && typeof result.convert === 'function') {\n self.$convert = result.convert\n }\n bridgeHandlesMethodToInstance(result, self)\n bridgeComposedMethodToInstance(result, self)\n addRespondToMethod(self)\n self.super(backend, opts)\n }\n })\n object.$extend(ConverterBackendTraits)\n } else if (typeof converter === 'object') {\n // Instance\n if (typeof converter.$convert === 'undefined' && typeof converter.convert === 'function') {\n converter.$convert = converter.convert\n }\n assignBackendTraitsToInstance(converter, converter)\n if (converter.backend_traits) {\n // \"extends\" ConverterBackendTraits\n var converterBackendTraitsFunctionNames = [\n 'basebackend',\n 'filetype',\n 'htmlsyntax',\n 'outfilesuffix',\n 'supports_templates',\n 'supports_templates?',\n 'init_backend_traits',\n 'backend_traits'\n ]\n for (var functionName of converterBackendTraitsFunctionNames) {\n converter['$' + functionName] = ConverterBackendTraits.prototype['$' + functionName]\n }\n converter.$$meta = ConverterBackendTraits\n }\n bridgeHandlesMethodToInstance(converter, converter)\n bridgeComposedMethodToInstance(converter, converter)\n addRespondToMethod(converter)\n object = converter\n }\n var args = [object].concat(backends)\n return Converter.$register.apply(Converter, args)\n}\n\n/**\n * Retrieves the singleton instance of the converter factory.\n *\n * @param {boolean} initialize - instantiate the singleton if it has not yet\n * been instantiated. If this value is false and the singleton has not yet been\n * instantiated, this method returns a fresh instance.\n * @returns {Converter/Factory} an instance of the converter factory.\n * @memberof Converter/Factory\n */\nConverterFactory.getDefault = function (initialize) {\n return this.$default(initialize)\n}\n\n/**\n * Create an instance of the converter bound to the specified backend.\n *\n * @param {string} backend - look for a converter bound to this keyword.\n * @param {Object} opts - a JSON of options to pass to the converter (default: {})\n * @returns {Converter} - a converter instance for converting nodes in an Asciidoctor AST.\n * @memberof Converter/Factory\n */\nConverterFactory.prototype.create = function (backend, opts) {\n return this.$create(backend, toHash(opts))\n}\n\n/**\n * Get the converter registry.\n * @returns the registry of converter instances or classes keyed by backend name\n * @memberof Converter/Factory\n */\nConverterFactory.getRegistry = function () {\n return fromHash(Converter.$registry())\n}\n\n/**\n * Lookup the custom converter registered with this factory to handle the specified backend.\n *\n * @param {string} backend - The {string} backend name.\n * @returns the {Converter} class or instance registered to convert the specified backend or undefined if no match is found.\n * @memberof Converter/Factory\n */\nConverterFactory.for = function (backend) {\n const converter = Converter.$for(backend)\n return converter === Opal.nil ? undefined : converter\n}\n\n/*\n * Unregister any custom converter classes that are registered with this factory.\n * Intended for testing only!\n */\nConverterFactory.unregisterAll = function () {\n var internalRegistry = Converter.DefaultFactory.$$cvars['@@registry']\n Converter.DefaultFactory.$$cvars['@@registry'] = toHash({ html5: internalRegistry['$[]']('html5') })\n}\n\n// Built-in converter\n\n/**\n * @namespace\n * @module Converter/Html5Converter\n */\nvar Html5Converter = Opal.Asciidoctor.Converter.Html5Converter\n\n// Alias\nOpal.Asciidoctor.Html5Converter = Html5Converter\n\n/**\n * Create a new Html5Converter.\n * @returns {Html5Converter} - a Html5Converter\n * @memberof Converter/Html5Converter\n */\nHtml5Converter.create = function () {\n return this.$new()\n}\n\n/**\n * Converts an {AbstractNode} using the given transform.\n * This method must be implemented by a concrete converter class.\n *\n * @param {AbstractNode} node - The concrete instance of AbstractNode to convert.\n * @param {string} [transform] - An optional String transform that hints at which transformation should be applied to this node.\n * If a transform is not given, the transform is often derived from the value of the {AbstractNode#getNodeName} property. (optional, default: undefined)\n * @param {Object} [opts]- An optional JSON of options hints about how to convert the node. (optional, default: undefined)\n *\n * @returns {string} - the String result.\n * @memberof Converter/Html5Converter\n */\nHtml5Converter.prototype.convert = function (node, transform, opts) {\n return this.$convert(node, transform, opts)\n}\n\n\nvar ASCIIDOCTOR_JS_VERSION = '2.2.5';\n\n /**\n * Get Asciidoctor.js version number.\n *\n * @memberof Asciidoctor\n * @returns {string} - returns the version number of Asciidoctor.js.\n */\n Opal.Asciidoctor.prototype.getVersion = function () {\n return ASCIIDOCTOR_JS_VERSION\n }\n return Opal.Asciidoctor\n}))\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <http://feross.org>\n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar isArray = require('isarray')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n * incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n ? global.TYPED_ARRAY_SUPPORT\n : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n try {\n var arr = new Uint8Array(1)\n arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n return arr.foo() === 42 && // typed array instances can be augmented\n typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n } catch (e) {\n return false\n }\n}\n\nfunction kMaxLength () {\n return Buffer.TYPED_ARRAY_SUPPORT\n ? 0x7fffffff\n : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n if (kMaxLength() < length) {\n throw new RangeError('Invalid typed array length')\n }\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = new Uint8Array(length)\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n if (that === null) {\n that = new Buffer(length)\n }\n that.length = length\n }\n\n return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n return new Buffer(arg, encodingOrOffset, length)\n }\n\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new Error(\n 'If encoding is specified then the first argument must be a string'\n )\n }\n return allocUnsafe(this, arg)\n }\n return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n arr.__proto__ = Buffer.prototype\n return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('\"value\" argument must not be a number')\n }\n\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n return fromArrayBuffer(that, value, encodingOrOffset, length)\n }\n\n if (typeof value === 'string') {\n return fromString(that, value, encodingOrOffset)\n }\n\n return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n Buffer.prototype.__proto__ = Uint8Array.prototype\n Buffer.__proto__ = Uint8Array\n if (typeof Symbol !== 'undefined' && Symbol.species &&\n Buffer[Symbol.species] === Buffer) {\n // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n Object.defineProperty(Buffer, Symbol.species, {\n value: null,\n configurable: true\n })\n }\n}\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be a number')\n } else if (size < 0) {\n throw new RangeError('\"size\" argument must not be negative')\n }\n}\n\nfunction alloc (that, size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(that, size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpretted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(that, size).fill(fill, encoding)\n : createBuffer(that, size).fill(fill)\n }\n return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n assertSize(size)\n that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) {\n for (var i = 0; i < size; ++i) {\n that[i] = 0\n }\n }\n return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('\"encoding\" must be a valid string encoding')\n }\n\n var length = byteLength(string, encoding) | 0\n that = createBuffer(that, length)\n\n var actual = that.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n that = that.slice(0, actual)\n }\n\n return that\n}\n\nfunction fromArrayLike (that, array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0\n that = createBuffer(that, length)\n for (var i = 0; i < length; i += 1) {\n that[i] = array[i] & 255\n }\n return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\\'offset\\' is out of bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\\'length\\' is out of bounds')\n }\n\n if (byteOffset === undefined && length === undefined) {\n array = new Uint8Array(array)\n } else if (length === undefined) {\n array = new Uint8Array(array, byteOffset)\n } else {\n array = new Uint8Array(array, byteOffset, length)\n }\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = array\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n that = fromArrayLike(that, array)\n }\n return that\n}\n\nfunction fromObject (that, obj) {\n if (Buffer.isBuffer(obj)) {\n var len = checked(obj.length) | 0\n that = createBuffer(that, len)\n\n if (that.length === 0) {\n return that\n }\n\n obj.copy(that, 0, 0, len)\n return that\n }\n\n if (obj) {\n if ((typeof ArrayBuffer !== 'undefined' &&\n obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n if (typeof obj.length !== 'number' || isnan(obj.length)) {\n return createBuffer(that, 0)\n }\n return fromArrayLike(that, obj)\n }\n\n if (obj.type === 'Buffer' && isArray(obj.data)) {\n return fromArrayLike(that, obj.data)\n }\n }\n\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n // Note: cannot use `length < kMaxLength()` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= kMaxLength()) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + kMaxLength().toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError('Arguments must be Buffers')\n }\n\n if (a === b) return 0\n\n var x = a.length\n var y = b.length\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n var i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n var buffer = Buffer.allocUnsafe(length)\n var pos = 0\n for (i = 0; i < list.length; ++i) {\n var buf = list[i]\n if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n buf.copy(buffer, pos)\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n string = '' + string\n }\n\n var len = string.length\n if (len === 0) return 0\n\n // Use a for loop to avoid recursion\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n case undefined:\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) return utf8ToBytes(string).length // assume utf8\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n var loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n var i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n var len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n var len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n var len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n var length = this.length | 0\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n var str = ''\n var max = exports.INSPECT_MAX_BYTES\n if (this.length > 0) {\n str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n if (this.length > max) str += ' ... '\n }\n return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (!Buffer.isBuffer(target)) {\n throw new TypeError('Argument must be a Buffer')\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n var x = thisEnd - thisStart\n var y = end - start\n var len = Math.min(x, y)\n\n var thisCopy = this.slice(thisStart, thisEnd)\n var targetCopy = target.slice(start, end)\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (isNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (Buffer.TYPED_ARRAY_SUPPORT &&\n typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1\n var arrLength = arr.length\n var valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n var i\n if (dir) {\n var foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n var found = true\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n var remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n // must be an even number of digits\n var strLen = string.length\n if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16)\n if (isNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset | 0\n if (isFinite(length)) {\n length = length | 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n // legacy write(string, encoding, offset, length) - remove in v0.13\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n var remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n return asciiWrite(this, string, offset, length)\n\n case 'latin1':\n case 'binary':\n return latin1Write(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n var res = []\n\n var i = start\n while (i < end) {\n var firstByte = buf[i]\n var codePoint = null\n var bytesPerSequence = (firstByte > 0xEF) ? 4\n : (firstByte > 0xDF) ? 3\n : (firstByte > 0xBF) ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n var len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n var res = ''\n var i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n var len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n var out = ''\n for (var i = start; i < end; ++i) {\n out += toHex(buf[i])\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n var bytes = buf.slice(start, end)\n var res = ''\n for (var i = 0; i < bytes.length; i += 2) {\n res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n var newBuf\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n newBuf = this.subarray(start, end)\n newBuf.__proto__ = Buffer.prototype\n } else {\n var sliceLen = end - start\n newBuf = new Buffer(sliceLen, undefined)\n for (var i = 0; i < sliceLen; ++i) {\n newBuf[i] = this[i + start]\n }\n }\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n var val = this[offset + --byteLength]\n var mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var i = byteLength\n var mul = 1\n var val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var mul = 1\n var i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var i = byteLength - 1\n var mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n (littleEndian ? i : 1 - i) * 8\n }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffffffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = 0\n var mul = 1\n var sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = byteLength - 1\n var mul = 1\n var sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n var len = end - start\n var i\n\n if (this === target && start < targetStart && targetStart < end) {\n // descending copy from end\n for (i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start]\n }\n } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n // ascending copy from start\n for (i = 0; i < len; ++i) {\n target[i + targetStart] = this[i + start]\n }\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, start + len),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0)\n if (code < 256) {\n val = code\n }\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n } else if (typeof val === 'number') {\n val = val & 255\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n var i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n var bytes = Buffer.isBuffer(val)\n ? val\n : utf8ToBytes(new Buffer(val, encoding).toString())\n var len = bytes.length\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction stringtrim (str) {\n if (str.trim) return str.trim()\n return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n if (n < 16) return '0' + n.toString(16)\n return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n var codePoint\n var length = string.length\n var leadSurrogate = null\n var bytes = []\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n var c, hi, lo\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\nfunction isnan (val) {\n return val !== val // eslint-disable-line no-self-compare\n}\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n return toString.call(arr) == '[object Array]';\n};\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport Route from \"./Route\";\nimport Link from \"./Link\";\n\n/**\n * A <Link> wrapper that knows if it's \"active\" or not.\n */\nvar NavLink = function NavLink(_ref) {\n var to = _ref.to,\n exact = _ref.exact,\n strict = _ref.strict,\n location = _ref.location,\n activeClassName = _ref.activeClassName,\n className = _ref.className,\n activeStyle = _ref.activeStyle,\n style = _ref.style,\n getIsActive = _ref.isActive,\n ariaCurrent = _ref[\"aria-current\"],\n rest = _objectWithoutProperties(_ref, [\"to\", \"exact\", \"strict\", \"location\", \"activeClassName\", \"className\", \"activeStyle\", \"style\", \"isActive\", \"aria-current\"]);\n\n var path = (typeof to === \"undefined\" ? \"undefined\" : _typeof(to)) === \"object\" ? to.pathname : to;\n\n // Regex taken from: https://github.com/pillarjs/path-to-regexp/blob/master/index.js#L202\n var escapedPath = path && path.replace(/([.+*?=^!:${}()[\\]|/\\\\])/g, \"\\\\$1\");\n\n return React.createElement(Route, {\n path: escapedPath,\n exact: exact,\n strict: strict,\n location: location,\n children: function children(_ref2) {\n var location = _ref2.location,\n match = _ref2.match;\n\n var isActive = !!(getIsActive ? getIsActive(match, location) : match);\n\n return React.createElement(Link, _extends({\n to: to,\n className: isActive ? [className, activeClassName].filter(function (i) {\n return i;\n }).join(\" \") : className,\n style: isActive ? _extends({}, style, activeStyle) : style,\n \"aria-current\": isActive && ariaCurrent || null\n }, rest));\n }\n });\n};\n\nNavLink.propTypes = {\n to: Link.propTypes.to,\n exact: PropTypes.bool,\n strict: PropTypes.bool,\n location: PropTypes.object,\n activeClassName: PropTypes.string,\n className: PropTypes.string,\n activeStyle: PropTypes.object,\n style: PropTypes.object,\n isActive: PropTypes.func,\n \"aria-current\": PropTypes.oneOf([\"page\", \"step\", \"location\", \"date\", \"time\", \"true\"])\n};\n\nNavLink.defaultProps = {\n activeClassName: \"active\",\n \"aria-current\": \"page\"\n};\n\nexport default NavLink;","var rHyphen = /-(.)/g;\nexport default function camelize(string) {\n return string.replace(rHyphen, function (_, chr) {\n return chr.toUpperCase();\n });\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"className\", \"bsPrefix\", \"as\"];\nimport classNames from 'classnames';\nimport camelize from 'dom-helpers/camelize';\nimport React from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\n\nvar pascalCase = function pascalCase(str) {\n return str[0].toUpperCase() + camelize(str).slice(1);\n};\n\n// TODO: emstricten & fix the typing here! `createWithBsPrefix<TElementType>...`\nexport default function createWithBsPrefix(prefix, _temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n _ref$displayName = _ref.displayName,\n displayName = _ref$displayName === void 0 ? pascalCase(prefix) : _ref$displayName,\n Component = _ref.Component,\n defaultProps = _ref.defaultProps;\n\n var BsComponent = /*#__PURE__*/React.forwardRef(function (_ref2, ref) {\n var className = _ref2.className,\n bsPrefix = _ref2.bsPrefix,\n _ref2$as = _ref2.as,\n Tag = _ref2$as === void 0 ? Component || 'div' : _ref2$as,\n props = _objectWithoutPropertiesLoose(_ref2, _excluded);\n\n var resolvedPrefix = useBootstrapPrefix(bsPrefix, prefix);\n return /*#__PURE__*/React.createElement(Tag, _extends({\n ref: ref,\n className: classNames(className, resolvedPrefix)\n }, props));\n });\n BsComponent.defaultProps = defaultProps;\n BsComponent.displayName = displayName;\n return BsComponent;\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"bsPrefix\", \"className\", \"as\"];\nimport classNames from 'classnames';\nimport React from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nvar NavbarBrand = /*#__PURE__*/React.forwardRef(function (_ref, ref) {\n var bsPrefix = _ref.bsPrefix,\n className = _ref.className,\n as = _ref.as,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n bsPrefix = useBootstrapPrefix(bsPrefix, 'navbar-brand');\n var Component = as || (props.href ? 'a' : 'span');\n return /*#__PURE__*/React.createElement(Component, _extends({}, props, {\n ref: ref,\n className: classNames(className, bsPrefix)\n }));\n});\nNavbarBrand.displayName = 'NavbarBrand';\nexport default NavbarBrand;","import ownerWindow from './ownerWindow';\n/**\n * Returns one or all computed style properties of an element.\n * \n * @param node the element\n * @param psuedoElement the style property\n */\n\nexport default function getComputedStyle(node, psuedoElement) {\n return ownerWindow(node).getComputedStyle(node, psuedoElement);\n}","import ownerDocument from './ownerDocument';\n/**\n * Returns the owner window of a given element.\n * \n * @param node the element\n */\n\nexport default function ownerWindow(node) {\n var doc = ownerDocument(node);\n return doc && doc.defaultView || window;\n}","var rUpper = /([A-Z])/g;\nexport default function hyphenate(string) {\n return string.replace(rUpper, '-$1').toLowerCase();\n}","/**\n * Copyright 2013-2014, Facebook, Inc.\n * All rights reserved.\n * https://github.com/facebook/react/blob/2aeb8a2a6beb00617a4217f7f8284924fa2ad819/src/vendor/core/hyphenateStyleName.js\n */\nimport hyphenate from './hyphenate';\nvar msPattern = /^ms-/;\nexport default function hyphenateStyleName(string) {\n return hyphenate(string).replace(msPattern, '-ms-');\n}","var supportedTransforms = /^((translate|rotate|scale)(X|Y|Z|3d)?|matrix(3d)?|perspective|skew(X|Y)?)$/i;\nexport default function isTransform(value) {\n return !!(value && supportedTransforms.test(value));\n}","import getComputedStyle from './getComputedStyle';\nimport hyphenate from './hyphenateStyle';\nimport isTransform from './isTransform';\n\nfunction style(node, property) {\n var css = '';\n var transforms = '';\n\n if (typeof property === 'string') {\n return node.style.getPropertyValue(hyphenate(property)) || getComputedStyle(node).getPropertyValue(hyphenate(property));\n }\n\n Object.keys(property).forEach(function (key) {\n var value = property[key];\n\n if (!value && value !== 0) {\n node.style.removeProperty(hyphenate(key));\n } else if (isTransform(key)) {\n transforms += key + \"(\" + value + \") \";\n } else {\n css += hyphenate(key) + \": \" + value + \";\";\n }\n });\n\n if (transforms) {\n css += \"transform: \" + transforms + \";\";\n }\n\n node.style.cssText += \";\" + css;\n}\n\nexport default style;","export default {\n disabled: false\n};","import React from 'react';\nexport default React.createContext(null);","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport config from './config';\nimport { timeoutsShape } from './utils/PropTypes';\nimport TransitionGroupContext from './TransitionGroupContext';\nexport var UNMOUNTED = 'unmounted';\nexport var EXITED = 'exited';\nexport var ENTERING = 'entering';\nexport var ENTERED = 'entered';\nexport var EXITING = 'exiting';\n/**\n * The Transition component lets you describe a transition from one component\n * state to another _over time_ with a simple declarative API. Most commonly\n * it's used to animate the mounting and unmounting of a component, but can also\n * be used to describe in-place transition states as well.\n *\n * ---\n *\n * **Note**: `Transition` is a platform-agnostic base component. If you're using\n * transitions in CSS, you'll probably want to use\n * [`CSSTransition`](https://reactcommunity.org/react-transition-group/css-transition)\n * instead. It inherits all the features of `Transition`, but contains\n * additional features necessary to play nice with CSS transitions (hence the\n * name of the component).\n *\n * ---\n *\n * By default the `Transition` component does not alter the behavior of the\n * component it renders, it only tracks \"enter\" and \"exit\" states for the\n * components. It's up to you to give meaning and effect to those states. For\n * example we can add styles to a component when it enters or exits:\n *\n * ```jsx\n * import { Transition } from 'react-transition-group';\n *\n * const duration = 300;\n *\n * const defaultStyle = {\n * transition: `opacity ${duration}ms ease-in-out`,\n * opacity: 0,\n * }\n *\n * const transitionStyles = {\n * entering: { opacity: 1 },\n * entered: { opacity: 1 },\n * exiting: { opacity: 0 },\n * exited: { opacity: 0 },\n * };\n *\n * const Fade = ({ in: inProp }) => (\n * <Transition in={inProp} timeout={duration}>\n * {state => (\n * <div style={{\n * ...defaultStyle,\n * ...transitionStyles[state]\n * }}>\n * I'm a fade Transition!\n * </div>\n * )}\n * </Transition>\n * );\n * ```\n *\n * There are 4 main states a Transition can be in:\n * - `'entering'`\n * - `'entered'`\n * - `'exiting'`\n * - `'exited'`\n *\n * Transition state is toggled via the `in` prop. When `true` the component\n * begins the \"Enter\" stage. During this stage, the component will shift from\n * its current transition state, to `'entering'` for the duration of the\n * transition and then to the `'entered'` stage once it's complete. Let's take\n * the following example (we'll use the\n * [useState](https://reactjs.org/docs/hooks-reference.html#usestate) hook):\n *\n * ```jsx\n * function App() {\n * const [inProp, setInProp] = useState(false);\n * return (\n * <div>\n * <Transition in={inProp} timeout={500}>\n * {state => (\n * // ...\n * )}\n * </Transition>\n * <button onClick={() => setInProp(true)}>\n * Click to Enter\n * </button>\n * </div>\n * );\n * }\n * ```\n *\n * When the button is clicked the component will shift to the `'entering'` state\n * and stay there for 500ms (the value of `timeout`) before it finally switches\n * to `'entered'`.\n *\n * When `in` is `false` the same thing happens except the state moves from\n * `'exiting'` to `'exited'`.\n */\n\nvar Transition = /*#__PURE__*/function (_React$Component) {\n _inheritsLoose(Transition, _React$Component);\n\n function Transition(props, context) {\n var _this;\n\n _this = _React$Component.call(this, props, context) || this;\n var parentGroup = context; // In the context of a TransitionGroup all enters are really appears\n\n var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;\n var initialStatus;\n _this.appearStatus = null;\n\n if (props.in) {\n if (appear) {\n initialStatus = EXITED;\n _this.appearStatus = ENTERING;\n } else {\n initialStatus = ENTERED;\n }\n } else {\n if (props.unmountOnExit || props.mountOnEnter) {\n initialStatus = UNMOUNTED;\n } else {\n initialStatus = EXITED;\n }\n }\n\n _this.state = {\n status: initialStatus\n };\n _this.nextCallback = null;\n return _this;\n }\n\n Transition.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {\n var nextIn = _ref.in;\n\n if (nextIn && prevState.status === UNMOUNTED) {\n return {\n status: EXITED\n };\n }\n\n return null;\n } // getSnapshotBeforeUpdate(prevProps) {\n // let nextStatus = null\n // if (prevProps !== this.props) {\n // const { status } = this.state\n // if (this.props.in) {\n // if (status !== ENTERING && status !== ENTERED) {\n // nextStatus = ENTERING\n // }\n // } else {\n // if (status === ENTERING || status === ENTERED) {\n // nextStatus = EXITING\n // }\n // }\n // }\n // return { nextStatus }\n // }\n ;\n\n var _proto = Transition.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n this.updateStatus(true, this.appearStatus);\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var nextStatus = null;\n\n if (prevProps !== this.props) {\n var status = this.state.status;\n\n if (this.props.in) {\n if (status !== ENTERING && status !== ENTERED) {\n nextStatus = ENTERING;\n }\n } else {\n if (status === ENTERING || status === ENTERED) {\n nextStatus = EXITING;\n }\n }\n }\n\n this.updateStatus(false, nextStatus);\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.cancelNextCallback();\n };\n\n _proto.getTimeouts = function getTimeouts() {\n var timeout = this.props.timeout;\n var exit, enter, appear;\n exit = enter = appear = timeout;\n\n if (timeout != null && typeof timeout !== 'number') {\n exit = timeout.exit;\n enter = timeout.enter; // TODO: remove fallback for next major\n\n appear = timeout.appear !== undefined ? timeout.appear : enter;\n }\n\n return {\n exit: exit,\n enter: enter,\n appear: appear\n };\n };\n\n _proto.updateStatus = function updateStatus(mounting, nextStatus) {\n if (mounting === void 0) {\n mounting = false;\n }\n\n if (nextStatus !== null) {\n // nextStatus will always be ENTERING or EXITING.\n this.cancelNextCallback();\n\n if (nextStatus === ENTERING) {\n this.performEnter(mounting);\n } else {\n this.performExit();\n }\n } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n this.setState({\n status: UNMOUNTED\n });\n }\n };\n\n _proto.performEnter = function performEnter(mounting) {\n var _this2 = this;\n\n var enter = this.props.enter;\n var appearing = this.context ? this.context.isMounting : mounting;\n\n var _ref2 = this.props.nodeRef ? [appearing] : [ReactDOM.findDOMNode(this), appearing],\n maybeNode = _ref2[0],\n maybeAppearing = _ref2[1];\n\n var timeouts = this.getTimeouts();\n var enterTimeout = appearing ? timeouts.appear : timeouts.enter; // no enter animation skip right to ENTERED\n // if we are mounting and running this it means appear _must_ be set\n\n if (!mounting && !enter || config.disabled) {\n this.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(maybeNode);\n });\n return;\n }\n\n this.props.onEnter(maybeNode, maybeAppearing);\n this.safeSetState({\n status: ENTERING\n }, function () {\n _this2.props.onEntering(maybeNode, maybeAppearing);\n\n _this2.onTransitionEnd(enterTimeout, function () {\n _this2.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(maybeNode, maybeAppearing);\n });\n });\n });\n };\n\n _proto.performExit = function performExit() {\n var _this3 = this;\n\n var exit = this.props.exit;\n var timeouts = this.getTimeouts();\n var maybeNode = this.props.nodeRef ? undefined : ReactDOM.findDOMNode(this); // no exit animation skip right to EXITED\n\n if (!exit || config.disabled) {\n this.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(maybeNode);\n });\n return;\n }\n\n this.props.onExit(maybeNode);\n this.safeSetState({\n status: EXITING\n }, function () {\n _this3.props.onExiting(maybeNode);\n\n _this3.onTransitionEnd(timeouts.exit, function () {\n _this3.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(maybeNode);\n });\n });\n });\n };\n\n _proto.cancelNextCallback = function cancelNextCallback() {\n if (this.nextCallback !== null) {\n this.nextCallback.cancel();\n this.nextCallback = null;\n }\n };\n\n _proto.safeSetState = function safeSetState(nextState, callback) {\n // This shouldn't be necessary, but there are weird race conditions with\n // setState callbacks and unmounting in testing, so always make sure that\n // we can cancel any pending setState callbacks after we unmount.\n callback = this.setNextCallback(callback);\n this.setState(nextState, callback);\n };\n\n _proto.setNextCallback = function setNextCallback(callback) {\n var _this4 = this;\n\n var active = true;\n\n this.nextCallback = function (event) {\n if (active) {\n active = false;\n _this4.nextCallback = null;\n callback(event);\n }\n };\n\n this.nextCallback.cancel = function () {\n active = false;\n };\n\n return this.nextCallback;\n };\n\n _proto.onTransitionEnd = function onTransitionEnd(timeout, handler) {\n this.setNextCallback(handler);\n var node = this.props.nodeRef ? this.props.nodeRef.current : ReactDOM.findDOMNode(this);\n var doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener;\n\n if (!node || doesNotHaveTimeoutOrListener) {\n setTimeout(this.nextCallback, 0);\n return;\n }\n\n if (this.props.addEndListener) {\n var _ref3 = this.props.nodeRef ? [this.nextCallback] : [node, this.nextCallback],\n maybeNode = _ref3[0],\n maybeNextCallback = _ref3[1];\n\n this.props.addEndListener(maybeNode, maybeNextCallback);\n }\n\n if (timeout != null) {\n setTimeout(this.nextCallback, timeout);\n }\n };\n\n _proto.render = function render() {\n var status = this.state.status;\n\n if (status === UNMOUNTED) {\n return null;\n }\n\n var _this$props = this.props,\n children = _this$props.children,\n _in = _this$props.in,\n _mountOnEnter = _this$props.mountOnEnter,\n _unmountOnExit = _this$props.unmountOnExit,\n _appear = _this$props.appear,\n _enter = _this$props.enter,\n _exit = _this$props.exit,\n _timeout = _this$props.timeout,\n _addEndListener = _this$props.addEndListener,\n _onEnter = _this$props.onEnter,\n _onEntering = _this$props.onEntering,\n _onEntered = _this$props.onEntered,\n _onExit = _this$props.onExit,\n _onExiting = _this$props.onExiting,\n _onExited = _this$props.onExited,\n _nodeRef = _this$props.nodeRef,\n childProps = _objectWithoutPropertiesLoose(_this$props, [\"children\", \"in\", \"mountOnEnter\", \"unmountOnExit\", \"appear\", \"enter\", \"exit\", \"timeout\", \"addEndListener\", \"onEnter\", \"onEntering\", \"onEntered\", \"onExit\", \"onExiting\", \"onExited\", \"nodeRef\"]);\n\n return (\n /*#__PURE__*/\n // allows for nested Transitions\n React.createElement(TransitionGroupContext.Provider, {\n value: null\n }, typeof children === 'function' ? children(status, childProps) : React.cloneElement(React.Children.only(children), childProps))\n );\n };\n\n return Transition;\n}(React.Component);\n\nTransition.contextType = TransitionGroupContext;\nTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * A React reference to DOM element that need to transition:\n * https://stackoverflow.com/a/51127130/4671932\n *\n * - When `nodeRef` prop is used, `node` is not passed to callback functions\n * (e.g. `onEnter`) because user already has direct access to the node.\n * - When changing `key` prop of `Transition` in a `TransitionGroup` a new\n * `nodeRef` need to be provided to `Transition` with changed `key` prop\n * (see\n * [test/CSSTransition-test.js](https://github.com/reactjs/react-transition-group/blob/13435f897b3ab71f6e19d724f145596f5910581c/test/CSSTransition-test.js#L362-L437)).\n */\n nodeRef: PropTypes.shape({\n current: typeof Element === 'undefined' ? PropTypes.any : function (propValue, key, componentName, location, propFullName, secret) {\n var value = propValue[key];\n return PropTypes.instanceOf(value && 'ownerDocument' in value ? value.ownerDocument.defaultView.Element : Element)(propValue, key, componentName, location, propFullName, secret);\n }\n }),\n\n /**\n * A `function` child can be used instead of a React element. This function is\n * called with the current transition status (`'entering'`, `'entered'`,\n * `'exiting'`, `'exited'`), which can be used to apply context\n * specific props to a component.\n *\n * ```jsx\n * <Transition in={this.state.in} timeout={150}>\n * {state => (\n * <MyComponent className={`fade fade-${state}`} />\n * )}\n * </Transition>\n * ```\n */\n children: PropTypes.oneOfType([PropTypes.func.isRequired, PropTypes.element.isRequired]).isRequired,\n\n /**\n * Show the component; triggers the enter or exit states\n */\n in: PropTypes.bool,\n\n /**\n * By default the child component is mounted immediately along with\n * the parent `Transition` component. If you want to \"lazy mount\" the component on the\n * first `in={true}` you can set `mountOnEnter`. After the first enter transition the component will stay\n * mounted, even on \"exited\", unless you also specify `unmountOnExit`.\n */\n mountOnEnter: PropTypes.bool,\n\n /**\n * By default the child component stays mounted after it reaches the `'exited'` state.\n * Set `unmountOnExit` if you'd prefer to unmount the component after it finishes exiting.\n */\n unmountOnExit: PropTypes.bool,\n\n /**\n * By default the child component does not perform the enter transition when\n * it first mounts, regardless of the value of `in`. If you want this\n * behavior, set both `appear` and `in` to `true`.\n *\n * > **Note**: there are no special appear states like `appearing`/`appeared`, this prop\n * > only adds an additional enter transition. However, in the\n * > `<CSSTransition>` component that first enter transition does result in\n * > additional `.appear-*` classes, that way you can choose to style it\n * > differently.\n */\n appear: PropTypes.bool,\n\n /**\n * Enable or disable enter transitions.\n */\n enter: PropTypes.bool,\n\n /**\n * Enable or disable exit transitions.\n */\n exit: PropTypes.bool,\n\n /**\n * The duration of the transition, in milliseconds.\n * Required unless `addEndListener` is provided.\n *\n * You may specify a single timeout for all transitions:\n *\n * ```jsx\n * timeout={500}\n * ```\n *\n * or individually:\n *\n * ```jsx\n * timeout={{\n * appear: 500,\n * enter: 300,\n * exit: 500,\n * }}\n * ```\n *\n * - `appear` defaults to the value of `enter`\n * - `enter` defaults to `0`\n * - `exit` defaults to `0`\n *\n * @type {number | { enter?: number, exit?: number, appear?: number }}\n */\n timeout: function timeout(props) {\n var pt = timeoutsShape;\n if (!props.addEndListener) pt = pt.isRequired;\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return pt.apply(void 0, [props].concat(args));\n },\n\n /**\n * Add a custom transition end trigger. Called with the transitioning\n * DOM node and a `done` callback. Allows for more fine grained transition end\n * logic. Timeouts are still used as a fallback if provided.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * ```jsx\n * addEndListener={(node, done) => {\n * // use the css transitionend event to mark the finish of a transition\n * node.addEventListener('transitionend', done, false);\n * }}\n * ```\n */\n addEndListener: PropTypes.func,\n\n /**\n * Callback fired before the \"entering\" status is applied. An extra parameter\n * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEnter: PropTypes.func,\n\n /**\n * Callback fired after the \"entering\" status is applied. An extra parameter\n * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntering: PropTypes.func,\n\n /**\n * Callback fired after the \"entered\" status is applied. An extra parameter\n * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEntered: PropTypes.func,\n\n /**\n * Callback fired before the \"exiting\" status is applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExit: PropTypes.func,\n\n /**\n * Callback fired after the \"exiting\" status is applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExiting: PropTypes.func,\n\n /**\n * Callback fired after the \"exited\" status is applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExited: PropTypes.func\n} : {}; // Name the function so it is clearer in the documentation\n\nfunction noop() {}\n\nTransition.defaultProps = {\n in: false,\n mountOnEnter: false,\n unmountOnExit: false,\n appear: false,\n enter: true,\n exit: true,\n onEnter: noop,\n onEntering: noop,\n onEntered: noop,\n onExit: noop,\n onExiting: noop,\n onExited: noop\n};\nTransition.UNMOUNTED = UNMOUNTED;\nTransition.EXITED = EXITED;\nTransition.ENTERING = ENTERING;\nTransition.ENTERED = ENTERED;\nTransition.EXITING = EXITING;\nexport default Transition;","/* eslint-disable no-return-assign */\nimport canUseDOM from './canUseDOM';\nexport var optionsSupported = false;\nexport var onceSupported = false;\n\ntry {\n var options = {\n get passive() {\n return optionsSupported = true;\n },\n\n get once() {\n // eslint-disable-next-line no-multi-assign\n return onceSupported = optionsSupported = true;\n }\n\n };\n\n if (canUseDOM) {\n window.addEventListener('test', options, options);\n window.removeEventListener('test', options, true);\n }\n} catch (e) {\n /* */\n}\n\n/**\n * An `addEventListener` ponyfill, supports the `once` option\n * \n * @param node the element\n * @param eventName the event name\n * @param handle the handler\n * @param options event options\n */\nfunction addEventListener(node, eventName, handler, options) {\n if (options && typeof options !== 'boolean' && !onceSupported) {\n var once = options.once,\n capture = options.capture;\n var wrappedHandler = handler;\n\n if (!onceSupported && once) {\n wrappedHandler = handler.__once || function onceHandler(event) {\n this.removeEventListener(eventName, onceHandler, capture);\n handler.call(this, event);\n };\n\n handler.__once = wrappedHandler;\n }\n\n node.addEventListener(eventName, wrappedHandler, optionsSupported ? options : capture);\n }\n\n node.addEventListener(eventName, handler, options);\n}\n\nexport default addEventListener;","/**\n * A `removeEventListener` ponyfill\n * \n * @param node the element\n * @param eventName the event name\n * @param handle the handler\n * @param options event options\n */\nfunction removeEventListener(node, eventName, handler, options) {\n var capture = options && typeof options !== 'boolean' ? options.capture : options;\n node.removeEventListener(eventName, handler, capture);\n\n if (handler.__once) {\n node.removeEventListener(eventName, handler.__once, capture);\n }\n}\n\nexport default removeEventListener;","import addEventListener from './addEventListener';\nimport removeEventListener from './removeEventListener';\n\nfunction listen(node, eventName, handler, options) {\n addEventListener(node, eventName, handler, options);\n return function () {\n removeEventListener(node, eventName, handler, options);\n };\n}\n\nexport default listen;","import css from './css';\nimport listen from './listen';\nimport triggerEvent from './triggerEvent';\n\nfunction parseDuration(node) {\n var str = css(node, 'transitionDuration') || '';\n var mult = str.indexOf('ms') === -1 ? 1000 : 1;\n return parseFloat(str) * mult;\n}\n\nfunction emulateTransitionEnd(element, duration, padding) {\n if (padding === void 0) {\n padding = 5;\n }\n\n var called = false;\n var handle = setTimeout(function () {\n if (!called) triggerEvent(element, 'transitionend', true);\n }, duration + padding);\n var remove = listen(element, 'transitionend', function () {\n called = true;\n }, {\n once: true\n });\n return function () {\n clearTimeout(handle);\n remove();\n };\n}\n\nexport default function transitionEnd(element, handler, duration, padding) {\n if (duration == null) duration = parseDuration(element) || 0;\n var removeEmulate = emulateTransitionEnd(element, duration, padding);\n var remove = listen(element, 'transitionend', handler);\n return function () {\n removeEmulate();\n remove();\n };\n}","/**\n * Triggers an event on a given element.\n * \n * @param node the element\n * @param eventName the event name to trigger\n * @param bubbles whether the event should bubble up\n * @param cancelable whether the event should be cancelable\n */\nexport default function triggerEvent(node, eventName, bubbles, cancelable) {\n if (bubbles === void 0) {\n bubbles = false;\n }\n\n if (cancelable === void 0) {\n cancelable = true;\n }\n\n if (node) {\n var event = document.createEvent('HTMLEvents');\n event.initEvent(eventName, bubbles, cancelable);\n node.dispatchEvent(event);\n }\n}","import css from 'dom-helpers/css';\nimport transitionEnd from 'dom-helpers/transitionEnd';\n\nfunction parseDuration(node, property) {\n var str = css(node, property) || '';\n var mult = str.indexOf('ms') === -1 ? 1000 : 1;\n return parseFloat(str) * mult;\n}\n\nexport default function transitionEndListener(element, handler) {\n var duration = parseDuration(element, 'transitionDuration');\n var delay = parseDuration(element, 'transitionDelay');\n var remove = transitionEnd(element, function (e) {\n if (e.target === element) {\n remove();\n handler(e);\n }\n }, duration + delay);\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"onEnter\", \"onEntering\", \"onEntered\", \"onExit\", \"onExiting\", \"className\", \"children\", \"dimension\", \"getDimensionValue\"];\n\nvar _collapseStyles;\n\nimport classNames from 'classnames';\nimport css from 'dom-helpers/css';\nimport React, { useMemo } from 'react';\nimport Transition, { ENTERED, ENTERING, EXITED, EXITING } from 'react-transition-group/Transition';\nimport transitionEndListener from './transitionEndListener';\nimport createChainedFunction from './createChainedFunction';\nimport triggerBrowserReflow from './triggerBrowserReflow';\nvar MARGINS = {\n height: ['marginTop', 'marginBottom'],\n width: ['marginLeft', 'marginRight']\n};\n\nfunction getDefaultDimensionValue(dimension, elem) {\n var offset = \"offset\" + dimension[0].toUpperCase() + dimension.slice(1);\n var value = elem[offset];\n var margins = MARGINS[dimension];\n return value + // @ts-ignore\n parseInt(css(elem, margins[0]), 10) + // @ts-ignore\n parseInt(css(elem, margins[1]), 10);\n}\n\nvar collapseStyles = (_collapseStyles = {}, _collapseStyles[EXITED] = 'collapse', _collapseStyles[EXITING] = 'collapsing', _collapseStyles[ENTERING] = 'collapsing', _collapseStyles[ENTERED] = 'collapse show', _collapseStyles);\nvar defaultProps = {\n in: false,\n timeout: 300,\n mountOnEnter: false,\n unmountOnExit: false,\n appear: false,\n getDimensionValue: getDefaultDimensionValue\n};\nvar Collapse = /*#__PURE__*/React.forwardRef(function (_ref, ref) {\n var onEnter = _ref.onEnter,\n onEntering = _ref.onEntering,\n onEntered = _ref.onEntered,\n onExit = _ref.onExit,\n onExiting = _ref.onExiting,\n className = _ref.className,\n children = _ref.children,\n _ref$dimension = _ref.dimension,\n dimension = _ref$dimension === void 0 ? 'height' : _ref$dimension,\n _ref$getDimensionValu = _ref.getDimensionValue,\n getDimensionValue = _ref$getDimensionValu === void 0 ? getDefaultDimensionValue : _ref$getDimensionValu,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n /* Compute dimension */\n var computedDimension = typeof dimension === 'function' ? dimension() : dimension;\n /* -- Expanding -- */\n\n var handleEnter = useMemo(function () {\n return createChainedFunction(function (elem) {\n elem.style[computedDimension] = '0';\n }, onEnter);\n }, [computedDimension, onEnter]);\n var handleEntering = useMemo(function () {\n return createChainedFunction(function (elem) {\n var scroll = \"scroll\" + computedDimension[0].toUpperCase() + computedDimension.slice(1);\n elem.style[computedDimension] = elem[scroll] + \"px\";\n }, onEntering);\n }, [computedDimension, onEntering]);\n var handleEntered = useMemo(function () {\n return createChainedFunction(function (elem) {\n elem.style[computedDimension] = null;\n }, onEntered);\n }, [computedDimension, onEntered]);\n /* -- Collapsing -- */\n\n var handleExit = useMemo(function () {\n return createChainedFunction(function (elem) {\n elem.style[computedDimension] = getDimensionValue(computedDimension, elem) + \"px\";\n triggerBrowserReflow(elem);\n }, onExit);\n }, [onExit, getDimensionValue, computedDimension]);\n var handleExiting = useMemo(function () {\n return createChainedFunction(function (elem) {\n elem.style[computedDimension] = null;\n }, onExiting);\n }, [computedDimension, onExiting]);\n return /*#__PURE__*/React.createElement(Transition // @ts-ignore\n , _extends({\n ref: ref,\n addEndListener: transitionEndListener\n }, props, {\n \"aria-expanded\": props.role ? props.in : null,\n onEnter: handleEnter,\n onEntering: handleEntering,\n onEntered: handleEntered,\n onExit: handleExit,\n onExiting: handleExiting\n }), function (state, innerProps) {\n return /*#__PURE__*/React.cloneElement(children, _extends({}, innerProps, {\n className: classNames(className, children.props.className, collapseStyles[state], computedDimension === 'width' && 'width')\n }));\n });\n}); // @ts-ignore\n\n// @ts-ignore\nCollapse.defaultProps = defaultProps;\nexport default Collapse;","// reading a dimension prop will cause the browser to recalculate,\n// which will let our animations work\nexport default function triggerBrowserReflow(node) {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n node.offsetHeight;\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"children\", \"bsPrefix\"];\nimport React from 'react';\nimport Collapse from './Collapse';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport NavbarContext from './NavbarContext';\nvar NavbarCollapse = /*#__PURE__*/React.forwardRef(function (_ref, ref) {\n var children = _ref.children,\n bsPrefix = _ref.bsPrefix,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n bsPrefix = useBootstrapPrefix(bsPrefix, 'navbar-collapse');\n return /*#__PURE__*/React.createElement(NavbarContext.Consumer, null, function (context) {\n return /*#__PURE__*/React.createElement(Collapse, _extends({\n in: !!(context && context.expanded)\n }, props), /*#__PURE__*/React.createElement(\"div\", {\n ref: ref,\n className: bsPrefix\n }, children));\n });\n});\nNavbarCollapse.displayName = 'NavbarCollapse';\nexport default NavbarCollapse;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"bsPrefix\", \"className\", \"children\", \"label\", \"as\", \"onClick\"];\nimport classNames from 'classnames';\nimport React, { useContext } from 'react';\nimport useEventCallback from '@restart/hooks/useEventCallback';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport NavbarContext from './NavbarContext';\nvar defaultProps = {\n label: 'Toggle navigation'\n};\nvar NavbarToggle = /*#__PURE__*/React.forwardRef(function (_ref, ref) {\n var bsPrefix = _ref.bsPrefix,\n className = _ref.className,\n children = _ref.children,\n label = _ref.label,\n _ref$as = _ref.as,\n Component = _ref$as === void 0 ? 'button' : _ref$as,\n onClick = _ref.onClick,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n bsPrefix = useBootstrapPrefix(bsPrefix, 'navbar-toggler');\n\n var _ref2 = useContext(NavbarContext) || {},\n onToggle = _ref2.onToggle,\n expanded = _ref2.expanded;\n\n var handleClick = useEventCallback(function (e) {\n if (onClick) onClick(e);\n if (onToggle) onToggle();\n });\n\n if (Component === 'button') {\n props.type = 'button';\n }\n\n return /*#__PURE__*/React.createElement(Component, _extends({}, props, {\n ref: ref,\n onClick: handleClick,\n \"aria-label\": label,\n className: classNames(className, bsPrefix, !expanded && 'collapsed')\n }), children || /*#__PURE__*/React.createElement(\"span\", {\n className: bsPrefix + \"-icon\"\n }));\n});\nNavbarToggle.displayName = 'NavbarToggle';\nNavbarToggle.defaultProps = defaultProps;\nexport default NavbarToggle;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"bsPrefix\", \"expand\", \"variant\", \"bg\", \"fixed\", \"sticky\", \"className\", \"children\", \"as\", \"expanded\", \"onToggle\", \"onSelect\", \"collapseOnSelect\"];\nimport classNames from 'classnames';\nimport React, { useCallback, useMemo } from 'react';\nimport { useUncontrolled } from 'uncontrollable';\nimport createWithBsPrefix from './createWithBsPrefix';\nimport NavbarBrand from './NavbarBrand';\nimport NavbarCollapse from './NavbarCollapse';\nimport NavbarToggle from './NavbarToggle';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport NavbarContext from './NavbarContext';\nimport SelectableContext from './SelectableContext';\nvar NavbarText = createWithBsPrefix('navbar-text', {\n Component: 'span'\n});\nvar defaultProps = {\n expand: true,\n variant: 'light',\n collapseOnSelect: false\n};\nvar Navbar = /*#__PURE__*/React.forwardRef(function (props, ref) {\n var _useUncontrolled = useUncontrolled(props, {\n expanded: 'onToggle'\n }),\n initialBsPrefix = _useUncontrolled.bsPrefix,\n expand = _useUncontrolled.expand,\n variant = _useUncontrolled.variant,\n bg = _useUncontrolled.bg,\n fixed = _useUncontrolled.fixed,\n sticky = _useUncontrolled.sticky,\n className = _useUncontrolled.className,\n children = _useUncontrolled.children,\n _useUncontrolled$as = _useUncontrolled.as,\n Component = _useUncontrolled$as === void 0 ? 'nav' : _useUncontrolled$as,\n expanded = _useUncontrolled.expanded,\n _onToggle = _useUncontrolled.onToggle,\n onSelect = _useUncontrolled.onSelect,\n collapseOnSelect = _useUncontrolled.collapseOnSelect,\n controlledProps = _objectWithoutPropertiesLoose(_useUncontrolled, _excluded);\n\n var bsPrefix = useBootstrapPrefix(initialBsPrefix, 'navbar');\n var handleCollapse = useCallback(function () {\n if (onSelect) onSelect.apply(void 0, arguments);\n\n if (collapseOnSelect && expanded) {\n if (_onToggle) {\n _onToggle(false);\n }\n }\n }, [onSelect, collapseOnSelect, expanded, _onToggle]); // will result in some false positives but that seems better\n // than false negatives. strict `undefined` check allows explicit\n // \"nulling\" of the role if the user really doesn't want one\n\n if (controlledProps.role === undefined && Component !== 'nav') {\n controlledProps.role = 'navigation';\n }\n\n var expandClass = bsPrefix + \"-expand\";\n if (typeof expand === 'string') expandClass = expandClass + \"-\" + expand;\n var navbarContext = useMemo(function () {\n return {\n onToggle: function onToggle() {\n return _onToggle && _onToggle(!expanded);\n },\n bsPrefix: bsPrefix,\n expanded: !!expanded\n };\n }, [bsPrefix, expanded, _onToggle]);\n return /*#__PURE__*/React.createElement(NavbarContext.Provider, {\n value: navbarContext\n }, /*#__PURE__*/React.createElement(SelectableContext.Provider, {\n value: handleCollapse\n }, /*#__PURE__*/React.createElement(Component, _extends({\n ref: ref\n }, controlledProps, {\n className: classNames(className, bsPrefix, expand && expandClass, variant && bsPrefix + \"-\" + variant, bg && \"bg-\" + bg, sticky && \"sticky-\" + sticky, fixed && \"fixed-\" + fixed)\n }), children)));\n});\nNavbar.defaultProps = defaultProps;\nNavbar.displayName = 'Navbar';\nNavbar.Brand = NavbarBrand;\nNavbar.Toggle = NavbarToggle;\nNavbar.Collapse = NavbarCollapse;\nNavbar.Text = NavbarText;\nexport default Navbar;","import React from 'react';\nvar context = /*#__PURE__*/React.createContext(null);\ncontext.displayName = 'CardContext';\nexport default context;","var toArray = Function.prototype.bind.call(Function.prototype.call, [].slice);\n/**\n * Runs `querySelectorAll` on a given element.\n * \n * @param element the element\n * @param selector the selector\n */\n\nexport default function qsa(element, selector) {\n return toArray(element.querySelectorAll(selector));\n}","import { useMemo } from 'react';\n\nvar toFnRef = function toFnRef(ref) {\n return !ref || typeof ref === 'function' ? ref : function (value) {\n ref.current = value;\n };\n};\n\nexport function mergeRefs(refA, refB) {\n var a = toFnRef(refA);\n var b = toFnRef(refB);\n return function (value) {\n if (a) a(value);\n if (b) b(value);\n };\n}\n/**\n * Create and returns a single callback ref composed from two other Refs.\n *\n * ```tsx\n * const Button = React.forwardRef((props, ref) => {\n * const [element, attachRef] = useCallbackRef<HTMLButtonElement>();\n * const mergedRef = useMergedRefs(ref, attachRef);\n *\n * return <button ref={mergedRef} {...props}/>\n * })\n * ```\n *\n * @param refA A Callback or mutable Ref\n * @param refB A Callback or mutable Ref\n * @category refs\n */\n\nfunction useMergedRefs(refA, refB) {\n return useMemo(function () {\n return mergeRefs(refA, refB);\n }, [refA, refB]);\n}\n\nexport default useMergedRefs;","import React from 'react'; // TODO: check this\n\nvar NavContext = /*#__PURE__*/React.createContext(null);\nNavContext.displayName = 'NavContext';\nexport default NavContext;","import React from 'react';\nvar TabContext = /*#__PURE__*/React.createContext(null);\nexport default TabContext;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"as\", \"onSelect\", \"activeKey\", \"role\", \"onKeyDown\"];\nimport qsa from 'dom-helpers/querySelectorAll';\nimport React, { useContext, useEffect, useRef } from 'react';\nimport useForceUpdate from '@restart/hooks/useForceUpdate';\nimport useMergedRefs from '@restart/hooks/useMergedRefs';\nimport NavContext from './NavContext';\nimport SelectableContext, { makeEventKey } from './SelectableContext';\nimport TabContext from './TabContext';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nvar noop = function noop() {};\n\nvar AbstractNav = /*#__PURE__*/React.forwardRef(function (_ref, ref) {\n var _ref$as = _ref.as,\n Component = _ref$as === void 0 ? 'ul' : _ref$as,\n onSelect = _ref.onSelect,\n activeKey = _ref.activeKey,\n role = _ref.role,\n onKeyDown = _ref.onKeyDown,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n // A ref and forceUpdate for refocus, b/c we only want to trigger when needed\n // and don't want to reset the set in the effect\n var forceUpdate = useForceUpdate();\n var needsRefocusRef = useRef(false);\n var parentOnSelect = useContext(SelectableContext);\n var tabContext = useContext(TabContext);\n var getControlledId, getControllerId;\n\n if (tabContext) {\n role = role || 'tablist';\n activeKey = tabContext.activeKey;\n getControlledId = tabContext.getControlledId;\n getControllerId = tabContext.getControllerId;\n }\n\n var listNode = useRef(null);\n\n var getNextActiveChild = function getNextActiveChild(offset) {\n var currentListNode = listNode.current;\n if (!currentListNode) return null;\n var items = qsa(currentListNode, '[data-rb-event-key]:not(.disabled)');\n var activeChild = currentListNode.querySelector('.active');\n if (!activeChild) return null;\n var index = items.indexOf(activeChild);\n if (index === -1) return null;\n var nextIndex = index + offset;\n if (nextIndex >= items.length) nextIndex = 0;\n if (nextIndex < 0) nextIndex = items.length - 1;\n return items[nextIndex];\n };\n\n var handleSelect = function handleSelect(key, event) {\n if (key == null) return;\n if (onSelect) onSelect(key, event);\n if (parentOnSelect) parentOnSelect(key, event);\n };\n\n var handleKeyDown = function handleKeyDown(event) {\n if (onKeyDown) onKeyDown(event);\n var nextActiveChild;\n\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowUp':\n nextActiveChild = getNextActiveChild(-1);\n break;\n\n case 'ArrowRight':\n case 'ArrowDown':\n nextActiveChild = getNextActiveChild(1);\n break;\n\n default:\n return;\n }\n\n if (!nextActiveChild) return;\n event.preventDefault();\n handleSelect(nextActiveChild.dataset.rbEventKey, event);\n needsRefocusRef.current = true;\n forceUpdate();\n };\n\n useEffect(function () {\n if (listNode.current && needsRefocusRef.current) {\n var activeChild = listNode.current.querySelector('[data-rb-event-key].active');\n if (activeChild) activeChild.focus();\n }\n\n needsRefocusRef.current = false;\n });\n var mergedRef = useMergedRefs(ref, listNode);\n return /*#__PURE__*/React.createElement(SelectableContext.Provider, {\n value: handleSelect\n }, /*#__PURE__*/React.createElement(NavContext.Provider, {\n value: {\n role: role,\n // used by NavLink to determine it's role\n activeKey: makeEventKey(activeKey),\n getControlledId: getControlledId || noop,\n getControllerId: getControllerId || noop\n }\n }, /*#__PURE__*/React.createElement(Component, _extends({}, props, {\n onKeyDown: handleKeyDown,\n ref: mergedRef,\n role: role\n }))));\n});\nexport default AbstractNav;","import { useReducer } from 'react';\n/**\n * Returns a function that triggers a component update. the hook equivalent to\n * `this.forceUpdate()` in a class component. In most cases using a state value directly\n * is preferable but may be required in some advanced usages of refs for interop or\n * when direct DOM manipulation is required.\n *\n * ```ts\n * const forceUpdate = useForceUpdate();\n *\n * const updateOnClick = useCallback(() => {\n * forceUpdate()\n * }, [forceUpdate])\n *\n * return <button type=\"button\" onClick={updateOnClick}>Hi there</button>\n * ```\n */\n\nexport default function useForceUpdate() {\n // The toggling state value is designed to defeat React optimizations for skipping\n // updates when they are stricting equal to the last state value\n var _useReducer = useReducer(function (state) {\n return !state;\n }, false),\n dispatch = _useReducer[1];\n\n return dispatch;\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"bsPrefix\", \"className\", \"children\", \"as\"];\nimport classNames from 'classnames';\nimport React from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nvar NavItem = /*#__PURE__*/React.forwardRef( // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\nfunction (_ref, ref) {\n var bsPrefix = _ref.bsPrefix,\n className = _ref.className,\n children = _ref.children,\n _ref$as = _ref.as,\n Component = _ref$as === void 0 ? 'div' : _ref$as,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n bsPrefix = useBootstrapPrefix(bsPrefix, 'nav-item');\n return /*#__PURE__*/React.createElement(Component, _extends({}, props, {\n ref: ref,\n className: classNames(className, bsPrefix)\n }), children);\n});\nNavItem.displayName = 'NavItem';\nexport default NavItem;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"as\", \"disabled\", \"onKeyDown\"];\nimport React from 'react';\nimport createChainedFunction from './createChainedFunction';\n\nfunction isTrivialHref(href) {\n return !href || href.trim() === '#';\n}\n/**\n * There are situations due to browser quirks or Bootstrap CSS where\n * an anchor tag is needed, when semantically a button tag is the\n * better choice. SafeAnchor ensures that when an anchor is used like a\n * button its accessible. It also emulates input `disabled` behavior for\n * links, which is usually desirable for Buttons, NavItems, DropdownItems, etc.\n */\n\n\nvar SafeAnchor = /*#__PURE__*/React.forwardRef(function (_ref, ref) {\n var _ref$as = _ref.as,\n Component = _ref$as === void 0 ? 'a' : _ref$as,\n disabled = _ref.disabled,\n onKeyDown = _ref.onKeyDown,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n var handleClick = function handleClick(event) {\n var href = props.href,\n onClick = props.onClick;\n\n if (disabled || isTrivialHref(href)) {\n event.preventDefault();\n }\n\n if (disabled) {\n event.stopPropagation();\n return;\n }\n\n if (onClick) {\n onClick(event);\n }\n };\n\n var handleKeyDown = function handleKeyDown(event) {\n if (event.key === ' ') {\n event.preventDefault();\n handleClick(event);\n }\n };\n\n if (isTrivialHref(props.href)) {\n props.role = props.role || 'button'; // we want to make sure there is a href attribute on the node\n // otherwise, the cursor incorrectly styled (except with role='button')\n\n props.href = props.href || '#';\n }\n\n if (disabled) {\n props.tabIndex = -1;\n props['aria-disabled'] = true;\n }\n\n return /*#__PURE__*/React.createElement(Component, _extends({\n ref: ref\n }, props, {\n onClick: handleClick,\n onKeyDown: createChainedFunction(handleKeyDown, onKeyDown)\n }));\n});\nSafeAnchor.displayName = 'SafeAnchor';\nexport default SafeAnchor;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"active\", \"className\", \"eventKey\", \"onSelect\", \"onClick\", \"as\"];\nimport classNames from 'classnames';\nimport React, { useContext } from 'react';\nimport useEventCallback from '@restart/hooks/useEventCallback';\nimport warning from 'warning';\nimport NavContext from './NavContext';\nimport SelectableContext, { makeEventKey } from './SelectableContext';\nvar defaultProps = {\n disabled: false\n};\nvar AbstractNavItem = /*#__PURE__*/React.forwardRef(function (_ref, ref) {\n var active = _ref.active,\n className = _ref.className,\n eventKey = _ref.eventKey,\n onSelect = _ref.onSelect,\n onClick = _ref.onClick,\n Component = _ref.as,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n var navKey = makeEventKey(eventKey, props.href);\n var parentOnSelect = useContext(SelectableContext);\n var navContext = useContext(NavContext);\n var isActive = active;\n\n if (navContext) {\n if (!props.role && navContext.role === 'tablist') props.role = 'tab';\n var contextControllerId = navContext.getControllerId(navKey);\n var contextControlledId = navContext.getControlledId(navKey);\n process.env.NODE_ENV !== \"production\" ? warning(!contextControllerId || !props.id, \"[react-bootstrap] The provided id '\" + props.id + \"' was overwritten by the current navContext with '\" + contextControllerId + \"'.\") : void 0;\n process.env.NODE_ENV !== \"production\" ? warning(!contextControlledId || !props['aria-controls'], \"[react-bootstrap] The provided aria-controls value '\" + props['aria-controls'] + \"' was overwritten by the current navContext with '\" + contextControlledId + \"'.\") : void 0;\n props['data-rb-event-key'] = navKey;\n props.id = contextControllerId || props.id;\n props['aria-controls'] = contextControlledId || props['aria-controls'];\n isActive = active == null && navKey != null ? navContext.activeKey === navKey : active;\n }\n\n if (props.role === 'tab') {\n if (props.disabled) {\n props.tabIndex = -1;\n props['aria-disabled'] = true;\n }\n\n props['aria-selected'] = isActive;\n }\n\n var handleOnclick = useEventCallback(function (e) {\n if (onClick) onClick(e);\n if (navKey == null) return;\n if (onSelect) onSelect(navKey, e);\n if (parentOnSelect) parentOnSelect(navKey, e);\n });\n return /*#__PURE__*/React.createElement(Component, _extends({}, props, {\n ref: ref,\n onClick: handleOnclick,\n className: classNames(className, isActive && 'active')\n }));\n});\nAbstractNavItem.defaultProps = defaultProps;\nexport default AbstractNavItem;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"bsPrefix\", \"disabled\", \"className\", \"href\", \"eventKey\", \"onSelect\", \"as\"];\nimport classNames from 'classnames';\nimport React from 'react';\nimport SafeAnchor from './SafeAnchor';\nimport AbstractNavItem from './AbstractNavItem';\nimport { useBootstrapPrefix } from './ThemeProvider';\nvar defaultProps = {\n disabled: false,\n as: SafeAnchor\n};\nvar NavLink = /*#__PURE__*/React.forwardRef(function (_ref, ref) {\n var bsPrefix = _ref.bsPrefix,\n disabled = _ref.disabled,\n className = _ref.className,\n href = _ref.href,\n eventKey = _ref.eventKey,\n onSelect = _ref.onSelect,\n as = _ref.as,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n bsPrefix = useBootstrapPrefix(bsPrefix, 'nav-link');\n return /*#__PURE__*/React.createElement(AbstractNavItem, _extends({}, props, {\n href: href,\n ref: ref,\n eventKey: eventKey,\n as: as,\n disabled: disabled,\n onSelect: onSelect,\n className: classNames(className, bsPrefix, disabled && 'disabled')\n }));\n});\nNavLink.displayName = 'NavLink';\nNavLink.defaultProps = defaultProps;\nexport default NavLink;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"as\", \"bsPrefix\", \"variant\", \"fill\", \"justify\", \"navbar\", \"navbarScroll\", \"className\", \"children\", \"activeKey\"];\nimport classNames from 'classnames';\nimport all from 'prop-types-extra/lib/all';\nimport React, { useContext } from 'react';\nimport { useUncontrolled } from 'uncontrollable';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport NavbarContext from './NavbarContext';\nimport CardContext from './CardContext';\nimport AbstractNav from './AbstractNav';\nimport NavItem from './NavItem';\nimport NavLink from './NavLink';\nvar defaultProps = {\n justify: false,\n fill: false\n};\nvar Nav = /*#__PURE__*/React.forwardRef(function (uncontrolledProps, ref) {\n var _classNames;\n\n var _useUncontrolled = useUncontrolled(uncontrolledProps, {\n activeKey: 'onSelect'\n }),\n _useUncontrolled$as = _useUncontrolled.as,\n as = _useUncontrolled$as === void 0 ? 'div' : _useUncontrolled$as,\n initialBsPrefix = _useUncontrolled.bsPrefix,\n variant = _useUncontrolled.variant,\n fill = _useUncontrolled.fill,\n justify = _useUncontrolled.justify,\n navbar = _useUncontrolled.navbar,\n navbarScroll = _useUncontrolled.navbarScroll,\n className = _useUncontrolled.className,\n children = _useUncontrolled.children,\n activeKey = _useUncontrolled.activeKey,\n props = _objectWithoutPropertiesLoose(_useUncontrolled, _excluded);\n\n var bsPrefix = useBootstrapPrefix(initialBsPrefix, 'nav');\n var navbarBsPrefix;\n var cardHeaderBsPrefix;\n var isNavbar = false;\n var navbarContext = useContext(NavbarContext);\n var cardContext = useContext(CardContext);\n\n if (navbarContext) {\n navbarBsPrefix = navbarContext.bsPrefix;\n isNavbar = navbar == null ? true : navbar;\n } else if (cardContext) {\n cardHeaderBsPrefix = cardContext.cardHeaderBsPrefix;\n }\n\n return /*#__PURE__*/React.createElement(AbstractNav, _extends({\n as: as,\n ref: ref,\n activeKey: activeKey,\n className: classNames(className, (_classNames = {}, _classNames[bsPrefix] = !isNavbar, _classNames[navbarBsPrefix + \"-nav\"] = isNavbar, _classNames[navbarBsPrefix + \"-nav-scroll\"] = isNavbar && navbarScroll, _classNames[cardHeaderBsPrefix + \"-\" + variant] = !!cardHeaderBsPrefix, _classNames[bsPrefix + \"-\" + variant] = !!variant, _classNames[bsPrefix + \"-fill\"] = fill, _classNames[bsPrefix + \"-justified\"] = justify, _classNames))\n }, props), children);\n});\nNav.displayName = 'Nav';\nNav.defaultProps = defaultProps;\nNav.Item = NavItem;\nNav.Link = NavLink;\nexport default Nav;","import pathToRegexp from \"path-to-regexp\";\n\nvar patternCache = {};\nvar cacheLimit = 10000;\nvar cacheCount = 0;\n\nvar compileGenerator = function compileGenerator(pattern) {\n var cacheKey = pattern;\n var cache = patternCache[cacheKey] || (patternCache[cacheKey] = {});\n\n if (cache[pattern]) return cache[pattern];\n\n var compiledGenerator = pathToRegexp.compile(pattern);\n\n if (cacheCount < cacheLimit) {\n cache[pattern] = compiledGenerator;\n cacheCount++;\n }\n\n return compiledGenerator;\n};\n\n/**\n * Public API for generating a URL pathname from a pattern and parameters.\n */\nvar generatePath = function generatePath() {\n var pattern = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"/\";\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (pattern === \"/\") {\n return pattern;\n }\n var generator = compileGenerator(pattern);\n return generator(params, { pretty: true });\n};\n\nexport default generatePath;","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport warning from \"warning\";\nimport invariant from \"invariant\";\nimport { createLocation, locationsAreEqual } from \"history\";\nimport generatePath from \"./generatePath\";\n\n/**\n * The public API for updating the location programmatically\n * with a component.\n */\n\nvar Redirect = function (_React$Component) {\n _inherits(Redirect, _React$Component);\n\n function Redirect() {\n _classCallCheck(this, Redirect);\n\n return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));\n }\n\n Redirect.prototype.isStatic = function isStatic() {\n return this.context.router && this.context.router.staticContext;\n };\n\n Redirect.prototype.componentWillMount = function componentWillMount() {\n invariant(this.context.router, \"You should not use <Redirect> outside a <Router>\");\n\n if (this.isStatic()) this.perform();\n };\n\n Redirect.prototype.componentDidMount = function componentDidMount() {\n if (!this.isStatic()) this.perform();\n };\n\n Redirect.prototype.componentDidUpdate = function componentDidUpdate(prevProps) {\n var prevTo = createLocation(prevProps.to);\n var nextTo = createLocation(this.props.to);\n\n if (locationsAreEqual(prevTo, nextTo)) {\n warning(false, \"You tried to redirect to the same route you're currently on: \" + (\"\\\"\" + nextTo.pathname + nextTo.search + \"\\\"\"));\n return;\n }\n\n this.perform();\n };\n\n Redirect.prototype.computeTo = function computeTo(_ref) {\n var computedMatch = _ref.computedMatch,\n to = _ref.to;\n\n if (computedMatch) {\n if (typeof to === \"string\") {\n return generatePath(to, computedMatch.params);\n } else {\n return _extends({}, to, {\n pathname: generatePath(to.pathname, computedMatch.params)\n });\n }\n }\n\n return to;\n };\n\n Redirect.prototype.perform = function perform() {\n var history = this.context.router.history;\n var push = this.props.push;\n\n var to = this.computeTo(this.props);\n\n if (push) {\n history.push(to);\n } else {\n history.replace(to);\n }\n };\n\n Redirect.prototype.render = function render() {\n return null;\n };\n\n return Redirect;\n}(React.Component);\n\nRedirect.propTypes = {\n computedMatch: PropTypes.object, // private, from <Switch>\n push: PropTypes.bool,\n from: PropTypes.string,\n to: PropTypes.oneOfType([PropTypes.string, PropTypes.object]).isRequired\n};\nRedirect.defaultProps = {\n push: false\n};\nRedirect.contextTypes = {\n router: PropTypes.shape({\n history: PropTypes.shape({\n push: PropTypes.func.isRequired,\n replace: PropTypes.func.isRequired\n }).isRequired,\n staticContext: PropTypes.object\n }).isRequired\n};\n\n\nexport default Redirect;","// Written in this round about way for babel-transform-imports\nimport Redirect from \"react-router/es/Redirect\";\n\nexport default Redirect;","function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport warning from \"warning\";\nimport invariant from \"invariant\";\nimport matchPath from \"./matchPath\";\n\n/**\n * The public API for rendering the first <Route> that matches.\n */\n\nvar Switch = function (_React$Component) {\n _inherits(Switch, _React$Component);\n\n function Switch() {\n _classCallCheck(this, Switch);\n\n return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));\n }\n\n Switch.prototype.componentWillMount = function componentWillMount() {\n invariant(this.context.router, \"You should not use <Switch> outside a <Router>\");\n };\n\n Switch.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n warning(!(nextProps.location && !this.props.location), '<Switch> elements should not change from uncontrolled to controlled (or vice versa). You initially used no \"location\" prop and then provided one on a subsequent render.');\n\n warning(!(!nextProps.location && this.props.location), '<Switch> elements should not change from controlled to uncontrolled (or vice versa). You provided a \"location\" prop initially but omitted it on a subsequent render.');\n };\n\n Switch.prototype.render = function render() {\n var route = this.context.router.route;\n var children = this.props.children;\n\n var location = this.props.location || route.location;\n\n var match = void 0,\n child = void 0;\n React.Children.forEach(children, function (element) {\n if (match == null && React.isValidElement(element)) {\n var _element$props = element.props,\n pathProp = _element$props.path,\n exact = _element$props.exact,\n strict = _element$props.strict,\n sensitive = _element$props.sensitive,\n from = _element$props.from;\n\n var path = pathProp || from;\n\n child = element;\n match = matchPath(location.pathname, { path: path, exact: exact, strict: strict, sensitive: sensitive }, route.match);\n }\n });\n\n return match ? React.cloneElement(child, { location: location, computedMatch: match }) : null;\n };\n\n return Switch;\n}(React.Component);\n\nSwitch.contextTypes = {\n router: PropTypes.shape({\n route: PropTypes.object.isRequired\n }).isRequired\n};\nSwitch.propTypes = {\n children: PropTypes.node,\n location: PropTypes.object\n};\n\n\nexport default Switch;","// Written in this round about way for babel-transform-imports\nimport Switch from \"react-router/es/Switch\";\n\nexport default Switch;","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport warning from \"warning\";\nimport invariant from \"invariant\";\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\n\n/**\n * The public API for putting history on context.\n */\n\nvar Router = function (_React$Component) {\n _inherits(Router, _React$Component);\n\n function Router() {\n var _temp, _this, _ret;\n\n _classCallCheck(this, Router);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.state = {\n match: _this.computeMatch(_this.props.history.location.pathname)\n }, _temp), _possibleConstructorReturn(_this, _ret);\n }\n\n Router.prototype.getChildContext = function getChildContext() {\n return {\n router: _extends({}, this.context.router, {\n history: this.props.history,\n route: {\n location: this.props.history.location,\n match: this.state.match\n }\n })\n };\n };\n\n Router.prototype.computeMatch = function computeMatch(pathname) {\n return {\n path: \"/\",\n url: \"/\",\n params: {},\n isExact: pathname === \"/\"\n };\n };\n\n Router.prototype.componentWillMount = function componentWillMount() {\n var _this2 = this;\n\n var _props = this.props,\n children = _props.children,\n history = _props.history;\n\n\n invariant(children == null || React.Children.count(children) === 1, \"A <Router> may have only one child element\");\n\n // Do this here so we can setState when a <Redirect> changes the\n // location in componentWillMount. This happens e.g. when doing\n // server rendering using a <StaticRouter>.\n this.unlisten = history.listen(function () {\n _this2.setState({\n match: _this2.computeMatch(history.location.pathname)\n });\n });\n };\n\n Router.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n warning(this.props.history === nextProps.history, \"You cannot change <Router history>\");\n };\n\n Router.prototype.componentWillUnmount = function componentWillUnmount() {\n this.unlisten();\n };\n\n Router.prototype.render = function render() {\n var children = this.props.children;\n\n return children ? React.Children.only(children) : null;\n };\n\n return Router;\n}(React.Component);\n\nRouter.propTypes = {\n history: PropTypes.object.isRequired,\n children: PropTypes.node\n};\nRouter.contextTypes = {\n router: PropTypes.object\n};\nRouter.childContextTypes = {\n router: PropTypes.object.isRequired\n};\n\n\nexport default Router;","// Written in this round about way for babel-transform-imports\nimport Router from \"react-router/es/Router\";\n\nexport default Router;"],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/2.ff597791.chunk.js b/static/js/2.ff597791.chunk.js new file mode 100644 index 00000000..ca0c078b --- /dev/null +++ b/static/js/2.ff597791.chunk.js @@ -0,0 +1,3 @@ +/*! For license information please see 2.ff597791.chunk.js.LICENSE.txt */ +(this["webpackJsonpmicrometer-docs"]=this["webpackJsonpmicrometer-docs"]||[]).push([[2],[function(e,t,n){"use strict";e.exports=n(45)},function(e,t,n){"use strict";e.exports=n(39)},function(e,t,n){e.exports=n(46)()},function(e,t,n){"use strict";function r(){return r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},r.apply(this,arguments)}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";function r(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(i[n]=e[n]);return i}n.d(t,"a",(function(){return r}))},function(e,t,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function i(){for(var e=[],t=0;t<arguments.length;t++){var r=arguments[t];if(r){var o=typeof r;if("string"===o||"number"===o)e.push(r);else if(Array.isArray(r)){if(r.length){var a=i.apply(null,r);a&&e.push(a)}}else if("object"===o)if(r.toString===Object.prototype.toString)for(var s in r)n.call(r,s)&&r[s]&&e.push(s);else e.push(r.toString())}}return e.join(" ")}e.exports?(i.default=i,e.exports=i):void 0===(r=function(){return i}.apply(t,[]))||(e.exports=r)}()},function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));n(3);var r=n(1),i=n.n(r),o=i.a.createContext({});o.Consumer,o.Provider;function a(e,t){var n=Object(r.useContext)(o);return e||n[t]||t}},function(e,t,n){"use strict";e.exports=function(e,t,n,r,i,o,a,s){if(!e){var $;if(void 0===t)$=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var l=[n,r,i,o,a,s],u=0;($=new Error(t.replace(/%s/g,(function(){return l[u++]})))).name="Invariant Violation"}throw $.framesToPop=1,$}}},function(e,t,n){"use strict";var r=function(){};e.exports=r},function(e,t,n){"use strict";n.d(t,"c",(function(){return f})),n.d(t,"b",(function(){return d})),n.d(t,"a",(function(){return p})),n.d(t,"d",(function(){return _}));var r=n(4),i=n(26),o=(n(2),n(1)),a=n.n(o),s=n(18),$=n.n(s),l=!1,u=a.a.createContext(null),c="unmounted",f="exited",d="entering",p="entered",_="exiting",h=function(e){function t(t,n){var r;r=e.call(this,t,n)||this;var i,o=n&&!n.isMounting?t.enter:t.appear;return r.appearStatus=null,t.in?o?(i=f,r.appearStatus=d):i=p:i=t.unmountOnExit||t.mountOnEnter?c:f,r.state={status:i},r.nextCallback=null,r}Object(i.a)(t,e),t.getDerivedStateFromProps=function(e,t){return e.in&&t.status===c?{status:f}:null};var n=t.prototype;return n.componentDidMount=function(){this.updateStatus(!0,this.appearStatus)},n.componentDidUpdate=function(e){var t=null;if(e!==this.props){var n=this.state.status;this.props.in?n!==d&&n!==p&&(t=d):n!==d&&n!==p||(t=_)}this.updateStatus(!1,t)},n.componentWillUnmount=function(){this.cancelNextCallback()},n.getTimeouts=function(){var e,t,n,r=this.props.timeout;return e=t=n=r,null!=r&&"number"!==typeof r&&(e=r.exit,t=r.enter,n=void 0!==r.appear?r.appear:t),{exit:e,enter:t,appear:n}},n.updateStatus=function(e,t){void 0===e&&(e=!1),null!==t?(this.cancelNextCallback(),t===d?this.performEnter(e):this.performExit()):this.props.unmountOnExit&&this.state.status===f&&this.setState({status:c})},n.performEnter=function(e){var t=this,n=this.props.enter,r=this.context?this.context.isMounting:e,i=this.props.nodeRef?[r]:[$.a.findDOMNode(this),r],o=i[0],a=i[1],s=this.getTimeouts(),u=r?s.appear:s.enter;!e&&!n||l?this.safeSetState({status:p},(function(){t.props.onEntered(o)})):(this.props.onEnter(o,a),this.safeSetState({status:d},(function(){t.props.onEntering(o,a),t.onTransitionEnd(u,(function(){t.safeSetState({status:p},(function(){t.props.onEntered(o,a)}))}))})))},n.performExit=function(){var e=this,t=this.props.exit,n=this.getTimeouts(),r=this.props.nodeRef?void 0:$.a.findDOMNode(this);t&&!l?(this.props.onExit(r),this.safeSetState({status:_},(function(){e.props.onExiting(r),e.onTransitionEnd(n.exit,(function(){e.safeSetState({status:f},(function(){e.props.onExited(r)}))}))}))):this.safeSetState({status:f},(function(){e.props.onExited(r)}))},n.cancelNextCallback=function(){null!==this.nextCallback&&(this.nextCallback.cancel(),this.nextCallback=null)},n.safeSetState=function(e,t){t=this.setNextCallback(t),this.setState(e,t)},n.setNextCallback=function(e){var t=this,n=!0;return this.nextCallback=function(r){n&&(n=!1,t.nextCallback=null,e(r))},this.nextCallback.cancel=function(){n=!1},this.nextCallback},n.onTransitionEnd=function(e,t){this.setNextCallback(t);var n=this.props.nodeRef?this.props.nodeRef.current:$.a.findDOMNode(this),r=null==e&&!this.props.addEndListener;if(n&&!r){if(this.props.addEndListener){var i=this.props.nodeRef?[this.nextCallback]:[n,this.nextCallback],o=i[0],a=i[1];this.props.addEndListener(o,a)}null!=e&&setTimeout(this.nextCallback,e)}else setTimeout(this.nextCallback,0)},n.render=function(){var e=this.state.status;if(e===c)return null;var t=this.props,n=t.children,i=(t.in,t.mountOnEnter,t.unmountOnExit,t.appear,t.enter,t.exit,t.timeout,t.addEndListener,t.onEnter,t.onEntering,t.onEntered,t.onExit,t.onExiting,t.onExited,t.nodeRef,Object(r.a)(t,["children","in","mountOnEnter","unmountOnExit","appear","enter","exit","timeout","addEndListener","onEnter","onEntering","onEntered","onExit","onExiting","onExited","nodeRef"]));return a.a.createElement(u.Provider,{value:null},"function"===typeof n?n(e,i):a.a.cloneElement(a.a.Children.only(n),i))},t}(a.a.Component);function m(){}h.contextType=u,h.propTypes={},h.defaultProps={in:!1,mountOnEnter:!1,unmountOnExit:!1,appear:!1,enter:!0,exit:!0,onEnter:m,onEntering:m,onEntered:m,onExit:m,onExiting:m,onExited:m},h.UNMOUNTED=c,h.EXITED=f,h.ENTERING=d,h.ENTERED=p,h.EXITING=_;t.e=h},function(e,t,n){"use strict";n.d(t,"b",(function(){return o}));var r=n(1),i=n.n(r).a.createContext(null),o=function(e,t){return void 0===t&&(t=null),null!=e?String(e):t||null};t.a=i},function(e,t,n){"use strict";var r=n(1),i=n.n(r).a.createContext(null);i.displayName="NavbarContext",t.a=i},function(e,t,n){"use strict";n.d(t,"a",(function(){return x})),n.d(t,"b",(function(){return _})),n.d(t,"c",(function(){return h}));var r=n(3);function i(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,i=e.length;r<i;n+=1,r+=1)e[n]=e[r];e.pop()}var a=function(e,t){void 0===t&&(t="");var n,r=e&&e.split("/")||[],a=t&&t.split("/")||[],s=e&&i(e),$=t&&i(t),l=s||$;if(e&&i(e)?a=r:r.length&&(a.pop(),a=a.concat(r)),!a.length)return"/";if(a.length){var u=a[a.length-1];n="."===u||".."===u||""===u}else n=!1;for(var c=0,f=a.length;f>=0;f--){var d=a[f];"."===d?o(a,f):".."===d?(o(a,f),c++):c&&(o(a,f),c--)}if(!l)for(;c--;c)a.unshift("..");!l||""===a[0]||a[0]&&i(a[0])||a.unshift("");var p=a.join("/");return n&&"/"!==p.substr(-1)&&(p+="/"),p};function s(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}var $=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every((function(t,r){return e(t,n[r])}));if("object"===typeof t||"object"===typeof n){var r=s(t),i=s(n);return r!==t||i!==n?e(r,i):Object.keys(Object.assign({},t,n)).every((function(r){return e(t[r],n[r])}))}return!1},l="Invariant failed";function u(e,t){if(!e)throw new Error(l)}function c(e){return"/"===e.charAt(0)?e:"/"+e}function f(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,i=t||"/";return n&&"?"!==n&&(i+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(i+="#"===r.charAt(0)?r:"#"+r),i}function _(e,t,n,i){var o;"string"===typeof e?(o=function(e){var t=e||"/",n="",r="",i=t.indexOf("#");-1!==i&&(r=t.substr(i),t=t.substr(0,i));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=Object(r.a)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(o.key=n),i?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=a(o.pathname,i.pathname)):o.pathname=i.pathname:o.pathname||(o.pathname="/"),o}function h(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&e.key===t.key&&$(e.state,t.state)}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,i){if(null!=e){var o="function"===typeof e?e(t,n):e;"string"===typeof o?"function"===typeof r?r(o,i):i(!0):i(!1!==o)}else i(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];t.forEach((function(e){return e.apply(void 0,n)}))}}}var y=!("undefined"===typeof window||!window.document||!window.document.createElement);function g(e,t){t(window.confirm(e))}var v="popstate",b="hashchange";function w(){try{return window.history.state||{}}catch(e){return{}}}function x(e){void 0===e&&(e={}),y||u(!1);var t=window.history,n=function(){var e=window.navigator.userAgent;return(-1===e.indexOf("Android 2.")&&-1===e.indexOf("Android 4.0")||-1===e.indexOf("Mobile Safari")||-1!==e.indexOf("Chrome")||-1!==e.indexOf("Windows Phone"))&&window.history&&"pushState"in window.history}(),i=!(-1===window.navigator.userAgent.indexOf("Trident")),o=e,a=o.forceRefresh,s=void 0!==a&&a,$=o.getUserConfirmation,l=void 0===$?g:$,h=o.keyLength,x=void 0===h?6:h,k=e.basename?d(c(e.basename)):"";function E(e){var t=e||{},n=t.key,r=t.state,i=window.location,o=i.pathname+i.search+i.hash;return k&&(o=f(o,k)),_(o,r,n)}function O(){return Math.random().toString(36).substr(2,x)}var A=m();function S(e){Object(r.a)(j,e),j.length=t.length,A.notifyListeners(j.location,j.action)}function C(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||I(E(e.state))}function R(){I(E(w()))}var T=!1;function I(e){if(T)T=!1,S();else{A.confirmTransitionTo(e,"POP",l,(function(t){t?S({action:"POP",location:e}):function(e){var t=j.location,n=L.indexOf(t.key);-1===n&&(n=0);var r=L.indexOf(e.key);-1===r&&(r=0);var i=n-r;i&&(T=!0,P(i))}(e)}))}}var N=E(w()),L=[N.key];function D(e){return k+p(e)}function P(e){t.go(e)}var M=0;function z(e){1===(M+=e)&&1===e?(window.addEventListener(v,C),i&&window.addEventListener(b,R)):0===M&&(window.removeEventListener(v,C),i&&window.removeEventListener(b,R))}var F=!1;var j={length:t.length,action:"POP",location:N,createHref:D,push:function(e,r){var i="PUSH",o=_(e,r,O(),j.location);A.confirmTransitionTo(o,i,l,(function(e){if(e){var r=D(o),a=o.key,$=o.state;if(n)if(t.pushState({key:a,state:$},null,r),s)window.location.href=r;else{var l=L.indexOf(j.location.key),u=L.slice(0,l+1);u.push(o.key),L=u,S({action:i,location:o})}else window.location.href=r}}))},replace:function(e,r){var i="REPLACE",o=_(e,r,O(),j.location);A.confirmTransitionTo(o,i,l,(function(e){if(e){var r=D(o),a=o.key,$=o.state;if(n)if(t.replaceState({key:a,state:$},null,r),s)window.location.replace(r);else{var l=L.indexOf(j.location.key);-1!==l&&(L[l]=o.key),S({action:i,location:o})}else window.location.replace(r)}}))},go:P,goBack:function(){P(-1)},goForward:function(){P(1)},block:function(e){void 0===e&&(e=!1);var t=A.setPrompt(e);return F||(z(1),F=!0),function(){return F&&(F=!1,z(-1)),t()}},listen:function(e){var t=A.appendListener(e);return z(1),function(){z(-1),t()}}};return j}},function(e,t,n){"use strict";t.a=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter((function(e){return null!=e})).reduce((function(e,t){if("function"!==typeof t)throw new Error("Invalid Argument Type, must only provide functions, undefined, or null.");return null===e?t:function(){for(var n=arguments.length,r=new Array(n),i=0;i<n;i++)r[i]=arguments[i];e.apply(this,r),t.apply(this,r)}}),null)}},function(e,t,n){"use strict";var r=n(30);function i(e,t){return function(e){var t=Object(r.a)(e);return t&&t.defaultView||window}(e).getComputedStyle(e,t)}var o=/([A-Z])/g;var a=/^ms-/;function s(e){return function(e){return e.replace(o,"-$1").toLowerCase()}(e).replace(a,"-ms-")}var $=/^((translate|rotate|scale)(X|Y|Z|3d)?|matrix(3d)?|perspective|skew(X|Y)?)$/i;t.a=function(e,t){var n="",r="";if("string"===typeof t)return e.style.getPropertyValue(s(t))||i(e).getPropertyValue(s(t));Object.keys(t).forEach((function(i){var o=t[i];o||0===o?!function(e){return!(!e||!$.test(e))}(i)?n+=s(i)+": "+o+";":r+=i+"("+o+") ":e.style.removeProperty(s(i))})),r&&(n+="transform: "+r+";"),e.style.cssText+=";"+n}},function(e,t,n){"use strict";var r=n(3),i=n(4),o=n(1),a=n.n(o),s=n(13),$=["as","disabled","onKeyDown"];function l(e){return!e||"#"===e.trim()}var u=a.a.forwardRef((function(e,t){var n=e.as,o=void 0===n?"a":n,u=e.disabled,c=e.onKeyDown,f=Object(i.a)(e,$),d=function(e){var t=f.href,n=f.onClick;(u||l(t))&&e.preventDefault(),u?e.stopPropagation():n&&n(e)};return l(f.href)&&(f.role=f.role||"button",f.href=f.href||"#"),u&&(f.tabIndex=-1,f["aria-disabled"]=!0),a.a.createElement(o,Object(r.a)({ref:t},f,{onClick:d,onKeyDown:Object(s.a)((function(e){" "===e.key&&(e.preventDefault(),d(e))}),c)}))}));u.displayName="SafeAnchor",t.a=u},function(e,t,n){"use strict";n.d(t,"a",(function(){return $}));var r=n(3),i=n(4),o=n(1);n(7);function a(e){return"default"+e.charAt(0).toUpperCase()+e.substr(1)}function s(e){var t=function(e,t){if("object"!==typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!==typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===typeof t?t:String(t)}function $(e,t){return Object.keys(t).reduce((function(n,$){var l,u=n,c=u[a($)],f=u[$],d=Object(i.a)(u,[a($),$].map(s)),p=t[$],_=function(e,t,n){var r=Object(o.useRef)(void 0!==e),i=Object(o.useState)(t),a=i[0],s=i[1],$=void 0!==e,l=r.current;return r.current=$,!$&&l&&a!==t&&s(t),[$?e:a,Object(o.useCallback)((function(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),i=1;i<t;i++)r[i-1]=arguments[i];n&&n.apply(void 0,[e].concat(r)),s(e)}),[n])]}(f,c,e[p]),h=_[0],m=_[1];return Object(r.a)({},d,((l={})[$]=h,l[p]=m,l))}),e)}n(26);function l(){var e=this.constructor.getDerivedStateFromProps(this.props,this.state);null!==e&&void 0!==e&&this.setState(e)}function u(e){this.setState(function(t){var n=this.constructor.getDerivedStateFromProps(e,t);return null!==n&&void 0!==n?n:null}.bind(this))}function c(e,t){try{var n=this.props,r=this.state;this.props=e,this.state=t,this.__reactInternalSnapshotFlag=!0,this.__reactInternalSnapshot=this.getSnapshotBeforeUpdate(n,r)}finally{this.props=n,this.state=r}}l.__suppressDeprecationWarning=!0,u.__suppressDeprecationWarning=!0,c.__suppressDeprecationWarning=!0},function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var r=n(1);var i=function(e){var t=Object(r.useRef)(e);return Object(r.useEffect)((function(){t.current=e}),[e]),t};function o(e){var t=i(e);return Object(r.useCallback)((function(){return t.current&&t.current.apply(t,arguments)}),[t])}},function(e,t,n){"use strict";!function e(){if("undefined"!==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(40)},function(e,t,n){"use strict";n.d(t,"a",(function(){return d}));var r=n(3),i=n(4),o=n(5),a=n.n(o),s=/-(.)/g;var $=n(1),l=n.n($),u=n(6),c=["className","bsPrefix","as"],f=function(e){return e[0].toUpperCase()+(t=e,t.replace(s,(function(e,t){return t.toUpperCase()}))).slice(1);var t};function d(e,t){var n=void 0===t?{}:t,o=n.displayName,s=void 0===o?f(e):o,$=n.Component,d=n.defaultProps,p=l.a.forwardRef((function(t,n){var o=t.className,s=t.bsPrefix,f=t.as,d=void 0===f?$||"div":f,p=Object(i.a)(t,c),_=Object(u.a)(s,e);return l.a.createElement(d,Object(r.a)({ref:n,className:a()(o,_)},p))}));return p.defaultProps=d,p.displayName=s,p}},,function(e,t,n){"use strict";function r(e){e.offsetHeight}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";var r=n(23),i=n.n(r),o={},a=0,s=function(e,t){var n=""+t.end+t.strict+t.sensitive,r=o[n]||(o[n]={});if(r[e])return r[e];var s=[],$={re:i()(e,s,t),keys:s};return a<1e4&&(r[e]=$,a++),$};t.a=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments[2];"string"===typeof t&&(t={path:t});var r=t,i=r.path,o=r.exact,a=void 0!==o&&o,$=r.strict,l=void 0!==$&&$,u=r.sensitive,c=void 0!==u&&u;if(null==i)return n;var f=s(i,{end:a,strict:l,sensitive:c}),d=f.re,p=f.keys,_=d.exec(e);if(!_)return null;var h=_[0],m=_.slice(1),y=e===h;return a&&!y?null:{path:i,url:"/"===i&&""===h?"/":h,isExact:y,params:p.reduce((function(e,t,n){return e[t.name]=m[n],e}),{})}}},function(e,t,n){var r=n(51);e.exports=d,e.exports.parse=o,e.exports.compile=function(e,t){return s(o(e,t),t)},e.exports.tokensToFunction=s,e.exports.tokensToRegExp=f;var i=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,a=0,s="",u=t&&t.delimiter||"/";null!=(n=i.exec(e));){var c=n[0],f=n[1],d=n.index;if(s+=e.slice(a,d),a=d+c.length,f)s+=f[1];else{var p=e[a],_=n[2],h=n[3],m=n[4],y=n[5],g=n[6],v=n[7];s&&(r.push(s),s="");var b=null!=_&&null!=p&&p!==_,w="+"===g||"*"===g,x="?"===g||"*"===g,k=n[2]||u,E=m||y;r.push({name:h||o++,prefix:_||"",delimiter:k,optional:x,repeat:w,partial:b,asterisk:!!v,pattern:E?l(E):v?".*":"[^"+$(k)+"]+?"})}}return a<e.length&&(s+=e.substr(a)),s&&r.push(s),r}function a(e){return encodeURI(e).replace(/[\/?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}function s(e,t){for(var n=new Array(e.length),i=0;i<e.length;i++)"object"===typeof e[i]&&(n[i]=new RegExp("^(?:"+e[i].pattern+")$",c(t)));return function(t,i){for(var o="",s=t||{},$=(i||{}).pretty?a:encodeURIComponent,l=0;l<e.length;l++){var u=e[l];if("string"!==typeof u){var c,f=s[u.name];if(null==f){if(u.optional){u.partial&&(o+=u.prefix);continue}throw new TypeError('Expected "'+u.name+'" to be defined')}if(r(f)){if(!u.repeat)throw new TypeError('Expected "'+u.name+'" to not repeat, but received `'+JSON.stringify(f)+"`");if(0===f.length){if(u.optional)continue;throw new TypeError('Expected "'+u.name+'" to not be empty')}for(var d=0;d<f.length;d++){if(c=$(f[d]),!n[l].test(c))throw new TypeError('Expected all "'+u.name+'" to match "'+u.pattern+'", but received `'+JSON.stringify(c)+"`");o+=(0===d?u.prefix:u.delimiter)+c}}else{if(c=u.asterisk?encodeURI(f).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):$(f),!n[l].test(c))throw new TypeError('Expected "'+u.name+'" to match "'+u.pattern+'", but received "'+c+'"');o+=u.prefix+c}}else o+=u}return o}}function $(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function l(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function u(e,t){return e.keys=t,e}function c(e){return e&&e.sensitive?"":"i"}function f(e,t,n){r(t)||(n=t||n,t=[]);for(var i=(n=n||{}).strict,o=!1!==n.end,a="",s=0;s<e.length;s++){var l=e[s];if("string"===typeof l)a+=$(l);else{var f=$(l.prefix),d="(?:"+l.pattern+")";t.push(l),l.repeat&&(d+="(?:"+f+d+")*"),a+=d=l.optional?l.partial?f+"("+d+")?":"(?:"+f+"("+d+"))?":f+"("+d+")"}}var p=$(n.delimiter||"/"),_=a.slice(-p.length)===p;return i||(a=(_?a.slice(0,-p.length):a)+"(?:"+p+"(?=$))?"),a+=o?"$":i&&_?"":"(?="+p+"|$)",u(new RegExp("^"+a,c(n)),t)}function d(e,t,n){return r(t)||(n=t||n,t=[]),n=n||{},e instanceof RegExp?function(e,t){var n=e.source.match(/\((?!\?)/g);if(n)for(var r=0;r<n.length;r++)t.push({name:r,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return u(e,t)}(e,t):r(e)?function(e,t,n){for(var r=[],i=0;i<e.length;i++)r.push(d(e[i],t,n).source);return u(new RegExp("(?:"+r.join("|")+")",c(n)),t)}(e,t,n):function(e,t,n){return f(o(e,n),t,n)}(e,t,n)}},function(e,t,n){"use strict";function r(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return p}));var r=n(14),i=n(31),o=!1,a=!1;try{var s={get passive(){return o=!0},get once(){return a=o=!0}};i.a&&(window.addEventListener("test",s,s),window.removeEventListener("test",s,!0))}catch(_){}var $=function(e,t,n,r){if(r&&"boolean"!==typeof r&&!a){var i=r.once,s=r.capture,$=n;!a&&i&&($=n.__once||function e(r){this.removeEventListener(t,e,s),n.call(this,r)},n.__once=$),e.addEventListener(t,$,o?r:s)}e.addEventListener(t,n,r)};var l=function(e,t,n,r){var i=r&&"boolean"!==typeof r?r.capture:r;e.removeEventListener(t,n,i),n.__once&&e.removeEventListener(t,n.__once,i)};var u=function(e,t,n,r){return $(e,t,n,r),function(){l(e,t,n,r)}};function c(e,t,n){void 0===n&&(n=5);var r=!1,i=setTimeout((function(){r||function(e,t,n,r){if(void 0===n&&(n=!1),void 0===r&&(r=!0),e){var i=document.createEvent("HTMLEvents");i.initEvent(t,n,r),e.dispatchEvent(i)}}(e,"transitionend",!0)}),t+n),o=u(e,"transitionend",(function(){r=!0}),{once:!0});return function(){clearTimeout(i),o()}}function f(e,t,n,i){null==n&&(n=function(e){var t=Object(r.a)(e,"transitionDuration")||"",n=-1===t.indexOf("ms")?1e3:1;return parseFloat(t)*n}(e)||0);var o=c(e,n,i),a=u(e,"transitionend",t);return function(){o(),a()}}function d(e,t){var n=Object(r.a)(e,t)||"",i=-1===n.indexOf("ms")?1e3:1;return parseFloat(n)*i}function p(e,t){var n=d(e,"transitionDuration"),r=d(e,"transitionDelay"),i=f(e,(function(n){n.target===e&&(i(),t(n))}),n+r)}},function(e,t,n){"use strict";function r(e,t){return r=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},r(e,t)}function i(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,"a",(function(){return i}))},function(e,t,n){"use strict";var r=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,o=Object.prototype.propertyIsEnumerable;function a(e){if(null===e||void 0===e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(i){return!1}}()?Object.assign:function(e,t){for(var n,s,$=a(e),l=1;l<arguments.length;l++){for(var u in n=Object(arguments[l]))i.call(n,u)&&($[u]=n[u]);if(r){s=r(n);for(var c=0;c<s.length;c++)o.call(n,s[c])&&($[s[c]]=n[s[c]])}}return $}},function(e,t,n){"use strict";var r=n(1),i=n.n(r),o=n(2),a=n.n(o),s=n(7),$=n.n(s),l=n(12),u=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e};function c(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function f(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!==typeof t&&"function"!==typeof t?e:t}var d=function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)},p=function(e){function t(){var n,r;c(this,t);for(var i=arguments.length,o=Array(i),a=0;a<i;a++)o[a]=arguments[a];return n=r=f(this,e.call.apply(e,[this].concat(o))),r.handleClick=function(e){if(r.props.onClick&&r.props.onClick(e),!e.defaultPrevented&&0===e.button&&!r.props.target&&!d(e)){e.preventDefault();var t=r.context.router.history,n=r.props,i=n.replace,o=n.to;i?t.replace(o):t.push(o)}},f(r,n)}return function(e,t){if("function"!==typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),t.prototype.render=function(){var e=this.props,t=(e.replace,e.to),n=e.innerRef,r=function(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(e,["replace","to","innerRef"]);$()(this.context.router,"You should not use <Link> outside a <Router>"),$()(void 0!==t,'You must specify the "to" property');var o=this.context.router.history,a="string"===typeof t?Object(l.b)(t,null,null,o.location):t,s=o.createHref(a);return i.a.createElement("a",u({},r,{onClick:this.handleClick,href:s,ref:n}))},t}(i.a.Component);p.propTypes={onClick:a.a.func,target:a.a.string,replace:a.a.bool,to:a.a.oneOfType([a.a.string,a.a.object]).isRequired,innerRef:a.a.oneOfType([a.a.string,a.a.func])},p.defaultProps={replace:!1},p.contextTypes={router:a.a.shape({history:a.a.shape({push:a.a.func.isRequired,replace:a.a.func.isRequired,createHref:a.a.func.isRequired}).isRequired}).isRequired},t.a=p},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(r){"object"===typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";function r(e){return e&&e.ownerDocument||document}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";t.a=!("undefined"===typeof window||!window.document||!window.document.createElement)},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";function r(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function i(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}n.d(t,"a",(function(){return i}))},,function(e,t,n){"use strict";function r(e){return r=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},r(e)}function i(e){return i="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},i(e)}n.d(t,"a",(function(){return s}));var o=n(24);function a(e,t){return!t||"object"!==i(t)&&"function"!==typeof t?Object(o.a)(e):t}function s(e){var t=function(){if("undefined"===typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"===typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,i=r(e);if(t){var o=r(this).constructor;n=Reflect.construct(i,arguments,o)}else n=i.apply(this,arguments);return a(this,n)}}},function(e,t,n){"use strict";var r=n(8),i=n.n(r),o=n(7),a=n.n(o),s=n(1),$=n.n(s),l=n(2),u=n.n(l),c=n(22),f=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e};function d(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function p(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!==typeof t&&"function"!==typeof t?e:t}var _=function(e){return 0===$.a.Children.count(e)},h=function(e){function t(){var n,r;d(this,t);for(var i=arguments.length,o=Array(i),a=0;a<i;a++)o[a]=arguments[a];return n=r=p(this,e.call.apply(e,[this].concat(o))),r.state={match:r.computeMatch(r.props,r.context.router)},p(r,n)}return function(e,t){if("function"!==typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),t.prototype.getChildContext=function(){return{router:f({},this.context.router,{route:{location:this.props.location||this.context.router.route.location,match:this.state.match}})}},t.prototype.computeMatch=function(e,t){var n=e.computedMatch,r=e.location,i=e.path,o=e.strict,s=e.exact,$=e.sensitive;if(n)return n;a()(t,"You should not use <Route> or withRouter() outside a <Router>");var l=t.route,u=(r||l.location).pathname;return Object(c.a)(u,{path:i,strict:o,exact:s,sensitive:$},l.match)},t.prototype.componentWillMount=function(){i()(!(this.props.component&&this.props.render),"You should not use <Route component> and <Route render> in the same route; <Route render> will be ignored"),i()(!(this.props.component&&this.props.children&&!_(this.props.children)),"You should not use <Route component> and <Route children> in the same route; <Route children> will be ignored"),i()(!(this.props.render&&this.props.children&&!_(this.props.children)),"You should not use <Route render> and <Route children> in the same route; <Route children> will be ignored")},t.prototype.componentWillReceiveProps=function(e,t){i()(!(e.location&&!this.props.location),'<Route> elements should not change from uncontrolled to controlled (or vice versa). You initially used no "location" prop and then provided one on a subsequent render.'),i()(!(!e.location&&this.props.location),'<Route> elements should not change from controlled to uncontrolled (or vice versa). You provided a "location" prop initially but omitted it on a subsequent render.'),this.setState({match:this.computeMatch(e,t.router)})},t.prototype.render=function(){var e=this.state.match,t=this.props,n=t.children,r=t.component,i=t.render,o=this.context.router,a=o.history,s=o.route,l=o.staticContext,u={match:e,location:this.props.location||s.location,history:a,staticContext:l};return r?e?$.a.createElement(r,u):null:i?e?i(u):null:"function"===typeof n?n(u):n&&!_(n)?$.a.Children.only(n):null},t}($.a.Component);h.propTypes={computedMatch:u.a.object,path:u.a.string,exact:u.a.bool,strict:u.a.bool,sensitive:u.a.bool,component:u.a.func,render:u.a.func,children:u.a.oneOfType([u.a.func,u.a.node]),location:u.a.object},h.contextTypes={router:u.a.shape({history:u.a.object.isRequired,route:u.a.object.isRequired,staticContext:u.a.object})},h.childContextTypes={router:u.a.object.isRequired};var m=h;t.a=m},function(e,t,n){"use strict";function r(e,t){return r=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},r(e,t)}function i(e,t){if("function"!==typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&r(e,t)}n.d(t,"a",(function(){return i}))},,function(e,t,n){"use strict";var r=n(27),i=60103,o=60106;t.Fragment=60107,t.StrictMode=60108,t.Profiler=60114;var a=60109,s=60110,$=60112;t.Suspense=60113;var l=60115,u=60116;if("function"===typeof Symbol&&Symbol.for){var c=Symbol.for;i=c("react.element"),o=c("react.portal"),t.Fragment=c("react.fragment"),t.StrictMode=c("react.strict_mode"),t.Profiler=c("react.profiler"),a=c("react.provider"),s=c("react.context"),$=c("react.forward_ref"),t.Suspense=c("react.suspense"),l=c("react.memo"),u=c("react.lazy")}var f="function"===typeof Symbol&&Symbol.iterator;function d(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var p={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},_={};function h(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||p}function m(){}function y(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||p}h.prototype.isReactComponent={},h.prototype.setState=function(e,t){if("object"!==typeof e&&"function"!==typeof e&&null!=e)throw Error(d(85));this.updater.enqueueSetState(this,e,t,"setState")},h.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},m.prototype=h.prototype;var g=y.prototype=new m;g.constructor=y,r(g,h.prototype),g.isPureReactComponent=!0;var v={current:null},b=Object.prototype.hasOwnProperty,w={key:!0,ref:!0,__self:!0,__source:!0};function x(e,t,n){var r,o={},a=null,s=null;if(null!=t)for(r in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(a=""+t.key),t)b.call(t,r)&&!w.hasOwnProperty(r)&&(o[r]=t[r]);var $=arguments.length-2;if(1===$)o.children=n;else if(1<$){for(var l=Array($),u=0;u<$;u++)l[u]=arguments[u+2];o.children=l}if(e&&e.defaultProps)for(r in $=e.defaultProps)void 0===o[r]&&(o[r]=$[r]);return{$$typeof:i,type:e,key:a,ref:s,props:o,_owner:v.current}}function k(e){return"object"===typeof e&&null!==e&&e.$$typeof===i}var E=/\/+/g;function O(e,t){return"object"===typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function A(e,t,n,r,a){var s=typeof e;"undefined"!==s&&"boolean"!==s||(e=null);var $=!1;if(null===e)$=!0;else switch(s){case"string":case"number":$=!0;break;case"object":switch(e.$$typeof){case i:case o:$=!0}}if($)return a=a($=e),e=""===r?"."+O($,0):r,Array.isArray(a)?(n="",null!=e&&(n=e.replace(E,"$&/")+"/"),A(a,t,n,"",(function(e){return e}))):null!=a&&(k(a)&&(a=function(e,t){return{$$typeof:i,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(a,n+(!a.key||$&&$.key===a.key?"":(""+a.key).replace(E,"$&/")+"/")+e)),t.push(a)),1;if($=0,r=""===r?".":r+":",Array.isArray(e))for(var l=0;l<e.length;l++){var u=r+O(s=e[l],l);$+=A(s,t,n,u,a)}else if(u=function(e){return null===e||"object"!==typeof e?null:"function"===typeof(e=f&&e[f]||e["@@iterator"])?e:null}(e),"function"===typeof u)for(e=u.call(e),l=0;!(s=e.next()).done;)$+=A(s=s.value,t,n,u=r+O(s,l++),a);else if("object"===s)throw t=""+e,Error(d(31,"[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t));return $}function S(e,t,n){if(null==e)return e;var r=[],i=0;return A(e,r,"","",(function(e){return t.call(n,e,i++)})),r}function C(e){if(-1===e._status){var t=e._result;t=t(),e._status=0,e._result=t,t.then((function(t){0===e._status&&(t=t.default,e._status=1,e._result=t)}),(function(t){0===e._status&&(e._status=2,e._result=t)}))}if(1===e._status)return e._result;throw e._result}var R={current:null};function T(){var e=R.current;if(null===e)throw Error(d(321));return e}var I={ReactCurrentDispatcher:R,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:v,IsSomeRendererActing:{current:!1},assign:r};t.Children={map:S,forEach:function(e,t,n){S(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return S(e,(function(){t++})),t},toArray:function(e){return S(e,(function(e){return e}))||[]},only:function(e){if(!k(e))throw Error(d(143));return e}},t.Component=h,t.PureComponent=y,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=I,t.cloneElement=function(e,t,n){if(null===e||void 0===e)throw Error(d(267,e));var o=r({},e.props),a=e.key,s=e.ref,$=e._owner;if(null!=t){if(void 0!==t.ref&&(s=t.ref,$=v.current),void 0!==t.key&&(a=""+t.key),e.type&&e.type.defaultProps)var l=e.type.defaultProps;for(u in t)b.call(t,u)&&!w.hasOwnProperty(u)&&(o[u]=void 0===t[u]&&void 0!==l?l[u]:t[u])}var u=arguments.length-2;if(1===u)o.children=n;else if(1<u){l=Array(u);for(var c=0;c<u;c++)l[c]=arguments[c+2];o.children=l}return{$$typeof:i,type:e.type,key:a,ref:s,props:o,_owner:$}},t.createContext=function(e,t){return void 0===t&&(t=null),(e={$$typeof:s,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:a,_context:e},e.Consumer=e},t.createElement=x,t.createFactory=function(e){var t=x.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:$,render:e}},t.isValidElement=k,t.lazy=function(e){return{$$typeof:u,_payload:{_status:-1,_result:e},_init:C}},t.memo=function(e,t){return{$$typeof:l,type:e,compare:void 0===t?null:t}},t.useCallback=function(e,t){return T().useCallback(e,t)},t.useContext=function(e,t){return T().useContext(e,t)},t.useDebugValue=function(){},t.useEffect=function(e,t){return T().useEffect(e,t)},t.useImperativeHandle=function(e,t,n){return T().useImperativeHandle(e,t,n)},t.useLayoutEffect=function(e,t){return T().useLayoutEffect(e,t)},t.useMemo=function(e,t){return T().useMemo(e,t)},t.useReducer=function(e,t,n){return T().useReducer(e,t,n)},t.useRef=function(e){return T().useRef(e)},t.useState=function(e){return T().useState(e)},t.version="17.0.2"},function(e,t,n){"use strict";var r=n(1),i=n(27),o=n(41);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}if(!r)throw Error(a(227));var s=new Set,$={};function l(e,t){u(e,t),u(e+"Capture",t)}function u(e,t){for($[e]=t,e=0;e<t.length;e++)s.add(t[e])}var c=!("undefined"===typeof window||"undefined"===typeof window.document||"undefined"===typeof window.document.createElement),f=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,d=Object.prototype.hasOwnProperty,p={},_={};function h(e,t,n,r,i,o,a){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=r,this.attributeNamespace=i,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=a}var m={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){m[e]=new h(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];m[t]=new h(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){m[e]=new h(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){m[e]=new h(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){m[e]=new h(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){m[e]=new h(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){m[e]=new h(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){m[e]=new h(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){m[e]=new h(e,5,!1,e.toLowerCase(),null,!1,!1)}));var y=/[\-:]([a-z])/g;function g(e){return e[1].toUpperCase()}function v(e,t,n,r){var i=m.hasOwnProperty(t)?m[t]:null;(null!==i?0===i.type:!r&&(2<t.length&&("o"===t[0]||"O"===t[0])&&("n"===t[1]||"N"===t[1])))||(function(e,t,n,r){if(null===t||"undefined"===typeof t||function(e,t,n,r){if(null!==n&&0===n.type)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return!r&&(null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}(e,t,n,r))return!0;if(r)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,i,r)&&(n=null),r||null===i?function(e){return!!d.call(_,e)||!d.call(p,e)&&(f.test(e)?_[e]=!0:(p[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):i.mustUseProperty?e[i.propertyName]=null===n?3!==i.type&&"":n:(t=i.attributeName,r=i.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(i=i.type)||4===i&&!0===n?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(y,g);m[t]=new h(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(y,g);m[t]=new h(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(y,g);m[t]=new h(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){m[e]=new h(e,1,!1,e.toLowerCase(),null,!1,!1)})),m.xlinkHref=new h("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){m[e]=new h(e,1,!1,e.toLowerCase(),null,!0,!0)}));var b=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,w=60103,x=60106,k=60107,E=60108,O=60114,A=60109,S=60110,C=60112,R=60113,T=60120,I=60115,N=60116,L=60121,D=60128,P=60129,M=60130,z=60131;if("function"===typeof Symbol&&Symbol.for){var F=Symbol.for;w=F("react.element"),x=F("react.portal"),k=F("react.fragment"),E=F("react.strict_mode"),O=F("react.profiler"),A=F("react.provider"),S=F("react.context"),C=F("react.forward_ref"),R=F("react.suspense"),T=F("react.suspense_list"),I=F("react.memo"),N=F("react.lazy"),L=F("react.block"),F("react.scope"),D=F("react.opaque.id"),P=F("react.debug_trace_mode"),M=F("react.offscreen"),z=F("react.legacy_hidden")}var j,B="function"===typeof Symbol&&Symbol.iterator;function q(e){return null===e||"object"!==typeof e?null:"function"===typeof(e=B&&e[B]||e["@@iterator"])?e:null}function U(e){if(void 0===j)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);j=t&&t[1]||""}return"\n"+j+e}var H=!1;function Y(e,t){if(!e||H)return"";H=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"===typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch($){var r=$}Reflect.construct(e,[],t)}else{try{t.call()}catch($){r=$}e.call(t.prototype)}else{try{throw Error()}catch($){r=$}e()}}catch($){if($&&r&&"string"===typeof $.stack){for(var i=$.stack.split("\n"),o=r.stack.split("\n"),a=i.length-1,s=o.length-1;1<=a&&0<=s&&i[a]!==o[s];)s--;for(;1<=a&&0<=s;a--,s--)if(i[a]!==o[s]){if(1!==a||1!==s)do{if(a--,0>--s||i[a]!==o[s])return"\n"+i[a].replace(" at new "," at ")}while(1<=a&&0<=s);break}}}finally{H=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?U(e):""}function W(e){switch(e.tag){case 5:return U(e.type);case 16:return U("Lazy");case 13:return U("Suspense");case 19:return U("SuspenseList");case 0:case 2:case 15:return e=Y(e.type,!1);case 11:return e=Y(e.type.render,!1);case 22:return e=Y(e.type._render,!1);case 1:return e=Y(e.type,!0);default:return""}}function V(e){if(null==e)return null;if("function"===typeof e)return e.displayName||e.name||null;if("string"===typeof e)return e;switch(e){case k:return"Fragment";case x:return"Portal";case O:return"Profiler";case E:return"StrictMode";case R:return"Suspense";case T:return"SuspenseList"}if("object"===typeof e)switch(e.$$typeof){case S:return(e.displayName||"Context")+".Consumer";case A:return(e._context.displayName||"Context")+".Provider";case C:var t=e.render;return t=t.displayName||t.name||"",e.displayName||(""!==t?"ForwardRef("+t+")":"ForwardRef");case I:return V(e.type);case L:return V(e._render);case N:t=e._payload,e=e._init;try{return V(e(t))}catch(n){}}return null}function K(e){switch(typeof e){case"boolean":case"number":case"object":case"string":case"undefined":return e;default:return""}}function G(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function X(e){e._valueTracker||(e._valueTracker=function(e){var t=G(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&"undefined"!==typeof n&&"function"===typeof n.get&&"function"===typeof n.set){var i=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(e){r=""+e,o.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function Q(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=G(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function J(e){if("undefined"===typeof(e=e||("undefined"!==typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function Z(e,t){var n=t.checked;return i({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function ee(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=K(null!=t.value?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function te(e,t){null!=(t=t.checked)&&v(e,"checked",t,!1)}function ne(e,t){te(e,t);var n=K(t.value),r=t.type;if(null!=n)"number"===r?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");t.hasOwnProperty("value")?ie(e,t.type,n):t.hasOwnProperty("defaultValue")&&ie(e,t.type,K(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function re(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!("submit"!==r&&"reset"!==r||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function ie(e,t,n){"number"===t&&J(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}function oe(e,t){return e=i({children:void 0},t),(t=function(e){var t="";return r.Children.forEach(e,(function(e){null!=e&&(t+=e)})),t}(t.children))&&(e.children=t),e}function ae(e,t,n,r){if(e=e.options,t){t={};for(var i=0;i<n.length;i++)t["$"+n[i]]=!0;for(n=0;n<e.length;n++)i=t.hasOwnProperty("$"+e[n].value),e[n].selected!==i&&(e[n].selected=i),i&&r&&(e[n].defaultSelected=!0)}else{for(n=""+K(n),t=null,i=0;i<e.length;i++){if(e[i].value===n)return e[i].selected=!0,void(r&&(e[i].defaultSelected=!0));null!==t||e[i].disabled||(t=e[i])}null!==t&&(t.selected=!0)}}function se(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(a(91));return i({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function $e(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(a(92));if(Array.isArray(n)){if(!(1>=n.length))throw Error(a(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:K(n)}}function le(e,t){var n=K(t.value),r=K(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=""+r)}function ue(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}var ce="http://www.w3.org/1999/xhtml",fe="http://www.w3.org/2000/svg";function de(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function pe(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?de(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var _e,he,me=(he=function(e,t){if(e.namespaceURI!==fe||"innerHTML"in e)e.innerHTML=t;else{for((_e=_e||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=_e.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction((function(){return he(e,t)}))}:he);function ye(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var ge={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},ve=["Webkit","ms","Moz","O"];function be(e,t,n){return null==t||"boolean"===typeof t||""===t?"":n||"number"!==typeof t||0===t||ge.hasOwnProperty(e)&&ge[e]?(""+t).trim():t+"px"}function we(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),i=be(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,i):e[n]=i}}Object.keys(ge).forEach((function(e){ve.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),ge[t]=ge[e]}))}));var xe=i({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ke(e,t){if(t){if(xe[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(a(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(a(60));if("object"!==typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(a(61))}if(null!=t.style&&"object"!==typeof t.style)throw Error(a(62))}}function Ee(e,t){if(-1===e.indexOf("-"))return"string"===typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}function Oe(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var Ae=null,Se=null,Ce=null;function Re(e){if(e=ri(e)){if("function"!==typeof Ae)throw Error(a(280));var t=e.stateNode;t&&(t=oi(t),Ae(e.stateNode,e.type,t))}}function Te(e){Se?Ce?Ce.push(e):Ce=[e]:Se=e}function Ie(){if(Se){var e=Se,t=Ce;if(Ce=Se=null,Re(e),t)for(e=0;e<t.length;e++)Re(t[e])}}function Ne(e,t){return e(t)}function Le(e,t,n,r,i){return e(t,n,r,i)}function De(){}var Pe=Ne,Me=!1,ze=!1;function Fe(){null===Se&&null===Ce||(De(),Ie())}function je(e,t){var n=e.stateNode;if(null===n)return null;var r=oi(n);if(null===r)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(r=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!r;break e;default:e=!1}if(e)return null;if(n&&"function"!==typeof n)throw Error(a(231,t,typeof n));return n}var Be=!1;if(c)try{var qe={};Object.defineProperty(qe,"passive",{get:function(){Be=!0}}),window.addEventListener("test",qe,qe),window.removeEventListener("test",qe,qe)}catch(he){Be=!1}function Ue(e,t,n,r,i,o,a,s,$){var l=Array.prototype.slice.call(arguments,3);try{t.apply(n,l)}catch(u){this.onError(u)}}var He=!1,Ye=null,We=!1,Ve=null,Ke={onError:function(e){He=!0,Ye=e}};function Ge(e,t,n,r,i,o,a,s,$){He=!1,Ye=null,Ue.apply(Ke,arguments)}function Xe(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{0!==(1026&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function Qe(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function Je(e){if(Xe(e)!==e)throw Error(a(188))}function Ze(e){if(e=function(e){var t=e.alternate;if(!t){if(null===(t=Xe(e)))throw Error(a(188));return t!==e?null:e}for(var n=e,r=t;;){var i=n.return;if(null===i)break;var o=i.alternate;if(null===o){if(null!==(r=i.return)){n=r;continue}break}if(i.child===o.child){for(o=i.child;o;){if(o===n)return Je(i),e;if(o===r)return Je(i),t;o=o.sibling}throw Error(a(188))}if(n.return!==r.return)n=i,r=o;else{for(var s=!1,$=i.child;$;){if($===n){s=!0,n=i,r=o;break}if($===r){s=!0,r=i,n=o;break}$=$.sibling}if(!s){for($=o.child;$;){if($===n){s=!0,n=o,r=i;break}if($===r){s=!0,r=o,n=i;break}$=$.sibling}if(!s)throw Error(a(189))}}if(n.alternate!==r)throw Error(a(190))}if(3!==n.tag)throw Error(a(188));return n.stateNode.current===n?e:t}(e),!e)return null;for(var t=e;;){if(5===t.tag||6===t.tag)return t;if(t.child)t.child.return=t,t=t.child;else{if(t===e)break;for(;!t.sibling;){if(!t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}}return null}function et(e,t){for(var n=e.alternate;null!==t;){if(t===e||t===n)return!0;t=t.return}return!1}var tt,nt,rt,it,ot=!1,at=[],st=null,$t=null,lt=null,ut=new Map,ct=new Map,ft=[],dt="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function pt(e,t,n,r,i){return{blockedOn:e,domEventName:t,eventSystemFlags:16|n,nativeEvent:i,targetContainers:[r]}}function _t(e,t){switch(e){case"focusin":case"focusout":st=null;break;case"dragenter":case"dragleave":$t=null;break;case"mouseover":case"mouseout":lt=null;break;case"pointerover":case"pointerout":ut.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":ct.delete(t.pointerId)}}function ht(e,t,n,r,i,o){return null===e||e.nativeEvent!==o?(e=pt(t,n,r,i,o),null!==t&&(null!==(t=ri(t))&&nt(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==i&&-1===t.indexOf(i)&&t.push(i),e)}function mt(e){var t=ni(e.target);if(null!==t){var n=Xe(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=Qe(n)))return e.blockedOn=t,void it(e.lanePriority,(function(){o.unstable_runWithPriority(e.priority,(function(){rt(n)}))}))}else if(3===t&&n.stateNode.hydrate)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function yt(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=Zt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=ri(n))&&nt(t),e.blockedOn=n,!1;t.shift()}return!0}function gt(e,t,n){yt(e)&&n.delete(t)}function vt(){for(ot=!1;0<at.length;){var e=at[0];if(null!==e.blockedOn){null!==(e=ri(e.blockedOn))&&tt(e);break}for(var t=e.targetContainers;0<t.length;){var n=Zt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n){e.blockedOn=n;break}t.shift()}null===e.blockedOn&&at.shift()}null!==st&&yt(st)&&(st=null),null!==$t&&yt($t)&&($t=null),null!==lt&&yt(lt)&&(lt=null),ut.forEach(gt),ct.forEach(gt)}function bt(e,t){e.blockedOn===t&&(e.blockedOn=null,ot||(ot=!0,o.unstable_scheduleCallback(o.unstable_NormalPriority,vt)))}function wt(e){function t(t){return bt(t,e)}if(0<at.length){bt(at[0],e);for(var n=1;n<at.length;n++){var r=at[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==st&&bt(st,e),null!==$t&&bt($t,e),null!==lt&&bt(lt,e),ut.forEach(t),ct.forEach(t),n=0;n<ft.length;n++)(r=ft[n]).blockedOn===e&&(r.blockedOn=null);for(;0<ft.length&&null===(n=ft[0]).blockedOn;)mt(n),null===n.blockedOn&&ft.shift()}function xt(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var kt={animationend:xt("Animation","AnimationEnd"),animationiteration:xt("Animation","AnimationIteration"),animationstart:xt("Animation","AnimationStart"),transitionend:xt("Transition","TransitionEnd")},Et={},Ot={};function At(e){if(Et[e])return Et[e];if(!kt[e])return e;var t,n=kt[e];for(t in n)if(n.hasOwnProperty(t)&&t in Ot)return Et[e]=n[t];return e}c&&(Ot=document.createElement("div").style,"AnimationEvent"in window||(delete kt.animationend.animation,delete kt.animationiteration.animation,delete kt.animationstart.animation),"TransitionEvent"in window||delete kt.transitionend.transition);var St=At("animationend"),Ct=At("animationiteration"),Rt=At("animationstart"),Tt=At("transitionend"),It=new Map,Nt=new Map,Lt=["abort","abort",St,"animationEnd",Ct,"animationIteration",Rt,"animationStart","canplay","canPlay","canplaythrough","canPlayThrough","durationchange","durationChange","emptied","emptied","encrypted","encrypted","ended","ended","error","error","gotpointercapture","gotPointerCapture","load","load","loadeddata","loadedData","loadedmetadata","loadedMetadata","loadstart","loadStart","lostpointercapture","lostPointerCapture","playing","playing","progress","progress","seeking","seeking","stalled","stalled","suspend","suspend","timeupdate","timeUpdate",Tt,"transitionEnd","waiting","waiting"];function Dt(e,t){for(var n=0;n<e.length;n+=2){var r=e[n],i=e[n+1];i="on"+(i[0].toUpperCase()+i.slice(1)),Nt.set(r,t),It.set(r,i),l(i,[r])}}(0,o.unstable_now)();var Pt=8;function Mt(e){if(0!==(1&e))return Pt=15,1;if(0!==(2&e))return Pt=14,2;if(0!==(4&e))return Pt=13,4;var t=24&e;return 0!==t?(Pt=12,t):0!==(32&e)?(Pt=11,32):0!==(t=192&e)?(Pt=10,t):0!==(256&e)?(Pt=9,256):0!==(t=3584&e)?(Pt=8,t):0!==(4096&e)?(Pt=7,4096):0!==(t=4186112&e)?(Pt=6,t):0!==(t=62914560&e)?(Pt=5,t):67108864&e?(Pt=4,67108864):0!==(134217728&e)?(Pt=3,134217728):0!==(t=805306368&e)?(Pt=2,t):0!==(1073741824&e)?(Pt=1,1073741824):(Pt=8,e)}function zt(e,t){var n=e.pendingLanes;if(0===n)return Pt=0;var r=0,i=0,o=e.expiredLanes,a=e.suspendedLanes,s=e.pingedLanes;if(0!==o)r=o,i=Pt=15;else if(0!==(o=134217727&n)){var $=o&~a;0!==$?(r=Mt($),i=Pt):0!==(s&=o)&&(r=Mt(s),i=Pt)}else 0!==(o=n&~a)?(r=Mt(o),i=Pt):0!==s&&(r=Mt(s),i=Pt);if(0===r)return 0;if(r=n&((0>(r=31-Ht(r))?0:1<<r)<<1)-1,0!==t&&t!==r&&0===(t&a)){if(Mt(t),i<=Pt)return t;Pt=i}if(0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)i=1<<(n=31-Ht(t)),r|=e[n],t&=~i;return r}function Ft(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function jt(e,t){switch(e){case 15:return 1;case 14:return 2;case 12:return 0===(e=Bt(24&~t))?jt(10,t):e;case 10:return 0===(e=Bt(192&~t))?jt(8,t):e;case 8:return 0===(e=Bt(3584&~t))&&(0===(e=Bt(4186112&~t))&&(e=512)),e;case 2:return 0===(t=Bt(805306368&~t))&&(t=268435456),t}throw Error(a(358,e))}function Bt(e){return e&-e}function qt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Ut(e,t,n){e.pendingLanes|=t;var r=t-1;e.suspendedLanes&=r,e.pingedLanes&=r,(e=e.eventTimes)[t=31-Ht(t)]=n}var Ht=Math.clz32?Math.clz32:function(e){return 0===e?32:31-(Yt(e)/Wt|0)|0},Yt=Math.log,Wt=Math.LN2;var Vt=o.unstable_UserBlockingPriority,Kt=o.unstable_runWithPriority,Gt=!0;function Xt(e,t,n,r){Me||De();var i=Jt,o=Me;Me=!0;try{Le(i,e,t,n,r)}finally{(Me=o)||Fe()}}function Qt(e,t,n,r){Kt(Vt,Jt.bind(null,e,t,n,r))}function Jt(e,t,n,r){var i;if(Gt)if((i=0===(4&t))&&0<at.length&&-1<dt.indexOf(e))e=pt(null,e,t,n,r),at.push(e);else{var o=Zt(e,t,n,r);if(null===o)i&&_t(e,r);else{if(i){if(-1<dt.indexOf(e))return e=pt(o,e,t,n,r),void at.push(e);if(function(e,t,n,r,i){switch(t){case"focusin":return st=ht(st,e,t,n,r,i),!0;case"dragenter":return $t=ht($t,e,t,n,r,i),!0;case"mouseover":return lt=ht(lt,e,t,n,r,i),!0;case"pointerover":var o=i.pointerId;return ut.set(o,ht(ut.get(o)||null,e,t,n,r,i)),!0;case"gotpointercapture":return o=i.pointerId,ct.set(o,ht(ct.get(o)||null,e,t,n,r,i)),!0}return!1}(o,e,t,n,r))return;_t(e,r)}Dr(e,t,r,null,n)}}}function Zt(e,t,n,r){var i=Oe(r);if(null!==(i=ni(i))){var o=Xe(i);if(null===o)i=null;else{var a=o.tag;if(13===a){if(null!==(i=Qe(o)))return i;i=null}else if(3===a){if(o.stateNode.hydrate)return 3===o.tag?o.stateNode.containerInfo:null;i=null}else o!==i&&(i=null)}}return Dr(e,t,r,i,n),null}var en=null,tn=null,nn=null;function rn(){if(nn)return nn;var e,t,n=tn,r=n.length,i="value"in en?en.value:en.textContent,o=i.length;for(e=0;e<r&&n[e]===i[e];e++);var a=r-e;for(t=1;t<=a&&n[r-t]===i[o-t];t++);return nn=i.slice(e,1<t?1-t:void 0)}function on(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function an(){return!0}function sn(){return!1}function $n(e){function t(t,n,r,i,o){for(var a in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=i,this.target=o,this.currentTarget=null,e)e.hasOwnProperty(a)&&(t=e[a],this[a]=t?t(i):i[a]);return this.isDefaultPrevented=(null!=i.defaultPrevented?i.defaultPrevented:!1===i.returnValue)?an:sn,this.isPropagationStopped=sn,this}return i(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!==typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=an)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!==typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=an)},persist:function(){},isPersistent:an}),t}var ln,un,cn,fn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},dn=$n(fn),pn=i({},fn,{view:0,detail:0}),_n=$n(pn),hn=i({},pn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Sn,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==cn&&(cn&&"mousemove"===e.type?(ln=e.screenX-cn.screenX,un=e.screenY-cn.screenY):un=ln=0,cn=e),ln)},movementY:function(e){return"movementY"in e?e.movementY:un}}),mn=$n(hn),yn=$n(i({},hn,{dataTransfer:0})),gn=$n(i({},pn,{relatedTarget:0})),vn=$n(i({},fn,{animationName:0,elapsedTime:0,pseudoElement:0})),bn=i({},fn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),wn=$n(bn),xn=$n(i({},fn,{data:0})),kn={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},En={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",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",224:"Meta"},On={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function An(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=On[e])&&!!t[e]}function Sn(){return An}var Cn=i({},pn,{key:function(e){if(e.key){var t=kn[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=on(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?En[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Sn,charCode:function(e){return"keypress"===e.type?on(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?on(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),Rn=$n(Cn),Tn=$n(i({},hn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),In=$n(i({},pn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Sn})),Nn=$n(i({},fn,{propertyName:0,elapsedTime:0,pseudoElement:0})),Ln=i({},hn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),Dn=$n(Ln),Pn=[9,13,27,32],Mn=c&&"CompositionEvent"in window,zn=null;c&&"documentMode"in document&&(zn=document.documentMode);var Fn=c&&"TextEvent"in window&&!zn,jn=c&&(!Mn||zn&&8<zn&&11>=zn),Bn=String.fromCharCode(32),qn=!1;function Un(e,t){switch(e){case"keyup":return-1!==Pn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Hn(e){return"object"===typeof(e=e.detail)&&"data"in e?e.data:null}var Yn=!1;var Wn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Vn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Wn[e.type]:"textarea"===t}function Kn(e,t,n,r){Te(r),0<(t=Mr(t,"onChange")).length&&(n=new dn("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Gn=null,Xn=null;function Qn(e){Cr(e,0)}function Jn(e){if(Q(ii(e)))return e}function Zn(e,t){if("change"===e)return t}var er=!1;if(c){var tr;if(c){var nr="oninput"in document;if(!nr){var rr=document.createElement("div");rr.setAttribute("oninput","return;"),nr="function"===typeof rr.oninput}tr=nr}else tr=!1;er=tr&&(!document.documentMode||9<document.documentMode)}function ir(){Gn&&(Gn.detachEvent("onpropertychange",or),Xn=Gn=null)}function or(e){if("value"===e.propertyName&&Jn(Xn)){var t=[];if(Kn(t,Xn,e,Oe(e)),e=Qn,Me)e(t);else{Me=!0;try{Ne(e,t)}finally{Me=!1,Fe()}}}}function ar(e,t,n){"focusin"===e?(ir(),Xn=n,(Gn=t).attachEvent("onpropertychange",or)):"focusout"===e&&ir()}function sr(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Jn(Xn)}function $r(e,t){if("click"===e)return Jn(t)}function lr(e,t){if("input"===e||"change"===e)return Jn(t)}var ur="function"===typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e===1/t)||e!==e&&t!==t},cr=Object.prototype.hasOwnProperty;function fr(e,t){if(ur(e,t))return!0;if("object"!==typeof e||null===e||"object"!==typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++)if(!cr.call(t,n[r])||!ur(e[n[r]],t[n[r]]))return!1;return!0}function dr(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function pr(e,t){var n,r=dr(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=dr(r)}}function _r(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?_r(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function hr(){for(var e=window,t=J();t instanceof e.HTMLIFrameElement;){try{var n="string"===typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=J((e=t.contentWindow).document)}return t}function mr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var yr=c&&"documentMode"in document&&11>=document.documentMode,gr=null,vr=null,br=null,wr=!1;function xr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;wr||null==gr||gr!==J(r)||("selectionStart"in(r=gr)&&mr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},br&&fr(br,r)||(br=r,0<(r=Mr(vr,"onSelect")).length&&(t=new dn("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=gr)))}Dt("cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focusin focus focusout blur input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "),0),Dt("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "),1),Dt(Lt,2);for(var kr="change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),Er=0;Er<kr.length;Er++)Nt.set(kr[Er],0);u("onMouseEnter",["mouseout","mouseover"]),u("onMouseLeave",["mouseout","mouseover"]),u("onPointerEnter",["pointerout","pointerover"]),u("onPointerLeave",["pointerout","pointerover"]),l("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),l("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),l("onBeforeInput",["compositionend","keypress","textInput","paste"]),l("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),l("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),l("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Or="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Ar=new Set("cancel close invalid load scroll toggle".split(" ").concat(Or));function Sr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,i,o,s,$,l){if(Ge.apply(this,arguments),He){if(!He)throw Error(a(198));var u=Ye;He=!1,Ye=null,We||(We=!0,Ve=u)}}(r,t,void 0,e),e.currentTarget=null}function Cr(e,t){t=0!==(4&t);for(var n=0;n<e.length;n++){var r=e[n],i=r.event;r=r.listeners;e:{var o=void 0;if(t)for(var a=r.length-1;0<=a;a--){var s=r[a],$=s.instance,l=s.currentTarget;if(s=s.listener,$!==o&&i.isPropagationStopped())break e;Sr(i,s,l),o=$}else for(a=0;a<r.length;a++){if($=(s=r[a]).instance,l=s.currentTarget,s=s.listener,$!==o&&i.isPropagationStopped())break e;Sr(i,s,l),o=$}}}if(We)throw e=Ve,We=!1,Ve=null,e}function Rr(e,t){var n=ai(t),r=e+"__bubble";n.has(r)||(Lr(t,e,2,!1),n.add(r))}var Tr="_reactListening"+Math.random().toString(36).slice(2);function Ir(e){e[Tr]||(e[Tr]=!0,s.forEach((function(t){Ar.has(t)||Nr(t,!1,e,null),Nr(t,!0,e,null)})))}function Nr(e,t,n,r){var i=4<arguments.length&&void 0!==arguments[4]?arguments[4]:0,o=n;if("selectionchange"===e&&9!==n.nodeType&&(o=n.ownerDocument),null!==r&&!t&&Ar.has(e)){if("scroll"!==e)return;i|=2,o=r}var a=ai(o),s=e+"__"+(t?"capture":"bubble");a.has(s)||(t&&(i|=4),Lr(o,e,i,t),a.add(s))}function Lr(e,t,n,r){var i=Nt.get(t);switch(void 0===i?2:i){case 0:i=Xt;break;case 1:i=Qt;break;default:i=Jt}n=i.bind(null,t,n,e),i=void 0,!Be||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(i=!0),r?void 0!==i?e.addEventListener(t,n,{capture:!0,passive:i}):e.addEventListener(t,n,!0):void 0!==i?e.addEventListener(t,n,{passive:i}):e.addEventListener(t,n,!1)}function Dr(e,t,n,r,i){var o=r;if(0===(1&t)&&0===(2&t)&&null!==r)e:for(;;){if(null===r)return;var a=r.tag;if(3===a||4===a){var s=r.stateNode.containerInfo;if(s===i||8===s.nodeType&&s.parentNode===i)break;if(4===a)for(a=r.return;null!==a;){var $=a.tag;if((3===$||4===$)&&(($=a.stateNode.containerInfo)===i||8===$.nodeType&&$.parentNode===i))return;a=a.return}for(;null!==s;){if(null===(a=ni(s)))return;if(5===($=a.tag)||6===$){r=o=a;continue e}s=s.parentNode}}r=r.return}!function(e,t,n){if(ze)return e(t,n);ze=!0;try{Pe(e,t,n)}finally{ze=!1,Fe()}}((function(){var r=o,i=Oe(n),a=[];e:{var s=It.get(e);if(void 0!==s){var $=dn,l=e;switch(e){case"keypress":if(0===on(n))break e;case"keydown":case"keyup":$=Rn;break;case"focusin":l="focus",$=gn;break;case"focusout":l="blur",$=gn;break;case"beforeblur":case"afterblur":$=gn;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":$=mn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":$=yn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":$=In;break;case St:case Ct:case Rt:$=vn;break;case Tt:$=Nn;break;case"scroll":$=_n;break;case"wheel":$=Dn;break;case"copy":case"cut":case"paste":$=wn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":$=Tn}var u=0!==(4&t),c=!u&&"scroll"===e,f=u?null!==s?s+"Capture":null:s;u=[];for(var d,p=r;null!==p;){var _=(d=p).stateNode;if(5===d.tag&&null!==_&&(d=_,null!==f&&(null!=(_=je(p,f))&&u.push(Pr(p,_,d)))),c)break;p=p.return}0<u.length&&(s=new $(s,l,null,n,i),a.push({event:s,listeners:u}))}}if(0===(7&t)){if($="mouseout"===e||"pointerout"===e,(!(s="mouseover"===e||"pointerover"===e)||0!==(16&t)||!(l=n.relatedTarget||n.fromElement)||!ni(l)&&!l[ei])&&($||s)&&(s=i.window===i?i:(s=i.ownerDocument)?s.defaultView||s.parentWindow:window,$?($=r,null!==(l=(l=n.relatedTarget||n.toElement)?ni(l):null)&&(l!==(c=Xe(l))||5!==l.tag&&6!==l.tag)&&(l=null)):($=null,l=r),$!==l)){if(u=mn,_="onMouseLeave",f="onMouseEnter",p="mouse","pointerout"!==e&&"pointerover"!==e||(u=Tn,_="onPointerLeave",f="onPointerEnter",p="pointer"),c=null==$?s:ii($),d=null==l?s:ii(l),(s=new u(_,p+"leave",$,n,i)).target=c,s.relatedTarget=d,_=null,ni(i)===r&&((u=new u(f,p+"enter",l,n,i)).target=d,u.relatedTarget=c,_=u),c=_,$&&l)e:{for(f=l,p=0,d=u=$;d;d=zr(d))p++;for(d=0,_=f;_;_=zr(_))d++;for(;0<p-d;)u=zr(u),p--;for(;0<d-p;)f=zr(f),d--;for(;p--;){if(u===f||null!==f&&u===f.alternate)break e;u=zr(u),f=zr(f)}u=null}else u=null;null!==$&&Fr(a,s,$,u,!1),null!==l&&null!==c&&Fr(a,c,l,u,!0)}if("select"===($=(s=r?ii(r):window).nodeName&&s.nodeName.toLowerCase())||"input"===$&&"file"===s.type)var h=Zn;else if(Vn(s))if(er)h=lr;else{h=sr;var m=ar}else($=s.nodeName)&&"input"===$.toLowerCase()&&("checkbox"===s.type||"radio"===s.type)&&(h=$r);switch(h&&(h=h(e,r))?Kn(a,h,n,i):(m&&m(e,s,r),"focusout"===e&&(m=s._wrapperState)&&m.controlled&&"number"===s.type&&ie(s,"number",s.value)),m=r?ii(r):window,e){case"focusin":(Vn(m)||"true"===m.contentEditable)&&(gr=m,vr=r,br=null);break;case"focusout":br=vr=gr=null;break;case"mousedown":wr=!0;break;case"contextmenu":case"mouseup":case"dragend":wr=!1,xr(a,n,i);break;case"selectionchange":if(yr)break;case"keydown":case"keyup":xr(a,n,i)}var y;if(Mn)e:{switch(e){case"compositionstart":var g="onCompositionStart";break e;case"compositionend":g="onCompositionEnd";break e;case"compositionupdate":g="onCompositionUpdate";break e}g=void 0}else Yn?Un(e,n)&&(g="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(g="onCompositionStart");g&&(jn&&"ko"!==n.locale&&(Yn||"onCompositionStart"!==g?"onCompositionEnd"===g&&Yn&&(y=rn()):(tn="value"in(en=i)?en.value:en.textContent,Yn=!0)),0<(m=Mr(r,g)).length&&(g=new xn(g,e,null,n,i),a.push({event:g,listeners:m}),y?g.data=y:null!==(y=Hn(n))&&(g.data=y))),(y=Fn?function(e,t){switch(e){case"compositionend":return Hn(t);case"keypress":return 32!==t.which?null:(qn=!0,Bn);case"textInput":return(e=t.data)===Bn&&qn?null:e;default:return null}}(e,n):function(e,t){if(Yn)return"compositionend"===e||!Mn&&Un(e,t)?(e=rn(),nn=tn=en=null,Yn=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return jn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(r=Mr(r,"onBeforeInput")).length&&(i=new xn("onBeforeInput","beforeinput",null,n,i),a.push({event:i,listeners:r}),i.data=y))}Cr(a,t)}))}function Pr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Mr(e,t){for(var n=t+"Capture",r=[];null!==e;){var i=e,o=i.stateNode;5===i.tag&&null!==o&&(i=o,null!=(o=je(e,n))&&r.unshift(Pr(e,o,i)),null!=(o=je(e,t))&&r.push(Pr(e,o,i))),e=e.return}return r}function zr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Fr(e,t,n,r,i){for(var o=t._reactName,a=[];null!==n&&n!==r;){var s=n,$=s.alternate,l=s.stateNode;if(null!==$&&$===r)break;5===s.tag&&null!==l&&(s=l,i?null!=($=je(n,o))&&a.unshift(Pr(n,$,s)):i||null!=($=je(n,o))&&a.push(Pr(n,$,s))),n=n.return}0!==a.length&&e.push({event:t,listeners:a})}function jr(){}var Br=null,qr=null;function Ur(e,t){switch(e){case"button":case"input":case"select":case"textarea":return!!t.autoFocus}return!1}function Hr(e,t){return"textarea"===e||"option"===e||"noscript"===e||"string"===typeof t.children||"number"===typeof t.children||"object"===typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var Yr="function"===typeof setTimeout?setTimeout:void 0,Wr="function"===typeof clearTimeout?clearTimeout:void 0;function Vr(e){1===e.nodeType?e.textContent="":9===e.nodeType&&(null!=(e=e.body)&&(e.textContent=""))}function Kr(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break}return e}function Gr(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}var Xr=0;var Qr=Math.random().toString(36).slice(2),Jr="__reactFiber$"+Qr,Zr="__reactProps$"+Qr,ei="__reactContainer$"+Qr,ti="__reactEvents$"+Qr;function ni(e){var t=e[Jr];if(t)return t;for(var n=e.parentNode;n;){if(t=n[ei]||n[Jr]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=Gr(e);null!==e;){if(n=e[Jr])return n;e=Gr(e)}return t}n=(e=n).parentNode}return null}function ri(e){return!(e=e[Jr]||e[ei])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function ii(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(a(33))}function oi(e){return e[Zr]||null}function ai(e){var t=e[ti];return void 0===t&&(t=e[ti]=new Set),t}var si=[],$i=-1;function li(e){return{current:e}}function ui(e){0>$i||(e.current=si[$i],si[$i]=null,$i--)}function ci(e,t){$i++,si[$i]=e.current,e.current=t}var fi={},di=li(fi),pi=li(!1),_i=fi;function hi(e,t){var n=e.type.contextTypes;if(!n)return fi;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var i,o={};for(i in n)o[i]=t[i];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function mi(e){return null!==(e=e.childContextTypes)&&void 0!==e}function yi(){ui(pi),ui(di)}function gi(e,t,n){if(di.current!==fi)throw Error(a(168));ci(di,t),ci(pi,n)}function vi(e,t,n){var r=e.stateNode;if(e=t.childContextTypes,"function"!==typeof r.getChildContext)return n;for(var o in r=r.getChildContext())if(!(o in e))throw Error(a(108,V(t)||"Unknown",o));return i({},n,r)}function bi(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||fi,_i=di.current,ci(di,e),ci(pi,pi.current),!0}function wi(e,t,n){var r=e.stateNode;if(!r)throw Error(a(169));n?(e=vi(e,t,_i),r.__reactInternalMemoizedMergedChildContext=e,ui(pi),ui(di),ci(di,e)):ui(pi),ci(pi,n)}var xi=null,ki=null,Ei=o.unstable_runWithPriority,Oi=o.unstable_scheduleCallback,Ai=o.unstable_cancelCallback,Si=o.unstable_shouldYield,Ci=o.unstable_requestPaint,Ri=o.unstable_now,Ti=o.unstable_getCurrentPriorityLevel,Ii=o.unstable_ImmediatePriority,Ni=o.unstable_UserBlockingPriority,Li=o.unstable_NormalPriority,Di=o.unstable_LowPriority,Pi=o.unstable_IdlePriority,Mi={},zi=void 0!==Ci?Ci:function(){},Fi=null,ji=null,Bi=!1,qi=Ri(),Ui=1e4>qi?Ri:function(){return Ri()-qi};function Hi(){switch(Ti()){case Ii:return 99;case Ni:return 98;case Li:return 97;case Di:return 96;case Pi:return 95;default:throw Error(a(332))}}function Yi(e){switch(e){case 99:return Ii;case 98:return Ni;case 97:return Li;case 96:return Di;case 95:return Pi;default:throw Error(a(332))}}function Wi(e,t){return e=Yi(e),Ei(e,t)}function Vi(e,t,n){return e=Yi(e),Oi(e,t,n)}function Ki(){if(null!==ji){var e=ji;ji=null,Ai(e)}Gi()}function Gi(){if(!Bi&&null!==Fi){Bi=!0;var e=0;try{var t=Fi;Wi(99,(function(){for(;e<t.length;e++){var n=t[e];do{n=n(!0)}while(null!==n)}})),Fi=null}catch(n){throw null!==Fi&&(Fi=Fi.slice(e+1)),Oi(Ii,Ki),n}finally{Bi=!1}}}var Xi=b.ReactCurrentBatchConfig;function Qi(e,t){if(e&&e.defaultProps){for(var n in t=i({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}var Ji=li(null),Zi=null,eo=null,to=null;function no(){to=eo=Zi=null}function ro(e){var t=Ji.current;ui(Ji),e.type._context._currentValue=t}function io(e,t){for(;null!==e;){var n=e.alternate;if((e.childLanes&t)===t){if(null===n||(n.childLanes&t)===t)break;n.childLanes|=t}else e.childLanes|=t,null!==n&&(n.childLanes|=t);e=e.return}}function oo(e,t){Zi=e,to=eo=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(0!==(e.lanes&t)&&(Ma=!0),e.firstContext=null)}function ao(e,t){if(to!==e&&!1!==t&&0!==t)if("number"===typeof t&&1073741823!==t||(to=e,t=1073741823),t={context:e,observedBits:t,next:null},null===eo){if(null===Zi)throw Error(a(308));eo=t,Zi.dependencies={lanes:0,firstContext:t,responders:null}}else eo=eo.next=t;return e._currentValue}var so=!1;function $o(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null},effects:null}}function lo(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function uo(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function co(e,t){if(null!==(e=e.updateQueue)){var n=(e=e.shared).pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}}function fo(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var i=null,o=null;if(null!==(n=n.firstBaseUpdate)){do{var a={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===o?i=o=a:o=o.next=a,n=n.next}while(null!==n);null===o?i=o=t:o=o.next=t}else i=o=t;return n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:o,shared:r.shared,effects:r.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function po(e,t,n,r){var o=e.updateQueue;so=!1;var a=o.firstBaseUpdate,s=o.lastBaseUpdate,$=o.shared.pending;if(null!==$){o.shared.pending=null;var l=$,u=l.next;l.next=null,null===s?a=u:s.next=u,s=l;var c=e.alternate;if(null!==c){var f=(c=c.updateQueue).lastBaseUpdate;f!==s&&(null===f?c.firstBaseUpdate=u:f.next=u,c.lastBaseUpdate=l)}}if(null!==a){for(f=o.baseState,s=0,c=u=l=null;;){$=a.lane;var d=a.eventTime;if((r&$)===$){null!==c&&(c=c.next={eventTime:d,lane:0,tag:a.tag,payload:a.payload,callback:a.callback,next:null});e:{var p=e,_=a;switch($=t,d=n,_.tag){case 1:if("function"===typeof(p=_.payload)){f=p.call(d,f,$);break e}f=p;break e;case 3:p.flags=-4097&p.flags|64;case 0:if(null===($="function"===typeof(p=_.payload)?p.call(d,f,$):p)||void 0===$)break e;f=i({},f,$);break e;case 2:so=!0}}null!==a.callback&&(e.flags|=32,null===($=o.effects)?o.effects=[a]:$.push(a))}else d={eventTime:d,lane:$,tag:a.tag,payload:a.payload,callback:a.callback,next:null},null===c?(u=c=d,l=f):c=c.next=d,s|=$;if(null===(a=a.next)){if(null===($=o.shared.pending))break;a=$.next,$.next=null,o.lastBaseUpdate=$,o.shared.pending=null}}null===c&&(l=f),o.baseState=l,o.firstBaseUpdate=u,o.lastBaseUpdate=c,Bs|=s,e.lanes=s,e.memoizedState=f}}function _o(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var r=e[t],i=r.callback;if(null!==i){if(r.callback=null,r=n,"function"!==typeof i)throw Error(a(191,i));i.call(r)}}}var ho=(new r.Component).refs;function mo(e,t,n,r){n=null===(n=n(r,t=e.memoizedState))||void 0===n?t:i({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var yo={isMounted:function(e){return!!(e=e._reactInternals)&&Xe(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=f$(),i=d$(e),o=uo(r,i);o.payload=t,void 0!==n&&null!==n&&(o.callback=n),co(e,o),p$(e,i,r)},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=f$(),i=d$(e),o=uo(r,i);o.tag=1,o.payload=t,void 0!==n&&null!==n&&(o.callback=n),co(e,o),p$(e,i,r)},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=f$(),r=d$(e),i=uo(n,r);i.tag=2,void 0!==t&&null!==t&&(i.callback=t),co(e,i),p$(e,r,n)}};function go(e,t,n,r,i,o,a){return"function"===typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,o,a):!t.prototype||!t.prototype.isPureReactComponent||(!fr(n,r)||!fr(i,o))}function vo(e,t,n){var r=!1,i=fi,o=t.contextType;return"object"===typeof o&&null!==o?o=ao(o):(i=mi(t)?_i:di.current,o=(r=null!==(r=t.contextTypes)&&void 0!==r)?hi(e,i):fi),t=new t(n,o),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=yo,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=i,e.__reactInternalMemoizedMaskedChildContext=o),t}function bo(e,t,n,r){e=t.state,"function"===typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"===typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&yo.enqueueReplaceState(t,t.state,null)}function wo(e,t,n,r){var i=e.stateNode;i.props=n,i.state=e.memoizedState,i.refs=ho,$o(e);var o=t.contextType;"object"===typeof o&&null!==o?i.context=ao(o):(o=mi(t)?_i:di.current,i.context=hi(e,o)),po(e,n,i,r),i.state=e.memoizedState,"function"===typeof(o=t.getDerivedStateFromProps)&&(mo(e,t,o,n),i.state=e.memoizedState),"function"===typeof t.getDerivedStateFromProps||"function"===typeof i.getSnapshotBeforeUpdate||"function"!==typeof i.UNSAFE_componentWillMount&&"function"!==typeof i.componentWillMount||(t=i.state,"function"===typeof i.componentWillMount&&i.componentWillMount(),"function"===typeof i.UNSAFE_componentWillMount&&i.UNSAFE_componentWillMount(),t!==i.state&&yo.enqueueReplaceState(i,i.state,null),po(e,n,i,r),i.state=e.memoizedState),"function"===typeof i.componentDidMount&&(e.flags|=4)}var xo=Array.isArray;function ko(e,t,n){if(null!==(e=n.ref)&&"function"!==typeof e&&"object"!==typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(a(309));var r=n.stateNode}if(!r)throw Error(a(147,e));var i=""+e;return null!==t&&null!==t.ref&&"function"===typeof t.ref&&t.ref._stringRef===i?t.ref:(t=function(e){var t=r.refs;t===ho&&(t=r.refs={}),null===e?delete t[i]:t[i]=e},t._stringRef=i,t)}if("string"!==typeof e)throw Error(a(284));if(!n._owner)throw Error(a(290,e))}return e}function Eo(e,t){if("textarea"!==e.type)throw Error(a(31,"[object Object]"===Object.prototype.toString.call(t)?"object with keys {"+Object.keys(t).join(", ")+"}":t))}function Oo(e){function t(t,n){if(e){var r=t.lastEffect;null!==r?(r.nextEffect=n,t.lastEffect=n):t.firstEffect=t.lastEffect=n,n.nextEffect=null,n.flags=8}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function i(e,t){return(e=W$(e,t)).index=0,e.sibling=null,e}function o(t,n,r){return t.index=r,e?null!==(r=t.alternate)?(r=r.index)<n?(t.flags=2,n):r:(t.flags=2,n):n}function s(t){return e&&null===t.alternate&&(t.flags=2),t}function $(e,t,n,r){return null===t||6!==t.tag?((t=X$(n,e.mode,r)).return=e,t):((t=i(t,n)).return=e,t)}function l(e,t,n,r){return null!==t&&t.elementType===n.type?((r=i(t,n.props)).ref=ko(e,t,n),r.return=e,r):((r=V$(n.type,n.key,n.props,null,e.mode,r)).ref=ko(e,t,n),r.return=e,r)}function u(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=Q$(n,e.mode,r)).return=e,t):((t=i(t,n.children||[])).return=e,t)}function c(e,t,n,r,o){return null===t||7!==t.tag?((t=K$(n,e.mode,r,o)).return=e,t):((t=i(t,n)).return=e,t)}function f(e,t,n){if("string"===typeof t||"number"===typeof t)return(t=X$(""+t,e.mode,n)).return=e,t;if("object"===typeof t&&null!==t){switch(t.$$typeof){case w:return(n=V$(t.type,t.key,t.props,null,e.mode,n)).ref=ko(e,null,t),n.return=e,n;case x:return(t=Q$(t,e.mode,n)).return=e,t}if(xo(t)||q(t))return(t=K$(t,e.mode,n,null)).return=e,t;Eo(e,t)}return null}function d(e,t,n,r){var i=null!==t?t.key:null;if("string"===typeof n||"number"===typeof n)return null!==i?null:$(e,t,""+n,r);if("object"===typeof n&&null!==n){switch(n.$$typeof){case w:return n.key===i?n.type===k?c(e,t,n.props.children,r,i):l(e,t,n,r):null;case x:return n.key===i?u(e,t,n,r):null}if(xo(n)||q(n))return null!==i?null:c(e,t,n,r,null);Eo(e,n)}return null}function p(e,t,n,r,i){if("string"===typeof r||"number"===typeof r)return $(t,e=e.get(n)||null,""+r,i);if("object"===typeof r&&null!==r){switch(r.$$typeof){case w:return e=e.get(null===r.key?n:r.key)||null,r.type===k?c(t,e,r.props.children,i,r.key):l(t,e,r,i);case x:return u(t,e=e.get(null===r.key?n:r.key)||null,r,i)}if(xo(r)||q(r))return c(t,e=e.get(n)||null,r,i,null);Eo(t,r)}return null}function _(i,a,s,$){for(var l=null,u=null,c=a,_=a=0,h=null;null!==c&&_<s.length;_++){c.index>_?(h=c,c=null):h=c.sibling;var m=d(i,c,s[_],$);if(null===m){null===c&&(c=h);break}e&&c&&null===m.alternate&&t(i,c),a=o(m,a,_),null===u?l=m:u.sibling=m,u=m,c=h}if(_===s.length)return n(i,c),l;if(null===c){for(;_<s.length;_++)null!==(c=f(i,s[_],$))&&(a=o(c,a,_),null===u?l=c:u.sibling=c,u=c);return l}for(c=r(i,c);_<s.length;_++)null!==(h=p(c,i,_,s[_],$))&&(e&&null!==h.alternate&&c.delete(null===h.key?_:h.key),a=o(h,a,_),null===u?l=h:u.sibling=h,u=h);return e&&c.forEach((function(e){return t(i,e)})),l}function h(i,s,$,l){var u=q($);if("function"!==typeof u)throw Error(a(150));if(null==($=u.call($)))throw Error(a(151));for(var c=u=null,_=s,h=s=0,m=null,y=$.next();null!==_&&!y.done;h++,y=$.next()){_.index>h?(m=_,_=null):m=_.sibling;var g=d(i,_,y.value,l);if(null===g){null===_&&(_=m);break}e&&_&&null===g.alternate&&t(i,_),s=o(g,s,h),null===c?u=g:c.sibling=g,c=g,_=m}if(y.done)return n(i,_),u;if(null===_){for(;!y.done;h++,y=$.next())null!==(y=f(i,y.value,l))&&(s=o(y,s,h),null===c?u=y:c.sibling=y,c=y);return u}for(_=r(i,_);!y.done;h++,y=$.next())null!==(y=p(_,i,h,y.value,l))&&(e&&null!==y.alternate&&_.delete(null===y.key?h:y.key),s=o(y,s,h),null===c?u=y:c.sibling=y,c=y);return e&&_.forEach((function(e){return t(i,e)})),u}return function(e,r,o,$){var l="object"===typeof o&&null!==o&&o.type===k&&null===o.key;l&&(o=o.props.children);var u="object"===typeof o&&null!==o;if(u)switch(o.$$typeof){case w:e:{for(u=o.key,l=r;null!==l;){if(l.key===u){if(7===l.tag){if(o.type===k){n(e,l.sibling),(r=i(l,o.props.children)).return=e,e=r;break e}}else if(l.elementType===o.type){n(e,l.sibling),(r=i(l,o.props)).ref=ko(e,l,o),r.return=e,e=r;break e}n(e,l);break}t(e,l),l=l.sibling}o.type===k?((r=K$(o.props.children,e.mode,$,o.key)).return=e,e=r):(($=V$(o.type,o.key,o.props,null,e.mode,$)).ref=ko(e,r,o),$.return=e,e=$)}return s(e);case x:e:{for(l=o.key;null!==r;){if(r.key===l){if(4===r.tag&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),(r=i(r,o.children||[])).return=e,e=r;break e}n(e,r);break}t(e,r),r=r.sibling}(r=Q$(o,e.mode,$)).return=e,e=r}return s(e)}if("string"===typeof o||"number"===typeof o)return o=""+o,null!==r&&6===r.tag?(n(e,r.sibling),(r=i(r,o)).return=e,e=r):(n(e,r),(r=X$(o,e.mode,$)).return=e,e=r),s(e);if(xo(o))return _(e,r,o,$);if(q(o))return h(e,r,o,$);if(u&&Eo(e,o),"undefined"===typeof o&&!l)switch(e.tag){case 1:case 22:case 0:case 11:case 15:throw Error(a(152,V(e.type)||"Component"))}return n(e,r)}}var Ao=Oo(!0),So=Oo(!1),Co={},Ro=li(Co),To=li(Co),Io=li(Co);function No(e){if(e===Co)throw Error(a(174));return e}function Lo(e,t){switch(ci(Io,t),ci(To,e),ci(Ro,Co),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:pe(null,"");break;default:t=pe(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}ui(Ro),ci(Ro,t)}function Do(){ui(Ro),ui(To),ui(Io)}function Po(e){No(Io.current);var t=No(Ro.current),n=pe(t,e.type);t!==n&&(ci(To,e),ci(Ro,n))}function Mo(e){To.current===e&&(ui(Ro),ui(To))}var zo=li(0);function Fo(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(0!==(64&t.flags))return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var jo=null,Bo=null,qo=!1;function Uo(e,t){var n=H$(5,null,null,0);n.elementType="DELETED",n.type="DELETED",n.stateNode=t,n.return=e,n.flags=8,null!==e.lastEffect?(e.lastEffect.nextEffect=n,e.lastEffect=n):e.firstEffect=e.lastEffect=n}function Ho(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,!0);default:return!1}}function Yo(e){if(qo){var t=Bo;if(t){var n=t;if(!Ho(e,t)){if(!(t=Kr(n.nextSibling))||!Ho(e,t))return e.flags=-1025&e.flags|2,qo=!1,void(jo=e);Uo(jo,n)}jo=e,Bo=Kr(t.firstChild)}else e.flags=-1025&e.flags|2,qo=!1,jo=e}}function Wo(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;jo=e}function Vo(e){if(e!==jo)return!1;if(!qo)return Wo(e),qo=!0,!1;var t=e.type;if(5!==e.tag||"head"!==t&&"body"!==t&&!Hr(t,e.memoizedProps))for(t=Bo;t;)Uo(e,t),t=Kr(t.nextSibling);if(Wo(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(a(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){Bo=Kr(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}Bo=null}}else Bo=jo?Kr(e.stateNode.nextSibling):null;return!0}function Ko(){Bo=jo=null,qo=!1}var Go=[];function Xo(){for(var e=0;e<Go.length;e++)Go[e]._workInProgressVersionPrimary=null;Go.length=0}var Qo=b.ReactCurrentDispatcher,Jo=b.ReactCurrentBatchConfig,Zo=0,ea=null,ta=null,na=null,ra=!1,ia=!1;function oa(){throw Error(a(321))}function aa(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!ur(e[n],t[n]))return!1;return!0}function sa(e,t,n,r,i,o){if(Zo=o,ea=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Qo.current=null===e||null===e.memoizedState?Na:La,e=n(r,i),ia){o=0;do{if(ia=!1,!(25>o))throw Error(a(301));o+=1,na=ta=null,t.updateQueue=null,Qo.current=Da,e=n(r,i)}while(ia)}if(Qo.current=Ia,t=null!==ta&&null!==ta.next,Zo=0,na=ta=ea=null,ra=!1,t)throw Error(a(300));return e}function $a(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===na?ea.memoizedState=na=e:na=na.next=e,na}function la(){if(null===ta){var e=ea.alternate;e=null!==e?e.memoizedState:null}else e=ta.next;var t=null===na?ea.memoizedState:na.next;if(null!==t)na=t,ta=e;else{if(null===e)throw Error(a(310));e={memoizedState:(ta=e).memoizedState,baseState:ta.baseState,baseQueue:ta.baseQueue,queue:ta.queue,next:null},null===na?ea.memoizedState=na=e:na=na.next=e}return na}function ua(e,t){return"function"===typeof t?t(e):t}function ca(e){var t=la(),n=t.queue;if(null===n)throw Error(a(311));n.lastRenderedReducer=e;var r=ta,i=r.baseQueue,o=n.pending;if(null!==o){if(null!==i){var s=i.next;i.next=o.next,o.next=s}r.baseQueue=i=o,n.pending=null}if(null!==i){i=i.next,r=r.baseState;var $=s=o=null,l=i;do{var u=l.lane;if((Zo&u)===u)null!==$&&($=$.next={lane:0,action:l.action,eagerReducer:l.eagerReducer,eagerState:l.eagerState,next:null}),r=l.eagerReducer===e?l.eagerState:e(r,l.action);else{var c={lane:u,action:l.action,eagerReducer:l.eagerReducer,eagerState:l.eagerState,next:null};null===$?(s=$=c,o=r):$=$.next=c,ea.lanes|=u,Bs|=u}l=l.next}while(null!==l&&l!==i);null===$?o=r:$.next=s,ur(r,t.memoizedState)||(Ma=!0),t.memoizedState=r,t.baseState=o,t.baseQueue=$,n.lastRenderedState=r}return[t.memoizedState,n.dispatch]}function fa(e){var t=la(),n=t.queue;if(null===n)throw Error(a(311));n.lastRenderedReducer=e;var r=n.dispatch,i=n.pending,o=t.memoizedState;if(null!==i){n.pending=null;var s=i=i.next;do{o=e(o,s.action),s=s.next}while(s!==i);ur(o,t.memoizedState)||(Ma=!0),t.memoizedState=o,null===t.baseQueue&&(t.baseState=o),n.lastRenderedState=o}return[o,r]}function da(e,t,n){var r=t._getVersion;r=r(t._source);var i=t._workInProgressVersionPrimary;if(null!==i?e=i===r:(e=e.mutableReadLanes,(e=(Zo&e)===e)&&(t._workInProgressVersionPrimary=r,Go.push(t))),e)return n(t._source);throw Go.push(t),Error(a(350))}function pa(e,t,n,r){var i=Ns;if(null===i)throw Error(a(349));var o=t._getVersion,s=o(t._source),$=Qo.current,l=$.useState((function(){return da(i,t,n)})),u=l[1],c=l[0];l=na;var f=e.memoizedState,d=f.refs,p=d.getSnapshot,_=f.source;f=f.subscribe;var h=ea;return e.memoizedState={refs:d,source:t,subscribe:r},$.useEffect((function(){d.getSnapshot=n,d.setSnapshot=u;var e=o(t._source);if(!ur(s,e)){e=n(t._source),ur(c,e)||(u(e),e=d$(h),i.mutableReadLanes|=e&i.pendingLanes),e=i.mutableReadLanes,i.entangledLanes|=e;for(var r=i.entanglements,a=e;0<a;){var $=31-Ht(a),l=1<<$;r[$]|=e,a&=~l}}}),[n,t,r]),$.useEffect((function(){return r(t._source,(function(){var e=d.getSnapshot,n=d.setSnapshot;try{n(e(t._source));var r=d$(h);i.mutableReadLanes|=r&i.pendingLanes}catch(o){n((function(){throw o}))}}))}),[t,r]),ur(p,n)&&ur(_,t)&&ur(f,r)||((e={pending:null,dispatch:null,lastRenderedReducer:ua,lastRenderedState:c}).dispatch=u=Ta.bind(null,ea,e),l.queue=e,l.baseQueue=null,c=da(i,t,n),l.memoizedState=l.baseState=c),c}function _a(e,t,n){return pa(la(),e,t,n)}function ha(e){var t=$a();return"function"===typeof e&&(e=e()),t.memoizedState=t.baseState=e,e=(e=t.queue={pending:null,dispatch:null,lastRenderedReducer:ua,lastRenderedState:e}).dispatch=Ta.bind(null,ea,e),[t.memoizedState,e]}function ma(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===(t=ea.updateQueue)?(t={lastEffect:null},ea.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function ya(e){return e={current:e},$a().memoizedState=e}function ga(){return la().memoizedState}function va(e,t,n,r){var i=$a();ea.flags|=e,i.memoizedState=ma(1|t,n,void 0,void 0===r?null:r)}function ba(e,t,n,r){var i=la();r=void 0===r?null:r;var o=void 0;if(null!==ta){var a=ta.memoizedState;if(o=a.destroy,null!==r&&aa(r,a.deps))return void ma(t,n,o,r)}ea.flags|=e,i.memoizedState=ma(1|t,n,o,r)}function wa(e,t){return va(516,4,e,t)}function xa(e,t){return ba(516,4,e,t)}function ka(e,t){return ba(4,2,e,t)}function Ea(e,t){return"function"===typeof t?(e=e(),t(e),function(){t(null)}):null!==t&&void 0!==t?(e=e(),t.current=e,function(){t.current=null}):void 0}function Oa(e,t,n){return n=null!==n&&void 0!==n?n.concat([e]):null,ba(4,2,Ea.bind(null,t,e),n)}function Aa(){}function Sa(e,t){var n=la();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&aa(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Ca(e,t){var n=la();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&aa(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Ra(e,t){var n=Hi();Wi(98>n?98:n,(function(){e(!0)})),Wi(97<n?97:n,(function(){var n=Jo.transition;Jo.transition=1;try{e(!1),t()}finally{Jo.transition=n}}))}function Ta(e,t,n){var r=f$(),i=d$(e),o={lane:i,action:n,eagerReducer:null,eagerState:null,next:null},a=t.pending;if(null===a?o.next=o:(o.next=a.next,a.next=o),t.pending=o,a=e.alternate,e===ea||null!==a&&a===ea)ia=ra=!0;else{if(0===e.lanes&&(null===a||0===a.lanes)&&null!==(a=t.lastRenderedReducer))try{var s=t.lastRenderedState,$=a(s,n);if(o.eagerReducer=a,o.eagerState=$,ur($,s))return}catch(l){}p$(e,i,r)}}var Ia={readContext:ao,useCallback:oa,useContext:oa,useEffect:oa,useImperativeHandle:oa,useLayoutEffect:oa,useMemo:oa,useReducer:oa,useRef:oa,useState:oa,useDebugValue:oa,useDeferredValue:oa,useTransition:oa,useMutableSource:oa,useOpaqueIdentifier:oa,unstable_isNewReconciler:!1},Na={readContext:ao,useCallback:function(e,t){return $a().memoizedState=[e,void 0===t?null:t],e},useContext:ao,useEffect:wa,useImperativeHandle:function(e,t,n){return n=null!==n&&void 0!==n?n.concat([e]):null,va(4,2,Ea.bind(null,t,e),n)},useLayoutEffect:function(e,t){return va(4,2,e,t)},useMemo:function(e,t){var n=$a();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=$a();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e=(e=r.queue={pending:null,dispatch:null,lastRenderedReducer:e,lastRenderedState:t}).dispatch=Ta.bind(null,ea,e),[r.memoizedState,e]},useRef:ya,useState:ha,useDebugValue:Aa,useDeferredValue:function(e){var t=ha(e),n=t[0],r=t[1];return wa((function(){var t=Jo.transition;Jo.transition=1;try{r(e)}finally{Jo.transition=t}}),[e]),n},useTransition:function(){var e=ha(!1),t=e[0];return ya(e=Ra.bind(null,e[1])),[e,t]},useMutableSource:function(e,t,n){var r=$a();return r.memoizedState={refs:{getSnapshot:t,setSnapshot:null},source:e,subscribe:n},pa(r,e,t,n)},useOpaqueIdentifier:function(){if(qo){var e=!1,t=function(e){return{$$typeof:D,toString:e,valueOf:e}}((function(){throw e||(e=!0,n("r:"+(Xr++).toString(36))),Error(a(355))})),n=ha(t)[1];return 0===(2&ea.mode)&&(ea.flags|=516,ma(5,(function(){n("r:"+(Xr++).toString(36))}),void 0,null)),t}return ha(t="r:"+(Xr++).toString(36)),t},unstable_isNewReconciler:!1},La={readContext:ao,useCallback:Sa,useContext:ao,useEffect:xa,useImperativeHandle:Oa,useLayoutEffect:ka,useMemo:Ca,useReducer:ca,useRef:ga,useState:function(){return ca(ua)},useDebugValue:Aa,useDeferredValue:function(e){var t=ca(ua),n=t[0],r=t[1];return xa((function(){var t=Jo.transition;Jo.transition=1;try{r(e)}finally{Jo.transition=t}}),[e]),n},useTransition:function(){var e=ca(ua)[0];return[ga().current,e]},useMutableSource:_a,useOpaqueIdentifier:function(){return ca(ua)[0]},unstable_isNewReconciler:!1},Da={readContext:ao,useCallback:Sa,useContext:ao,useEffect:xa,useImperativeHandle:Oa,useLayoutEffect:ka,useMemo:Ca,useReducer:fa,useRef:ga,useState:function(){return fa(ua)},useDebugValue:Aa,useDeferredValue:function(e){var t=fa(ua),n=t[0],r=t[1];return xa((function(){var t=Jo.transition;Jo.transition=1;try{r(e)}finally{Jo.transition=t}}),[e]),n},useTransition:function(){var e=fa(ua)[0];return[ga().current,e]},useMutableSource:_a,useOpaqueIdentifier:function(){return fa(ua)[0]},unstable_isNewReconciler:!1},Pa=b.ReactCurrentOwner,Ma=!1;function za(e,t,n,r){t.child=null===e?So(t,null,n,r):Ao(t,e.child,n,r)}function Fa(e,t,n,r,i){n=n.render;var o=t.ref;return oo(t,i),r=sa(e,t,n,r,o,i),null===e||Ma?(t.flags|=1,za(e,t,r,i),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~i,os(e,t,i))}function ja(e,t,n,r,i,o){if(null===e){var a=n.type;return"function"!==typeof a||Y$(a)||void 0!==a.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=V$(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=a,Ba(e,t,a,r,i,o))}return a=e.child,0===(i&o)&&(i=a.memoizedProps,(n=null!==(n=n.compare)?n:fr)(i,r)&&e.ref===t.ref)?os(e,t,o):(t.flags|=1,(e=W$(a,r)).ref=t.ref,e.return=t,t.child=e)}function Ba(e,t,n,r,i,o){if(null!==e&&fr(e.memoizedProps,r)&&e.ref===t.ref){if(Ma=!1,0===(o&i))return t.lanes=e.lanes,os(e,t,o);0!==(16384&e.flags)&&(Ma=!0)}return Ha(e,t,n,r,o)}function qa(e,t,n){var r=t.pendingProps,i=r.children,o=null!==e?e.memoizedState:null;if("hidden"===r.mode||"unstable-defer-without-hiding"===r.mode)if(0===(4&t.mode))t.memoizedState={baseLanes:0},w$(t,n);else{if(0===(1073741824&n))return e=null!==o?o.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e},w$(t,e),null;t.memoizedState={baseLanes:0},w$(t,null!==o?o.baseLanes:n)}else null!==o?(r=o.baseLanes|n,t.memoizedState=null):r=n,w$(t,r);return za(e,t,i,n),t.child}function Ua(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=128)}function Ha(e,t,n,r,i){var o=mi(n)?_i:di.current;return o=hi(t,o),oo(t,i),n=sa(e,t,n,r,o,i),null===e||Ma?(t.flags|=1,za(e,t,n,i),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~i,os(e,t,i))}function Ya(e,t,n,r,i){if(mi(n)){var o=!0;bi(t)}else o=!1;if(oo(t,i),null===t.stateNode)null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),vo(t,n,r),wo(t,n,r,i),r=!0;else if(null===e){var a=t.stateNode,s=t.memoizedProps;a.props=s;var $=a.context,l=n.contextType;"object"===typeof l&&null!==l?l=ao(l):l=hi(t,l=mi(n)?_i:di.current);var u=n.getDerivedStateFromProps,c="function"===typeof u||"function"===typeof a.getSnapshotBeforeUpdate;c||"function"!==typeof a.UNSAFE_componentWillReceiveProps&&"function"!==typeof a.componentWillReceiveProps||(s!==r||$!==l)&&bo(t,a,r,l),so=!1;var f=t.memoizedState;a.state=f,po(t,r,a,i),$=t.memoizedState,s!==r||f!==$||pi.current||so?("function"===typeof u&&(mo(t,n,u,r),$=t.memoizedState),(s=so||go(t,n,s,r,f,$,l))?(c||"function"!==typeof a.UNSAFE_componentWillMount&&"function"!==typeof a.componentWillMount||("function"===typeof a.componentWillMount&&a.componentWillMount(),"function"===typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount()),"function"===typeof a.componentDidMount&&(t.flags|=4)):("function"===typeof a.componentDidMount&&(t.flags|=4),t.memoizedProps=r,t.memoizedState=$),a.props=r,a.state=$,a.context=l,r=s):("function"===typeof a.componentDidMount&&(t.flags|=4),r=!1)}else{a=t.stateNode,lo(e,t),s=t.memoizedProps,l=t.type===t.elementType?s:Qi(t.type,s),a.props=l,c=t.pendingProps,f=a.context,"object"===typeof($=n.contextType)&&null!==$?$=ao($):$=hi(t,$=mi(n)?_i:di.current);var d=n.getDerivedStateFromProps;(u="function"===typeof d||"function"===typeof a.getSnapshotBeforeUpdate)||"function"!==typeof a.UNSAFE_componentWillReceiveProps&&"function"!==typeof a.componentWillReceiveProps||(s!==c||f!==$)&&bo(t,a,r,$),so=!1,f=t.memoizedState,a.state=f,po(t,r,a,i);var p=t.memoizedState;s!==c||f!==p||pi.current||so?("function"===typeof d&&(mo(t,n,d,r),p=t.memoizedState),(l=so||go(t,n,l,r,f,p,$))?(u||"function"!==typeof a.UNSAFE_componentWillUpdate&&"function"!==typeof a.componentWillUpdate||("function"===typeof a.componentWillUpdate&&a.componentWillUpdate(r,p,$),"function"===typeof a.UNSAFE_componentWillUpdate&&a.UNSAFE_componentWillUpdate(r,p,$)),"function"===typeof a.componentDidUpdate&&(t.flags|=4),"function"===typeof a.getSnapshotBeforeUpdate&&(t.flags|=256)):("function"!==typeof a.componentDidUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!==typeof a.getSnapshotBeforeUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=256),t.memoizedProps=r,t.memoizedState=p),a.props=r,a.state=p,a.context=$,r=l):("function"!==typeof a.componentDidUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!==typeof a.getSnapshotBeforeUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=256),r=!1)}return Wa(e,t,n,r,o,i)}function Wa(e,t,n,r,i,o){Ua(e,t);var a=0!==(64&t.flags);if(!r&&!a)return i&&wi(t,n,!1),os(e,t,o);r=t.stateNode,Pa.current=t;var s=a&&"function"!==typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&a?(t.child=Ao(t,e.child,null,o),t.child=Ao(t,null,s,o)):za(e,t,s,o),t.memoizedState=r.state,i&&wi(t,n,!0),t.child}function Va(e){var t=e.stateNode;t.pendingContext?gi(0,t.pendingContext,t.pendingContext!==t.context):t.context&&gi(0,t.context,!1),Lo(e,t.containerInfo)}var Ka,Ga,Xa,Qa={dehydrated:null,retryLane:0};function Ja(e,t,n){var r,i=t.pendingProps,o=zo.current,a=!1;return(r=0!==(64&t.flags))||(r=(null===e||null!==e.memoizedState)&&0!==(2&o)),r?(a=!0,t.flags&=-65):null!==e&&null===e.memoizedState||void 0===i.fallback||!0===i.unstable_avoidThisFallback||(o|=1),ci(zo,1&o),null===e?(void 0!==i.fallback&&Yo(t),e=i.children,o=i.fallback,a?(e=Za(t,e,o,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Qa,e):"number"===typeof i.unstable_expectedLoadTime?(e=Za(t,e,o,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Qa,t.lanes=33554432,e):((n=G$({mode:"visible",children:e},t.mode,n,null)).return=t,t.child=n)):(e.memoizedState,a?(i=ts(e,t,i.children,i.fallback,n),a=t.child,o=e.child.memoizedState,a.memoizedState=null===o?{baseLanes:n}:{baseLanes:o.baseLanes|n},a.childLanes=e.childLanes&~n,t.memoizedState=Qa,i):(n=es(e,t,i.children,n),t.memoizedState=null,n))}function Za(e,t,n,r){var i=e.mode,o=e.child;return t={mode:"hidden",children:t},0===(2&i)&&null!==o?(o.childLanes=0,o.pendingProps=t):o=G$(t,i,0,null),n=K$(n,i,r,null),o.return=e,n.return=e,o.sibling=n,e.child=o,n}function es(e,t,n,r){var i=e.child;return e=i.sibling,n=W$(i,{mode:"visible",children:n}),0===(2&t.mode)&&(n.lanes=r),n.return=t,n.sibling=null,null!==e&&(e.nextEffect=null,e.flags=8,t.firstEffect=t.lastEffect=e),t.child=n}function ts(e,t,n,r,i){var o=t.mode,a=e.child;e=a.sibling;var s={mode:"hidden",children:n};return 0===(2&o)&&t.child!==a?((n=t.child).childLanes=0,n.pendingProps=s,null!==(a=n.lastEffect)?(t.firstEffect=n.firstEffect,t.lastEffect=a,a.nextEffect=null):t.firstEffect=t.lastEffect=null):n=W$(a,s),null!==e?r=W$(e,r):(r=K$(r,o,i,null)).flags|=2,r.return=t,n.return=t,n.sibling=r,t.child=n,r}function ns(e,t){e.lanes|=t;var n=e.alternate;null!==n&&(n.lanes|=t),io(e.return,t)}function rs(e,t,n,r,i,o){var a=e.memoizedState;null===a?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:i,lastEffect:o}:(a.isBackwards=t,a.rendering=null,a.renderingStartTime=0,a.last=r,a.tail=n,a.tailMode=i,a.lastEffect=o)}function is(e,t,n){var r=t.pendingProps,i=r.revealOrder,o=r.tail;if(za(e,t,r.children,n),0!==(2&(r=zo.current)))r=1&r|2,t.flags|=64;else{if(null!==e&&0!==(64&e.flags))e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&ns(e,n);else if(19===e.tag)ns(e,n);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(ci(zo,r),0===(2&t.mode))t.memoizedState=null;else switch(i){case"forwards":for(n=t.child,i=null;null!==n;)null!==(e=n.alternate)&&null===Fo(e)&&(i=n),n=n.sibling;null===(n=i)?(i=t.child,t.child=null):(i=n.sibling,n.sibling=null),rs(t,!1,i,n,o,t.lastEffect);break;case"backwards":for(n=null,i=t.child,t.child=null;null!==i;){if(null!==(e=i.alternate)&&null===Fo(e)){t.child=i;break}e=i.sibling,i.sibling=n,n=i,i=e}rs(t,!0,n,null,o,t.lastEffect);break;case"together":rs(t,!1,null,null,void 0,t.lastEffect);break;default:t.memoizedState=null}return t.child}function os(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Bs|=t.lanes,0!==(n&t.childLanes)){if(null!==e&&t.child!==e.child)throw Error(a(153));if(null!==t.child){for(n=W$(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=W$(e,e.pendingProps)).return=t;n.sibling=null}return t.child}return null}function as(e,t){if(!qo)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function ss(e,t,n){var r=t.pendingProps;switch(t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:case 17:return mi(t.type)&&yi(),null;case 3:return Do(),ui(pi),ui(di),Xo(),(r=t.stateNode).pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(Vo(t)?t.flags|=4:r.hydrate||(t.flags|=256)),null;case 5:Mo(t);var o=No(Io.current);if(n=t.type,null!==e&&null!=t.stateNode)Ga(e,t,n,r),e.ref!==t.ref&&(t.flags|=128);else{if(!r){if(null===t.stateNode)throw Error(a(166));return null}if(e=No(Ro.current),Vo(t)){r=t.stateNode,n=t.type;var s=t.memoizedProps;switch(r[Jr]=t,r[Zr]=s,n){case"dialog":Rr("cancel",r),Rr("close",r);break;case"iframe":case"object":case"embed":Rr("load",r);break;case"video":case"audio":for(e=0;e<Or.length;e++)Rr(Or[e],r);break;case"source":Rr("error",r);break;case"img":case"image":case"link":Rr("error",r),Rr("load",r);break;case"details":Rr("toggle",r);break;case"input":ee(r,s),Rr("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!s.multiple},Rr("invalid",r);break;case"textarea":$e(r,s),Rr("invalid",r)}for(var l in ke(n,s),e=null,s)s.hasOwnProperty(l)&&(o=s[l],"children"===l?"string"===typeof o?r.textContent!==o&&(e=["children",o]):"number"===typeof o&&r.textContent!==""+o&&(e=["children",""+o]):$.hasOwnProperty(l)&&null!=o&&"onScroll"===l&&Rr("scroll",r));switch(n){case"input":X(r),re(r,s,!0);break;case"textarea":X(r),ue(r);break;case"select":case"option":break;default:"function"===typeof s.onClick&&(r.onclick=jr)}r=e,t.updateQueue=r,null!==r&&(t.flags|=4)}else{switch(l=9===o.nodeType?o:o.ownerDocument,e===ce&&(e=de(n)),e===ce?"script"===n?((e=l.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"===typeof r.is?e=l.createElement(n,{is:r.is}):(e=l.createElement(n),"select"===n&&(l=e,r.multiple?l.multiple=!0:r.size&&(l.size=r.size))):e=l.createElementNS(e,n),e[Jr]=t,e[Zr]=r,Ka(e,t),t.stateNode=e,l=Ee(n,r),n){case"dialog":Rr("cancel",e),Rr("close",e),o=r;break;case"iframe":case"object":case"embed":Rr("load",e),o=r;break;case"video":case"audio":for(o=0;o<Or.length;o++)Rr(Or[o],e);o=r;break;case"source":Rr("error",e),o=r;break;case"img":case"image":case"link":Rr("error",e),Rr("load",e),o=r;break;case"details":Rr("toggle",e),o=r;break;case"input":ee(e,r),o=Z(e,r),Rr("invalid",e);break;case"option":o=oe(e,r);break;case"select":e._wrapperState={wasMultiple:!!r.multiple},o=i({},r,{value:void 0}),Rr("invalid",e);break;case"textarea":$e(e,r),o=se(e,r),Rr("invalid",e);break;default:o=r}ke(n,o);var u=o;for(s in u)if(u.hasOwnProperty(s)){var c=u[s];"style"===s?we(e,c):"dangerouslySetInnerHTML"===s?null!=(c=c?c.__html:void 0)&&me(e,c):"children"===s?"string"===typeof c?("textarea"!==n||""!==c)&&ye(e,c):"number"===typeof c&&ye(e,""+c):"suppressContentEditableWarning"!==s&&"suppressHydrationWarning"!==s&&"autoFocus"!==s&&($.hasOwnProperty(s)?null!=c&&"onScroll"===s&&Rr("scroll",e):null!=c&&v(e,s,c,l))}switch(n){case"input":X(e),re(e,r,!1);break;case"textarea":X(e),ue(e);break;case"option":null!=r.value&&e.setAttribute("value",""+K(r.value));break;case"select":e.multiple=!!r.multiple,null!=(s=r.value)?ae(e,!!r.multiple,s,!1):null!=r.defaultValue&&ae(e,!!r.multiple,r.defaultValue,!0);break;default:"function"===typeof o.onClick&&(e.onclick=jr)}Ur(n,r)&&(t.flags|=4)}null!==t.ref&&(t.flags|=128)}return null;case 6:if(e&&null!=t.stateNode)Xa(0,t,e.memoizedProps,r);else{if("string"!==typeof r&&null===t.stateNode)throw Error(a(166));n=No(Io.current),No(Ro.current),Vo(t)?(r=t.stateNode,n=t.memoizedProps,r[Jr]=t,r.nodeValue!==n&&(t.flags|=4)):((r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[Jr]=t,t.stateNode=r)}return null;case 13:return ui(zo),r=t.memoizedState,0!==(64&t.flags)?(t.lanes=n,t):(r=null!==r,n=!1,null===e?void 0!==t.memoizedProps.fallback&&Vo(t):n=null!==e.memoizedState,r&&!n&&0!==(2&t.mode)&&(null===e&&!0!==t.memoizedProps.unstable_avoidThisFallback||0!==(1&zo.current)?0===zs&&(zs=3):(0!==zs&&3!==zs||(zs=4),null===Ns||0===(134217727&Bs)&&0===(134217727&qs)||y$(Ns,Ds))),(r||n)&&(t.flags|=4),null);case 4:return Do(),null===e&&Ir(t.stateNode.containerInfo),null;case 10:return ro(t),null;case 19:if(ui(zo),null===(r=t.memoizedState))return null;if(s=0!==(64&t.flags),null===(l=r.rendering))if(s)as(r,!1);else{if(0!==zs||null!==e&&0!==(64&e.flags))for(e=t.child;null!==e;){if(null!==(l=Fo(e))){for(t.flags|=64,as(r,!1),null!==(s=l.updateQueue)&&(t.updateQueue=s,t.flags|=4),null===r.lastEffect&&(t.firstEffect=null),t.lastEffect=r.lastEffect,r=n,n=t.child;null!==n;)e=r,(s=n).flags&=2,s.nextEffect=null,s.firstEffect=null,s.lastEffect=null,null===(l=s.alternate)?(s.childLanes=0,s.lanes=e,s.child=null,s.memoizedProps=null,s.memoizedState=null,s.updateQueue=null,s.dependencies=null,s.stateNode=null):(s.childLanes=l.childLanes,s.lanes=l.lanes,s.child=l.child,s.memoizedProps=l.memoizedProps,s.memoizedState=l.memoizedState,s.updateQueue=l.updateQueue,s.type=l.type,e=l.dependencies,s.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return ci(zo,1&zo.current|2),t.child}e=e.sibling}null!==r.tail&&Ui()>Ws&&(t.flags|=64,s=!0,as(r,!1),t.lanes=33554432)}else{if(!s)if(null!==(e=Fo(l))){if(t.flags|=64,s=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),as(r,!0),null===r.tail&&"hidden"===r.tailMode&&!l.alternate&&!qo)return null!==(t=t.lastEffect=r.lastEffect)&&(t.nextEffect=null),null}else 2*Ui()-r.renderingStartTime>Ws&&1073741824!==n&&(t.flags|=64,s=!0,as(r,!1),t.lanes=33554432);r.isBackwards?(l.sibling=t.child,t.child=l):(null!==(n=r.last)?n.sibling=l:t.child=l,r.last=l)}return null!==r.tail?(n=r.tail,r.rendering=n,r.tail=n.sibling,r.lastEffect=t.lastEffect,r.renderingStartTime=Ui(),n.sibling=null,t=zo.current,ci(zo,s?1&t|2:1&t),n):null;case 23:case 24:return x$(),null!==e&&null!==e.memoizedState!==(null!==t.memoizedState)&&"unstable-defer-without-hiding"!==r.mode&&(t.flags|=4),null}throw Error(a(156,t.tag))}function $s(e){switch(e.tag){case 1:mi(e.type)&&yi();var t=e.flags;return 4096&t?(e.flags=-4097&t|64,e):null;case 3:if(Do(),ui(pi),ui(di),Xo(),0!==(64&(t=e.flags)))throw Error(a(285));return e.flags=-4097&t|64,e;case 5:return Mo(e),null;case 13:return ui(zo),4096&(t=e.flags)?(e.flags=-4097&t|64,e):null;case 19:return ui(zo),null;case 4:return Do(),null;case 10:return ro(e),null;case 23:case 24:return x$(),null;default:return null}}function ls(e,t){try{var n="",r=t;do{n+=W(r),r=r.return}while(r);var i=n}catch(o){i="\nError generating stack: "+o.message+"\n"+o.stack}return{value:e,source:t,stack:i}}function us(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}Ka=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Ga=function(e,t,n,r){var o=e.memoizedProps;if(o!==r){e=t.stateNode,No(Ro.current);var a,s=null;switch(n){case"input":o=Z(e,o),r=Z(e,r),s=[];break;case"option":o=oe(e,o),r=oe(e,r),s=[];break;case"select":o=i({},o,{value:void 0}),r=i({},r,{value:void 0}),s=[];break;case"textarea":o=se(e,o),r=se(e,r),s=[];break;default:"function"!==typeof o.onClick&&"function"===typeof r.onClick&&(e.onclick=jr)}for(c in ke(n,r),n=null,o)if(!r.hasOwnProperty(c)&&o.hasOwnProperty(c)&&null!=o[c])if("style"===c){var l=o[c];for(a in l)l.hasOwnProperty(a)&&(n||(n={}),n[a]="")}else"dangerouslySetInnerHTML"!==c&&"children"!==c&&"suppressContentEditableWarning"!==c&&"suppressHydrationWarning"!==c&&"autoFocus"!==c&&($.hasOwnProperty(c)?s||(s=[]):(s=s||[]).push(c,null));for(c in r){var u=r[c];if(l=null!=o?o[c]:void 0,r.hasOwnProperty(c)&&u!==l&&(null!=u||null!=l))if("style"===c)if(l){for(a in l)!l.hasOwnProperty(a)||u&&u.hasOwnProperty(a)||(n||(n={}),n[a]="");for(a in u)u.hasOwnProperty(a)&&l[a]!==u[a]&&(n||(n={}),n[a]=u[a])}else n||(s||(s=[]),s.push(c,n)),n=u;else"dangerouslySetInnerHTML"===c?(u=u?u.__html:void 0,l=l?l.__html:void 0,null!=u&&l!==u&&(s=s||[]).push(c,u)):"children"===c?"string"!==typeof u&&"number"!==typeof u||(s=s||[]).push(c,""+u):"suppressContentEditableWarning"!==c&&"suppressHydrationWarning"!==c&&($.hasOwnProperty(c)?(null!=u&&"onScroll"===c&&Rr("scroll",e),s||l===u||(s=[])):"object"===typeof u&&null!==u&&u.$$typeof===D?u.toString():(s=s||[]).push(c,u))}n&&(s=s||[]).push("style",n);var c=s;(t.updateQueue=c)&&(t.flags|=4)}},Xa=function(e,t,n,r){n!==r&&(t.flags|=4)};var cs="function"===typeof WeakMap?WeakMap:Map;function fs(e,t,n){(n=uo(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Xs||(Xs=!0,Qs=r),us(0,t)},n}function ds(e,t,n){(n=uo(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"===typeof r){var i=t.value;n.payload=function(){return us(0,t),r(i)}}var o=e.stateNode;return null!==o&&"function"===typeof o.componentDidCatch&&(n.callback=function(){"function"!==typeof r&&(null===Js?Js=new Set([this]):Js.add(this),us(0,t));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}var ps="function"===typeof WeakSet?WeakSet:Set;function _s(e){var t=e.ref;if(null!==t)if("function"===typeof t)try{t(null)}catch(n){j$(e,n)}else t.current=null}function hs(e,t){switch(t.tag){case 0:case 11:case 15:case 22:case 5:case 6:case 4:case 17:return;case 1:if(256&t.flags&&null!==e){var n=e.memoizedProps,r=e.memoizedState;t=(e=t.stateNode).getSnapshotBeforeUpdate(t.elementType===t.type?n:Qi(t.type,n),r),e.__reactInternalSnapshotBeforeUpdate=t}return;case 3:return void(256&t.flags&&Vr(t.stateNode.containerInfo))}throw Error(a(163))}function ms(e,t,n){switch(n.tag){case 0:case 11:case 15:case 22:if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{if(3===(3&e.tag)){var r=e.create;e.destroy=r()}e=e.next}while(e!==t)}if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{var i=e;r=i.next,0!==(4&(i=i.tag))&&0!==(1&i)&&(M$(n,e),P$(n,e)),e=r}while(e!==t)}return;case 1:return e=n.stateNode,4&n.flags&&(null===t?e.componentDidMount():(r=n.elementType===n.type?t.memoizedProps:Qi(n.type,t.memoizedProps),e.componentDidUpdate(r,t.memoizedState,e.__reactInternalSnapshotBeforeUpdate))),void(null!==(t=n.updateQueue)&&_o(n,t,e));case 3:if(null!==(t=n.updateQueue)){if(e=null,null!==n.child)switch(n.child.tag){case 5:case 1:e=n.child.stateNode}_o(n,t,e)}return;case 5:return e=n.stateNode,void(null===t&&4&n.flags&&Ur(n.type,n.memoizedProps)&&e.focus());case 6:case 4:case 12:case 19:case 17:case 20:case 21:case 23:case 24:return;case 13:return void(null===n.memoizedState&&(n=n.alternate,null!==n&&(n=n.memoizedState,null!==n&&(n=n.dehydrated,null!==n&&wt(n)))))}throw Error(a(163))}function ys(e,t){for(var n=e;;){if(5===n.tag){var r=n.stateNode;if(t)"function"===typeof(r=r.style).setProperty?r.setProperty("display","none","important"):r.display="none";else{r=n.stateNode;var i=n.memoizedProps.style;i=void 0!==i&&null!==i&&i.hasOwnProperty("display")?i.display:null,r.style.display=be("display",i)}}else if(6===n.tag)n.stateNode.nodeValue=t?"":n.memoizedProps;else if((23!==n.tag&&24!==n.tag||null===n.memoizedState||n===e)&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===e)break;for(;null===n.sibling;){if(null===n.return||n.return===e)return;n=n.return}n.sibling.return=n.return,n=n.sibling}}function gs(e,t){if(ki&&"function"===typeof ki.onCommitFiberUnmount)try{ki.onCommitFiberUnmount(xi,t)}catch(o){}switch(t.tag){case 0:case 11:case 14:case 15:case 22:if(null!==(e=t.updateQueue)&&null!==(e=e.lastEffect)){var n=e=e.next;do{var r=n,i=r.destroy;if(r=r.tag,void 0!==i)if(0!==(4&r))M$(t,n);else{r=t;try{i()}catch(o){j$(r,o)}}n=n.next}while(n!==e)}break;case 1:if(_s(t),"function"===typeof(e=t.stateNode).componentWillUnmount)try{e.props=t.memoizedProps,e.state=t.memoizedState,e.componentWillUnmount()}catch(o){j$(t,o)}break;case 5:_s(t);break;case 4:Es(e,t)}}function vs(e){e.alternate=null,e.child=null,e.dependencies=null,e.firstEffect=null,e.lastEffect=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.return=null,e.updateQueue=null}function bs(e){return 5===e.tag||3===e.tag||4===e.tag}function ws(e){e:{for(var t=e.return;null!==t;){if(bs(t))break e;t=t.return}throw Error(a(160))}var n=t;switch(t=n.stateNode,n.tag){case 5:var r=!1;break;case 3:case 4:t=t.containerInfo,r=!0;break;default:throw Error(a(161))}16&n.flags&&(ye(t,""),n.flags&=-17);e:t:for(n=e;;){for(;null===n.sibling;){if(null===n.return||bs(n.return)){n=null;break e}n=n.return}for(n.sibling.return=n.return,n=n.sibling;5!==n.tag&&6!==n.tag&&18!==n.tag;){if(2&n.flags)continue t;if(null===n.child||4===n.tag)continue t;n.child.return=n,n=n.child}if(!(2&n.flags)){n=n.stateNode;break e}}r?xs(e,n,t):ks(e,n,t)}function xs(e,t,n){var r=e.tag,i=5===r||6===r;if(i)e=i?e.stateNode:e.stateNode.instance,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!==(n=n._reactRootContainer)&&void 0!==n||null!==t.onclick||(t.onclick=jr));else if(4!==r&&null!==(e=e.child))for(xs(e,t,n),e=e.sibling;null!==e;)xs(e,t,n),e=e.sibling}function ks(e,t,n){var r=e.tag,i=5===r||6===r;if(i)e=i?e.stateNode:e.stateNode.instance,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&null!==(e=e.child))for(ks(e,t,n),e=e.sibling;null!==e;)ks(e,t,n),e=e.sibling}function Es(e,t){for(var n,r,i=t,o=!1;;){if(!o){o=i.return;e:for(;;){if(null===o)throw Error(a(160));switch(n=o.stateNode,o.tag){case 5:r=!1;break e;case 3:case 4:n=n.containerInfo,r=!0;break e}o=o.return}o=!0}if(5===i.tag||6===i.tag){e:for(var s=e,$=i,l=$;;)if(gs(s,l),null!==l.child&&4!==l.tag)l.child.return=l,l=l.child;else{if(l===$)break e;for(;null===l.sibling;){if(null===l.return||l.return===$)break e;l=l.return}l.sibling.return=l.return,l=l.sibling}r?(s=n,$=i.stateNode,8===s.nodeType?s.parentNode.removeChild($):s.removeChild($)):n.removeChild(i.stateNode)}else if(4===i.tag){if(null!==i.child){n=i.stateNode.containerInfo,r=!0,i.child.return=i,i=i.child;continue}}else if(gs(e,i),null!==i.child){i.child.return=i,i=i.child;continue}if(i===t)break;for(;null===i.sibling;){if(null===i.return||i.return===t)return;4===(i=i.return).tag&&(o=!1)}i.sibling.return=i.return,i=i.sibling}}function Os(e,t){switch(t.tag){case 0:case 11:case 14:case 15:case 22:var n=t.updateQueue;if(null!==(n=null!==n?n.lastEffect:null)){var r=n=n.next;do{3===(3&r.tag)&&(e=r.destroy,r.destroy=void 0,void 0!==e&&e()),r=r.next}while(r!==n)}return;case 1:case 12:case 17:return;case 5:if(null!=(n=t.stateNode)){r=t.memoizedProps;var i=null!==e?e.memoizedProps:r;e=t.type;var o=t.updateQueue;if(t.updateQueue=null,null!==o){for(n[Zr]=r,"input"===e&&"radio"===r.type&&null!=r.name&&te(n,r),Ee(e,i),t=Ee(e,r),i=0;i<o.length;i+=2){var s=o[i],$=o[i+1];"style"===s?we(n,$):"dangerouslySetInnerHTML"===s?me(n,$):"children"===s?ye(n,$):v(n,s,$,t)}switch(e){case"input":ne(n,r);break;case"textarea":le(n,r);break;case"select":e=n._wrapperState.wasMultiple,n._wrapperState.wasMultiple=!!r.multiple,null!=(o=r.value)?ae(n,!!r.multiple,o,!1):e!==!!r.multiple&&(null!=r.defaultValue?ae(n,!!r.multiple,r.defaultValue,!0):ae(n,!!r.multiple,r.multiple?[]:"",!1))}}}return;case 6:if(null===t.stateNode)throw Error(a(162));return void(t.stateNode.nodeValue=t.memoizedProps);case 3:return void((n=t.stateNode).hydrate&&(n.hydrate=!1,wt(n.containerInfo)));case 13:return null!==t.memoizedState&&(Ys=Ui(),ys(t.child,!0)),void As(t);case 19:return void As(t);case 23:case 24:return void ys(t,null!==t.memoizedState)}throw Error(a(163))}function As(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new ps),t.forEach((function(t){var r=q$.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function Ss(e,t){return null!==e&&(null===(e=e.memoizedState)||null!==e.dehydrated)&&(null!==(t=t.memoizedState)&&null===t.dehydrated)}var Cs=Math.ceil,Rs=b.ReactCurrentDispatcher,Ts=b.ReactCurrentOwner,Is=0,Ns=null,Ls=null,Ds=0,Ps=0,Ms=li(0),zs=0,Fs=null,js=0,Bs=0,qs=0,Us=0,Hs=null,Ys=0,Ws=1/0;function Vs(){Ws=Ui()+500}var Ks,Gs=null,Xs=!1,Qs=null,Js=null,Zs=!1,e$=null,t$=90,n$=[],r$=[],i$=null,o$=0,a$=null,s$=-1,$$=0,l$=0,u$=null,c$=!1;function f$(){return 0!==(48&Is)?Ui():-1!==s$?s$:s$=Ui()}function d$(e){if(0===(2&(e=e.mode)))return 1;if(0===(4&e))return 99===Hi()?1:2;if(0===$$&&($$=js),0!==Xi.transition){0!==l$&&(l$=null!==Hs?Hs.pendingLanes:0),e=$$;var t=4186112&~l$;return 0===(t&=-t)&&(0===(t=(e=4186112&~e)&-e)&&(t=8192)),t}return e=Hi(),0!==(4&Is)&&98===e?e=jt(12,$$):e=jt(e=function(e){switch(e){case 99:return 15;case 98:return 10;case 97:case 96:return 8;case 95:return 2;default:return 0}}(e),$$),e}function p$(e,t,n){if(50<o$)throw o$=0,a$=null,Error(a(185));if(null===(e=_$(e,t)))return null;Ut(e,t,n),e===Ns&&(qs|=t,4===zs&&y$(e,Ds));var r=Hi();1===t?0!==(8&Is)&&0===(48&Is)?g$(e):(h$(e,n),0===Is&&(Vs(),Ki())):(0===(4&Is)||98!==r&&99!==r||(null===i$?i$=new Set([e]):i$.add(e)),h$(e,n)),Hs=e}function _$(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}function h$(e,t){for(var n=e.callbackNode,r=e.suspendedLanes,i=e.pingedLanes,o=e.expirationTimes,s=e.pendingLanes;0<s;){var $=31-Ht(s),l=1<<$,u=o[$];if(-1===u){if(0===(l&r)||0!==(l&i)){u=t,Mt(l);var c=Pt;o[$]=10<=c?u+250:6<=c?u+5e3:-1}}else u<=t&&(e.expiredLanes|=l);s&=~l}if(r=zt(e,e===Ns?Ds:0),t=Pt,0===r)null!==n&&(n!==Mi&&Ai(n),e.callbackNode=null,e.callbackPriority=0);else{if(null!==n){if(e.callbackPriority===t)return;n!==Mi&&Ai(n)}15===t?(n=g$.bind(null,e),null===Fi?(Fi=[n],ji=Oi(Ii,Gi)):Fi.push(n),n=Mi):14===t?n=Vi(99,g$.bind(null,e)):(n=function(e){switch(e){case 15:case 14:return 99;case 13:case 12:case 11:case 10:return 98;case 9:case 8:case 7:case 6:case 4:case 5:return 97;case 3:case 2:case 1:return 95;case 0:return 90;default:throw Error(a(358,e))}}(t),n=Vi(n,m$.bind(null,e))),e.callbackPriority=t,e.callbackNode=n}}function m$(e){if(s$=-1,l$=$$=0,0!==(48&Is))throw Error(a(327));var t=e.callbackNode;if(D$()&&e.callbackNode!==t)return null;var n=zt(e,e===Ns?Ds:0);if(0===n)return null;var r=n,i=Is;Is|=16;var o=O$();for(Ns===e&&Ds===r||(Vs(),k$(e,r));;)try{C$();break}catch($){E$(e,$)}if(no(),Rs.current=o,Is=i,null!==Ls?r=0:(Ns=null,Ds=0,r=zs),0!==(js&qs))k$(e,0);else if(0!==r){if(2===r&&(Is|=64,e.hydrate&&(e.hydrate=!1,Vr(e.containerInfo)),0!==(n=Ft(e))&&(r=A$(e,n))),1===r)throw t=Fs,k$(e,0),y$(e,n),h$(e,Ui()),t;switch(e.finishedWork=e.current.alternate,e.finishedLanes=n,r){case 0:case 1:throw Error(a(345));case 2:case 5:I$(e);break;case 3:if(y$(e,n),(62914560&n)===n&&10<(r=Ys+500-Ui())){if(0!==zt(e,0))break;if(((i=e.suspendedLanes)&n)!==n){f$(),e.pingedLanes|=e.suspendedLanes&i;break}e.timeoutHandle=Yr(I$.bind(null,e),r);break}I$(e);break;case 4:if(y$(e,n),(4186112&n)===n)break;for(r=e.eventTimes,i=-1;0<n;){var s=31-Ht(n);o=1<<s,(s=r[s])>i&&(i=s),n&=~o}if(n=i,10<(n=(120>(n=Ui()-n)?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*Cs(n/1960))-n)){e.timeoutHandle=Yr(I$.bind(null,e),n);break}I$(e);break;default:throw Error(a(329))}}return h$(e,Ui()),e.callbackNode===t?m$.bind(null,e):null}function y$(e,t){for(t&=~Us,t&=~qs,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-Ht(t),r=1<<n;e[n]=-1,t&=~r}}function g$(e){if(0!==(48&Is))throw Error(a(327));if(D$(),e===Ns&&0!==(e.expiredLanes&Ds)){var t=Ds,n=A$(e,t);0!==(js&qs)&&(n=A$(e,t=zt(e,t)))}else n=A$(e,t=zt(e,0));if(0!==e.tag&&2===n&&(Is|=64,e.hydrate&&(e.hydrate=!1,Vr(e.containerInfo)),0!==(t=Ft(e))&&(n=A$(e,t))),1===n)throw n=Fs,k$(e,0),y$(e,t),h$(e,Ui()),n;return e.finishedWork=e.current.alternate,e.finishedLanes=t,I$(e),h$(e,Ui()),null}function v$(e,t){var n=Is;Is|=1;try{return e(t)}finally{0===(Is=n)&&(Vs(),Ki())}}function b$(e,t){var n=Is;Is&=-2,Is|=8;try{return e(t)}finally{0===(Is=n)&&(Vs(),Ki())}}function w$(e,t){ci(Ms,Ps),Ps|=t,js|=t}function x$(){Ps=Ms.current,ui(Ms)}function k$(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,Wr(n)),null!==Ls)for(n=Ls.return;null!==n;){var r=n;switch(r.tag){case 1:null!==(r=r.type.childContextTypes)&&void 0!==r&&yi();break;case 3:Do(),ui(pi),ui(di),Xo();break;case 5:Mo(r);break;case 4:Do();break;case 13:case 19:ui(zo);break;case 10:ro(r);break;case 23:case 24:x$()}n=n.return}Ns=e,Ls=W$(e.current,null),Ds=Ps=js=t,zs=0,Fs=null,Us=qs=Bs=0}function E$(e,t){for(;;){var n=Ls;try{if(no(),Qo.current=Ia,ra){for(var r=ea.memoizedState;null!==r;){var i=r.queue;null!==i&&(i.pending=null),r=r.next}ra=!1}if(Zo=0,na=ta=ea=null,ia=!1,Ts.current=null,null===n||null===n.return){zs=1,Fs=t,Ls=null;break}e:{var o=e,a=n.return,s=n,$=t;if(t=Ds,s.flags|=2048,s.firstEffect=s.lastEffect=null,null!==$&&"object"===typeof $&&"function"===typeof $.then){var l=$;if(0===(2&s.mode)){var u=s.alternate;u?(s.updateQueue=u.updateQueue,s.memoizedState=u.memoizedState,s.lanes=u.lanes):(s.updateQueue=null,s.memoizedState=null)}var c=0!==(1&zo.current),f=a;do{var d;if(d=13===f.tag){var p=f.memoizedState;if(null!==p)d=null!==p.dehydrated;else{var _=f.memoizedProps;d=void 0!==_.fallback&&(!0!==_.unstable_avoidThisFallback||!c)}}if(d){var h=f.updateQueue;if(null===h){var m=new Set;m.add(l),f.updateQueue=m}else h.add(l);if(0===(2&f.mode)){if(f.flags|=64,s.flags|=16384,s.flags&=-2981,1===s.tag)if(null===s.alternate)s.tag=17;else{var y=uo(-1,1);y.tag=2,co(s,y)}s.lanes|=1;break e}$=void 0,s=t;var g=o.pingCache;if(null===g?(g=o.pingCache=new cs,$=new Set,g.set(l,$)):void 0===($=g.get(l))&&($=new Set,g.set(l,$)),!$.has(s)){$.add(s);var v=B$.bind(null,o,l,s);l.then(v,v)}f.flags|=4096,f.lanes=t;break e}f=f.return}while(null!==f);$=Error((V(s.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.")}5!==zs&&(zs=2),$=ls($,s),f=a;do{switch(f.tag){case 3:o=$,f.flags|=4096,t&=-t,f.lanes|=t,fo(f,fs(0,o,t));break e;case 1:o=$;var b=f.type,w=f.stateNode;if(0===(64&f.flags)&&("function"===typeof b.getDerivedStateFromError||null!==w&&"function"===typeof w.componentDidCatch&&(null===Js||!Js.has(w)))){f.flags|=4096,t&=-t,f.lanes|=t,fo(f,ds(f,o,t));break e}}f=f.return}while(null!==f)}T$(n)}catch(x){t=x,Ls===n&&null!==n&&(Ls=n=n.return);continue}break}}function O$(){var e=Rs.current;return Rs.current=Ia,null===e?Ia:e}function A$(e,t){var n=Is;Is|=16;var r=O$();for(Ns===e&&Ds===t||k$(e,t);;)try{S$();break}catch(i){E$(e,i)}if(no(),Is=n,Rs.current=r,null!==Ls)throw Error(a(261));return Ns=null,Ds=0,zs}function S$(){for(;null!==Ls;)R$(Ls)}function C$(){for(;null!==Ls&&!Si();)R$(Ls)}function R$(e){var t=Ks(e.alternate,e,Ps);e.memoizedProps=e.pendingProps,null===t?T$(e):Ls=t,Ts.current=null}function T$(e){var t=e;do{var n=t.alternate;if(e=t.return,0===(2048&t.flags)){if(null!==(n=ss(n,t,Ps)))return void(Ls=n);if(24!==(n=t).tag&&23!==n.tag||null===n.memoizedState||0!==(1073741824&Ps)||0===(4&n.mode)){for(var r=0,i=n.child;null!==i;)r|=i.lanes|i.childLanes,i=i.sibling;n.childLanes=r}null!==e&&0===(2048&e.flags)&&(null===e.firstEffect&&(e.firstEffect=t.firstEffect),null!==t.lastEffect&&(null!==e.lastEffect&&(e.lastEffect.nextEffect=t.firstEffect),e.lastEffect=t.lastEffect),1<t.flags&&(null!==e.lastEffect?e.lastEffect.nextEffect=t:e.firstEffect=t,e.lastEffect=t))}else{if(null!==(n=$s(t)))return n.flags&=2047,void(Ls=n);null!==e&&(e.firstEffect=e.lastEffect=null,e.flags|=2048)}if(null!==(t=t.sibling))return void(Ls=t);Ls=t=e}while(null!==t);0===zs&&(zs=5)}function I$(e){var t=Hi();return Wi(99,N$.bind(null,e,t)),null}function N$(e,t){do{D$()}while(null!==e$);if(0!==(48&Is))throw Error(a(327));var n=e.finishedWork;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(a(177));e.callbackNode=null;var r=n.lanes|n.childLanes,i=r,o=e.pendingLanes&~i;e.pendingLanes=i,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=i,e.mutableReadLanes&=i,e.entangledLanes&=i,i=e.entanglements;for(var s=e.eventTimes,$=e.expirationTimes;0<o;){var l=31-Ht(o),u=1<<l;i[l]=0,s[l]=-1,$[l]=-1,o&=~u}if(null!==i$&&0===(24&r)&&i$.has(e)&&i$.delete(e),e===Ns&&(Ls=Ns=null,Ds=0),1<n.flags?null!==n.lastEffect?(n.lastEffect.nextEffect=n,r=n.firstEffect):r=n:r=n.firstEffect,null!==r){if(i=Is,Is|=32,Ts.current=null,Br=Gt,mr(s=hr())){if("selectionStart"in s)$={start:s.selectionStart,end:s.selectionEnd};else e:if($=($=s.ownerDocument)&&$.defaultView||window,(u=$.getSelection&&$.getSelection())&&0!==u.rangeCount){$=u.anchorNode,o=u.anchorOffset,l=u.focusNode,u=u.focusOffset;try{$.nodeType,l.nodeType}catch(O){$=null;break e}var c=0,f=-1,d=-1,p=0,_=0,h=s,m=null;t:for(;;){for(var y;h!==$||0!==o&&3!==h.nodeType||(f=c+o),h!==l||0!==u&&3!==h.nodeType||(d=c+u),3===h.nodeType&&(c+=h.nodeValue.length),null!==(y=h.firstChild);)m=h,h=y;for(;;){if(h===s)break t;if(m===$&&++p===o&&(f=c),m===l&&++_===u&&(d=c),null!==(y=h.nextSibling))break;m=(h=m).parentNode}h=y}$=-1===f||-1===d?null:{start:f,end:d}}else $=null;$=$||{start:0,end:0}}else $=null;qr={focusedElem:s,selectionRange:$},Gt=!1,u$=null,c$=!1,Gs=r;do{try{L$()}catch(O){if(null===Gs)throw Error(a(330));j$(Gs,O),Gs=Gs.nextEffect}}while(null!==Gs);u$=null,Gs=r;do{try{for(s=e;null!==Gs;){var g=Gs.flags;if(16&g&&ye(Gs.stateNode,""),128&g){var v=Gs.alternate;if(null!==v){var b=v.ref;null!==b&&("function"===typeof b?b(null):b.current=null)}}switch(1038&g){case 2:ws(Gs),Gs.flags&=-3;break;case 6:ws(Gs),Gs.flags&=-3,Os(Gs.alternate,Gs);break;case 1024:Gs.flags&=-1025;break;case 1028:Gs.flags&=-1025,Os(Gs.alternate,Gs);break;case 4:Os(Gs.alternate,Gs);break;case 8:Es(s,$=Gs);var w=$.alternate;vs($),null!==w&&vs(w)}Gs=Gs.nextEffect}}catch(O){if(null===Gs)throw Error(a(330));j$(Gs,O),Gs=Gs.nextEffect}}while(null!==Gs);if(b=qr,v=hr(),g=b.focusedElem,s=b.selectionRange,v!==g&&g&&g.ownerDocument&&_r(g.ownerDocument.documentElement,g)){null!==s&&mr(g)&&(v=s.start,void 0===(b=s.end)&&(b=v),"selectionStart"in g?(g.selectionStart=v,g.selectionEnd=Math.min(b,g.value.length)):(b=(v=g.ownerDocument||document)&&v.defaultView||window).getSelection&&(b=b.getSelection(),$=g.textContent.length,w=Math.min(s.start,$),s=void 0===s.end?w:Math.min(s.end,$),!b.extend&&w>s&&($=s,s=w,w=$),$=pr(g,w),o=pr(g,s),$&&o&&(1!==b.rangeCount||b.anchorNode!==$.node||b.anchorOffset!==$.offset||b.focusNode!==o.node||b.focusOffset!==o.offset)&&((v=v.createRange()).setStart($.node,$.offset),b.removeAllRanges(),w>s?(b.addRange(v),b.extend(o.node,o.offset)):(v.setEnd(o.node,o.offset),b.addRange(v))))),v=[];for(b=g;b=b.parentNode;)1===b.nodeType&&v.push({element:b,left:b.scrollLeft,top:b.scrollTop});for("function"===typeof g.focus&&g.focus(),g=0;g<v.length;g++)(b=v[g]).element.scrollLeft=b.left,b.element.scrollTop=b.top}Gt=!!Br,qr=Br=null,e.current=n,Gs=r;do{try{for(g=e;null!==Gs;){var x=Gs.flags;if(36&x&&ms(g,Gs.alternate,Gs),128&x){v=void 0;var k=Gs.ref;if(null!==k){var E=Gs.stateNode;Gs.tag,v=E,"function"===typeof k?k(v):k.current=v}}Gs=Gs.nextEffect}}catch(O){if(null===Gs)throw Error(a(330));j$(Gs,O),Gs=Gs.nextEffect}}while(null!==Gs);Gs=null,zi(),Is=i}else e.current=n;if(Zs)Zs=!1,e$=e,t$=t;else for(Gs=r;null!==Gs;)t=Gs.nextEffect,Gs.nextEffect=null,8&Gs.flags&&((x=Gs).sibling=null,x.stateNode=null),Gs=t;if(0===(r=e.pendingLanes)&&(Js=null),1===r?e===a$?o$++:(o$=0,a$=e):o$=0,n=n.stateNode,ki&&"function"===typeof ki.onCommitFiberRoot)try{ki.onCommitFiberRoot(xi,n,void 0,64===(64&n.current.flags))}catch(O){}if(h$(e,Ui()),Xs)throw Xs=!1,e=Qs,Qs=null,e;return 0!==(8&Is)||Ki(),null}function L$(){for(;null!==Gs;){var e=Gs.alternate;c$||null===u$||(0!==(8&Gs.flags)?et(Gs,u$)&&(c$=!0):13===Gs.tag&&Ss(e,Gs)&&et(Gs,u$)&&(c$=!0));var t=Gs.flags;0!==(256&t)&&hs(e,Gs),0===(512&t)||Zs||(Zs=!0,Vi(97,(function(){return D$(),null}))),Gs=Gs.nextEffect}}function D$(){if(90!==t$){var e=97<t$?97:t$;return t$=90,Wi(e,z$)}return!1}function P$(e,t){n$.push(t,e),Zs||(Zs=!0,Vi(97,(function(){return D$(),null})))}function M$(e,t){r$.push(t,e),Zs||(Zs=!0,Vi(97,(function(){return D$(),null})))}function z$(){if(null===e$)return!1;var e=e$;if(e$=null,0!==(48&Is))throw Error(a(331));var t=Is;Is|=32;var n=r$;r$=[];for(var r=0;r<n.length;r+=2){var i=n[r],o=n[r+1],s=i.destroy;if(i.destroy=void 0,"function"===typeof s)try{s()}catch(l){if(null===o)throw Error(a(330));j$(o,l)}}for(n=n$,n$=[],r=0;r<n.length;r+=2){i=n[r],o=n[r+1];try{var $=i.create;i.destroy=$()}catch(l){if(null===o)throw Error(a(330));j$(o,l)}}for($=e.current.firstEffect;null!==$;)e=$.nextEffect,$.nextEffect=null,8&$.flags&&($.sibling=null,$.stateNode=null),$=e;return Is=t,Ki(),!0}function F$(e,t,n){co(e,t=fs(0,t=ls(n,t),1)),t=f$(),null!==(e=_$(e,1))&&(Ut(e,1,t),h$(e,t))}function j$(e,t){if(3===e.tag)F$(e,e,t);else for(var n=e.return;null!==n;){if(3===n.tag){F$(n,e,t);break}if(1===n.tag){var r=n.stateNode;if("function"===typeof n.type.getDerivedStateFromError||"function"===typeof r.componentDidCatch&&(null===Js||!Js.has(r))){var i=ds(n,e=ls(t,e),1);if(co(n,i),i=f$(),null!==(n=_$(n,1)))Ut(n,1,i),h$(n,i);else if("function"===typeof r.componentDidCatch&&(null===Js||!Js.has(r)))try{r.componentDidCatch(t,e)}catch(o){}break}}n=n.return}}function B$(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=f$(),e.pingedLanes|=e.suspendedLanes&n,Ns===e&&(Ds&n)===n&&(4===zs||3===zs&&(62914560&Ds)===Ds&&500>Ui()-Ys?k$(e,0):Us|=n),h$(e,t)}function q$(e,t){var n=e.stateNode;null!==n&&n.delete(t),0===(t=0)&&(0===(2&(t=e.mode))?t=1:0===(4&t)?t=99===Hi()?1:2:(0===$$&&($$=js),0===(t=Bt(62914560&~$$))&&(t=4194304))),n=f$(),null!==(e=_$(e,t))&&(Ut(e,t,n),h$(e,n))}function U$(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.flags=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childLanes=this.lanes=0,this.alternate=null}function H$(e,t,n,r){return new U$(e,t,n,r)}function Y$(e){return!(!(e=e.prototype)||!e.isReactComponent)}function W$(e,t){var n=e.alternate;return null===n?((n=H$(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.nextEffect=null,n.firstEffect=null,n.lastEffect=null),n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function V$(e,t,n,r,i,o){var s=2;if(r=e,"function"===typeof e)Y$(e)&&(s=1);else if("string"===typeof e)s=5;else e:switch(e){case k:return K$(n.children,i,o,t);case P:s=8,i|=16;break;case E:s=8,i|=1;break;case O:return(e=H$(12,n,t,8|i)).elementType=O,e.type=O,e.lanes=o,e;case R:return(e=H$(13,n,t,i)).type=R,e.elementType=R,e.lanes=o,e;case T:return(e=H$(19,n,t,i)).elementType=T,e.lanes=o,e;case M:return G$(n,i,o,t);case z:return(e=H$(24,n,t,i)).elementType=z,e.lanes=o,e;default:if("object"===typeof e&&null!==e)switch(e.$$typeof){case A:s=10;break e;case S:s=9;break e;case C:s=11;break e;case I:s=14;break e;case N:s=16,r=null;break e;case L:s=22;break e}throw Error(a(130,null==e?e:typeof e,""))}return(t=H$(s,n,t,i)).elementType=e,t.type=r,t.lanes=o,t}function K$(e,t,n,r){return(e=H$(7,e,r,t)).lanes=n,e}function G$(e,t,n,r){return(e=H$(23,e,r,t)).elementType=M,e.lanes=n,e}function X$(e,t,n){return(e=H$(6,e,null,t)).lanes=n,e}function Q$(e,t,n){return(t=H$(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function J$(e,t,n){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.pendingContext=this.context=null,this.hydrate=n,this.callbackNode=null,this.callbackPriority=0,this.eventTimes=qt(0),this.expirationTimes=qt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=qt(0),this.mutableSourceEagerHydrationData=null}function Z$(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:x,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}function el(e,t,n,r){var i=t.current,o=f$(),s=d$(i);e:if(n){t:{if(Xe(n=n._reactInternals)!==n||1!==n.tag)throw Error(a(170));var $=n;do{switch($.tag){case 3:$=$.stateNode.context;break t;case 1:if(mi($.type)){$=$.stateNode.__reactInternalMemoizedMergedChildContext;break t}}$=$.return}while(null!==$);throw Error(a(171))}if(1===n.tag){var l=n.type;if(mi(l)){n=vi(n,l,$);break e}}n=$}else n=fi;return null===t.context?t.context=n:t.pendingContext=n,(t=uo(o,s)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),co(i,t),p$(i,s,o),s}function tl(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function nl(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function rl(e,t){nl(e,t),(e=e.alternate)&&nl(e,t)}function il(e,t,n){var r=null!=n&&null!=n.hydrationOptions&&n.hydrationOptions.mutableSources||null;if(n=new J$(e,t,null!=n&&!0===n.hydrate),t=H$(3,null,null,2===t?7:1===t?3:0),n.current=t,t.stateNode=n,$o(t),e[ei]=n.current,Ir(8===e.nodeType?e.parentNode:e),r)for(e=0;e<r.length;e++){var i=(t=r[e])._getVersion;i=i(t._source),null==n.mutableSourceEagerHydrationData?n.mutableSourceEagerHydrationData=[t,i]:n.mutableSourceEagerHydrationData.push(t,i)}this._internalRoot=n}function ol(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function al(e,t,n,r,i){var o=n._reactRootContainer;if(o){var a=o._internalRoot;if("function"===typeof i){var s=i;i=function(){var e=tl(a);s.call(e)}}el(t,a,e,i)}else{if(o=n._reactRootContainer=function(e,t){if(t||(t=!(!(t=e?9===e.nodeType?e.documentElement:e.firstChild:null)||1!==t.nodeType||!t.hasAttribute("data-reactroot"))),!t)for(var n;n=e.lastChild;)e.removeChild(n);return new il(e,0,t?{hydrate:!0}:void 0)}(n,r),a=o._internalRoot,"function"===typeof i){var $=i;i=function(){var e=tl(a);$.call(e)}}b$((function(){el(t,a,e,i)}))}return tl(a)}function sl(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!ol(t))throw Error(a(200));return Z$(e,t,null,n)}Ks=function(e,t,n){var r=t.lanes;if(null!==e)if(e.memoizedProps!==t.pendingProps||pi.current)Ma=!0;else{if(0===(n&r)){switch(Ma=!1,t.tag){case 3:Va(t),Ko();break;case 5:Po(t);break;case 1:mi(t.type)&&bi(t);break;case 4:Lo(t,t.stateNode.containerInfo);break;case 10:r=t.memoizedProps.value;var i=t.type._context;ci(Ji,i._currentValue),i._currentValue=r;break;case 13:if(null!==t.memoizedState)return 0!==(n&t.child.childLanes)?Ja(e,t,n):(ci(zo,1&zo.current),null!==(t=os(e,t,n))?t.sibling:null);ci(zo,1&zo.current);break;case 19:if(r=0!==(n&t.childLanes),0!==(64&e.flags)){if(r)return is(e,t,n);t.flags|=64}if(null!==(i=t.memoizedState)&&(i.rendering=null,i.tail=null,i.lastEffect=null),ci(zo,zo.current),r)break;return null;case 23:case 24:return t.lanes=0,qa(e,t,n)}return os(e,t,n)}Ma=0!==(16384&e.flags)}else Ma=!1;switch(t.lanes=0,t.tag){case 2:if(r=t.type,null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,i=hi(t,di.current),oo(t,n),i=sa(null,t,r,e,i,n),t.flags|=1,"object"===typeof i&&null!==i&&"function"===typeof i.render&&void 0===i.$$typeof){if(t.tag=1,t.memoizedState=null,t.updateQueue=null,mi(r)){var o=!0;bi(t)}else o=!1;t.memoizedState=null!==i.state&&void 0!==i.state?i.state:null,$o(t);var s=r.getDerivedStateFromProps;"function"===typeof s&&mo(t,r,s,e),i.updater=yo,t.stateNode=i,i._reactInternals=t,wo(t,r,e,n),t=Wa(null,t,r,!0,o,n)}else t.tag=0,za(null,t,i,n),t=t.child;return t;case 16:i=t.elementType;e:{switch(null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,i=(o=i._init)(i._payload),t.type=i,o=t.tag=function(e){if("function"===typeof e)return Y$(e)?1:0;if(void 0!==e&&null!==e){if((e=e.$$typeof)===C)return 11;if(e===I)return 14}return 2}(i),e=Qi(i,e),o){case 0:t=Ha(null,t,i,e,n);break e;case 1:t=Ya(null,t,i,e,n);break e;case 11:t=Fa(null,t,i,e,n);break e;case 14:t=ja(null,t,i,Qi(i.type,e),r,n);break e}throw Error(a(306,i,""))}return t;case 0:return r=t.type,i=t.pendingProps,Ha(e,t,r,i=t.elementType===r?i:Qi(r,i),n);case 1:return r=t.type,i=t.pendingProps,Ya(e,t,r,i=t.elementType===r?i:Qi(r,i),n);case 3:if(Va(t),r=t.updateQueue,null===e||null===r)throw Error(a(282));if(r=t.pendingProps,i=null!==(i=t.memoizedState)?i.element:null,lo(e,t),po(t,r,null,n),(r=t.memoizedState.element)===i)Ko(),t=os(e,t,n);else{if((o=(i=t.stateNode).hydrate)&&(Bo=Kr(t.stateNode.containerInfo.firstChild),jo=t,o=qo=!0),o){if(null!=(e=i.mutableSourceEagerHydrationData))for(i=0;i<e.length;i+=2)(o=e[i])._workInProgressVersionPrimary=e[i+1],Go.push(o);for(n=So(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|1024,n=n.sibling}else za(e,t,r,n),Ko();t=t.child}return t;case 5:return Po(t),null===e&&Yo(t),r=t.type,i=t.pendingProps,o=null!==e?e.memoizedProps:null,s=i.children,Hr(r,i)?s=null:null!==o&&Hr(r,o)&&(t.flags|=16),Ua(e,t),za(e,t,s,n),t.child;case 6:return null===e&&Yo(t),null;case 13:return Ja(e,t,n);case 4:return Lo(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=Ao(t,null,r,n):za(e,t,r,n),t.child;case 11:return r=t.type,i=t.pendingProps,Fa(e,t,r,i=t.elementType===r?i:Qi(r,i),n);case 7:return za(e,t,t.pendingProps,n),t.child;case 8:case 12:return za(e,t,t.pendingProps.children,n),t.child;case 10:e:{r=t.type._context,i=t.pendingProps,s=t.memoizedProps,o=i.value;var $=t.type._context;if(ci(Ji,$._currentValue),$._currentValue=o,null!==s)if($=s.value,0===(o=ur($,o)?0:0|("function"===typeof r._calculateChangedBits?r._calculateChangedBits($,o):1073741823))){if(s.children===i.children&&!pi.current){t=os(e,t,n);break e}}else for(null!==($=t.child)&&($.return=t);null!==$;){var l=$.dependencies;if(null!==l){s=$.child;for(var u=l.firstContext;null!==u;){if(u.context===r&&0!==(u.observedBits&o)){1===$.tag&&((u=uo(-1,n&-n)).tag=2,co($,u)),$.lanes|=n,null!==(u=$.alternate)&&(u.lanes|=n),io($.return,n),l.lanes|=n;break}u=u.next}}else s=10===$.tag&&$.type===t.type?null:$.child;if(null!==s)s.return=$;else for(s=$;null!==s;){if(s===t){s=null;break}if(null!==($=s.sibling)){$.return=s.return,s=$;break}s=s.return}$=s}za(e,t,i.children,n),t=t.child}return t;case 9:return i=t.type,r=(o=t.pendingProps).children,oo(t,n),r=r(i=ao(i,o.unstable_observedBits)),t.flags|=1,za(e,t,r,n),t.child;case 14:return o=Qi(i=t.type,t.pendingProps),ja(e,t,i,o=Qi(i.type,o),r,n);case 15:return Ba(e,t,t.type,t.pendingProps,r,n);case 17:return r=t.type,i=t.pendingProps,i=t.elementType===r?i:Qi(r,i),null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),t.tag=1,mi(r)?(e=!0,bi(t)):e=!1,oo(t,n),vo(t,r,i),wo(t,r,i,n),Wa(null,t,r,!0,e,n);case 19:return is(e,t,n);case 23:case 24:return qa(e,t,n)}throw Error(a(156,t.tag))},il.prototype.render=function(e){el(e,this._internalRoot,null,null)},il.prototype.unmount=function(){var e=this._internalRoot,t=e.containerInfo;el(null,e,null,(function(){t[ei]=null}))},tt=function(e){13===e.tag&&(p$(e,4,f$()),rl(e,4))},nt=function(e){13===e.tag&&(p$(e,67108864,f$()),rl(e,67108864))},rt=function(e){if(13===e.tag){var t=f$(),n=d$(e);p$(e,n,t),rl(e,n)}},it=function(e,t){return t()},Ae=function(e,t,n){switch(t){case"input":if(ne(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var i=oi(r);if(!i)throw Error(a(90));Q(r),ne(r,i)}}}break;case"textarea":le(e,n);break;case"select":null!=(t=n.value)&&ae(e,!!n.multiple,t,!1)}},Ne=v$,Le=function(e,t,n,r,i){var o=Is;Is|=4;try{return Wi(98,e.bind(null,t,n,r,i))}finally{0===(Is=o)&&(Vs(),Ki())}},De=function(){0===(49&Is)&&(function(){if(null!==i$){var e=i$;i$=null,e.forEach((function(e){e.expiredLanes|=24&e.pendingLanes,h$(e,Ui())}))}Ki()}(),D$())},Pe=function(e,t){var n=Is;Is|=2;try{return e(t)}finally{0===(Is=n)&&(Vs(),Ki())}};var $l={Events:[ri,ii,oi,Te,Ie,D$,{current:!1}]},ll={findFiberByHostInstance:ni,bundleType:0,version:"17.0.2",rendererPackageName:"react-dom"},ul={bundleType:ll.bundleType,version:ll.version,rendererPackageName:ll.rendererPackageName,rendererConfig:ll.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:b.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Ze(e))?null:e.stateNode},findFiberByHostInstance:ll.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null};if("undefined"!==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var cl=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!cl.isDisabled&&cl.supportsFiber)try{xi=cl.inject(ul),ki=cl}catch(he){}}t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=$l,t.createPortal=sl,t.findDOMNode=function(e){if(null==e)return null;if(1===e.nodeType)return e;var t=e._reactInternals;if(void 0===t){if("function"===typeof e.render)throw Error(a(188));throw Error(a(268,Object.keys(e)))}return e=null===(e=Ze(t))?null:e.stateNode},t.flushSync=function(e,t){var n=Is;if(0!==(48&n))return e(t);Is|=1;try{if(e)return Wi(99,e.bind(null,t))}finally{Is=n,Ki()}},t.hydrate=function(e,t,n){if(!ol(t))throw Error(a(200));return al(null,e,t,!0,n)},t.render=function(e,t,n){if(!ol(t))throw Error(a(200));return al(null,e,t,!1,n)},t.unmountComponentAtNode=function(e){if(!ol(e))throw Error(a(40));return!!e._reactRootContainer&&(b$((function(){al(null,null,e,!1,(function(){e._reactRootContainer=null,e[ei]=null}))})),!0)},t.unstable_batchedUpdates=v$,t.unstable_createPortal=function(e,t){return sl(e,t,2<arguments.length&&void 0!==arguments[2]?arguments[2]:null)},t.unstable_renderSubtreeIntoContainer=function(e,t,n,r){if(!ol(n))throw Error(a(200));if(null==e||void 0===e._reactInternals)throw Error(a(38));return al(e,t,n,!1,r)},t.version="17.0.2"},function(e,t,n){"use strict";e.exports=n(42)},function(e,t,n){"use strict";var r,i,o,a;if("object"===typeof performance&&"function"===typeof performance.now){var s=performance;t.unstable_now=function(){return s.now()}}else{var $=Date,l=$.now();t.unstable_now=function(){return $.now()-l}}if("undefined"===typeof window||"function"!==typeof MessageChannel){var u=null,c=null,f=function e(){if(null!==u)try{var n=t.unstable_now();u(!0,n),u=null}catch(r){throw setTimeout(e,0),r}};r=function(e){null!==u?setTimeout(r,0,e):(u=e,setTimeout(f,0))},i=function(e,t){c=setTimeout(e,t)},o=function(){clearTimeout(c)},t.unstable_shouldYield=function(){return!1},a=t.unstable_forceFrameRate=function(){}}else{var d=window.setTimeout,p=window.clearTimeout;if("undefined"!==typeof console){var _=window.cancelAnimationFrame;"function"!==typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),"function"!==typeof _&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var h=!1,m=null,y=-1,g=5,v=0;t.unstable_shouldYield=function(){return t.unstable_now()>=v},a=function(){},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):g=0<e?Math.floor(1e3/e):5};var b=new MessageChannel,w=b.port2;b.port1.onmessage=function(){if(null!==m){var e=t.unstable_now();v=e+g;try{m(!0,e)?w.postMessage(null):(h=!1,m=null)}catch(n){throw w.postMessage(null),n}}else h=!1},r=function(e){m=e,h||(h=!0,w.postMessage(null))},i=function(e,n){y=d((function(){e(t.unstable_now())}),n)},o=function(){p(y),y=-1}}function x(e,t){var n=e.length;e.push(t);e:for(;;){var r=n-1>>>1,i=e[r];if(!(void 0!==i&&0<O(i,t)))break e;e[r]=t,e[n]=i,n=r}}function k(e){return void 0===(e=e[0])?null:e}function E(e){var t=e[0];if(void 0!==t){var n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,i=e.length;r<i;){var o=2*(r+1)-1,a=e[o],s=o+1,$=e[s];if(void 0!==a&&0>O(a,n))void 0!==$&&0>O($,a)?(e[r]=$,e[s]=n,r=s):(e[r]=a,e[o]=n,r=o);else{if(!(void 0!==$&&0>O($,n)))break e;e[r]=$,e[s]=n,r=s}}}return t}return null}function O(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}var A=[],S=[],C=1,R=null,T=3,I=!1,N=!1,L=!1;function D(e){for(var t=k(S);null!==t;){if(null===t.callback)E(S);else{if(!(t.startTime<=e))break;E(S),t.sortIndex=t.expirationTime,x(A,t)}t=k(S)}}function P(e){if(L=!1,D(e),!N)if(null!==k(A))N=!0,r(M);else{var t=k(S);null!==t&&i(P,t.startTime-e)}}function M(e,n){N=!1,L&&(L=!1,o()),I=!0;var r=T;try{for(D(n),R=k(A);null!==R&&(!(R.expirationTime>n)||e&&!t.unstable_shouldYield());){var a=R.callback;if("function"===typeof a){R.callback=null,T=R.priorityLevel;var s=a(R.expirationTime<=n);n=t.unstable_now(),"function"===typeof s?R.callback=s:R===k(A)&&E(A),D(n)}else E(A);R=k(A)}if(null!==R)var $=!0;else{var l=k(S);null!==l&&i(P,l.startTime-n),$=!1}return $}finally{R=null,T=r,I=!1}}var z=a;t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){N||I||(N=!0,r(M))},t.unstable_getCurrentPriorityLevel=function(){return T},t.unstable_getFirstCallbackNode=function(){return k(A)},t.unstable_next=function(e){switch(T){case 1:case 2:case 3:var t=3;break;default:t=T}var n=T;T=t;try{return e()}finally{T=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=z,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=T;T=e;try{return t()}finally{T=n}},t.unstable_scheduleCallback=function(e,n,a){var s=t.unstable_now();switch("object"===typeof a&&null!==a?a="number"===typeof(a=a.delay)&&0<a?s+a:s:a=s,e){case 1:var $=-1;break;case 2:$=250;break;case 5:$=1073741823;break;case 4:$=1e4;break;default:$=5e3}return e={id:C++,callback:n,priorityLevel:e,startTime:a,expirationTime:$=a+$,sortIndex:-1},a>s?(e.sortIndex=a,x(S,e),null===k(A)&&e===k(S)&&(L?o():L=!0,i(P,a-s))):(e.sortIndex=$,x(A,e),N||I||(N=!0,r(M))),e},t.unstable_wrapCallback=function(e){var t=T;return function(){var n=T;T=t;try{return e.apply(this,arguments)}finally{T=n}}}},function(e,t,n){},,function(e,t,n){"use strict";n(27);var r=n(1),i=60103;if(t.Fragment=60107,"function"===typeof Symbol&&Symbol.for){var o=Symbol.for;i=o("react.element"),t.Fragment=o("react.fragment")}var a=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,s=Object.prototype.hasOwnProperty,$={key:!0,ref:!0,__self:!0,__source:!0};function l(e,t,n){var r,o={},l=null,u=null;for(r in void 0!==n&&(l=""+n),void 0!==t.key&&(l=""+t.key),void 0!==t.ref&&(u=t.ref),t)s.call(t,r)&&!$.hasOwnProperty(r)&&(o[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===o[r]&&(o[r]=t[r]);return{$$typeof:i,type:e,key:l,ref:u,props:o,_owner:a.current}}t.jsx=l,t.jsxs=l},function(e,t,n){"use strict";var r=n(47);function i(){}function o(){}o.resetWarningCache=i,e.exports=function(){function e(e,t,n,i,o,a){if(a!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:i};return n.PropTypes=n,n}},function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];function r(){for(var e=arguments.length,n=Array(e),r=0;r<e;r++)n[r]=arguments[r];var i=null;return t.forEach((function(e){if(null==i){var t=e.apply(void 0,n);null!=t&&(i=t)}})),i}return(0,o.default)(r)};var r,i=n(49),o=(r=i)&&r.__esModule?r:{default:r};e.exports=t.default},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){function t(t,n,r,i,o,a){var s=i||"<<anonymous>>",$=a||r;if(null==n[r])return t?new Error("Required "+o+" `"+$+"` was not specified in `"+s+"`."):null;for(var l=arguments.length,u=Array(l>6?l-6:0),c=6;c<l;c++)u[c-6]=arguments[c];return e.apply(void 0,[n,r,s,o,$].concat(u))}var n=t.bind(null,!1);return n.isRequired=t.bind(null,!0),n},e.exports=t.default},,function(e,t){e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},function(e,t,n){},,,,,,,,,,function(e,t,n){e.exports=n(63)},function(module,exports,__webpack_require__){(function(global,process,Buffer,module){var __WEBPACK_AMD_DEFINE_ARRAY__,__WEBPACK_AMD_DEFINE_RESULT__,factory;(function(e){var t,n,r,i,o,a,s=this;if("undefined"!==typeof global&&(s=global),"undefined"!==typeof window&&(s=window),"log"in(t="object"===typeof s.console?s.console:null==s.console?s.console={}:{})||(t.log=function(){}),"warn"in t||(t.warn=t.log),"undefined"!==typeof s.Opal)return t.warn("Opal already loaded. Loading twice can cause troubles, please fix your setup."),s.Opal;var $=this.Opal={};$.global=s,s.Opal=$,$.config={missing_require_severity:"error",unsupported_features_severity:"warning",enable_stack_trace:!0};var l=Object.hasOwnProperty,u=Function.prototype.bind,c=Object.setPrototypeOf,f=Array.prototype.slice,d=Array.prototype.splice,p=4;function _(e,t,n){"string"===typeof e?e[t]=n:Object.defineProperty(e,t,{value:n,enumerable:!1,configurable:!0,writable:!0})}function h(e,t){if(e)return e.$$const[t]}function m(e,t){var n,r,i;if(null!=e)for(n=0,r=(i=$.ancestors(e)).length;n<r;n++)if(i[n].$$const&&l.call(i[n].$$const,t))return i[n].$$const[t]}function y(e,t,n){if(!n)return(e||i).$const_missing(t)}function g(e){return e.hasOwnProperty("$$iclass")&&e.hasOwnProperty("$$root")}function v(e){var t=b(e);return e.$$is_module&&e.$$iclasses.push(t),t}function b(e){var t={},n=e.$$prototype;n.hasOwnProperty("$$dummy")&&(n=n.$$define_methods_on);var r,i=Object.getOwnPropertyNames(n),o=i.length;for(r=0;r<o;r++){var a=i[r];_(t,a,n[a])}return _(t,"$$iclass",!0),_(t,"$$module",e),t}function w(e){var t=e.length,n=e[0];if(_(n,"$$root",!0),1===t)return{first:n,last:n};for(var r=n,i=1;i<t;i++){var o=e[i];c(r,o),r=o}return{first:e[0],last:e[t-1]}}function x(e){if(!e.hasOwnProperty("$$dummy"))return e.hasOwnProperty("$$iclass")?e.$$module:e.hasOwnProperty("$$class")?e.$$class:void 0}function k(e){return"function"===typeof e&&!e.$$stub}$.uid=function(){return p+=2},$.id=function(e){return e.$$is_number?2*e+1:(null!=e.$$id||_(e,"$$id",$.uid()),e.$$id)},$.gvars={},$.exit=function(e){$.gvars.DEBUG&&t.log("Exited with status "+e)},$.exceptions=[],$.pop_exception=function(){$.gvars["!"]=$.exceptions.pop()||n},$.inspect=function(t){return t===e?"undefined":null===t?"null":t.$$class?t.$inspect():t.toString()},$.defineProperty=_,$.slice=f,$.truthy=function(e){return e!==n&&null!=e&&(!e.$$is_boolean||1==e)},$.falsy=function(e){return e===n||null==e||e.$$is_boolean&&0==e},$.const_get_local=function(e,t,n){var r;if(null!=e){if("::"===e&&(e=i),!e.$$is_module&&!e.$$is_class)throw new $.TypeError(e.toString()+" is not a class/module");return null!=(r=h(e,t))||null!=(r=y(e,t,n))?r:void 0}},$.const_get_qualified=function(e,t,n){var r,o,a,s=$.const_cache_version;if(null!=e){if("::"===e&&(e=i),!e.$$is_module&&!e.$$is_class)throw new $.TypeError(e.toString()+" is not a class/module");return null==(o=e.$$const_cache)&&(_(e,"$$const_cache",Object.create(null)),o=e.$$const_cache),null==(a=o[t])||a[0]!==s?(null!=(r=h(e,t))||(r=m(e,t)),o[t]=[s,r]):r=a[1],null!=r?r:y(e,t,n)}},$.const_cache_version=1,$.const_get_relative=function(e,t,n){var r,o,a,s=e[0],l=$.const_cache_version;return null==(o=e.$$const_cache)&&(_(e,"$$const_cache",Object.create(null)),o=e.$$const_cache),null==(a=o[t])||a[0]!==l?(null!=(r=h(s,t))||null!=(r=function(e,t){var n,r,i;if(0!==e.length)for(n=0,r=e.length;n<r;n++)if(null!=(i=e[n].$$const[t]))return i}(e,t))||null!=(r=m(s,t))||(r=function(e,t){if(null==e||e.$$is_module)return m(i,t)}(s,t)),o[t]=[l,r]):r=a[1],null!=r?r:y(s,t,n)},$.const_set=function(e,t,r){return null!=e&&"::"!==e||(e=i),r.$$is_a_module&&(null!=r.$$name&&r.$$name!==n||(r.$$name=t),null==r.$$base_module&&(r.$$base_module=e)),e.$$const=e.$$const||Object.create(null),e.$$const[t]=r,e.$$=e.$$const,$.const_cache_version++,e===i&&($[t]=r),_(e,t,r),r},$.constants=function(e,t){null==t&&(t=!0);var n,r,o,a,s=[e],l={};for(t&&(s=s.concat($.ancestors(e))),t&&e.$$is_module&&(s=s.concat([$.Object]).concat($.ancestors($.Object))),r=0,o=s.length;r<o&&(n=s[r],e===i||n!=i);r++)for(a in n.$$const)l[a]=!0;return Object.keys(l)},$.const_remove=function(e,t){if($.const_cache_version++,null!=e.$$const[t]){var r=e.$$const[t];return delete e.$$const[t],r}if(null!=e.$$autoload&&null!=e.$$autoload[t])return delete e.$$autoload[t],n;throw $.NameError.$new("constant "+e+"::"+e.$name()+" not defined")},$.allocate_class=function(e,t){var n,r;return r=null!=t&&t.$$bridge?function(){var e=f.call(arguments),r=new(u.apply(t.$$constructor,[null].concat(e)));return c(r,n.$$prototype),r}:function(){},e&&_(r,"displayName","::"+e),_(n=r,"$$name",e),_(n,"$$constructor",r),_(n,"$$prototype",r.prototype),_(n,"$$const",{}),_(n,"$$is_class",!0),_(n,"$$is_a_module",!0),_(n,"$$super",t),_(n,"$$cvars",{}),_(n,"$$own_included_modules",[]),_(n,"$$own_prepended_modules",[]),_(n,"$$ancestors",[]),_(n,"$$ancestors_cache_version",null),_(n.$$prototype,"$$class",n),$.Class&&c(n,$.Class.prototype),null!=t&&(c(n.$$prototype,t.$$prototype),t.$$meta&&$.build_class_singleton_class(n)),n},$.klass=function(e,t,n){var r;null==e?e=i:e.$$is_class||e.$$is_module||(e=e.$$class),null==t||t.hasOwnProperty("$$is_class")||(r=t,t=i);var o=function(e,t){var n=h(e,t);if(n){if(!n.$$is_class)throw $.TypeError.$new(t+" is not a class");return n}}(e,n);return o?(t&&function(e,t){if(e.$$super!==t)throw $.TypeError.$new("superclass mismatch for class "+e.$$name)}(o,t),o):(null==t&&(t=i),o=$.allocate_class(n,t),$.const_set(e,n,o),t.$inherited&&t.$inherited(o),r&&$.bridge(r,o),o)},$.allocate_module=function(e){var t=function(){};e&&_(t,"displayName",e+".$$constructor");var n=t;return e&&_(t,"displayName",e+".constructor"),_(n,"$$name",e),_(n,"$$prototype",t.prototype),_(n,"$$const",{}),_(n,"$$is_module",!0),_(n,"$$is_a_module",!0),_(n,"$$cvars",{}),_(n,"$$iclasses",[]),_(n,"$$own_included_modules",[]),_(n,"$$own_prepended_modules",[]),_(n,"$$ancestors",[n]),_(n,"$$ancestors_cache_version",null),c(n,$.Module.prototype),n},$.module=function(e,t){var n;return null==e?e=i:e.$$is_class||e.$$is_module||(e=e.$$class),n=function(e,t){var n=h(e,t);if(null==n&&e===i&&(n=m(i,t)),n&&!n.$$is_module&&n!==i)throw $.TypeError.$new(t+" is not a module");return n}(e,t),n||(n=$.allocate_module(t),$.const_set(e,t,n),n)},$.get_singleton_class=function(e){return e.$$meta?e.$$meta:e.hasOwnProperty("$$is_class")?$.build_class_singleton_class(e):e.hasOwnProperty("$$is_module")?$.build_module_singletin_class(e):$.build_object_singleton_class(e)},$.build_class_singleton_class=function(e){var t,n;return e.$$meta?e.$$meta:(t=e===r?a:$.get_singleton_class(e.$$super),_(n=$.allocate_class(null,t,(function(){})),"$$is_singleton",!0),_(n,"$$singleton_of",e),_(e,"$$meta",n),c(e,n.$$prototype),_(e,"$$class",$.Class),n)},$.build_module_singletin_class=function(e){if(e.$$meta)return e.$$meta;var t=$.allocate_class(null,$.Module,(function(){}));return _(t,"$$is_singleton",!0),_(t,"$$singleton_of",e),_(e,"$$meta",t),c(e,t.$$prototype),_(e,"$$class",$.Module),t},$.build_object_singleton_class=function(e){var t=e.$$class,r=$.allocate_class(n,t,(function(){}));return _(r,"$$is_singleton",!0),_(r,"$$singleton_of",e),delete r.$$prototype.$$class,_(e,"$$meta",r),c(e,e.$$meta.$$prototype),r},$.is_method=function(e){return"$"===e[0]&&"$"!==e[1]},$.instance_methods=function(e){for(var t=[],n=[],r=$.ancestors(e),i=0,o=r.length;i<o;i++){var a=r[i].$$prototype;a.hasOwnProperty("$$dummy")&&(a=a.$$define_methods_on);for(var s=Object.getOwnPropertyNames(a),l=0,u=s.length;l<u;l++){var c=s[l];if($.is_method(c)){var f=c.slice(1),d=a[c];d.$$stub&&-1===t.indexOf(f)&&t.push(f),d.$$stub||-1!==n.indexOf(f)||-1!==t.indexOf(f)||n.push(f)}}}return n},$.own_instance_methods=function(e){var t=[],n=e.$$prototype;n.hasOwnProperty("$$dummy")&&(n=n.$$define_methods_on);for(var r=Object.getOwnPropertyNames(n),i=0,o=r.length;i<o;i++){var a=r[i];if($.is_method(a))if(!n[a].$$stub){var s=a.slice(1);t.push(s)}}return t},$.methods=function(e){return $.instance_methods($.get_singleton_class(e))},$.own_methods=function(e){return $.own_instance_methods($.get_singleton_class(e))},$.receiver_methods=function(e){var t=$.get_singleton_class(e),n=$.own_instance_methods(t),r=$.own_instance_methods(t.$$super);return n.concat(r)},$.class_variables=function(e){var t,n=$.ancestors(e),r={};for(t=n.length-1;t>=0;t--){var i=n[t];for(var o in i.$$cvars)r[o]=i.$$cvars[o]}return r},$.class_variable_set=function(e,t,n){var r,i=$.ancestors(e);for(r=i.length-2;r>=0;r--){var o=i[r];if(l.call(o.$$cvars,t))return o.$$cvars[t]=n,n}return e.$$cvars[t]=n,n},$.append_features=function(e,t){var n=$.ancestors(e),r=[];if(-1!==n.indexOf(t))throw $.ArgumentError.$new("cyclic include detected");for(var i=0,o=n.length;i<o;i++){var a=v(n[i]);_(a,"$$included",!0),r.push(a)}var s,l,u=$.ancestors(t),f=w(r);if(-1===u.indexOf(e))s=t.$$prototype,l=Object.getPrototypeOf(t.$$prototype);else{for(var d=t.$$prototype,p=Object.getPrototypeOf(d);null!=p&&(!g(p)||p.$$module!==e);)d=p,p=Object.getPrototypeOf(p);for(var h=Object.getPrototypeOf(p);h.hasOwnProperty("$$iclass")&&!g(h);)h=Object.getPrototypeOf(h);s=d,l=h}c(s,f.first),c(f.last,l),t.$$own_included_modules=function(e){for(var t,n=[],r=Object.getPrototypeOf(e.$$prototype);r&&!r.hasOwnProperty("$$class");)(t=x(r))&&n.push(t),r=Object.getPrototypeOf(r);return n}(t),$.const_cache_version++},$.prepend_features=function(e,t){var n=$.ancestors(e),r=[];if(-1!==n.indexOf(t))throw $.ArgumentError.$new("cyclic prepend detected");for(var i=0,o=n.length;i<o;i++){var a=v(n[i]);_(a,"$$prepended",!0),r.push(a)}var s,l,u,f=w(r),d=t.$$prototype,p=Object.getPrototypeOf(d);if(d.hasOwnProperty("$$dummy")?s=d.$$define_methods_on:(s=b(t),function(e){for(var t=e.$$prototype,n=Object.getOwnPropertyNames(t),r=0;r<n.length;r++){var i=n[r];$.is_method(i)&&delete t[i]}}(t),_(d,"$$dummy",!0),_(d,"$$define_methods_on",s),c(d,s),c(s,p)),-1!==$.ancestors(t).indexOf(e))throw $.RuntimeError.$new("Prepending a module multiple times is not supported");for(l=d,u=Object.getPrototypeOf(d);null!=u&&!u.hasOwnProperty("$$root")&&u!==s&&u.hasOwnProperty("$$iclass");)u=Object.getPrototypeOf(u);c(l,f.first),c(f.last,u),t.$$own_prepended_modules=function(e){var t,n=[],r=Object.getPrototypeOf(e.$$prototype);if(e.$$prototype.hasOwnProperty("$$dummy"))for(;r&&r!==e.$$prototype.$$define_methods_on;)(t=x(r))&&n.push(t),r=Object.getPrototypeOf(r);return n}(t),$.const_cache_version++},$.bridge=function(e,t){if(e.hasOwnProperty("$$bridge"))throw $.ArgumentError.$new("already bridged");t.$$super||$.Object;t.$$prototype;_(e,"$$bridge",t),c(e.prototype,(t.$$super||$.Object).$$prototype),_(t,"$$prototype",e.prototype),_(t.$$prototype,"$$class",t),_(t,"$$constructor",e),_(t,"$$bridge",!0)},$.ancestors=function(e){if(!e)return[];if(e.$$ancestors_cache_version===$.const_cache_version)return e.$$ancestors;var t,n,r,i=[];for(t=0,n=function(e){return e.$$own_prepended_modules.concat([e]).concat(e.$$own_included_modules)}(e),r=n.length;t<r;t++)i.push(n[t]);if(e.$$super)for(t=0,r=(n=$.ancestors(e.$$super)).length;t<r;t++)i.push(n[t]);return e.$$ancestors_cache_version=$.const_cache_version,e.$$ancestors=i,i},$.included_modules=function(e){for(var t=[],n=null,r=Object.getPrototypeOf(e.$$prototype);r&&Object.getPrototypeOf(r);r=Object.getPrototypeOf(r))(n=x(r))&&n.$$is_module&&r.$$iclass&&r.$$included&&t.push(n);return t},$.add_stubs=function(e){for(var t=$.BasicObject.$$prototype,n=0,r=e.length;n<r;n++){var i=e[n],o=t[i];(null==o||o.$$stub)&&$.add_stub_for(t,i)}},$.add_stub_for=function(e,t){_(e,t,$.stub_for(t))},$.stub_for=function(e){function t(){this.$method_missing.$$p=t.$$p,t.$$p=null;for(var n=new Array(arguments.length),r=0,i=n.length;r<i;r++)n[r]=arguments[r];return this.$method_missing.apply(this,[e.slice(1)].concat(n))}return t.$$stub=!0,t},$.ac=function(e,t,n,r){var i="";throw n.$$is_a_module?i+=n.$$name+".":i+=n.$$class.$$name+"#",i+=r,$.ArgumentError.$new("["+i+"] wrong number of arguments("+e+" for "+t+")")},$.block_ac=function(e,t,n){var r="`block in "+n+"'";throw $.ArgumentError.$new(r+": wrong number of arguments ("+e+" for "+t+")")},$.find_super_dispatcher=function(e,t,n,r,i){for(var o,a,s="$"+t,l=(o=e.hasOwnProperty("$$meta")?$.ancestors(e.$$meta):$.ancestors(e.$$class)).indexOf(n.$$owner)+1;l<o.length;l++){var u=o[l].$$prototype;if(u.hasOwnProperty("$$dummy")&&(u=u.$$define_methods_on),u.hasOwnProperty(s)){var c=u[s];c.$$stub||(a=c);break}}if(!r&&null==a&&$.Kernel.$method_missing===e.$method_missing)throw $.NoMethodError.$new("super: no superclass method `"+t+"' for "+e,t);return a},$.find_iter_super_dispatcher=function(e,t,n,r,i){var o=t;if(!n)throw $.RuntimeError.$new("super called outside of method");if(i&&n.$$define_meth)throw $.RuntimeError.$new("implicit argument passing of super from method defined by define_method() is not supported. Specify all arguments explicitly");return n.$$def&&(o=n.$$jsid),$.find_super_dispatcher(e,o,n,r)},$.ret=function(e){throw $.returner.$v=e,$.returner},$.brk=function(e,t){throw t.$v=e,t},$.new_brk=function(){return new Error("unexpected break")},$.yield1=function(e,t){if("function"!==typeof e)throw $.LocalJumpError.$new("no block given");var n=e.$$has_top_level_mlhs_arg,r=e.$$has_trailing_comma_in_args;return(e.length>1||(n||r)&&1===e.length)&&(t=$.to_ary(t)),(e.length>1||r&&1===e.length)&&t.$$is_array?e.apply(null,t):e(t)},$.yieldX=function(e,t){if("function"!==typeof e)throw $.LocalJumpError.$new("no block given");if(e.length>1&&1===t.length&&t[0].$$is_array)return e.apply(null,t[0]);if(!t.$$is_array){for(var n=new Array(t.length),r=0,i=n.length;r<i;r++)n[r]=t[r];return e.apply(null,n)}return e.apply(null,t)},$.rescue=function(e,t){for(var n=0;n<t.length;n++){var r=t[n];if(r.$$is_array){var i=$.rescue(e,r);if(i)return i}else{if(r===$.JS.Error)return r;if(r["$==="](e))return r}}return null},$.is_a=function(e,t){if(null!=t&&e.$$meta===t||e.$$class===t)return!0;if(e.$$is_number&&t.$$is_number_class)return!0;var n,r,i=$.ancestors(e.$$is_class?$.get_singleton_class(e):e.$$meta||e.$$class);for(n=0,r=i.length;n<r;n++)if(i[n]===t)return!0;return!1},$.to_hash=function(e){if(e.$$is_hash)return e;if(e["$respond_to?"]("to_hash",!0)){var t=e.$to_hash();if(t.$$is_hash)return t;throw $.TypeError.$new("Can't convert "+e.$$class+" to Hash ("+e.$$class+"#to_hash gives "+t.$$class+")")}throw $.TypeError.$new("no implicit conversion of "+e.$$class+" into Hash")},$.to_ary=function(e){if(e.$$is_array)return e;if(e["$respond_to?"]("to_ary",!0)){var t=e.$to_ary();if(t===n)return[e];if(t.$$is_array)return t;throw $.TypeError.$new("Can't convert "+e.$$class+" to Array ("+e.$$class+"#to_ary gives "+t.$$class+")")}return[e]},$.to_a=function(e){if(e.$$is_array)return e.slice();if(e["$respond_to?"]("to_a",!0)){var t=e.$to_a();if(t===n)return[e];if(t.$$is_array)return t;throw $.TypeError.$new("Can't convert "+e.$$class+" to Array ("+e.$$class+"#to_a gives "+t.$$class+")")}return[e]},$.extract_kwargs=function(e){var t=e[e.length-1];return null!=t&&t["$respond_to?"]("to_hash",!0)?(d.call(e,e.length-1,1),t.$to_hash()):$.hash2([],{})},$.kwrestargs=function(e,t){var n=[],r={},i=null,o=e.$$smap;for(i in o)t[i]||(n.push(i),r[i]=o[i]);return $.hash2(n,r)},$.send=function(e,t,n,r){var i="string"===typeof t?e["$"+t]:t;return null!=i?("function"===typeof r&&(i.$$p=r),i.apply(e,n)):e.$method_missing.apply(e,[t].concat(n))},$.lambda=function(e){return e.$$is_lambda=!0,e},$.def=function(e,t,n){e===$.top?$.defn($.Object,t,n):!e.$$eval&&e.$$is_a_module?$.defn(e,t,n):$.defs(e,t,n)},$.defn=function(e,t,n){n.displayName=t,n.$$owner=e;var r=e.$$prototype;if(r.hasOwnProperty("$$dummy")&&(r=r.$$define_methods_on),_(r,t,n),e.$$is_module){e.$$module_function&&$.defs(e,t,n);for(var i=0,o=e.$$iclasses,a=o.length;i<a;i++){_(o[i],t,n)}}var s=e.$$singleton_of;!e.$method_added||e.$method_added.$$stub||s?s&&s.$singleton_method_added&&!s.$singleton_method_added.$$stub&&s.$singleton_method_added(t.substr(1)):e.$method_added(t.substr(1))},$.defs=function(e,t,n){if(e.$$is_string||e.$$is_number)throw $.TypeError.$new("can't define singleton");$.defn($.get_singleton_class(e),t,n)},$.rdef=function(e,t){if(!l.call(e.$$prototype,t))throw $.NameError.$new("method '"+t.substr(1)+"' not defined in "+e.$name());delete e.$$prototype[t],e.$$is_singleton?e.$$prototype.$singleton_method_removed&&!e.$$prototype.$singleton_method_removed.$$stub&&e.$$prototype.$singleton_method_removed(t.substr(1)):e.$method_removed&&!e.$method_removed.$$stub&&e.$method_removed(t.substr(1))},$.udef=function(e,t){if(!e.$$prototype[t]||e.$$prototype[t].$$stub)throw $.NameError.$new("method '"+t.substr(1)+"' not defined in "+e.$name());$.add_stub_for(e.$$prototype,t),e.$$is_singleton?e.$$prototype.$singleton_method_undefined&&!e.$$prototype.$singleton_method_undefined.$$stub&&e.$$prototype.$singleton_method_undefined(t.substr(1)):e.$method_undefined&&!e.$method_undefined.$$stub&&e.$method_undefined(t.substr(1))},$.alias=function(e,t,n){var r,i="$"+t,o="$"+n,a=e.$$prototype["$"+n];if(e.$$eval)return $.alias($.get_singleton_class(e),t,n);if(!k(a)){for(var s=e.$$super;"function"!==typeof a&&s;)a=s[o],s=s.$$super;if(!k(a)&&e.$$is_module&&(a=$.Object.$$prototype[o]),!k(a))throw $.NameError.$new("undefined method `"+n+"' for class `"+e.$name()+"'")}return a.$$alias_of&&(a=a.$$alias_of),r=function(){var e,t,n,i=r.$$p;for(e=new Array(arguments.length),t=0,n=arguments.length;t<n;t++)e[t]=arguments[t];return null!=i&&(r.$$p=null),$.send(this,a,e,i)},r.displayName=t,r.length=a.length,r.$$arity=a.$$arity,r.$$parameters=a.$$parameters,r.$$source_location=a.$$source_location,r.$$alias_of=a,r.$$alias_name=t,$.defn(e,i,r),e},$.alias_native=function(e,t,n){var r="$"+t,i=e.$$prototype[n];if("function"!==typeof i||i.$$stub)throw $.NameError.$new("undefined native method `"+n+"' for class `"+e.$name()+"'");return $.defn(e,r,i),e},$.hash_init=function(e){e.$$smap=Object.create(null),e.$$map=Object.create(null),e.$$keys=[]},$.hash_clone=function(e,t){t.$$none=e.$$none,t.$$proc=e.$$proc;for(var n,r,i=0,o=e.$$keys,a=e.$$smap,s=o.length;i<s;i++)(n=o[i]).$$is_string?r=a[n]:(r=n.value,n=n.key),$.hash_put(t,n,r)},$.hash_put=function(t,n,r){if(n.$$is_string)return l.call(t.$$smap,n)||t.$$keys.push(n),void(t.$$smap[n]=r);var i,o,a;if(i=t.$$by_identity?$.id(n):n.$hash(),!l.call(t.$$map,i))return o={key:n,key_hash:i,value:r},t.$$keys.push(o),void(t.$$map[i]=o);for(o=t.$$map[i];o;){if(n===o.key||n["$eql?"](o.key)){a=e,o.value=r;break}a=o,o=o.next}a&&(o={key:n,key_hash:i,value:r},t.$$keys.push(o),a.next=o)},$.hash_get=function(e,t){if(t.$$is_string)return l.call(e.$$smap,t)?e.$$smap[t]:void 0;var n,r;if(n=e.$$by_identity?$.id(t):t.$hash(),l.call(e.$$map,n))for(r=e.$$map[n];r;){if(t===r.key||t["$eql?"](r.key))return r.value;r=r.next}},$.hash_delete=function(e,t){var n,r,i=e.$$keys,o=i.length;if(t.$$is_string){if(!l.call(e.$$smap,t))return;for(n=0;n<o;n++)if(i[n]===t){i.splice(n,1);break}return r=e.$$smap[t],delete e.$$smap[t],r}var a=t.$hash();if(l.call(e.$$map,a))for(var s,$=e.$$map[a];$;){if(t===$.key||t["$eql?"]($.key)){for(r=$.value,n=0;n<o;n++)if(i[n]===$){i.splice(n,1);break}return s&&$.next?s.next=$.next:s?delete s.next:$.next?e.$$map[a]=$.next:delete e.$$map[a],r}s=$,$=$.next}},$.hash_rehash=function(t){for(var n,r,i,o=0,a=t.$$keys.length;o<a;o++)if(!t.$$keys[o].$$is_string&&(n=t.$$keys[o].key.$hash())!==t.$$keys[o].key_hash){for(r=t.$$map[t.$$keys[o].key_hash],i=e;r;){if(r===t.$$keys[o]){i&&r.next?i.next=r.next:i?delete i.next:r.next?t.$$map[t.$$keys[o].key_hash]=r.next:delete t.$$map[t.$$keys[o].key_hash];break}i=r,r=r.next}if(t.$$keys[o].key_hash=n,l.call(t.$$map,n)){for(r=t.$$map[n],i=e;r;){if(r===t.$$keys[o]){i=e;break}i=r,r=r.next}i&&(i.next=t.$$keys[o])}else t.$$map[n]=t.$$keys[o]}},$.hash=function(){var e,t,n,r,i,o,a=arguments.length;if(1===a&&arguments[0].$$is_hash)return arguments[0];if(t=new $.Hash,$.hash_init(t),1===a&&arguments[0].$$is_array){for(r=(e=arguments[0]).length,n=0;n<r;n++){if(2!==e[n].length)throw $.ArgumentError.$new("value not of length 2: "+e[n].$inspect());i=e[n][0],o=e[n][1],$.hash_put(t,i,o)}return t}if(1===a){for(i in e=arguments[0])l.call(e,i)&&(o=e[i],$.hash_put(t,i,o));return t}if(a%2!==0)throw $.ArgumentError.$new("odd number of arguments for Hash");for(n=0;n<a;n+=2)i=arguments[n],o=arguments[n+1],$.hash_put(t,i,o);return t},$.hash2=function(e,t){var n=new $.Hash;return n.$$smap=t,n.$$map=Object.create(null),n.$$keys=e,n},$.range=function(e,t,n){var r=new $.Range;return r.begin=e,r.end=t,r.excl=n,r},$.ivar=function(e){return"constructor"===e||"displayName"===e||"__count__"===e||"__noSuchMethod__"===e||"__parent__"===e||"__proto__"===e||"hasOwnProperty"===e||"valueOf"===e?e+"$":e},$.escape_regexp=function(e){return e.replace(/([-[\]\/{}()*+?.^$\\| ])/g,"\\$1").replace(/[\n]/g,"\\n").replace(/[\r]/g,"\\r").replace(/[\f]/g,"\\f").replace(/[\t]/g,"\\t")},$.global_regexp=function(e){return e.global?e:(null==e.$$g?e.$$g=new RegExp(e.source,(e.multiline?"gm":"g")+(e.ignoreCase?"i":"")):e.$$g.lastIndex=null,e.$$g)},$.global_multiline_regexp=function(e){var t;if(e.multiline){if(e.global)return e;t=null!=e.$$g?e.$$g:e.$$g=new RegExp(e.source,"gm"+(e.ignoreCase?"i":""))}else t=null!=e.$$gm?e.$$gm:e.$$gm=new RegExp(e.source,"gm"+(e.ignoreCase?"i":""));return t.lastIndex=null,t},$.modules={},$.loaded_features=["corelib/runtime"],$.current_dir=".",$.require_table={"corelib/runtime":!0},$.normalize=function(e){var t,n,r=[];"."!==$.current_dir&&(e=$.current_dir.replace(/\/*$/,"/")+e);for(var i=0,o=(t=(e=(e=e.replace(/^\.\//,"")).replace(/\.(rb|opal|js)$/,"")).split("/")).length;i<o;i++)""!==(n=t[i])&&(".."===n?r.pop():r.push(n));return r.join("/")},$.loaded=function(e){var t,n,r;for(t=0,n=e.length;t<n;t++)r=$.normalize(e[t]),$.require_table[r]||($.loaded_features.push(r),$.require_table[r]=!0)},$.load=function(e){e=$.normalize(e),$.loaded([e]);var n=$.modules[e];if(n)n($);else{var r=$.config.missing_require_severity,i="cannot load such file -- "+e;if("error"===r)throw $.LoadError?$.LoadError.$new(i):i;"warning"===r&&t.warn("WARNING: LoadError: "+i)}return!0},$.require=function(e){return e=$.normalize(e),!$.require_table[e]&&$.load(e)},$.encodings=Object.create(null),$.set_encoding=function(e,t){if("string"===typeof e)throw $.FrozenError.$new("can't modify frozen String");var n=$.encodings[t];return n===e.encoding||(e.encoding=n),e},$.enc=function(e,t){var n=new String(e);return $.set_encoding(n,t),n.internal_encoding=n.encoding,n},$.BasicObject=r=$.allocate_class("BasicObject",null,(function(){})),$.Object=i=$.allocate_class("Object",$.BasicObject,(function(){})),$.Module=o=$.allocate_class("Module",$.Object,(function(){})),$.Class=a=$.allocate_class("Class",$.Module,(function(){})),c($.BasicObject,$.Class.$$prototype),c($.Object,$.Class.$$prototype),c($.Module,$.Class.$$prototype),c($.Class,$.Class.$$prototype),r.$$const.BasicObject=r,$.const_set(i,"BasicObject",r),$.const_set(i,"Object",i),$.const_set(i,"Module",o),$.const_set(i,"Class",a),r.$$class=a,i.$$class=a,o.$$class=a,a.$$class=a,_(i.$$prototype,"toString",(function(){var e=this.$to_s();return e.$$is_string&&"object"===typeof e?e.valueOf():e})),_(i.$$prototype,"$require",$.require),$.$$=i.$$,$.top=new i,$.top.$to_s=$.top.$inspect=function(){return"main"},$.NilClass=$.allocate_class("NilClass",$.Object,(function(){})),$.const_set(i,"NilClass",$.NilClass),(n=$.nil=new $.NilClass).$$id=4,n.call=n.apply=function(){throw $.LocalJumpError.$new("no block given")},$.breaker=new Error("unexpected break (old)"),$.returner=new Error("unexpected return"),TypeError.$$super=Error}).call(this),Opal.loaded(["corelib/runtime.js"]),Opal.modules["corelib/helpers"]=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative),i=(e.breaker,e.slice,e.module),o=e.truthy;return e.add_stubs(["$new","$class","$===","$respond_to?","$raise","$type_error","$__send__","$coerce_to","$nil?","$<=>","$coerce_to!","$!=","$[]","$upcase"]),function(t,a){var s,$,l,u,c,f,d,p,_,h,m,y,g,v,b=i(t,"Opal"),w=[b].concat(a);e.defs(b,"$bridge",s=function(t,n){return e.bridge(t,n)},s.$$arity=2),e.defs(b,"$type_error",$=function(e,t,i,a){var s;return null==i&&(i=n),null==a&&(a=n),o(o(s=i)?a:s)?r(w,"TypeError").$new("can't convert "+e.$class()+" into "+t+" ("+e.$class()+"#"+i+" gives "+a.$class()+")"):r(w,"TypeError").$new("no implicit conversion of "+e.$class()+" into "+t)},$.$$arity=-3),e.defs(b,"$coerce_to",l=function(e,t,n){return o(t["$==="](e))?e:(o(e["$respond_to?"](n))||this.$raise(this.$type_error(e,t)),e.$__send__(n))},l.$$arity=3),e.defs(b,"$coerce_to!",u=function(e,t,n){var r,i=this;return r=i.$coerce_to(e,t,n),o(t["$==="](r))||i.$raise(i.$type_error(e,t,n,r)),r},u.$$arity=3),e.defs(b,"$coerce_to?",c=function(e,t,r){var i=this,a=n;return o(e["$respond_to?"](r))?(a=i.$coerce_to(e,t,r),o(a["$nil?"]())?n:(o(t["$==="](a))||i.$raise(i.$type_error(e,t,r,a)),a)):n},c.$$arity=3),e.defs(b,"$try_convert",f=function(e,t,r){return o(t["$==="](e))?e:o(e["$respond_to?"](r))?e.$__send__(r):n},f.$$arity=3),e.defs(b,"$compare",d=function(e,t){var i;return i=e["$<=>"](t),o(i===n)&&this.$raise(r(w,"ArgumentError"),"comparison of "+e.$class()+" with "+t.$class()+" failed"),i},d.$$arity=2),e.defs(b,"$destructure",p=function(e){if(1==e.length)return e[0];if(e.$$is_array)return e;for(var t=new Array(e.length),n=0,r=t.length;n<r;n++)t[n]=e[n];return t},p.$$arity=1),e.defs(b,"$respond_to?",_=function(e,t,n){return null==n&&(n=!1),!(null==e||!e.$$class)&&e["$respond_to?"](t,n)},_.$$arity=-3),e.defs(b,"$inspect_obj",h=function(t){return e.inspect(t)},h.$$arity=1),e.defs(b,"$instance_variable_name!",m=function(e){return e=r(w,"Opal")["$coerce_to!"](e,r(w,"String"),"to_str"),o(/^@[a-zA-Z_][a-zA-Z0-9_]*?$/.test(e))||this.$raise(r(w,"NameError").$new("'"+e+"' is not allowed as an instance variable name",e)),e},m.$$arity=1),e.defs(b,"$class_variable_name!",y=function(e){return e=r(w,"Opal")["$coerce_to!"](e,r(w,"String"),"to_str"),o(e.length<3||"@@"!==e.slice(0,2))&&this.$raise(r(w,"NameError").$new("`"+e+"' is not allowed as a class variable name",e)),e},y.$$arity=1),e.defs(b,"$const_name!",g=function(e){return e=r(w,"Opal")["$coerce_to!"](e,r(w,"String"),"to_str"),o(e["$[]"](0)["$!="](e["$[]"](0).$upcase()))&&this.$raise(r(w,"NameError"),"wrong constant name "+e),e},g.$$arity=1),e.defs(b,"$pristine",v=function(t,r){for(var i,o,a,s=(i=e.slice.call(arguments,1,arguments.length)).length-1;s>=0;s--)o=i[s],(a=t.$$prototype["$"+o])&&!a.$$stub&&(a.$$pristine=!0);return n},v.$$arity=-2)}(t[0],t)},Opal.modules["corelib/module"]=function(Opal){function $rb_lt(e,t){return"number"===typeof e&&"number"===typeof t?e<t:e["$<"](t)}function $rb_gt(e,t){return"number"===typeof e&&"number"===typeof t?e>t:e["$>"](t)}var self=Opal.top,$nesting=[],nil=Opal.nil,$$$=Opal.const_get_qualified,$$=Opal.const_get_relative,$breaker=Opal.breaker,$slice=Opal.slice,$klass=Opal.klass,$send=Opal.send,$truthy=Opal.truthy,$lambda=Opal.lambda,$range=Opal.range,$hash2=Opal.hash2;return Opal.add_stubs(["$module_eval","$to_proc","$===","$raise","$equal?","$<","$>","$nil?","$attr_reader","$attr_writer","$class_variable_name!","$new","$const_name!","$=~","$inject","$split","$const_get","$==","$!~","$start_with?","$bind","$call","$class","$append_features","$included","$name","$cover?","$size","$merge","$compile","$proc","$any?","$prepend_features","$prepended","$to_s","$__id__","$constants","$include?","$copy_class_variables","$copy_constants"]),function($base,$super,$parent_nesting){var self=$klass($base,$super,"Module"),$nesting=[self].concat($parent_nesting),$Module_allocate$1,$Module_initialize$2,$Module_$eq_eq_eq$3,$Module_$lt$4,$Module_$lt_eq$5,$Module_$gt$6,$Module_$gt_eq$7,$Module_$lt_eq_gt$8,$Module_alias_method$9,$Module_alias_native$10,$Module_ancestors$11,$Module_append_features$12,$Module_attr_accessor$13,$Module_attr_reader$14,$Module_attr_writer$15,$Module_autoload$16,$Module_class_variables$17,$Module_class_variable_get$18,$Module_class_variable_set$19,$Module_class_variable_defined$ques$20,$Module_remove_class_variable$21,$Module_constants$22,$Module_constants$23,$Module_nesting$24,$Module_const_defined$ques$25,$Module_const_get$26,$Module_const_missing$28,$Module_const_set$29,$Module_public_constant$30,$Module_define_method$31,$Module_remove_method$33,$Module_singleton_class$ques$34,$Module_include$35,$Module_included_modules$36,$Module_include$ques$37,$Module_instance_method$38,$Module_instance_methods$39,$Module_included$40,$Module_extended$41,$Module_extend_object$42,$Module_method_added$43,$Module_method_removed$44,$Module_method_undefined$45,$Module_module_eval$46,$Module_module_exec$48,$Module_method_defined$ques$49,$Module_module_function$50,$Module_name$51,$Module_prepend$52,$Module_prepend_features$53,$Module_prepended$54,$Module_remove_const$55,$Module_to_s$56,$Module_undef_method$57,$Module_instance_variables$58,$Module_dup$59,$Module_copy_class_variables$60,$Module_copy_constants$61;return Opal.defs(self,"$allocate",$Module_allocate$1=function(){var e=Opal.allocate_module(nil,(function(){}));return this!==Opal.Module&&Object.setPrototypeOf(e,this.$$prototype),e},$Module_allocate$1.$$arity=0),Opal.def(self,"$initialize",$Module_initialize$2=function(){var e=$Module_initialize$2.$$p,t=e||nil;return e&&($Module_initialize$2.$$p=null),e&&($Module_initialize$2.$$p=null),t!==nil?$send(this,"module_eval",[],t.$to_proc()):nil},$Module_initialize$2.$$arity=0),Opal.def(self,"$===",$Module_$eq_eq_eq$3=function(e){return!$truthy(null==e)&&Opal.is_a(e,this)},$Module_$eq_eq_eq$3.$$arity=1),Opal.def(self,"$<",$Module_$lt$4=function(e){var t,n,r,i=this;if($truthy($$($nesting,"Module")["$==="](e))||i.$raise($$($nesting,"TypeError"),"compared with non class/module"),i===e)return!1;for(n=0,r=(t=Opal.ancestors(i)).length;n<r;n++)if(t[n]===e)return!0;for(n=0,r=(t=Opal.ancestors(e)).length;n<r;n++)if(t[n]===i)return!1;return nil},$Module_$lt$4.$$arity=1),Opal.def(self,"$<=",$Module_$lt_eq$5=function(e){var t;return $truthy(t=this["$equal?"](e))?t:$rb_lt(this,e)},$Module_$lt_eq$5.$$arity=1),Opal.def(self,"$>",$Module_$gt$6=function(e){return $truthy($$($nesting,"Module")["$==="](e))||this.$raise($$($nesting,"TypeError"),"compared with non class/module"),$rb_lt(e,this)},$Module_$gt$6.$$arity=1),Opal.def(self,"$>=",$Module_$gt_eq$7=function(e){var t;return $truthy(t=this["$equal?"](e))?t:$rb_gt(this,e)},$Module_$gt_eq$7.$$arity=1),Opal.def(self,"$<=>",$Module_$lt_eq_gt$8=function(e){var t=nil;return this===e?0:$truthy($$($nesting,"Module")["$==="](e))?(t=$rb_lt(this,e),$truthy(t["$nil?"]())?nil:$truthy(t)?-1:1):nil},$Module_$lt_eq_gt$8.$$arity=1),Opal.def(self,"$alias_method",$Module_alias_method$9=function(e,t){return Opal.alias(this,e,t),this},$Module_alias_method$9.$$arity=2),Opal.def(self,"$alias_native",$Module_alias_native$10=function(e,t){return null==t&&(t=e),Opal.alias_native(this,e,t),this},$Module_alias_native$10.$$arity=-2),Opal.def(self,"$ancestors",$Module_ancestors$11=function(){return Opal.ancestors(this)},$Module_ancestors$11.$$arity=0),Opal.def(self,"$append_features",$Module_append_features$12=function(e){return Opal.append_features(this,e),this},$Module_append_features$12.$$arity=1),Opal.def(self,"$attr_accessor",$Module_attr_accessor$13=function(e){var t,n=this;return t=Opal.slice.call(arguments,0,arguments.length),$send(n,"attr_reader",Opal.to_a(t)),$send(n,"attr_writer",Opal.to_a(t))},$Module_attr_accessor$13.$$arity=-1),Opal.alias(self,"attr","attr_accessor"),Opal.def(self,"$attr_reader",$Module_attr_reader$14=function(e){var t,n=this;t=Opal.slice.call(arguments,0,arguments.length);for(var r=n.$$prototype,i=t.length-1;i>=0;i--){var o=t[i],a="$"+o,s=Opal.ivar(o),$=function(e){return function(){return null==this[e]?nil:this[e]}}(s);Opal.defineProperty(r,s,nil),$.$$parameters=[],$.$$arity=0,Opal.defn(n,a,$)}return nil},$Module_attr_reader$14.$$arity=-1),Opal.def(self,"$attr_writer",$Module_attr_writer$15=function(e){var t,n=this;t=Opal.slice.call(arguments,0,arguments.length);for(var r=n.$$prototype,i=t.length-1;i>=0;i--){var o=t[i],a="$"+o+"=",s=Opal.ivar(o),$=function(e){return function(t){return this[e]=t}}(s);$.$$parameters=[["req"]],$.$$arity=1,Opal.defineProperty(r,s,nil),Opal.defn(n,a,$)}return nil},$Module_attr_writer$15.$$arity=-1),Opal.def(self,"$autoload",$Module_autoload$16=function(e,t){var n=this;return null==n.$$autoload&&(n.$$autoload={}),Opal.const_cache_version++,n.$$autoload[e]=t,nil},$Module_autoload$16.$$arity=2),Opal.def(self,"$class_variables",$Module_class_variables$17=function(){return Object.keys(Opal.class_variables(this))},$Module_class_variables$17.$$arity=0),Opal.def(self,"$class_variable_get",$Module_class_variable_get$18=function(e){var t=this;e=$$($nesting,"Opal")["$class_variable_name!"](e);var n=Opal.class_variables(t)[e];return null==n&&t.$raise($$($nesting,"NameError").$new("uninitialized class variable "+e+" in "+t,e)),n},$Module_class_variable_get$18.$$arity=1),Opal.def(self,"$class_variable_set",$Module_class_variable_set$19=function(e,t){return e=$$($nesting,"Opal")["$class_variable_name!"](e),Opal.class_variable_set(this,e,t)},$Module_class_variable_set$19.$$arity=2),Opal.def(self,"$class_variable_defined?",$Module_class_variable_defined$ques$20=function(e){return e=$$($nesting,"Opal")["$class_variable_name!"](e),Opal.class_variables(this).hasOwnProperty(e)},$Module_class_variable_defined$ques$20.$$arity=1),Opal.def(self,"$remove_class_variable",$Module_remove_class_variable$21=function(e){var t=this;if(e=$$($nesting,"Opal")["$class_variable_name!"](e),Opal.hasOwnProperty.call(t.$$cvars,e)){var n=t.$$cvars[e];return delete t.$$cvars[e],n}t.$raise($$($nesting,"NameError"),"cannot remove "+e+" for "+t)},$Module_remove_class_variable$21.$$arity=1),Opal.def(self,"$constants",$Module_constants$22=function(e){return null==e&&(e=!0),Opal.constants(this,e)},$Module_constants$22.$$arity=-1),Opal.defs(self,"$constants",$Module_constants$23=function(e){if(null==e){var t,n,r,i=(this.$$nesting||[]).concat(Opal.Object),o={};for(n=0,r=i.length;n<r;n++)for(t in i[n].$$const)o[t]=!0;return Object.keys(o)}return Opal.constants(this,e)},$Module_constants$23.$$arity=-1),Opal.defs(self,"$nesting",$Module_nesting$24=function(){return this.$$nesting||[]},$Module_nesting$24.$$arity=0),Opal.def(self,"$const_defined?",$Module_const_defined$ques$25=function(e,t){var n=this;null==t&&(t=!0),e=$$($nesting,"Opal")["$const_name!"](e),$truthy(e["$=~"]($$$($$($nesting,"Opal"),"CONST_NAME_REGEXP")))||n.$raise($$($nesting,"NameError").$new("wrong constant name "+e,e));var r,i,o=[n];for(t&&(o=o.concat(Opal.ancestors(n)),n.$$is_module&&(o=o.concat([Opal.Object]).concat(Opal.ancestors(Opal.Object)))),r=0,i=o.length;r<i;r++)if(null!=o[r].$$const[e])return!0;return!1},$Module_const_defined$ques$25.$$arity=-2),Opal.def(self,"$const_get",$Module_const_get$26=function(e,t){var n,r=this;return null==t&&(t=!0),0===(e=$$($nesting,"Opal")["$const_name!"](e)).indexOf("::")&&"::"!==e&&(e=e.slice(2)),$truthy(-1!=e.indexOf("::")&&"::"!=e)?$send(e.$split("::"),"inject",[r],((n=function(e,t){n.$$s;return null==e&&(e=nil),null==t&&(t=nil),e.$const_get(t)}).$$s=r,n.$$arity=2,n)):($truthy(e["$=~"]($$$($$($nesting,"Opal"),"CONST_NAME_REGEXP")))||r.$raise($$($nesting,"NameError").$new("wrong constant name "+e,e)),t?$$([r],e):Opal.const_get_local(r,e))},$Module_const_get$26.$$arity=-2),Opal.def(self,"$const_missing",$Module_const_missing$28=function(e){var t,n=this;if(n.$$autoload){var r=n.$$autoload[e];if(r)return n.$require(r),n.$const_get(e)}return t=n["$=="]($$($nesting,"Object"))?e:n+"::"+e,n.$raise($$($nesting,"NameError").$new("uninitialized constant "+t,e))},$Module_const_missing$28.$$arity=1),Opal.def(self,"$const_set",$Module_const_set$29=function(e,t){var n;return e=$$($nesting,"Opal")["$const_name!"](e),$truthy($truthy(n=e["$!~"]($$$($$($nesting,"Opal"),"CONST_NAME_REGEXP")))?n:e["$start_with?"]("::"))&&this.$raise($$($nesting,"NameError").$new("wrong constant name "+e,e)),Opal.const_set(this,e,t),t},$Module_const_set$29.$$arity=2),Opal.def(self,"$public_constant",$Module_public_constant$30=function(e){return nil},$Module_public_constant$30.$$arity=1),Opal.def(self,"$define_method",$Module_define_method$31=function(e,t){var n,r,i=$Module_define_method$31.$$p,o=i||nil,a=this,s=nil;i&&($Module_define_method$31.$$p=null),i&&($Module_define_method$31.$$p=null),$truthy(void 0===t&&o===nil)&&a.$raise($$($nesting,"ArgumentError"),"tried to create a Proc object without a block"),o=$truthy(n=o)?n:(s=t,$$($nesting,"Proc")["$==="](s)?t:$$($nesting,"Method")["$==="](s)?t.$to_proc().$$unbound:$$($nesting,"UnboundMethod")["$==="](s)?$lambda((r=function(e){var n,i=r.$$s||this,o=nil;return n=Opal.slice.call(arguments,0,arguments.length),o=t.$bind(i),$send(o,"call",Opal.to_a(n))},r.$$s=a,r.$$arity=-1,r)):a.$raise($$($nesting,"TypeError"),"wrong argument type "+o.$class()+" (expected Proc/Method)"));var $="$"+e;return o.$$jsid=e,o.$$s=null,o.$$def=o,o.$$define_meth=!0,Opal.defn(a,$,o),e},$Module_define_method$31.$$arity=-2),Opal.def(self,"$remove_method",$Module_remove_method$33=function(e){for(var t,n=this,r=0,i=(t=Opal.slice.call(arguments,0,arguments.length)).length;r<i;r++)Opal.rdef(n,"$"+t[r]);return n},$Module_remove_method$33.$$arity=-1),Opal.def(self,"$singleton_class?",$Module_singleton_class$ques$34=function(){return!!this.$$is_singleton},$Module_singleton_class$ques$34.$$arity=0),Opal.def(self,"$include",$Module_include$35=function(e){for(var t,n=this,r=(t=Opal.slice.call(arguments,0,arguments.length)).length-1;r>=0;r--){var i=t[r];i.$$is_module||n.$raise($$($nesting,"TypeError"),"wrong argument type "+i.$class()+" (expected Module)"),i.$append_features(n),i.$included(n)}return n},$Module_include$35.$$arity=-1),Opal.def(self,"$included_modules",$Module_included_modules$36=function(){return Opal.included_modules(this)},$Module_included_modules$36.$$arity=0),Opal.def(self,"$include?",$Module_include$ques$37=function(e){var t=this;e.$$is_module||t.$raise($$($nesting,"TypeError"),"wrong argument type "+e.$class()+" (expected Module)");var n,r,i,o=Opal.ancestors(t);for(n=0,r=o.length;n<r;n++)if((i=o[n])===e&&i!==t)return!0;return!1},$Module_include$ques$37.$$arity=1),Opal.def(self,"$instance_method",$Module_instance_method$38=function(e){var t=this,n=t.$$prototype["$"+e];return n&&!n.$$stub||t.$raise($$($nesting,"NameError").$new("undefined method `"+e+"' for class `"+t.$name()+"'",e)),$$($nesting,"UnboundMethod").$new(t,n.$$owner||t,n,e)},$Module_instance_method$38.$$arity=1),Opal.def(self,"$instance_methods",$Module_instance_methods$39=function(e){return null==e&&(e=!0),$truthy(e)?Opal.instance_methods(this):Opal.own_instance_methods(this)},$Module_instance_methods$39.$$arity=-1),Opal.def(self,"$included",$Module_included$40=function(e){return nil},$Module_included$40.$$arity=1),Opal.def(self,"$extended",$Module_extended$41=function(e){return nil},$Module_extended$41.$$arity=1),Opal.def(self,"$extend_object",$Module_extend_object$42=function(e){return nil},$Module_extend_object$42.$$arity=1),Opal.def(self,"$method_added",$Module_method_added$43=function(e){return Opal.slice.call(arguments,0,arguments.length),nil},$Module_method_added$43.$$arity=-1),Opal.def(self,"$method_removed",$Module_method_removed$44=function(e){return Opal.slice.call(arguments,0,arguments.length),nil},$Module_method_removed$44.$$arity=-1),Opal.def(self,"$method_undefined",$Module_method_undefined$45=function(e){return Opal.slice.call(arguments,0,arguments.length),nil},$Module_method_undefined$45.$$arity=-1),Opal.def(self,"$module_eval",$Module_module_eval$46=function $$module_eval($a){var $iter=$Module_module_eval$46.$$p,block=$iter||nil,$post_args,args,$b,_$$3,self=this,string=nil,file=nil,_lineno=nil,default_eval_options=nil,compiling_options=nil,compiled=nil;$iter&&($Module_module_eval$46.$$p=null),$iter&&($Module_module_eval$46.$$p=null),$post_args=Opal.slice.call(arguments,0,arguments.length),args=$post_args,$truthy($truthy($b=block["$nil?"]())?!!Opal.compile:$b)?($truthy($range(1,3,!1)["$cover?"](args.$size()))||$$($nesting,"Kernel").$raise($$($nesting,"ArgumentError"),"wrong number of arguments (0 for 1..3)"),$b=[].concat(Opal.to_a(args)),string=null==$b[0]?nil:$b[0],file=null==$b[1]?nil:$b[1],_lineno=null==$b[2]?nil:$b[2],default_eval_options=$hash2(["file","eval"],{file:$truthy($b=file)?$b:"(eval)",eval:!0}),compiling_options=Opal.hash({arity_check:!1}).$merge(default_eval_options),compiled=$$($nesting,"Opal").$compile(string,compiling_options),block=$send($$($nesting,"Kernel"),"proc",[],(_$$3=function $$47(){var self=_$$3.$$s||this;return function(self){return eval(compiled)}(self)},_$$3.$$s=self,_$$3.$$arity=0,_$$3))):$truthy(args["$any?"]())&&$$($nesting,"Kernel").$raise($$($nesting,"ArgumentError"),"wrong number of arguments ("+args.$size()+" for 0)\n\n NOTE:If you want to enable passing a String argument please add \"require 'opal-parser'\" to your script\n");var old=block.$$s,result;return block.$$s=null,result=block.apply(self,[self]),block.$$s=old,result},$Module_module_eval$46.$$arity=-1),Opal.alias(self,"class_eval","module_eval"),Opal.def(self,"$module_exec",$Module_module_exec$48=function(e){var t,n=$Module_module_exec$48.$$p,r=n||nil,i=this;n&&($Module_module_exec$48.$$p=null),n&&($Module_module_exec$48.$$p=null),t=Opal.slice.call(arguments,0,arguments.length),r===nil&&i.$raise($$($nesting,"LocalJumpError"),"no block given");var o,a=r.$$s;return r.$$s=null,o=r.apply(i,t),r.$$s=a,o},$Module_module_exec$48.$$arity=-1),Opal.alias(self,"class_exec","module_exec"),Opal.def(self,"$method_defined?",$Module_method_defined$ques$49=function(e){var t=this.$$prototype["$"+e];return!!t&&!t.$$stub},$Module_method_defined$ques$49.$$arity=1),Opal.def(self,"$module_function",$Module_module_function$50=function(e){var t,n=this;if(0===(t=Opal.slice.call(arguments,0,arguments.length)).length)n.$$module_function=!0;else for(var r=0,i=t.length;r<i;r++){var o=t[r],a="$"+o,s=n.$$prototype[a];Opal.defs(n,a,s)}return n},$Module_module_function$50.$$arity=-1),Opal.def(self,"$name",$Module_name$51=function(){var e=this;if(e.$$full_name)return e.$$full_name;for(var t=[],n=e;n;){if(n.$$name===nil||null==n.$$name)return nil;if(t.unshift(n.$$name),(n=n.$$base_module)===Opal.Object)break}return 0===t.length?nil:e.$$full_name=t.join("::")},$Module_name$51.$$arity=0),Opal.def(self,"$prepend",$Module_prepend$52=function(e){var t,n=this;0===(t=Opal.slice.call(arguments,0,arguments.length)).length&&n.$raise($$($nesting,"ArgumentError"),"wrong number of arguments (given 0, expected 1+)");for(var r=t.length-1;r>=0;r--){var i=t[r];i.$$is_module||n.$raise($$($nesting,"TypeError"),"wrong argument type "+i.$class()+" (expected Module)"),i.$prepend_features(n),i.$prepended(n)}return n},$Module_prepend$52.$$arity=-1),Opal.def(self,"$prepend_features",$Module_prepend_features$53=function(e){var t=this;return t.$$is_module||t.$raise($$($nesting,"TypeError"),"wrong argument type "+t.$class()+" (expected Module)"),Opal.prepend_features(t,e),t},$Module_prepend_features$53.$$arity=1),Opal.def(self,"$prepended",$Module_prepended$54=function(e){return nil},$Module_prepended$54.$$arity=1),Opal.def(self,"$remove_const",$Module_remove_const$55=function(e){return Opal.const_remove(this,e)},$Module_remove_const$55.$$arity=1),Opal.def(self,"$to_s",$Module_to_s$56=function(){var e,t=this;return $truthy(e=Opal.Module.$name.call(t))?e:"#<"+(t.$$is_module?"Module":"Class")+":0x"+t.$__id__().$to_s(16)+">"},$Module_to_s$56.$$arity=0),Opal.def(self,"$undef_method",$Module_undef_method$57=function(e){for(var t,n=this,r=0,i=(t=Opal.slice.call(arguments,0,arguments.length)).length;r<i;r++)Opal.udef(n,"$"+t[r]);return n},$Module_undef_method$57.$$arity=-1),Opal.def(self,"$instance_variables",$Module_instance_variables$58=function(){var e=this,t=nil;Opal.Module.$$nesting=$nesting,t=e.$constants();var n=[];for(var r in e)e.hasOwnProperty(r)&&"$"!==r.charAt(0)&&"constructor"!==r&&!t["$include?"](r)&&n.push("@"+r);return n},$Module_instance_variables$58.$$arity=0),Opal.def(self,"$dup",$Module_dup$59=function(){var e=$Module_dup$59.$$p,t=this,n=nil,r=nil,i=nil,o=nil;for(e&&($Module_dup$59.$$p=null),i=0,o=arguments.length,r=new Array(o);i<o;i++)r[i]=arguments[i];return(n=$send(t,Opal.find_super_dispatcher(t,"dup",$Module_dup$59,!1),r,e)).$copy_class_variables(t),n.$copy_constants(t),n},$Module_dup$59.$$arity=0),Opal.def(self,"$copy_class_variables",$Module_copy_class_variables$60=function(e){for(var t in e.$$cvars)this.$$cvars[t]=e.$$cvars[t]},$Module_copy_class_variables$60.$$arity=1),Opal.def(self,"$copy_constants",$Module_copy_constants$61=function(e){var t,n=e.$$const;for(t in n)Opal.const_set(this,t,n[t])},$Module_copy_constants$61.$$arity=1),nil&&"copy_constants"}($nesting[0],null,$nesting)},Opal.modules["corelib/class"]=function(e){var t=e.top,n=[],r=e.nil,i=(e.const_get_qualified,e.const_get_relative),o=(e.breaker,e.slice,e.klass),a=e.send;return e.add_stubs(["$require","$class_eval","$to_proc","$initialize_copy","$allocate","$name","$to_s"]),t.$require("corelib/module"),function(t,n,s){var $,l,u,c,f,d,p,_=o(t,null,"Class"),h=[_].concat(s);return e.defs(_,"$new",$=function(t){var n=$.$$p,o=n||r;if(n&&($.$$p=null),n&&($.$$p=null),null==t&&(t=i(h,"Object")),!t.$$is_class)throw e.TypeError.$new("superclass must be a Class");var s=e.allocate_class(r,t);return t.$inherited(s),o!==r&&a(s,"class_eval",[],o.$to_proc()),s},$.$$arity=-1),e.def(_,"$allocate",l=function(){var t=new this.$$constructor;return t.$$id=e.uid(),t},l.$$arity=0),e.def(_,"$inherited",u=function(e){return r},u.$$arity=1),e.def(_,"$initialize_dup",c=function(e){var t=this;t.$initialize_copy(e),t.$$name=null,t.$$full_name=null},c.$$arity=1),e.def(_,"$new",f=function(t){var n,i=f.$$p,o=i||r,a=this;i&&(f.$$p=null),i&&(f.$$p=null),n=e.slice.call(arguments,0,arguments.length);var s=a.$allocate();return e.send(s,s.$initialize,n,o),s},f.$$arity=-1),e.def(_,"$superclass",d=function(){return this.$$super||r},d.$$arity=0),e.def(_,"$to_s",p=function(){var t=p.$$p,n=this;t&&(p.$$p=null);var r=n.$$singleton_of;return r&&r.$$is_a_module?"#<Class:"+r.$name()+">":r?"#<Class:#<"+r.$$class.$name()+":0x"+e.id(r).$to_s(16)+">>":a(n,e.find_super_dispatcher(n,"to_s",p,!1),[],null)},p.$$arity=0),r&&"to_s"}(n[0],0,n)},Opal.modules["corelib/basic_object"]=function(Opal){var self=Opal.top,$nesting=[],nil=Opal.nil,$$$=Opal.const_get_qualified,$$=Opal.const_get_relative,$breaker=Opal.breaker,$slice=Opal.slice,$klass=Opal.klass,$truthy=Opal.truthy,$range=Opal.range,$hash2=Opal.hash2,$send=Opal.send;return Opal.add_stubs(["$==","$!","$nil?","$cover?","$size","$raise","$merge","$compile","$proc","$any?","$inspect","$new"]),function($base,$super,$parent_nesting){var self=$klass($base,$super,"BasicObject"),$nesting=[self].concat($parent_nesting),$BasicObject_initialize$1,$BasicObject_$eq_eq$2,$BasicObject_eql$ques$3,$BasicObject___id__$4,$BasicObject___send__$5,$BasicObject_$excl$6,$BasicObject_$not_eq$7,$BasicObject_instance_eval$8,$BasicObject_instance_exec$10,$BasicObject_singleton_method_added$11,$BasicObject_singleton_method_removed$12,$BasicObject_singleton_method_undefined$13,$BasicObject_class$14,$BasicObject_method_missing$15;return Opal.def(self,"$initialize",$BasicObject_initialize$1=function(e){return Opal.slice.call(arguments,0,arguments.length),nil},$BasicObject_initialize$1.$$arity=-1),Opal.def(self,"$==",$BasicObject_$eq_eq$2=function(e){return this===e},$BasicObject_$eq_eq$2.$$arity=1),Opal.def(self,"$eql?",$BasicObject_eql$ques$3=function(e){return this["$=="](e)},$BasicObject_eql$ques$3.$$arity=1),Opal.alias(self,"equal?","=="),Opal.def(self,"$__id__",$BasicObject___id__$4=function(){var e=this;return null!=e.$$id||Opal.defineProperty(e,"$$id",Opal.uid()),e.$$id},$BasicObject___id__$4.$$arity=0),Opal.def(self,"$__send__",$BasicObject___send__$5=function(e,t){var n,r=$BasicObject___send__$5.$$p,i=r||nil,o=this;r&&($BasicObject___send__$5.$$p=null),r&&($BasicObject___send__$5.$$p=null),n=Opal.slice.call(arguments,1,arguments.length);var a=o["$"+e];return a?(i!==nil&&(a.$$p=i),a.apply(o,n)):(i!==nil&&(o.$method_missing.$$p=i),o.$method_missing.apply(o,[e].concat(n)))},$BasicObject___send__$5.$$arity=-2),Opal.def(self,"$!",$BasicObject_$excl$6=function(){return!1},$BasicObject_$excl$6.$$arity=0),Opal.def(self,"$!=",$BasicObject_$not_eq$7=function(e){return this["$=="](e)["$!"]()},$BasicObject_$not_eq$7.$$arity=1),Opal.def(self,"$instance_eval",$BasicObject_instance_eval$8=function $$instance_eval($a){var $iter=$BasicObject_instance_eval$8.$$p,block=$iter||nil,$post_args,args,$b,_$$4,self=this,string=nil,file=nil,_lineno=nil,default_eval_options=nil,compiling_options=nil,compiled=nil;$iter&&($BasicObject_instance_eval$8.$$p=null),$iter&&($BasicObject_instance_eval$8.$$p=null),$post_args=Opal.slice.call(arguments,0,arguments.length),args=$post_args,$truthy($truthy($b=block["$nil?"]())?!!Opal.compile:$b)?($truthy($range(1,3,!1)["$cover?"](args.$size()))||$$$("::","Kernel").$raise($$$("::","ArgumentError"),"wrong number of arguments (0 for 1..3)"),$b=[].concat(Opal.to_a(args)),string=null==$b[0]?nil:$b[0],file=null==$b[1]?nil:$b[1],_lineno=null==$b[2]?nil:$b[2],default_eval_options=$hash2(["file","eval"],{file:$truthy($b=file)?$b:"(eval)",eval:!0}),compiling_options=Opal.hash({arity_check:!1}).$merge(default_eval_options),compiled=$$$("::","Opal").$compile(string,compiling_options),block=$send($$$("::","Kernel"),"proc",[],(_$$4=function $$9(){var self=_$$4.$$s||this;return function(self){return eval(compiled)}(self)},_$$4.$$s=self,_$$4.$$arity=0,_$$4))):$truthy(args["$any?"]())&&$$$("::","Kernel").$raise($$$("::","ArgumentError"),"wrong number of arguments ("+args.$size()+" for 0)");var old=block.$$s,result;if(block.$$s=null,self.$$is_a_module){self.$$eval=!0;try{result=block.call(self,self)}finally{self.$$eval=!1}}else result=block.call(self,self);return block.$$s=old,result},$BasicObject_instance_eval$8.$$arity=-1),Opal.def(self,"$instance_exec",$BasicObject_instance_exec$10=function(e){var t,n=$BasicObject_instance_exec$10.$$p,r=n||nil,i=this;n&&($BasicObject_instance_exec$10.$$p=null),n&&($BasicObject_instance_exec$10.$$p=null),t=Opal.slice.call(arguments,0,arguments.length),$truthy(r)||$$$("::","Kernel").$raise($$$("::","ArgumentError"),"no block given");var o,a=r.$$s;if(r.$$s=null,i.$$is_a_module){i.$$eval=!0;try{o=r.apply(i,t)}finally{i.$$eval=!1}}else o=r.apply(i,t);return r.$$s=a,o},$BasicObject_instance_exec$10.$$arity=-1),Opal.def(self,"$singleton_method_added",$BasicObject_singleton_method_added$11=function(e){return Opal.slice.call(arguments,0,arguments.length),nil},$BasicObject_singleton_method_added$11.$$arity=-1),Opal.def(self,"$singleton_method_removed",$BasicObject_singleton_method_removed$12=function(e){return Opal.slice.call(arguments,0,arguments.length),nil},$BasicObject_singleton_method_removed$12.$$arity=-1),Opal.def(self,"$singleton_method_undefined",$BasicObject_singleton_method_undefined$13=function(e){return Opal.slice.call(arguments,0,arguments.length),nil},$BasicObject_singleton_method_undefined$13.$$arity=-1),Opal.def(self,"$class",$BasicObject_class$14=function(){return this.$$class},$BasicObject_class$14.$$arity=0),Opal.def(self,"$method_missing",$BasicObject_method_missing$15=function(e,t){var n=$BasicObject_method_missing$15.$$p,r=this,i=nil;return n&&($BasicObject_method_missing$15.$$p=null),n&&($BasicObject_method_missing$15.$$p=null),Opal.slice.call(arguments,1,arguments.length),i=$truthy(r.$inspect&&!r.$inspect.$$stub)?"undefined method `"+e+"' for "+r.$inspect()+":"+r.$$class:"undefined method `"+e+"' for "+r.$$class,$$$("::","Kernel").$raise($$$("::","NoMethodError").$new(i,e))},$BasicObject_method_missing$15.$$arity=-2),nil&&"method_missing"}($nesting[0],null,$nesting)},Opal.modules["corelib/kernel"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e<=t:e["$<="](t)}e.top;var n=[],r=e.nil,i=e.const_get_qualified,o=e.const_get_relative,a=(e.breaker,e.slice,e.module),s=e.truthy,$=e.gvars,l=e.hash2,u=e.send,c=e.klass;return e.add_stubs(["$raise","$new","$inspect","$!","$=~","$==","$object_id","$class","$coerce_to?","$<<","$allocate","$copy_instance_variables","$copy_singleton_methods","$initialize_clone","$initialize_copy","$define_method","$singleton_class","$to_proc","$initialize_dup","$for","$empty?","$pop","$call","$coerce_to","$append_features","$extend_object","$extended","$__id__","$to_s","$instance_variable_name!","$respond_to?","$to_int","$coerce_to!","$Integer","$nil?","$===","$enum_for","$result","$any?","$print","$format","$puts","$each","$<=","$length","$[]","$exception","$is_a?","$rand","$respond_to_missing?","$try_convert!","$expand_path","$join","$start_with?","$new_seed","$srand","$sym","$arg","$open","$include"]),function(n,c){var f,d,p,_,h,m,y,g,v,b,w,x,k,E,O,A,S,C,R,T,I,N,L,D,P,M,z,F,j,B,q,U,H,Y,W,V,K,G,X,Q,J,Z,ee,te,ne,re,ie,oe,ae,se,$e,le,ue,ce,fe,de,pe,_e,he,me,ye,ge,ve,be,we,xe=a(n,"Kernel"),ke=[xe].concat(c);e.def(xe,"$method_missing",f=function(t,n){var r,i=f.$$p,a=this;return i&&(f.$$p=null),i&&(f.$$p=null),r=e.slice.call(arguments,1,arguments.length),a.$raise(o(ke,"NoMethodError").$new("undefined method `"+t+"' for "+a.$inspect(),t,r))},f.$$arity=-2),e.def(xe,"$=~",d=function(e){return!1},d.$$arity=1),e.def(xe,"$!~",p=function(e){return this["$=~"](e)["$!"]()},p.$$arity=1),e.def(xe,"$===",_=function(e){var t;return s(t=this.$object_id()["$=="](e.$object_id()))?t:this["$=="](e)},_.$$arity=1),e.def(xe,"$<=>",h=function(e){this.$$comparable=!0;var t=this["$=="](e);return t&&t!==r?0:r},h.$$arity=1),e.def(xe,"$method",m=function(e){var t=this,n=t["$"+e];return n&&!n.$$stub||t.$raise(o(ke,"NameError").$new("undefined method `"+e+"' for class `"+t.$class()+"'",e)),o(ke,"Method").$new(t,n.$$owner||t.$class(),n,e)},m.$$arity=1),e.def(xe,"$methods",y=function(t){return null==t&&(t=!0),s(t)?e.methods(this):e.own_methods(this)},y.$$arity=-1),e.def(xe,"$public_methods",g=function(t){return null==t&&(t=!0),s(t)?e.methods(this):e.receiver_methods(this)},g.$$arity=-1),e.def(xe,"$Array",v=function(e){var t;return e===r?[]:e.$$is_array?e:(t=o(ke,"Opal")["$coerce_to?"](e,o(ke,"Array"),"to_ary"))!==r||(t=o(ke,"Opal")["$coerce_to?"](e,o(ke,"Array"),"to_a"))!==r?t:[e]},v.$$arity=1),e.def(xe,"$at_exit",b=function(){var e,t=b.$$p,n=t||r;return null==$.__at_exit__&&($.__at_exit__=r),t&&(b.$$p=null),t&&(b.$$p=null),$.__at_exit__=s(e=$.__at_exit__)?e:[],$.__at_exit__["$<<"](n)},b.$$arity=0),e.def(xe,"$caller",w=function(t){return e.slice.call(arguments,0,arguments.length),[]},w.$$arity=-1),e.def(xe,"$class",x=function(){return this.$$class},x.$$arity=0),e.def(xe,"$copy_instance_variables",k=function(e){var t,n,r,i=Object.keys(e);for(t=0,n=i.length;t<n;t++)"$"!==(r=i[t]).charAt(0)&&e.hasOwnProperty(r)&&(this[r]=e[r])},k.$$arity=1),e.def(xe,"$copy_singleton_methods",E=function(t){var n,r,i,o;if(t.hasOwnProperty("$$meta")){var a=e.get_singleton_class(t),s=e.get_singleton_class(this);for(n=0,o=(i=Object.getOwnPropertyNames(a.$$prototype)).length;n<o;n++)r=i[n],e.is_method(r)&&(s.$$prototype[r]=a.$$prototype[r]);s.$$const=Object.assign({},a.$$const),Object.setPrototypeOf(s.$$prototype,Object.getPrototypeOf(a.$$prototype))}for(n=0,o=(i=Object.getOwnPropertyNames(t)).length;n<o;n++)"$"===(r=i[n]).charAt(0)&&"$"!==r.charAt(1)&&t.hasOwnProperty(r)&&(this[r]=t[r])},E.$$arity=1),e.def(xe,"$clone",O=function(t){var n=this,i=r;if(null==t)t=l([],{});else if(!t.$$is_hash)throw e.ArgumentError.$new("expected kwargs");return null==t.$$smap.freeze&&!0,(i=n.$class().$allocate()).$copy_instance_variables(n),i.$copy_singleton_methods(n),i.$initialize_clone(n),i},O.$$arity=-1),e.def(xe,"$initialize_clone",A=function(e){return this.$initialize_copy(e)},A.$$arity=1),e.def(xe,"$define_singleton_method",S=function(e,t){var n=S.$$p,i=n||r;return n&&(S.$$p=null),n&&(S.$$p=null),u(this.$singleton_class(),"define_method",[e,t],i.$to_proc())},S.$$arity=-2),e.def(xe,"$dup",C=function(){var e=this,t=r;return(t=e.$class().$allocate()).$copy_instance_variables(e),t.$initialize_dup(e),t},C.$$arity=0),e.def(xe,"$initialize_dup",R=function(e){return this.$initialize_copy(e)},R.$$arity=1),e.def(xe,"$enum_for",T=function(t,n){var i,a,s,$=T.$$p,l=$||r,c=this;return $&&(T.$$p=null),$&&(T.$$p=null),(i=e.slice.call(arguments,0,arguments.length)).length>0&&(a=i[0],i.splice(0,1)),null==a&&(a="each"),s=i,u(o(ke,"Enumerator"),"for",[c,a].concat(e.to_a(s)),l.$to_proc())},T.$$arity=-1),e.alias(xe,"to_enum","enum_for"),e.def(xe,"$equal?",I=function(e){return this===e},I.$$arity=1),e.def(xe,"$exit",N=function(t){var n;for(null==$.__at_exit__&&($.__at_exit__=r),null==t&&(t=!0),$.__at_exit__=s(n=$.__at_exit__)?n:[];!s($.__at_exit__["$empty?"]());)$.__at_exit__.$pop().$call();return t=t.$$is_boolean?t?0:1:o(ke,"Opal").$coerce_to(t,o(ke,"Integer"),"to_int"),e.exit(t),r},N.$$arity=-1),e.def(xe,"$extend",L=function(t){var n,r=this;n=e.slice.call(arguments,0,arguments.length);for(var i=r.$singleton_class(),a=n.length-1;a>=0;a--){var s=n[a];s.$$is_module||r.$raise(o(ke,"TypeError"),"wrong argument type "+s.$class()+" (expected Module)"),s.$append_features(i),s.$extend_object(r),s.$extended(r)}return r},L.$$arity=-1),e.def(xe,"$hash",D=function(){return this.$__id__()},D.$$arity=0),e.def(xe,"$initialize_copy",P=function(e){return r},P.$$arity=1),e.def(xe,"$inspect",M=function(){return this.$to_s()},M.$$arity=0),e.def(xe,"$instance_of?",z=function(e){return e.$$is_class||e.$$is_module||this.$raise(o(ke,"TypeError"),"class or module required"),this.$$class===e},z.$$arity=1),e.def(xe,"$instance_variable_defined?",F=function(t){return t=o(ke,"Opal")["$instance_variable_name!"](t),e.hasOwnProperty.call(this,t.substr(1))},F.$$arity=1),e.def(xe,"$instance_variable_get",j=function(t){t=o(ke,"Opal")["$instance_variable_name!"](t);var n=this[e.ivar(t.substr(1))];return null==n?r:n},j.$$arity=1),e.def(xe,"$instance_variable_set",B=function(t,n){return t=o(ke,"Opal")["$instance_variable_name!"](t),this[e.ivar(t.substr(1))]=n},B.$$arity=2),e.def(xe,"$remove_instance_variable",q=function(t){var n=this;t=o(ke,"Opal")["$instance_variable_name!"](t);var r,i=e.ivar(t.substr(1));return n.hasOwnProperty(i)?(r=n[i],delete n[i],r):n.$raise(o(ke,"NameError"),"instance variable "+t+" not defined")},q.$$arity=1),e.def(xe,"$instance_variables",U=function(){var e,t=[];for(var n in this)this.hasOwnProperty(n)&&"$"!==n.charAt(0)&&(e="$"===n.substr(-1)?n.slice(0,n.length-1):n,t.push("@"+e));return t},U.$$arity=0),e.def(xe,"$Integer",H=function(e,t){var n,i,a,s=this;return e.$$is_string?"0"===e?0:(void 0===t?t=0:(1===(t=o(ke,"Opal").$coerce_to(t,o(ke,"Integer"),"to_int"))||t<0||t>36)&&s.$raise(o(ke,"ArgumentError"),"invalid radix "+t),i=(i=(i=e.toLowerCase()).replace(/(\d)_(?=\d)/g,"$1")).replace(/^(\s*[+-]?)(0[bodx]?)/,(function(n,r,i){switch(i){case"0b":if(0===t||2===t)return t=2,r;case"0":case"0o":if(0===t||8===t)return t=8,r;case"0d":if(0===t||10===t)return t=10,r;case"0x":if(0===t||16===t)return t=16,r}s.$raise(o(ke,"ArgumentError"),'invalid value for Integer(): "'+e+'"')})),a="0-"+((t=0===t?10:t)<=10?t-1:"9a-"+String.fromCharCode(t-11+97)),new RegExp("^\\s*[+-]?["+a+"]+\\s*$").test(i)||s.$raise(o(ke,"ArgumentError"),'invalid value for Integer(): "'+e+'"'),n=parseInt(i,t),isNaN(n)&&s.$raise(o(ke,"ArgumentError"),'invalid value for Integer(): "'+e+'"'),n):(void 0!==t&&s.$raise(o(ke,"ArgumentError"),"base specified for non string value"),e===r&&s.$raise(o(ke,"TypeError"),"can't convert nil into Integer"),e.$$is_number?((e===1/0||e===-1/0||isNaN(e))&&s.$raise(o(ke,"FloatDomainError"),e),Math.floor(e)):e["$respond_to?"]("to_int")&&(n=e.$to_int())!==r?n:o(ke,"Opal")["$coerce_to!"](e,o(ke,"Integer"),"to_i"))},H.$$arity=-2),e.def(xe,"$Float",Y=function(e){var t,n=this;return e===r&&n.$raise(o(ke,"TypeError"),"can't convert nil into Float"),e.$$is_string?(t=(t=e.toString()).replace(/(\d)_(?=\d)/g,"$1"),/^\s*[-+]?0[xX][0-9a-fA-F]+\s*$/.test(t)?n.$Integer(t):(/^\s*[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?\s*$/.test(t)||n.$raise(o(ke,"ArgumentError"),'invalid value for Float(): "'+e+'"'),parseFloat(t))):o(ke,"Opal")["$coerce_to!"](e,o(ke,"Float"),"to_f")},Y.$$arity=1),e.def(xe,"$Hash",W=function(e){var t;return s(s(t=e["$nil?"]())?t:e["$=="]([]))?l([],{}):s(o(ke,"Hash")["$==="](e))?e:o(ke,"Opal")["$coerce_to!"](e,o(ke,"Hash"),"to_hash")},W.$$arity=1),e.def(xe,"$is_a?",V=function(t){return t.$$is_class||t.$$is_module||this.$raise(o(ke,"TypeError"),"class or module required"),e.is_a(this,t)},V.$$arity=1),e.def(xe,"$itself",K=function(){return this},K.$$arity=0),e.alias(xe,"kind_of?","is_a?"),e.def(xe,"$lambda",G=function(){var t=G.$$p,n=t||r;return t&&(G.$$p=null),t&&(G.$$p=null),e.lambda(n)},G.$$arity=0),e.def(xe,"$load",X=function(t){return t=o(ke,"Opal")["$coerce_to!"](t,o(ke,"String"),"to_str"),e.load(t)},X.$$arity=1),e.def(xe,"$loop",Q=function(){var t,n=Q.$$p,a=n||r,$=this,l=r;if(n&&(Q.$$p=null),a===r)return u($,"enum_for",["loop"],((t=function(){t.$$s;return i(o(ke,"Float"),"INFINITY")}).$$s=$,t.$$arity=0,t));for(;s(!0);)try{e.yieldX(a,[])}catch(c){if(!e.rescue(c,[o(ke,"StopIteration")]))throw c;l=c;try{return l.$result()}finally{e.pop_exception()}}return $},Q.$$arity=0),e.def(xe,"$nil?",J=function(){return!1},J.$$arity=0),e.alias(xe,"object_id","__id__"),e.def(xe,"$printf",Z=function(t){var n,i,o=this;return n=e.slice.call(arguments,0,arguments.length),s((i=n)["$any?"]())&&o.$print(u(o,"format",e.to_a(i))),r},Z.$$arity=-1),e.def(xe,"$proc",ee=function(){var e=ee.$$p,t=e||r;return e&&(ee.$$p=null),e&&(ee.$$p=null),s(t)||this.$raise(o(ke,"ArgumentError"),"tried to create Proc object without a block"),t.$$is_lambda=!1,t},ee.$$arity=0),e.def(xe,"$puts",te=function(t){var n;return null==$.stdout&&($.stdout=r),n=e.slice.call(arguments,0,arguments.length),u($.stdout,"puts",e.to_a(n))},te.$$arity=-1),e.def(xe,"$p",ne=function(n){var i,o,a,l=this;return i=e.slice.call(arguments,0,arguments.length),u(o=i,"each",[],((a=function(e){a.$$s;return null==$.stdout&&($.stdout=r),null==e&&(e=r),$.stdout.$puts(e.$inspect())}).$$s=l,a.$$arity=1,a)),s(t(o.$length(),1))?o["$[]"](0):o},ne.$$arity=-1),e.def(xe,"$print",re=function(t){var n;return null==$.stdout&&($.stdout=r),n=e.slice.call(arguments,0,arguments.length),u($.stdout,"print",e.to_a(n))},re.$$arity=-1),e.def(xe,"$warn",ie=function(t){var n,i;return null==$.VERBOSE&&($.VERBOSE=r),null==$.stderr&&($.stderr=r),n=e.slice.call(arguments,0,arguments.length),s(s(i=$.VERBOSE["$nil?"]())?i:n["$empty?"]())?r:u($.stderr,"puts",e.to_a(n))},ie.$$arity=-1),e.def(xe,"$raise",oe=function(t,n,i){if(null==$["!"]&&($["!"]=r),null==n&&(n=r),null==i&&(i=r),null==t&&$["!"]!==r)throw $["!"];throw null==t?t=o(ke,"RuntimeError").$new():t.$$is_string?t=o(ke,"RuntimeError").$new(t):t.$$is_class&&t["$respond_to?"]("exception")?t=t.$exception(n):t["$is_a?"](o(ke,"Exception"))||(t=o(ke,"TypeError").$new("exception class/object expected")),$["!"]!==r&&e.exceptions.push($["!"]),$["!"]=t,t},oe.$$arity=-1),e.alias(xe,"fail","raise"),e.def(xe,"$rand",ae=function(e){return void 0===e?i(o(ke,"Random"),"DEFAULT").$rand():(e.$$is_number&&(e<0&&(e=Math.abs(e)),e%1!==0&&(e=e.$to_i()),0===e&&(e=void 0)),i(o(ke,"Random"),"DEFAULT").$rand(e))},ae.$$arity=-1),e.def(xe,"$respond_to?",se=function(e,t){if(null==t&&(t=!1),s(this["$respond_to_missing?"](e,t)))return!0;var n=this["$"+e];return"function"===typeof n&&!n.$$stub},se.$$arity=-2),e.def(xe,"$respond_to_missing?",$e=function(e,t){return null==t&&(t=!1),!1},$e.$$arity=-2),e.def(xe,"$require",le=function(t){return t=o(ke,"Opal")["$coerce_to!"](t,o(ke,"String"),"to_str"),e.require(t)},le.$$arity=1),e.def(xe,"$require_relative",ue=function(t){return o(ke,"Opal")["$try_convert!"](t,o(ke,"String"),"to_str"),t=o(ke,"File").$expand_path(o(ke,"File").$join(e.current_file,"..",t)),e.require(t)},ue.$$arity=1),e.def(xe,"$require_tree",ce=function(t){var n=[];for(var r in t=o(ke,"File").$expand_path(t),"."===(t=e.normalize(t))&&(t=""),e.modules)r["$start_with?"](t)&&n.push([r,e.require(r)]);return n},ce.$$arity=1),e.alias(xe,"send","__send__"),e.alias(xe,"public_send","__send__"),e.def(xe,"$singleton_class",fe=function(){return e.get_singleton_class(this)},fe.$$arity=0),e.def(xe,"$sleep",de=function(t){var n=this;null==t&&(t=r),t===r&&n.$raise(o(ke,"TypeError"),"can't convert NilClass into time interval"),t.$$is_number||n.$raise(o(ke,"TypeError"),"can't convert "+t.$class()+" into time interval"),t<0&&n.$raise(o(ke,"ArgumentError"),"time interval must be positive");for(var i=e.global.performance?function(){return performance.now()}:function(){return new Date},a=i();i()-a<=1e3*t;);return t},de.$$arity=-1),e.def(xe,"$srand",pe=function(e){return null==e&&(e=o(ke,"Random").$new_seed()),o(ke,"Random").$srand(e)},pe.$$arity=-1),e.def(xe,"$String",_e=function(e){var t;return s(t=o(ke,"Opal")["$coerce_to?"](e,o(ke,"String"),"to_str"))?t:o(ke,"Opal")["$coerce_to!"](e,o(ke,"String"),"to_s")},_e.$$arity=1),e.def(xe,"$tap",he=function(){var t=he.$$p,n=t||r;return t&&(he.$$p=null),t&&(he.$$p=null),e.yield1(n,this),this},he.$$arity=0),e.def(xe,"$to_proc",me=function(){return this},me.$$arity=0),e.def(xe,"$to_s",ye=function(){return"#<"+this.$class()+":0x"+this.$__id__().$to_s(16)+">"},ye.$$arity=0),e.def(xe,"$catch",ge=function(t){var n=ge.$$p,i=n||r,a=r;n&&(ge.$$p=null);try{return e.yieldX(i,[])}catch(s){if(!e.rescue(s,[o(ke,"UncaughtThrowError")]))throw s;a=s;try{return a.$sym()["$=="](t)?a.$arg():this.$raise()}finally{e.pop_exception()}}},ge.$$arity=1),e.def(xe,"$throw",ve=function(t){var n,r=this;return n=e.slice.call(arguments,0,arguments.length),r.$raise(o(ke,"UncaughtThrowError"),n)},ve.$$arity=-1),e.def(xe,"$open",be=function(t){var n,i=be.$$p,a=i||r;return i&&(be.$$p=null),i&&(be.$$p=null),n=e.slice.call(arguments,0,arguments.length),u(o(ke,"File"),"open",e.to_a(n),a.$to_proc())},be.$$arity=-1),e.def(xe,"$yield_self",we=function(){var t,n=we.$$p,i=n||r,o=this;return n&&(we.$$p=null),i===r?u(o,"enum_for",["yield_self"],((t=function(){t.$$s;return 1}).$$s=o,t.$$arity=0,t)):e.yield1(i,o)},we.$$arity=0)}(n[0],n),function(e,t,n){var r=c(e,null,"Object"),i=[r].concat(n);return r.$include(o(i,"Kernel"))}(n[0],0,n)},Opal.modules["corelib/error"]=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative),i=(e.breaker,e.slice,e.klass),o=e.send,a=e.truthy,s=e.module,$=e.hash2;return e.add_stubs(["$new","$clone","$to_s","$empty?","$class","$raise","$+","$attr_reader","$[]","$>","$length","$inspect"]),function(t,s,$){var l,u,c,f,d,p,_,h,m,y,g=i(t,s,"Exception"),v=[g].concat($);g.$$prototype.message=n,e.defs(g,"$new",l=function(t){var r,i=this,o=(r=e.slice.call(arguments,0,arguments.length)).length>0?r[0]:n,a=new i.$$constructor(o);return a.name=i.$$name,a.message=o,e.send(a,a.$initialize,r),e.config.enable_stack_trace&&Error.captureStackTrace&&Error.captureStackTrace(a,y),a},l.$$arity=-1),y=g.$new,e.defs(g,"$exception",u=function(t){var n,r=this;return n=e.slice.call(arguments,0,arguments.length),o(r,"new",e.to_a(n))},u.$$arity=-1),e.def(g,"$initialize",c=function(t){var r,i=this;return r=e.slice.call(arguments,0,arguments.length),i.message=r.length>0?r[0]:n},c.$$arity=-1),e.def(g,"$backtrace",f=function(){var e=this;if(e.backtrace)return e.backtrace;var t=e.stack;return"string"===typeof t?t.split("\n").slice(0,15):t?t.slice(0,15):[]},f.$$arity=0),e.def(g,"$exception",d=function(e){var t=this;if(null==e&&(e=n),e===n||t===e)return t;var r=t.$clone();return r.message=e,r},d.$$arity=-1),e.def(g,"$message",p=function(){return this.$to_s()},p.$$arity=0),e.def(g,"$inspect",_=function(){var e=this,t=n;return t=e.$to_s(),a(t["$empty?"]())?e.$class().$to_s():"#<"+e.$class().$to_s()+": "+e.$to_s()+">"},_.$$arity=0),e.def(g,"$set_backtrace",h=function(e){var t,i,o=this,a=!0;if(e===n)o.backtrace=n;else if(e.$$is_string)o.backtrace=[e];else{if(e.$$is_array){for(t=0,i=e.length;t<i;t++)if(!e[t].$$is_string){a=!1;break}}else a=!1;!1===a&&o.$raise(r(v,"TypeError"),"backtrace must be Array of String"),o.backtrace=e}return e},h.$$arity=1),e.def(g,"$to_s",m=function(){var e,t,n=this;return a(e=a(t=n.message)?n.message.$to_s():t)?e:n.$class().$to_s()},m.$$arity=0)}(t[0],Error,t),function(e,t,n){[i(e,t,"ScriptError")].concat(n)}(t[0],r(t,"Exception"),t),function(e,t,n){[i(e,t,"SyntaxError")].concat(n)}(t[0],r(t,"ScriptError"),t),function(e,t,n){[i(e,t,"LoadError")].concat(n)}(t[0],r(t,"ScriptError"),t),function(e,t,n){[i(e,t,"NotImplementedError")].concat(n)}(t[0],r(t,"ScriptError"),t),function(e,t,n){[i(e,t,"SystemExit")].concat(n)}(t[0],r(t,"Exception"),t),function(e,t,n){[i(e,t,"NoMemoryError")].concat(n)}(t[0],r(t,"Exception"),t),function(e,t,n){[i(e,t,"SignalException")].concat(n)}(t[0],r(t,"Exception"),t),function(e,t,n){[i(e,t,"Interrupt")].concat(n)}(t[0],r(t,"Exception"),t),function(e,t,n){[i(e,t,"SecurityError")].concat(n)}(t[0],r(t,"Exception"),t),function(e,t,n){[i(e,t,"StandardError")].concat(n)}(t[0],r(t,"Exception"),t),function(e,t,n){[i(e,t,"EncodingError")].concat(n)}(t[0],r(t,"StandardError"),t),function(e,t,n){[i(e,t,"ZeroDivisionError")].concat(n)}(t[0],r(t,"StandardError"),t),function(e,t,n){[i(e,t,"NameError")].concat(n)}(t[0],r(t,"StandardError"),t),function(e,t,n){[i(e,t,"NoMethodError")].concat(n)}(t[0],r(t,"NameError"),t),function(e,t,n){[i(e,t,"RuntimeError")].concat(n)}(t[0],r(t,"StandardError"),t),function(e,t,n){[i(e,t,"FrozenError")].concat(n)}(t[0],r(t,"RuntimeError"),t),function(e,t,n){[i(e,t,"LocalJumpError")].concat(n)}(t[0],r(t,"StandardError"),t),function(e,t,n){[i(e,t,"TypeError")].concat(n)}(t[0],r(t,"StandardError"),t),function(e,t,n){[i(e,t,"ArgumentError")].concat(n)}(t[0],r(t,"StandardError"),t),function(e,t,n){[i(e,t,"IndexError")].concat(n)}(t[0],r(t,"StandardError"),t),function(e,t,n){[i(e,t,"StopIteration")].concat(n)}(t[0],r(t,"IndexError"),t),function(e,t,n){[i(e,t,"KeyError")].concat(n)}(t[0],r(t,"IndexError"),t),function(e,t,n){[i(e,t,"RangeError")].concat(n)}(t[0],r(t,"StandardError"),t),function(e,t,n){[i(e,t,"FloatDomainError")].concat(n)}(t[0],r(t,"RangeError"),t),function(e,t,n){[i(e,t,"IOError")].concat(n)}(t[0],r(t,"StandardError"),t),function(e,t,n){[i(e,t,"SystemCallError")].concat(n)}(t[0],r(t,"StandardError"),t),function(t,$){var l=[s(t,"Errno")].concat($);!function(t,r,s){var $,l=i(t,r,"EINVAL");[l].concat(s);e.defs(l,"$new",$=function(t){var r,i,s=$.$$p,l=this,u=n;return s&&($.$$p=null),null==t&&(t=n),u="Invalid argument",a(t)&&(i=" - "+t,u="number"===typeof(r=u)&&"number"===typeof i?r+i:r["$+"](i)),o(l,e.find_super_dispatcher(l,"new",$,!1,l.$$class.$$prototype),[u],null)},$.$$arity=-1)}(l[0],r(l,"SystemCallError"),l)}(t[0],t),function(t,r,s){var $,l=i(t,r,"UncaughtThrowError");[l].concat(s);l.$$prototype.sym=n,l.$attr_reader("sym","arg"),e.def(l,"$initialize",$=function(t){var n,r,i=$.$$p,s=this;return i&&($.$$p=null),s.sym=t["$[]"](0),a((n=t.$length(),r=1,"number"===typeof n&&"number"===typeof r?n>r:n["$>"](r)))&&(s.arg=t["$[]"](1)),o(s,e.find_super_dispatcher(s,"initialize",$,!1),["uncaught throw "+s.sym.$inspect()],null)},$.$$arity=1)}(t[0],r(t,"ArgumentError"),t),function(t,r,a){var s,$=i(t,null,"NameError");[$].concat(a);$.$attr_reader("name"),e.def($,"$initialize",s=function(t,r){var i=s.$$p,a=this;return i&&(s.$$p=null),null==r&&(r=n),o(a,e.find_super_dispatcher(a,"initialize",s,!1),[t],null),a.name=r},s.$$arity=-2)}(t[0],0,t),function(t,r,a){var s,$=i(t,null,"NoMethodError");[$].concat(a);$.$attr_reader("args"),e.def($,"$initialize",s=function(t,r,i){var a=s.$$p,$=this;return a&&(s.$$p=null),null==r&&(r=n),null==i&&(i=[]),o($,e.find_super_dispatcher($,"initialize",s,!1),[t,r],null),$.args=i},s.$$arity=-2)}(t[0],0,t),function(e,t,n){var r=i(e,null,"StopIteration");[r].concat(n);r.$attr_reader("result")}(t[0],0,t),function(t,s,l){var u,c,f,d=i(t,null,"KeyError"),p=[d].concat(l);d.$$prototype.receiver=d.$$prototype.key=n,e.def(d,"$initialize",u=function(t,r){var i,a,s=u.$$p,l=this;if(s&&(u.$$p=null),null==r)r=$([],{});else if(!r.$$is_hash)throw e.ArgumentError.$new("expected kwargs");return null==(i=r.$$smap.receiver)&&(i=n),null==(a=r.$$smap.key)&&(a=n),o(l,e.find_super_dispatcher(l,"initialize",u,!1),[t],null),l.receiver=i,l.key=a},u.$$arity=-2),e.def(d,"$receiver",c=function(){var e;return a(e=this.receiver)?e:this.$raise(r(p,"ArgumentError"),"no receiver is available")},c.$$arity=0),e.def(d,"$key",f=function(){var e;return a(e=this.key)?e:this.$raise(r(p,"ArgumentError"),"no key is available")},f.$$arity=0)}(t[0],0,t),function(e,t){var n=[s(e,"JS")].concat(t);!function(e,t,n){[i(e,null,"Error")].concat(n)}(n[0],0,n)}(t[0],t)},Opal.modules["corelib/constants"]=function(e){e.top;var t=[],n=(e.nil,e.const_get_qualified,e.const_get_relative);e.breaker,e.slice;return e.const_set(t[0],"RUBY_PLATFORM","opal"),e.const_set(t[0],"RUBY_ENGINE","opal"),e.const_set(t[0],"RUBY_VERSION","2.5.1"),e.const_set(t[0],"RUBY_ENGINE_VERSION","0.11.99.dev"),e.const_set(t[0],"RUBY_RELEASE_DATE","2018-12-25"),e.const_set(t[0],"RUBY_PATCHLEVEL",0),e.const_set(t[0],"RUBY_REVISION",0),e.const_set(t[0],"RUBY_COPYRIGHT","opal - Copyright (C) 2013-2018 Adam Beynon and the Opal contributors"),e.const_set(t[0],"RUBY_DESCRIPTION","opal "+n(t,"RUBY_ENGINE_VERSION")+" ("+n(t,"RUBY_RELEASE_DATE")+" revision "+n(t,"RUBY_REVISION")+")")},Opal.modules["opal/base"]=function(e){var t=e.top;e.nil,e.const_get_qualified,e.const_get_relative,e.breaker,e.slice;return e.add_stubs(["$require"]),t.$require("corelib/runtime"),t.$require("corelib/helpers"),t.$require("corelib/module"),t.$require("corelib/class"),t.$require("corelib/basic_object"),t.$require("corelib/kernel"),t.$require("corelib/error"),t.$require("corelib/constants")},Opal.modules["corelib/nil"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e>t:e["$>"](t)}e.top;var n=[],r=e.nil,i=(e.const_get_qualified,e.const_get_relative),o=(e.breaker,e.slice,e.klass),a=e.hash2,s=e.truthy;return e.add_stubs(["$raise","$name","$new","$>","$length","$Rational"]),function(n,$,l){var u,c,f,d,p,_,h,m,y,g,v,b,w,x,k,E,O,A,S=o(n,null,"NilClass"),C=[S].concat(l);S.$$prototype.$$meta=S,function(t,n){var r,o=[t].concat(n);e.def(t,"$allocate",r=function(){return this.$raise(i(o,"TypeError"),"allocator undefined for "+this.$name())},r.$$arity=0),e.udef(t,"$new")}(e.get_singleton_class(S),C),e.def(S,"$!",u=function(){return!0},u.$$arity=0),e.def(S,"$&",c=function(e){return!1},c.$$arity=1),e.def(S,"$|",f=function(e){return!1!==e&&e!==r},f.$$arity=1),e.def(S,"$^",d=function(e){return!1!==e&&e!==r},d.$$arity=1),e.def(S,"$==",p=function(e){return e===r},p.$$arity=1),e.def(S,"$dup",_=function(){return r},_.$$arity=0),e.def(S,"$clone",h=function(t){if(null==t)t=a([],{});else if(!t.$$is_hash)throw e.ArgumentError.$new("expected kwargs");return null==t.$$smap.freeze&&!0,r},h.$$arity=-1),e.def(S,"$inspect",m=function(){return"nil"},m.$$arity=0),e.def(S,"$nil?",y=function(){return!0},y.$$arity=0),e.def(S,"$singleton_class",g=function(){return i(C,"NilClass")},g.$$arity=0),e.def(S,"$to_a",v=function(){return[]},v.$$arity=0),e.def(S,"$to_h",b=function(){return e.hash()},b.$$arity=0),e.def(S,"$to_i",w=function(){return 0},w.$$arity=0),e.alias(S,"to_f","to_i"),e.def(S,"$to_s",x=function(){return""},x.$$arity=0),e.def(S,"$to_c",k=function(){return i(C,"Complex").$new(0,0)},k.$$arity=0),e.def(S,"$rationalize",E=function(n){var r,o=this;return r=e.slice.call(arguments,0,arguments.length),s(t(r.$length(),1))&&o.$raise(i(C,"ArgumentError")),o.$Rational(0,1)},E.$$arity=-1),e.def(S,"$to_r",O=function(){return this.$Rational(0,1)},O.$$arity=0),e.def(S,"$instance_variables",A=function(){return[]},A.$$arity=0)}(n[0],0,n),e.const_set(n[0],"NIL",r)},Opal.modules["corelib/boolean"]=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative),i=(e.breaker,e.slice,e.klass),o=e.hash2;return e.add_stubs(["$raise","$name"]),function(t,a,s){var $,l,u,c,f,d,p,_,h,m,y=i(t,a,"Boolean"),g=[y].concat(s);e.defineProperty(y.$$prototype,"$$is_boolean",!0),e.defineProperty(y.$$prototype,"$$meta",y),function(t,n){var i,o=[t].concat(n);e.def(t,"$allocate",i=function(){return this.$raise(r(o,"TypeError"),"allocator undefined for "+this.$name())},i.$$arity=0),e.udef(t,"$new")}(e.get_singleton_class(y),g),e.def(y,"$__id__",$=function(){return this.valueOf()?2:0},$.$$arity=0),e.alias(y,"object_id","__id__"),e.def(y,"$!",l=function(){return 1!=this},l.$$arity=0),e.def(y,"$&",u=function(e){return 1==this&&(!1!==e&&e!==n)},u.$$arity=1),e.def(y,"$|",c=function(e){return 1==this||!1!==e&&e!==n},c.$$arity=1),e.def(y,"$^",f=function(e){return 1==this?!1===e||e===n:!1!==e&&e!==n},f.$$arity=1),e.def(y,"$==",d=function(e){return 1==this===e.valueOf()},d.$$arity=1),e.alias(y,"equal?","=="),e.alias(y,"eql?","=="),e.def(y,"$singleton_class",p=function(){return r(g,"Boolean")},p.$$arity=0),e.def(y,"$to_s",_=function(){return 1==this?"true":"false"},_.$$arity=0),e.def(y,"$dup",h=function(){return this},h.$$arity=0),e.def(y,"$clone",m=function(t){if(null==t)t=o([],{});else if(!t.$$is_hash)throw e.ArgumentError.$new("expected kwargs");return null==t.$$smap.freeze&&!0,this},m.$$arity=-1)}(t[0],Boolean,t),e.const_set(t[0],"TrueClass",r(t,"Boolean")),e.const_set(t[0],"FalseClass",r(t,"Boolean")),e.const_set(t[0],"TRUE",!0),e.const_set(t[0],"FALSE",!1)},Opal.modules["corelib/comparable"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e>t:e["$>"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e<t:e["$<"](t)}e.top;var r=[],i=e.nil,o=(e.const_get_qualified,e.const_get_relative),a=(e.breaker,e.slice,e.module),s=e.truthy;return e.add_stubs(["$===","$>","$<","$equal?","$<=>","$normalize","$raise","$class"]),function(r,$){var l,u,c,f,d,p,_,h,m=a(r,"Comparable"),y=[m].concat($);e.defs(m,"$normalize",l=function(e){return s(o(y,"Integer")["$==="](e))?e:s(t(e,0))?1:s(n(e,0))?-1:0},l.$$arity=1),e.def(m,"$==",u=function(t){var n=this,r=i;try{return!!s(n["$equal?"](t))||n["$<=>"]!=e.Kernel["$<=>"]&&(n.$$comparable?(delete n.$$comparable,!1):!!s(r=n["$<=>"](t))&&0==o(y,"Comparable").$normalize(r))}catch(a){if(!e.rescue(a,[o(y,"StandardError")]))throw a;try{return!1}finally{e.pop_exception()}}},u.$$arity=1),e.def(m,"$>",c=function(e){var t,n=this;return s(t=n["$<=>"](e))||n.$raise(o(y,"ArgumentError"),"comparison of "+n.$class()+" with "+e.$class()+" failed"),o(y,"Comparable").$normalize(t)>0},c.$$arity=1),e.def(m,"$>=",f=function(e){var t,n=this;return s(t=n["$<=>"](e))||n.$raise(o(y,"ArgumentError"),"comparison of "+n.$class()+" with "+e.$class()+" failed"),o(y,"Comparable").$normalize(t)>=0},f.$$arity=1),e.def(m,"$<",d=function(e){var t,n=this;return s(t=n["$<=>"](e))||n.$raise(o(y,"ArgumentError"),"comparison of "+n.$class()+" with "+e.$class()+" failed"),o(y,"Comparable").$normalize(t)<0},d.$$arity=1),e.def(m,"$<=",p=function(e){var t,n=this;return s(t=n["$<=>"](e))||n.$raise(o(y,"ArgumentError"),"comparison of "+n.$class()+" with "+e.$class()+" failed"),o(y,"Comparable").$normalize(t)<=0},p.$$arity=1),e.def(m,"$between?",_=function(e,r){return!n(this,e)&&!t(this,r)},_.$$arity=2),e.def(m,"$clamp",h=function(e,r){var i,a=this;return i=e["$<=>"](r),s(i)||a.$raise(o(y,"ArgumentError"),"comparison of "+e.$class()+" with "+r.$class()+" failed"),s(t(o(y,"Comparable").$normalize(i),0))&&a.$raise(o(y,"ArgumentError"),"min argument must be smaller than max argument"),s(n(o(y,"Comparable").$normalize(a["$<=>"](e)),0))?e:s(t(o(y,"Comparable").$normalize(a["$<=>"](r)),0))?r:a},h.$$arity=2)}(r[0],r)},Opal.modules["corelib/regexp"]=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative),i=(e.breaker,e.slice,e.klass),o=e.send,a=e.truthy,s=e.gvars;return e.add_stubs(["$nil?","$[]","$raise","$escape","$options","$to_str","$new","$join","$coerce_to!","$!","$match","$coerce_to?","$begin","$coerce_to","$=~","$attr_reader","$===","$inspect","$to_a"]),function(e,t,n){[i(e,t,"RegexpError")].concat(n)}(t[0],r(t,"StandardError"),t),function(t,$,l){var u,c,f,d,p,_,h,m,y,g,v=i(t,$,"Regexp"),b=[v].concat(l);e.const_set(b[0],"IGNORECASE",1),e.const_set(b[0],"EXTENDED",2),e.const_set(b[0],"MULTILINE",4),e.defineProperty(v.$$prototype,"$$is_regexp",!0),function(t,i){var $,l,u,c,f,d=[t].concat(i);e.def(t,"$allocate",$=function(){var t=$.$$p,r=this,i=n,a=n,s=n,l=n;for(t&&($.$$p=null),s=0,l=arguments.length,a=new Array(l);s<l;s++)a[s]=arguments[s];return(i=o(r,e.find_super_dispatcher(r,"allocate",$,!1),a,t)).uninitialized=!0,i},$.$$arity=0),e.def(t,"$escape",l=function(t){return e.escape_regexp(t)},l.$$arity=1),e.def(t,"$last_match",u=function(e){return null==s["~"]&&(s["~"]=n),null==e&&(e=n),a(e["$nil?"]())?s["~"]:s["~"]["$[]"](e)},u.$$arity=-1),e.alias(t,"quote","escape"),e.def(t,"$union",c=function(t){var n,i,o,a,s,$,l=this;if(0==(n=e.slice.call(arguments,0,arguments.length)).length)return/(?!)/;if(1==n.length&&n[0].$$is_regexp)return n[0];i=n[0].$$is_array,n.length>1&&i&&l.$raise(r(d,"TypeError"),"no implicit conversion of Array into String"),i&&(n=n[0]),s=void 0,o=[];for(var u=0;u<n.length;u++)(a=n[u]).$$is_string?o.push(l.$escape(a)):a.$$is_regexp?($=a.$options(),void 0!=s&&s!=$&&l.$raise(r(d,"TypeError"),"All expressions must use the same options"),s=$,o.push("("+a.source+")")):o.push(l.$escape(a.$to_str()));return l.$new(o.$join("|"),s)},c.$$arity=-1),e.def(t,"$new",f=function(e,t){if(e.$$is_regexp)return new RegExp(e);if("\\"===(e=r(d,"Opal")["$coerce_to!"](e,r(d,"String"),"to_str")).charAt(e.length-1)&&"\\"!==e.charAt(e.length-2)&&this.$raise(r(d,"RegexpError"),"too short escape sequence: /"+e+"/"),void 0===t||t["$!"]())return new RegExp(e);if(t.$$is_number){var n="";r(d,"IGNORECASE")&t&&(n+="i"),r(d,"MULTILINE")&t&&(n+="m"),t=n}else t="i";return new RegExp(e,t)},f.$$arity=-2)}(e.get_singleton_class(v),b),e.def(v,"$==",u=function(e){return e instanceof RegExp&&this.toString()===e.toString()},u.$$arity=1),e.def(v,"$===",c=function(e){return this.$match(r(b,"Opal")["$coerce_to?"](e,r(b,"String"),"to_str"))!==n},c.$$arity=1),e.def(v,"$=~",f=function(e){var t;return null==s["~"]&&(s["~"]=n),a(t=this.$match(e))?s["~"].$begin(0):t},f.$$arity=1),e.alias(v,"eql?","=="),e.def(v,"$inspect",d=function(){var e=this.toString(),t=/^\/(.*)\/([^\/]*)$/.exec(e);if(t){for(var n=t[1],r=t[2],i=n.split(""),o=i.length,a=!1,s="",$=0;$<o;$++){var l=i[$];a||"/"!=l||(s=s.concat("\\")),s=s.concat(l),a="\\"==l&&!a}return"/"+s+"/"+r}return e},d.$$arity=0),e.def(v,"$match",p=function(t,i){var o=p.$$p,a=o||n,$=this;if(null==s["~"]&&(s["~"]=n),o&&(p.$$p=null),o&&(p.$$p=null),$.uninitialized&&$.$raise(r(b,"TypeError"),"uninitialized Regexp"),void 0===i){if(t===n)return s["~"]=n;var l=$.exec(r(b,"Opal").$coerce_to(t,r(b,"String"),"to_str"));return l?(s["~"]=r(b,"MatchData").$new($,l),a===n?s["~"]:e.yield1(a,s["~"])):s["~"]=n}if(i=r(b,"Opal").$coerce_to(i,r(b,"Integer"),"to_int"),t===n)return s["~"]=n;if(t=r(b,"Opal").$coerce_to(t,r(b,"String"),"to_str"),i<0&&(i+=t.length)<0)return s["~"]=n;for(var u,c=e.global_regexp($);;){if(null===(u=c.exec(t)))return s["~"]=n;if(u.index>=i)return s["~"]=r(b,"MatchData").$new(c,u),a===n?s["~"]:e.yield1(a,s["~"]);c.lastIndex=u.index+1}},p.$$arity=-2),e.def(v,"$match?",_=function(t,i){var o,a=this;return a.uninitialized&&a.$raise(r(b,"TypeError"),"uninitialized Regexp"),void 0===i?t!==n&&a.test(r(b,"Opal").$coerce_to(t,r(b,"String"),"to_str")):(i=r(b,"Opal").$coerce_to(i,r(b,"Integer"),"to_int"),t!==n&&(t=r(b,"Opal").$coerce_to(t,r(b,"String"),"to_str"),!(i<0&&(i+=t.length)<0)&&!(null===(o=e.global_regexp(a).exec(t))||o.index<i)))},_.$$arity=-2),e.def(v,"$~",h=function(){return null==s._&&(s._=n),this["$=~"](s._)},h.$$arity=0),e.def(v,"$source",m=function(){return this.source},m.$$arity=0),e.def(v,"$options",y=function(){var e=this;e.uninitialized&&e.$raise(r(b,"TypeError"),"uninitialized Regexp");var t=0;return e.multiline&&(t|=r(b,"MULTILINE")),e.ignoreCase&&(t|=r(b,"IGNORECASE")),t},y.$$arity=0),e.def(v,"$casefold?",g=function(){return this.ignoreCase},g.$$arity=0),e.alias(v,"to_s","source")}(t[0],RegExp,t),function(t,$,l){var u,c,f,d,p,_,h,m,y,g,v,b,w=i(t,null,"MatchData"),x=[w].concat(l);return w.$$prototype.matches=n,w.$attr_reader("post_match","pre_match","regexp","string"),e.def(w,"$initialize",u=function(e,t){var r=this;s["~"]=r,r.regexp=e,r.begin=t.index,r.string=t.input,r.pre_match=t.input.slice(0,t.index),r.post_match=t.input.slice(t.index+t[0].length),r.matches=[];for(var i=0,o=t.length;i<o;i++){var a=t[i];null==a?r.matches.push(n):r.matches.push(a)}},u.$$arity=2),e.def(w,"$[]",c=function(t){var n,r=this;return n=e.slice.call(arguments,0,arguments.length),o(r.matches,"[]",e.to_a(n))},c.$$arity=-1),e.def(w,"$offset",f=function(e){var t=this;return 0!==e&&t.$raise(r(x,"ArgumentError"),"MatchData#offset only supports 0th element"),[t.begin,t.begin+t.matches[e].length]},f.$$arity=1),e.def(w,"$==",d=function(e){var t,n,i,o,s=this;return!!a(r(x,"MatchData")["$==="](e))&&(a(t=a(n=a(i=a(o=s.string==e.string)?s.regexp.toString()==e.regexp.toString():o)?s.pre_match==e.pre_match:i)?s.post_match==e.post_match:n)?s.begin==e.begin:t)},d.$$arity=1),e.alias(w,"eql?","=="),e.def(w,"$begin",p=function(e){return 0!==e&&this.$raise(r(x,"ArgumentError"),"MatchData#begin only supports 0th element"),this.begin},p.$$arity=1),e.def(w,"$end",_=function(e){var t=this;return 0!==e&&t.$raise(r(x,"ArgumentError"),"MatchData#end only supports 0th element"),t.begin+t.matches[e].length},_.$$arity=1),e.def(w,"$captures",h=function(){return this.matches.slice(1)},h.$$arity=0),e.def(w,"$inspect",m=function(){for(var e=this,t="#<MatchData "+e.matches[0].$inspect(),n=1,r=e.matches.length;n<r;n++)t+=" "+n+":"+e.matches[n].$inspect();return t+">"},m.$$arity=0),e.def(w,"$length",y=function(){return this.matches.length},y.$$arity=0),e.alias(w,"size","length"),e.def(w,"$to_a",g=function(){return this.matches},g.$$arity=0),e.def(w,"$to_s",v=function(){return this.matches[0]},v.$$arity=0),e.def(w,"$values_at",b=function(t){var i,o=this;i=e.slice.call(arguments,0,arguments.length);var a,s,$,l=[];for(a=0;a<i.length;a++)i[a].$$is_range&&((s=i[a].$to_a()).unshift(a,1),Array.prototype.splice.apply(i,s)),($=r(x,"Opal")["$coerce_to!"](i[a],r(x,"Integer"),"to_int"))<0&&($+=o.matches.length)<0?l.push(n):l.push(o.matches[$]);return l},b.$$arity=-1),n&&"values_at"}(t[0],0,t)},Opal.modules["corelib/string"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e/t:e["$/"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e+t:e["$+"](t)}var r=e.top,i=[],o=e.nil,a=(e.const_get_qualified,e.const_get_relative),s=(e.breaker,e.slice,e.klass),$=e.truthy,l=e.send,u=e.gvars;return e.add_stubs(["$require","$include","$coerce_to?","$coerce_to","$raise","$===","$format","$to_s","$respond_to?","$to_str","$<=>","$==","$=~","$new","$force_encoding","$casecmp","$empty?","$ljust","$ceil","$/","$+","$rjust","$floor","$to_a","$each_char","$to_proc","$coerce_to!","$copy_singleton_methods","$initialize_clone","$initialize_dup","$enum_for","$size","$chomp","$[]","$to_i","$each_line","$class","$match","$match?","$captures","$proc","$succ","$escape"]),r.$require("corelib/comparable"),r.$require("corelib/regexp"),function(r,i,c){var f,d,p,_,h,m,y,g,v,b,w,x,k,E,O,A,S,C,R,T,I,N,L,D,P,M,z,F,j,B,q,U,H,Y,W,V,K,G,X,Q,J,Z,ee,te,ne,re,ie,oe,ae,se,$e,le,ue,ce,fe,de,pe,_e,he,me,ye,ge,ve,be,we,xe,ke,Ee,Oe,Ae,Se,Ce,Re,Te,Ie,Ne,Le=s(r,String,"String"),De=[Le].concat(c);function Pe(e){function t(e){var t,n,r,i,o,s,$="",l=e.length;for(t=0;t<l;t++)if("-"===(n=e.charAt(t))&&t>0&&t<l-1&&!r){for((i=e.charCodeAt(t-1))>(o=e.charCodeAt(t+1))&&Le.$raise(a(De,"ArgumentError"),'invalid range "'+i+"-"+o+'" in string transliteration'),s=i+1;s<o+1;s++)$+=String.fromCharCode(s);r=!0,t++}else r="\\"===n,$+=n;return $}function n(e,t){if(0===e.length)return t;var n,r,i="",o=e.length;for(n=0;n<o;n++)r=e.charAt(n),-1!==t.indexOf(r)&&(i+=r);return i}var r,i,o,s,$,l,u="",c="";for(r=0,i=e.length;r<i;r++)s="^"===(o=a(De,"Opal").$coerce_to(e[r],a(De,"String"),"to_str")).charAt(0)&&o.length>1,o=t(s?o.slice(1):o),s?c=n(c,o):u=n(u,o);if(u.length>0&&c.length>0){for(l="",r=0,i=u.length;r<i;r++)$=u.charAt(r),-1===c.indexOf($)&&(l+=$);u=l,c=""}return u.length>0?"["+a(De,"Regexp").$escape(u)+"]":c.length>0?"[^"+a(De,"Regexp").$escape(c)+"]":null}Le.$include(a(De,"Comparable")),e.defineProperty(Le.$$prototype,"$$is_string",!0),e.defineProperty(Le.$$prototype,"$$cast",(function(e){var t=this.$$class;return t.$$constructor===String?e:new t.$$constructor(e)})),e.def(Le,"$__id__",f=function(){return this.toString()},f.$$arity=0),e.alias(Le,"object_id","__id__"),e.defs(Le,"$try_convert",d=function(e){return a(De,"Opal")["$coerce_to?"](e,a(De,"String"),"to_str")},d.$$arity=1),e.defs(Le,"$new",p=function(e){return null==e&&(e=""),e=a(De,"Opal").$coerce_to(e,a(De,"String"),"to_str"),new this.$$constructor(e)},p.$$arity=-1),e.def(Le,"$initialize",_=function(e){return void 0===e?this:this.$raise(a(De,"NotImplementedError"),"Mutable strings are not supported in Opal.")},_.$$arity=-1),e.def(Le,"$%",h=function(t){var n=this;return $(a(De,"Array")["$==="](t))?l(n,"format",[n].concat(e.to_a(t))):n.$format(n,t)},h.$$arity=1),e.def(Le,"$*",m=function(e){var t=this;if((e=a(De,"Opal").$coerce_to(e,a(De,"Integer"),"to_int"))<0&&t.$raise(a(De,"ArgumentError"),"negative argument"),0===e)return t.$$cast("");var n="",r=t.toString();for(r.length*e>=1<<28&&t.$raise(a(De,"RangeError"),"multiply count must not overflow maximum string size");1===(1&e)&&(n+=r),0!==(e>>>=1);)r+=r;return t.$$cast(n)},m.$$arity=1),e.def(Le,"$+",y=function(e){return this+(e=a(De,"Opal").$coerce_to(e,a(De,"String"),"to_str")).$to_s()},y.$$arity=1),e.def(Le,"$<=>",g=function(e){var t=this;if($(e["$respond_to?"]("to_str")))return t>(e=e.$to_str().$to_s())?1:t<e?-1:0;var n=e["$<=>"](t);return n===o?o:n>0?-1:n<0?1:0},g.$$arity=1),e.def(Le,"$==",v=function(e){return e.$$is_string?this.toString()===e.toString():!!a(De,"Opal")["$respond_to?"](e,"to_str")&&e["$=="](this)},v.$$arity=1),e.alias(Le,"eql?","=="),e.alias(Le,"===","=="),e.def(Le,"$=~",b=function(e){return e.$$is_string&&this.$raise(a(De,"TypeError"),"type mismatch: String given"),e["$=~"](this)},b.$$arity=1),e.def(Le,"$[]",w=function(e,t){var n,r=this,i=r.length;if(e.$$is_range)return n=e.excl,t=a(De,"Opal").$coerce_to(e.end,a(De,"Integer"),"to_int"),e=a(De,"Opal").$coerce_to(e.begin,a(De,"Integer"),"to_int"),Math.abs(e)>i?o:(e<0&&(e+=i),t<0&&(t+=i),n||(t+=1),(t-=e)<0&&(t=0),r.$$cast(r.substr(e,t)));if(e.$$is_string)return null!=t&&r.$raise(a(De,"TypeError")),-1!==r.indexOf(e)?r.$$cast(e):o;if(e.$$is_regexp){var s=r.match(e);return null===s?(u["~"]=o,o):(u["~"]=a(De,"MatchData").$new(e,s),null==t?r.$$cast(s[0]):(t=a(De,"Opal").$coerce_to(t,a(De,"Integer"),"to_int"))<0&&-t<s.length?r.$$cast(s[t+=s.length]):t>=0&&t<s.length?r.$$cast(s[t]):o)}return(e=a(De,"Opal").$coerce_to(e,a(De,"Integer"),"to_int"))<0&&(e+=i),null==t?e>=i||e<0?o:r.$$cast(r.substr(e,1)):(t=a(De,"Opal").$coerce_to(t,a(De,"Integer"),"to_int"))<0||e>i||e<0?o:r.$$cast(r.substr(e,t))},w.$$arity=-2),e.alias(Le,"byteslice","[]"),e.def(Le,"$b",x=function(){return this.$force_encoding("binary")},x.$$arity=0),e.def(Le,"$capitalize",k=function(){var e=this;return e.$$cast(e.charAt(0).toUpperCase()+e.substr(1).toLowerCase())},k.$$arity=0),e.def(Le,"$casecmp",E=function(e){var t=this;if(!$(e["$respond_to?"]("to_str")))return o;e=a(De,"Opal").$coerce_to(e,a(De,"String"),"to_str").$to_s();var n=/^[\x00-\x7F]*$/;return n.test(t)&&n.test(e)&&(t=t.toLowerCase(),e=e.toLowerCase()),t["$<=>"](e)},E.$$arity=1),e.def(Le,"$casecmp?",O=function(e){var t=this.$casecmp(e);return t===o?o:0===t},O.$$arity=1),e.def(Le,"$center",A=function(e,r){var i=this;if(null==r&&(r=" "),e=a(De,"Opal").$coerce_to(e,a(De,"Integer"),"to_int"),r=a(De,"Opal").$coerce_to(r,a(De,"String"),"to_str").$to_s(),$(r["$empty?"]())&&i.$raise(a(De,"ArgumentError"),"zero width padding"),$(e<=i.length))return i;var o=i.$ljust(t(n(e,i.length),2).$ceil(),r),s=i.$rjust(t(n(e,i.length),2).$floor(),r);return i.$$cast(s+o.slice(i.length))},A.$$arity=-2),e.def(Le,"$chars",S=function(){var e=S.$$p,t=e||o;return e&&(S.$$p=null),e&&(S.$$p=null),$(t)?l(this,"each_char",[],t.$to_proc()):this.$each_char().$to_a()},S.$$arity=0),e.def(Le,"$chomp",C=function(e){var t,n=this;if(null==u["/"]&&(u["/"]=o),null==e&&(e=u["/"]),$(e===o||0===n.length))return n;if("\n"===(e=a(De,"Opal")["$coerce_to!"](e,a(De,"String"),"to_str").$to_s()))t=n.replace(/\r?\n?$/,"");else if(""===e)t=n.replace(/(\r?\n)+$/,"");else if(n.length>=e.length){n.substr(n.length-e.length,e.length)===e&&(t=n.substr(0,n.length-e.length))}return null!=t?n.$$cast(t):n},C.$$arity=-1),e.def(Le,"$chop",R=function(){var e,t=this,n=t.length;return e=n<=1?"":"\n"===t.charAt(n-1)&&"\r"===t.charAt(n-2)?t.substr(0,n-2):t.substr(0,n-1),t.$$cast(e)},R.$$arity=0),e.def(Le,"$chr",T=function(){return this.charAt(0)},T.$$arity=0),e.def(Le,"$clone",I=function(){var e=this,t=o;return(t=e.slice()).$copy_singleton_methods(e),t.$initialize_clone(e),t},I.$$arity=0),e.def(Le,"$dup",N=function(){var e=o;return(e=this.slice()).$initialize_dup(this),e},N.$$arity=0),e.def(Le,"$count",L=function(t){var n,r=this;0===(n=e.slice.call(arguments,0,arguments.length)).length&&r.$raise(a(De,"ArgumentError"),"ArgumentError: wrong number of arguments (0 for 1+)");var i=Pe(n);return null===i?0:r.length-r.replace(new RegExp(i,"g"),"").length},L.$$arity=-1),e.def(Le,"$delete",D=function(t){var n,r=this;0===(n=e.slice.call(arguments,0,arguments.length)).length&&r.$raise(a(De,"ArgumentError"),"ArgumentError: wrong number of arguments (0 for 1+)");var i=Pe(n);return null===i?r:r.$$cast(r.replace(new RegExp(i,"g"),""))},D.$$arity=-1),e.def(Le,"$delete_prefix",P=function(e){var t=this;return e.$$is_string||(e=a(De,"Opal").$coerce_to(e,a(De,"String"),"to_str")),t.slice(0,e.length)===e?t.$$cast(t.slice(e.length)):t},P.$$arity=1),e.def(Le,"$delete_suffix",M=function(e){var t=this;return e.$$is_string||(e=a(De,"Opal").$coerce_to(e,a(De,"String"),"to_str")),t.slice(t.length-e.length)===e?t.$$cast(t.slice(0,t.length-e.length)):t},M.$$arity=1),e.def(Le,"$downcase",z=function(){return this.$$cast(this.toLowerCase())},z.$$arity=0),e.def(Le,"$each_char",F=function(){var t,n=F.$$p,r=n||o,i=this;if(n&&(F.$$p=null),n&&(F.$$p=null),r===o)return l(i,"enum_for",["each_char"],((t=function(){return(t.$$s||this).$size()}).$$s=i,t.$$arity=0,t));for(var a=0,s=i.length;a<s;a++)e.yield1(r,i.charAt(a));return i},F.$$arity=0),e.def(Le,"$each_line",j=function(t){var n,r,i,s,$,l,c,f=j.$$p,d=f||o,p=this;if(null==u["/"]&&(u["/"]=o),f&&(j.$$p=null),f&&(j.$$p=null),null==t&&(t=u["/"]),d===o)return p.$enum_for("each_line",t);if(t===o)return e.yield1(d,p),p;if(0===(t=a(De,"Opal").$coerce_to(t,a(De,"String"),"to_str")).length){for(r=0,i=(n=p.split(/(\n{2,})/)).length;r<i;r+=2)if(n[r]||n[r+1]){var _=(n[r]||"")+(n[r+1]||"");e.yield1(d,p.$$cast(_))}return p}for($=p.$chomp(t),l=p.length!=$.length,r=0,s=(c=$.split(t)).length;r<s;r++)r<s-1||l?e.yield1(d,p.$$cast(c[r]+t)):e.yield1(d,p.$$cast(c[r]));return p},j.$$arity=-1),e.def(Le,"$empty?",B=function(){return 0===this.length},B.$$arity=0),e.def(Le,"$end_with?",q=function(t){for(var n,r=this,i=0,o=(n=e.slice.call(arguments,0,arguments.length)).length;i<o;i++){var s=a(De,"Opal").$coerce_to(n[i],a(De,"String"),"to_str").$to_s();if(r.length>=s.length&&r.substr(r.length-s.length,s.length)==s)return!0}return!1},q.$$arity=-1),e.alias(Le,"equal?","==="),e.def(Le,"$gsub",U=function(t,n){var r=U.$$p,i=r||o,s=this;if(r&&(U.$$p=null),r&&(U.$$p=null),void 0===n&&i===o)return s.$enum_for("gsub",t);var $,l,c,f="",d=o,p=0;for(t.$$is_regexp?t=e.global_multiline_regexp(t):(t=a(De,"Opal").$coerce_to(t,a(De,"String"),"to_str"),t=new RegExp(t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"gm"));;){if(null===($=t.exec(s))){u["~"]=o,f+=s.slice(p);break}d=a(De,"MatchData").$new(t,$),void 0===n?(c=t.lastIndex,l=i($[0]),t.lastIndex=c):n.$$is_hash?l=n["$[]"]($[0]).$to_s():(n.$$is_string||(n=a(De,"Opal").$coerce_to(n,a(De,"String"),"to_str")),l=n.replace(/([\\]+)([0-9+&`'])/g,(function(e,t,n){if(t.length%2===0)return e;switch(n){case"+":for(var r=$.length-1;r>0;r--)if(void 0!==$[r])return t.slice(1)+$[r];return"";case"&":return t.slice(1)+$[0];case"`":return t.slice(1)+s.slice(0,$.index);case"'":return t.slice(1)+s.slice($.index+$[0].length);default:return t.slice(1)+($[n]||"")}})).replace(/\\\\/g,"\\")),t.lastIndex===$.index?(f+=l+s.slice(p,$.index+1),t.lastIndex+=1):f+=s.slice(p,$.index)+l,p=t.lastIndex}return u["~"]=d,s.$$cast(f)},U.$$arity=-2),e.def(Le,"$hash",H=function(){return this.toString()},H.$$arity=0),e.def(Le,"$hex",Y=function(){return this.$to_i(16)},Y.$$arity=0),e.def(Le,"$include?",W=function(e){return e.$$is_string||(e=a(De,"Opal").$coerce_to(e,a(De,"String"),"to_str")),-1!==this.indexOf(e)},W.$$arity=1),e.def(Le,"$index",V=function(t,n){var r,i,s,$=this;if(void 0===n)n=0;else if((n=a(De,"Opal").$coerce_to(n,a(De,"Integer"),"to_int"))<0&&(n+=$.length)<0)return o;if(t.$$is_regexp)for(s=e.global_multiline_regexp(t);;){if(null===(i=s.exec($))){u["~"]=o,r=-1;break}if(i.index>=n){u["~"]=a(De,"MatchData").$new(s,i),r=i.index;break}s.lastIndex=i.index+1}else r=0===(t=a(De,"Opal").$coerce_to(t,a(De,"String"),"to_str")).length&&n>$.length?-1:$.indexOf(t,n);return-1===r?o:r},V.$$arity=-2),e.def(Le,"$inspect",K=function(){var e={"\x07":"\\a","\x1b":"\\e","\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r","\v":"\\v",'"':'\\"',"\\":"\\\\"};return'"'+this.replace(/[\\\"\x00-\x1f\u007F-\u009F\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,(function(t){return e[t]||"\\u"+("0000"+t.charCodeAt(0).toString(16).toUpperCase()).slice(-4)})).replace(/\#[\$\@\{]/g,"\\$&")+'"'},K.$$arity=0),e.def(Le,"$intern",G=function(){return this.toString()},G.$$arity=0),e.def(Le,"$lines",X=function(e){var t=X.$$p,n=t||o,r=o;return null==u["/"]&&(u["/"]=o),t&&(X.$$p=null),t&&(X.$$p=null),null==e&&(e=u["/"]),r=l(this,"each_line",[e],n.$to_proc()),$(n)?this:r.$to_a()},X.$$arity=-1),e.def(Le,"$length",Q=function(){return this.length},Q.$$arity=0),e.def(Le,"$ljust",J=function(e,t){var n=this;if(null==t&&(t=" "),e=a(De,"Opal").$coerce_to(e,a(De,"Integer"),"to_int"),t=a(De,"Opal").$coerce_to(t,a(De,"String"),"to_str").$to_s(),$(t["$empty?"]())&&n.$raise(a(De,"ArgumentError"),"zero width padding"),$(e<=n.length))return n;var r=-1,i="";for(e-=n.length;++r<e;)i+=t;return n.$$cast(n+i.slice(0,e))},J.$$arity=-2),e.def(Le,"$lstrip",Z=function(){return this.replace(/^\s*/,"")},Z.$$arity=0),e.def(Le,"$ascii_only?",ee=function(){return this.match(/[ -~\n]*/)[0]===this},ee.$$arity=0),e.def(Le,"$match",te=function(e,t){var n,r=te.$$p,i=r||o;return r&&(te.$$p=null),r&&(te.$$p=null),$($(n=a(De,"String")["$==="](e))?n:e["$respond_to?"]("to_str"))&&(e=a(De,"Regexp").$new(e.$to_str())),$(a(De,"Regexp")["$==="](e))||this.$raise(a(De,"TypeError"),"wrong argument type "+e.$class()+" (expected Regexp)"),l(e,"match",[this,t],i.$to_proc())},te.$$arity=-2),e.def(Le,"$match?",ne=function(e,t){var n;return $($(n=a(De,"String")["$==="](e))?n:e["$respond_to?"]("to_str"))&&(e=a(De,"Regexp").$new(e.$to_str())),$(a(De,"Regexp")["$==="](e))||this.$raise(a(De,"TypeError"),"wrong argument type "+e.$class()+" (expected Regexp)"),e["$match?"](this,t)},ne.$$arity=-2),e.def(Le,"$next",re=function(){var e=this,t=e.length;if(0===t)return e.$$cast("");for(var n,r=e,i=e.search(/[a-zA-Z0-9]/),o=!1;t--;){if((n=e.charCodeAt(t))>=48&&n<=57||n>=65&&n<=90||n>=97&&n<=122)switch(n){case 57:o=!0,n=48;break;case 90:o=!0,n=65;break;case 122:o=!0,n=97;break;default:o=!1,n+=1}else-1===i?255===n?(o=!0,n=0):(o=!1,n+=1):o=!0;if(r=r.slice(0,t)+String.fromCharCode(n)+r.slice(t+1),o&&(0===t||t===i)){switch(n){case 65:case 97:break;default:n+=1}r=0===t?String.fromCharCode(n)+r:r.slice(0,t)+String.fromCharCode(n)+r.slice(t),o=!1}if(!o)break}return e.$$cast(r)},re.$$arity=0),e.def(Le,"$oct",ie=function(){var e,t=this,n=8;return/^\s*_/.test(t)?0:(t=t.replace(/^(\s*[+-]?)(0[bodx]?)(.+)$/i,(function(e,t,r,i){switch(i.charAt(0)){case"+":case"-":return e;case"0":if("x"===i.charAt(1)&&"0x"===r)return e}switch(r){case"0b":n=2;break;case"0":case"0o":n=8;break;case"0d":n=10;break;case"0x":n=16}return t+i})),e=parseInt(t.replace(/_(?!_)/g,""),n),isNaN(e)?0:e)},ie.$$arity=0),e.def(Le,"$ord",oe=function(){return this.charCodeAt(0)},oe.$$arity=0),e.def(Le,"$partition",ae=function(e){var t,n,r=this;return e.$$is_regexp?null===(n=e.exec(r))?t=-1:(a(De,"MatchData").$new(e,n),e=n[0],t=n.index):(e=a(De,"Opal").$coerce_to(e,a(De,"String"),"to_str"),t=r.indexOf(e)),-1===t?[r,"",""]:[r.slice(0,t),r.slice(t,t+e.length),r.slice(t+e.length)]},ae.$$arity=1),e.def(Le,"$reverse",se=function(){return this.split("").reverse().join("")},se.$$arity=0),e.def(Le,"$rindex",$e=function(t,n){var r,i,s,$,l=this;if(void 0===n)n=l.length;else if((n=a(De,"Opal").$coerce_to(n,a(De,"Integer"),"to_int"))<0&&(n+=l.length)<0)return o;if(t.$$is_regexp){for(i=null,s=e.global_multiline_regexp(t);!(null===($=s.exec(l))||$.index>n);)i=$,s.lastIndex=i.index+1;null===i?(u["~"]=o,r=-1):(a(De,"MatchData").$new(s,i),r=i.index)}else t=a(De,"Opal").$coerce_to(t,a(De,"String"),"to_str"),r=l.lastIndexOf(t,n);return-1===r?o:r},$e.$$arity=-2),e.def(Le,"$rjust",le=function(e,t){var n=this;if(null==t&&(t=" "),e=a(De,"Opal").$coerce_to(e,a(De,"Integer"),"to_int"),t=a(De,"Opal").$coerce_to(t,a(De,"String"),"to_str").$to_s(),$(t["$empty?"]())&&n.$raise(a(De,"ArgumentError"),"zero width padding"),$(e<=n.length))return n;var r=Math.floor(e-n.length),i=Math.floor(r/t.length),o=Array(i+1).join(t),s=r-o.length;return n.$$cast(o+t.slice(0,s)+n)},le.$$arity=-2),e.def(Le,"$rpartition",ue=function(t){var n,r,i,o,s=this;if(t.$$is_regexp){for(r=null,i=e.global_multiline_regexp(t);null!==(o=i.exec(s));)r=o,i.lastIndex=r.index+1;null===r?n=-1:(a(De,"MatchData").$new(i,r),t=r[0],n=r.index)}else t=a(De,"Opal").$coerce_to(t,a(De,"String"),"to_str"),n=s.lastIndexOf(t);return-1===n?["","",s]:[s.slice(0,n),s.slice(n,n+t.length),s.slice(n+t.length)]},ue.$$arity=1),e.def(Le,"$rstrip",ce=function(){return this.replace(/[\s\u0000]*$/,"")},ce.$$arity=0),e.def(Le,"$scan",fe=function(t){var n=fe.$$p,r=n||o,i=this;n&&(fe.$$p=null),n&&(fe.$$p=null);var s,$=[],l=o;for(t.$$is_regexp?t=e.global_multiline_regexp(t):(t=a(De,"Opal").$coerce_to(t,a(De,"String"),"to_str"),t=new RegExp(t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"gm"));null!=(s=t.exec(i));)l=a(De,"MatchData").$new(t,s),r===o?1==s.length?$.push(s[0]):$.push(l.$captures()):1==s.length?r(s[0]):r.call(i,l.$captures()),t.lastIndex===s.index&&(t.lastIndex+=1);return u["~"]=l,r!==o?i:$},fe.$$arity=1),e.alias(Le,"size","length"),e.alias(Le,"slice","[]"),e.def(Le,"$split",de=function(t,n){var r,i=this;if(null==u[";"]&&(u[";"]=o),0===i.length)return[];if(void 0===n)n=0;else if(1===(n=a(De,"Opal")["$coerce_to!"](n,a(De,"Integer"),"to_int")))return[i];void 0!==t&&t!==o||(t=$(r=u[";"])?r:" ");var s,l,c,f=[],d=i.toString(),p=0;if(t.$$is_regexp?t=e.global_multiline_regexp(t):" "===(t=a(De,"Opal").$coerce_to(t,a(De,"String"),"to_str").$to_s())?(t=/\s+/gm,d=d.replace(/^\s+/,"")):t=new RegExp(t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"gm"),1===(f=d.split(t)).length&&f[0]===d)return[i.$$cast(f[0])];for(;-1!==(l=f.indexOf(void 0));)f.splice(l,1);function _(){for(l=0;l<f.length;l++)f[l]=i.$$cast(f[l])}if(0===n){for(;""===f[f.length-1];)f.length-=1;return _(),f}if(s=t.exec(d),n<0){if(null!==s&&""===s[0]&&-1===t.source.indexOf("(?="))for(l=0,c=s.length;l<c;l++)f.push("");return _(),f}if(null!==s&&""===s[0])return f.splice(n-1,f.length-1,f.slice(n-1).join("")),_(),f;if(n>=f.length)return _(),f;for(l=0;null!==s&&(l++,p=t.lastIndex,l+1!==n);)s=t.exec(d);return f.splice(n-1,f.length-1,d.slice(p)),_(),f},de.$$arity=-1),e.def(Le,"$squeeze",pe=function(t){var n,r=this;if(0===(n=e.slice.call(arguments,0,arguments.length)).length)return r.$$cast(r.replace(/(.)\1+/g,"$1"));var i=Pe(n);return null===i?r:r.$$cast(r.replace(new RegExp("("+i+")\\1+","g"),"$1"))},pe.$$arity=-1),e.def(Le,"$start_with?",_e=function(t){for(var n,r=this,i=0,o=(n=e.slice.call(arguments,0,arguments.length)).length;i<o;i++){var s=a(De,"Opal").$coerce_to(n[i],a(De,"String"),"to_str").$to_s();if(0===r.indexOf(s))return!0}return!1},_e.$$arity=-1),e.def(Le,"$strip",he=function(){return this.replace(/^\s*/,"").replace(/[\s\u0000]*$/,"")},he.$$arity=0),e.def(Le,"$sub",me=function(e,t){var n=me.$$p,r=n||o,i=this;n&&(me.$$p=null),n&&(me.$$p=null),e.$$is_regexp||(e=a(De,"Opal").$coerce_to(e,a(De,"String"),"to_str"),e=new RegExp(e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")));var s,$=e.exec(i);return null===$?(u["~"]=o,s=i.toString()):(a(De,"MatchData").$new(e,$),void 0===t?(r===o&&i.$raise(a(De,"ArgumentError"),"wrong number of arguments (1 for 2)"),s=i.slice(0,$.index)+r($[0])+i.slice($.index+$[0].length)):t.$$is_hash?s=i.slice(0,$.index)+t["$[]"]($[0]).$to_s()+i.slice($.index+$[0].length):(t=(t=a(De,"Opal").$coerce_to(t,a(De,"String"),"to_str")).replace(/([\\]+)([0-9+&`'])/g,(function(e,t,n){if(t.length%2===0)return e;switch(n){case"+":for(var r=$.length-1;r>0;r--)if(void 0!==$[r])return t.slice(1)+$[r];return"";case"&":return t.slice(1)+$[0];case"`":return t.slice(1)+i.slice(0,$.index);case"'":return t.slice(1)+i.slice($.index+$[0].length);default:return t.slice(1)+($[n]||"")}})).replace(/\\\\/g,"\\"),s=i.slice(0,$.index)+t+i.slice($.index+$[0].length))),i.$$cast(s)},me.$$arity=-2),e.alias(Le,"succ","next"),e.def(Le,"$sum",ye=function(e){null==e&&(e=16),e=a(De,"Opal").$coerce_to(e,a(De,"Integer"),"to_int");for(var t=0,n=this.length,r=0;r<n;r++)t+=this.charCodeAt(r);return e<=0?t:t&Math.pow(2,e)-1},ye.$$arity=-1),e.def(Le,"$swapcase",ge=function(){var e=this,t=e.replace(/([a-z]+)|([A-Z]+)/g,(function(e,t,n){return t?e.toUpperCase():e.toLowerCase()}));return e.constructor===String?t:e.$class().$new(t)},ge.$$arity=0),e.def(Le,"$to_f",ve=function(){if("_"===this.charAt(0))return 0;var e=parseFloat(this.replace(/_/g,""));return isNaN(e)||e==1/0||e==-1/0?0:e},ve.$$arity=0),e.def(Le,"$to_i",be=function(e){null==e&&(e=10);var t,n=this.toLowerCase(),r=a(De,"Opal").$coerce_to(e,a(De,"Integer"),"to_int");return(1===r||r<0||r>36)&&this.$raise(a(De,"ArgumentError"),"invalid radix "+r),/^\s*_/.test(n)?0:(n=n.replace(/^(\s*[+-]?)(0[bodx]?)(.+)$/,(function(e,t,n,i){switch(i.charAt(0)){case"+":case"-":return e;case"0":if("x"===i.charAt(1)&&"0x"===n&&(0===r||16===r))return e}switch(n){case"0b":if(0===r||2===r)return r=2,t+i;break;case"0":case"0o":if(0===r||8===r)return r=8,t+i;break;case"0d":if(0===r||10===r)return r=10,t+i;break;case"0x":if(0===r||16===r)return r=16,t+i}return e})),t=parseInt(n.replace(/_(?!_)/g,""),r),isNaN(t)?0:t)},be.$$arity=-1),e.def(Le,"$to_proc",we=function(){var t,r,i=we.$$p,s=this;return i&&(we.$$p=null),r=n("$",s.valueOf()),l(s,"proc",[],(t=function(n){var i,s=t.$$s||this,$=t.$$p,l=$||o;$&&(t.$$p=null),0===(i=e.slice.call(arguments,0,arguments.length)).length&&s.$raise(a(De,"ArgumentError"),"no receiver given");var u=i[0];null==u&&(u=o);var c=u[r];return c?("function"===typeof l&&(c.$$p=l),1===i.length?c.call(u):c.apply(u,i.slice(1))):u.$method_missing.apply(u,i)},t.$$s=s,t.$$arity=-1,t))},we.$$arity=0),e.def(Le,"$to_s",xe=function(){return this.toString()},xe.$$arity=0),e.alias(Le,"to_str","to_s"),e.alias(Le,"to_sym","intern"),e.def(Le,"$tr",ke=function(e,t){var n,r,i,o,s,$,l,u=this;if(e=a(De,"Opal").$coerce_to(e,a(De,"String"),"to_str").$to_s(),t=a(De,"Opal").$coerce_to(t,a(De,"String"),"to_str").$to_s(),0==e.length||e===t)return u;var c={},f=e.split(""),d=f.length,p=t.split(""),_=p.length,h=!1,m=null;"^"===f[0]&&f.length>1&&(h=!0,f.shift(),m=p[_-1],d-=1);var y=[],g=null;for(r=!1,n=0;n<d;n++)if(o=f[n],null==g)g=o,y.push(o);else if("-"===o)"-"===g?(y.push("-"),y.push("-")):n==d-1?y.push("-"):r=!0;else if(r){for((s=g.charCodeAt(0))>($=o.charCodeAt(0))&&u.$raise(a(De,"ArgumentError"),'invalid range "'+String.fromCharCode(s)+"-"+String.fromCharCode($)+'" in string transliteration'),i=s+1;i<$;i++)y.push(String.fromCharCode(i));y.push(o),r=null,g=null}else y.push(o);if(d=(f=y).length,h)for(n=0;n<d;n++)c[f[n]]=!0;else{if(_>0){var v=[],b=null;for(r=!1,n=0;n<_;n++)if(o=p[n],null==b)b=o,v.push(o);else if("-"===o)"-"===b?(v.push("-"),v.push("-")):n==_-1?v.push("-"):r=!0;else if(r){for((s=b.charCodeAt(0))>($=o.charCodeAt(0))&&u.$raise(a(De,"ArgumentError"),'invalid range "'+String.fromCharCode(s)+"-"+String.fromCharCode($)+'" in string transliteration'),i=s+1;i<$;i++)v.push(String.fromCharCode(i));v.push(o),r=null,b=null}else v.push(o);_=(p=v).length}var w=d-_;if(w>0){var x=_>0?p[_-1]:"";for(n=0;n<w;n++)p.push(x)}for(n=0;n<d;n++)c[f[n]]=p[n]}var k="";for(n=0,l=u.length;n<l;n++){var E=c[o=u.charAt(n)];k+=h?null==E?m:o:null!=E?E:o}return u.$$cast(k)},ke.$$arity=2),e.def(Le,"$tr_s",Ee=function(e,t){var n,r,i,o,s,$,l,u=this;if(e=a(De,"Opal").$coerce_to(e,a(De,"String"),"to_str").$to_s(),t=a(De,"Opal").$coerce_to(t,a(De,"String"),"to_str").$to_s(),0==e.length)return u;var c={},f=e.split(""),d=f.length,p=t.split(""),_=p.length,h=!1,m=null;"^"===f[0]&&f.length>1&&(h=!0,f.shift(),m=p[_-1],d-=1);var y=[],g=null;for(r=!1,n=0;n<d;n++)if(o=f[n],null==g)g=o,y.push(o);else if("-"===o)"-"===g?(y.push("-"),y.push("-")):n==d-1?y.push("-"):r=!0;else if(r){for((s=g.charCodeAt(0))>($=o.charCodeAt(0))&&u.$raise(a(De,"ArgumentError"),'invalid range "'+String.fromCharCode(s)+"-"+String.fromCharCode($)+'" in string transliteration'),i=s+1;i<$;i++)y.push(String.fromCharCode(i));y.push(o),r=null,g=null}else y.push(o);if(d=(f=y).length,h)for(n=0;n<d;n++)c[f[n]]=!0;else{if(_>0){var v=[];for(r=!1,n=0;n<_;n++)if(o=p[n],null==g)g=o,v.push(o);else if("-"===o)n==_-1?v.push("-"):r=!0;else if(r){for((s=g.charCodeAt(0))>($=o.charCodeAt(0))&&u.$raise(a(De,"ArgumentError"),'invalid range "'+String.fromCharCode(s)+"-"+String.fromCharCode($)+'" in string transliteration'),i=s+1;i<$;i++)v.push(String.fromCharCode(i));v.push(o),r=null,g=null}else v.push(o);_=(p=v).length}var b=d-_;if(b>0){var w=_>0?p[_-1]:"";for(n=0;n<b;n++)p.push(w)}for(n=0;n<d;n++)c[f[n]]=p[n]}var x="",k=null;for(n=0,l=u.length;n<l;n++){var E=c[o=u.charAt(n)];h?null==E?null==k&&(x+=m,k=!0):(x+=o,k=null):null!=E?null!=k&&k===E||(x+=E,k=E):(x+=o,k=null)}return u.$$cast(x)},Ee.$$arity=2),e.def(Le,"$upcase",Oe=function(){return this.$$cast(this.toUpperCase())},Oe.$$arity=0),e.def(Le,"$upto",Ae=function(e,t){var n=Ae.$$p,r=n||o,i=this;if(n&&(Ae.$$p=null),n&&(Ae.$$p=null),null==t&&(t=!1),r===o)return i.$enum_for("upto",e,t);e=a(De,"Opal").$coerce_to(e,a(De,"String"),"to_str");var s,$,l=i.toString();if(1===l.length&&1===e.length)for(s=l.charCodeAt(0),$=e.charCodeAt(0);s<=$&&(!t||s!==$);)r(String.fromCharCode(s)),s+=1;else if(parseInt(l,10).toString()===l&&parseInt(e,10).toString()===e)for(s=parseInt(l,10),$=parseInt(e,10);s<=$&&(!t||s!==$);)r(s.toString()),s+=1;else for(;l.length<=e.length&&l<=e&&(!t||l!==e);)r(l),l=l.$succ();return i},Ae.$$arity=-2),e.def(Le,"$instance_variables",Se=function(){return[]},Se.$$arity=0),e.defs(Le,"$_load",Ce=function(t){var n,r=this;return n=e.slice.call(arguments,0,arguments.length),l(r,"new",e.to_a(n))},Ce.$$arity=-1),e.def(Le,"$unicode_normalize",Re=function(e){return this.toString()},Re.$$arity=-1),e.def(Le,"$unicode_normalized?",Te=function(e){return!0},Te.$$arity=-1),e.def(Le,"$unpack",Ie=function(e){return this.$raise("To use String#unpack, you must first require 'corelib/string/unpack'.")},Ie.$$arity=1),e.def(Le,"$unpack1",Ne=function(e){return this.$raise("To use String#unpack1, you must first require 'corelib/string/unpack'.")},Ne.$$arity=1)}(i[0],0,i),e.const_set(i[0],"Symbol",a(i,"String"))},Opal.modules["corelib/enumerable"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e>t:e["$>"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e<t:e["$<"](t)}function r(e,t){return"number"===typeof e&&"number"===typeof t?e+t:e["$+"](t)}function i(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}function o(e,t){return"number"===typeof e&&"number"===typeof t?e<=t:e["$<="](t)}e.top;var a=[],s=e.nil,$=e.const_get_qualified,l=e.const_get_relative,u=(e.breaker,e.slice,e.module),c=e.truthy,f=e.send,d=e.falsy,p=e.hash2,_=e.lambda;return e.add_stubs(["$each","$public_send","$destructure","$to_enum","$enumerator_size","$new","$yield","$raise","$slice_when","$!","$enum_for","$flatten","$map","$warn","$proc","$==","$nil?","$respond_to?","$coerce_to!","$>","$*","$coerce_to","$try_convert","$<","$+","$-","$ceil","$/","$size","$__send__","$length","$<=","$[]","$push","$<<","$[]=","$===","$inspect","$<=>","$first","$reverse","$sort","$to_proc","$compare","$call","$dup","$to_a","$sort!","$map!","$key?","$values","$zip"]),function(a,h){var m,y,g,v,b,w,x,k,E,O,A,S,C,R,T,I,N,L,D,P,M,z,F,j,B,q,U,H,Y,W,V,K,G,X,Q,J,Z,ee,te,ne,re,ie,oe,ae,se,$e,le,ue,ce=u(a,"Enumerable"),fe=[ce].concat(h);function de(e){return 0===e.length&&(e=[s]),e.length>1&&(e=[e]),e}e.def(ce,"$all?",m=function(t){try{var n,r,i,o=m.$$p,a=o||s,$=this;return o&&(m.$$p=null),o&&(m.$$p=null),c(void 0!==t)?f($,"each",[],(n=function(r){n.$$s;var i=s;if(i=de(e.slice.call(arguments,0,arguments.length)),c(f(t,"public_send",["==="].concat(e.to_a(i)))))return s;e.ret(!1)},n.$$s=$,n.$$arity=-1,n)):f($,"each",[],a!==s?(r=function(t){var n;r.$$s;if(n=e.slice.call(arguments,0,arguments.length),c(e.yieldX(a,e.to_a(n))))return s;e.ret(!1)},r.$$s=$,r.$$arity=-1,r):(i=function(t){var n;i.$$s;if(n=e.slice.call(arguments,0,arguments.length),c(l(fe,"Opal").$destructure(n)))return s;e.ret(!1)},i.$$s=$,i.$$arity=-1,i)),!0}catch(u){if(u===e.returner)return u.$v;throw u}},m.$$arity=-1),e.def(ce,"$any?",y=function(t){try{var n,r,i,o=y.$$p,a=o||s,$=this;return o&&(y.$$p=null),o&&(y.$$p=null),c(void 0!==t)?f($,"each",[],(n=function(r){n.$$s;var i=s;if(i=de(e.slice.call(arguments,0,arguments.length)),!c(f(t,"public_send",["==="].concat(e.to_a(i)))))return s;e.ret(!0)},n.$$s=$,n.$$arity=-1,n)):f($,"each",[],a!==s?(r=function(t){var n;r.$$s;if(n=e.slice.call(arguments,0,arguments.length),!c(e.yieldX(a,e.to_a(n))))return s;e.ret(!0)},r.$$s=$,r.$$arity=-1,r):(i=function(t){var n;i.$$s;if(n=e.slice.call(arguments,0,arguments.length),!c(l(fe,"Opal").$destructure(n)))return s;e.ret(!0)},i.$$s=$,i.$$arity=-1,i)),!1}catch(u){if(u===e.returner)return u.$v;throw u}},y.$$arity=-1),e.def(ce,"$chunk",g=function(){var t,n,r=g.$$p,i=r||s,o=this;return r&&(g.$$p=null),r&&(g.$$p=null),i===s?f(o,"to_enum",["chunk"],((t=function(){return(t.$$s||this).$enumerator_size()}).$$s=o,t.$$arity=0,t)):f($("::","Enumerator"),"new",[],(n=function(t){var r=n.$$s||this;null==t&&(t=s);var o=s,a=[];function $(){a.length>0&&t.$yield(o,a)}r.$each.$$p=function(t){var n=e.yield1(i,t);n===s?($(),a=[],o=s):(o===s||o===n?a.push(t):($(),a=[t]),o=n)},r.$each(),$()},n.$$s=o,n.$$arity=1,n))},g.$$arity=0),e.def(ce,"$chunk_while",v=function(){var t,n=v.$$p,r=n||s,i=this;return n&&(v.$$p=null),n&&(v.$$p=null),r!==s||i.$raise(l(fe,"ArgumentError"),"no block given"),f(i,"slice_when",[],((t=function(n,i){t.$$s;return null==n&&(n=s),null==i&&(i=s),e.yieldX(r,[n,i])["$!"]()}).$$s=i,t.$$arity=2,t))},v.$$arity=0),e.def(ce,"$collect",b=function(){var t,n=b.$$p,r=n||s,i=this;if(n&&(b.$$p=null),n&&(b.$$p=null),r===s)return f(i,"enum_for",["collect"],((t=function(){return(t.$$s||this).$enumerator_size()}).$$s=i,t.$$arity=0,t));var o=[];return i.$each.$$p=function(){var t=e.yieldX(r,arguments);o.push(t)},i.$each(),o},b.$$arity=0),e.def(ce,"$collect_concat",w=function(){var t,n,r=w.$$p,i=r||s,o=this;return r&&(w.$$p=null),r&&(w.$$p=null),i===s?f(o,"enum_for",["collect_concat"],((t=function(){return(t.$$s||this).$enumerator_size()}).$$s=o,t.$$arity=0,t)):f(o,"map",[],(n=function(t){n.$$s;return null==t&&(t=s),e.yield1(i,t)},n.$$s=o,n.$$arity=1,n)).$flatten(1)},w.$$arity=0),e.def(ce,"$count",x=function(t){var n,r,i,o=x.$$p,a=o||s,$=this,u=s;return o&&(x.$$p=null),o&&(x.$$p=null),u=0,null!=t&&a!==s&&$.$warn("warning: given block not used"),c(null!=t)?a=f($,"proc",[],(n=function(r){var i;n.$$s;return i=e.slice.call(arguments,0,arguments.length),l(fe,"Opal").$destructure(i)["$=="](t)},n.$$s=$,n.$$arity=-1,n)):c(a["$nil?"]())&&(a=f($,"proc",[],((r=function(){r.$$s;return!0}).$$s=$,r.$$arity=0,r))),f($,"each",[],(i=function(t){var n;i.$$s;return n=e.slice.call(arguments,0,arguments.length),c(e.yieldX(a,n))?u++:s},i.$$s=$,i.$$arity=-1,i)),u},x.$$arity=-1),e.def(ce,"$cycle",k=function(n){var r,i=k.$$p,o=i||s,a=this;if(i&&(k.$$p=null),i&&(k.$$p=null),null==n&&(n=s),o===s)return f(a,"enum_for",["cycle",n],(r=function(){var e,i,o=r.$$s||this;return c(n["$nil?"]())?c(o["$respond_to?"]("size"))?$(l(fe,"Float"),"INFINITY"):s:(n=l(fe,"Opal")["$coerce_to!"](n,l(fe,"Integer"),"to_int"),c(t(n,0))?(e=o.$enumerator_size(),i=n,"number"===typeof e&&"number"===typeof i?e*i:e["$*"](i)):0)},r.$$s=a,r.$$arity=0,r));if(c(n["$nil?"]()));else if(n=l(fe,"Opal")["$coerce_to!"](n,l(fe,"Integer"),"to_int"),c(n<=0))return s;var u,d,p=[];if(a.$each.$$p=function(){var t=l(fe,"Opal").$destructure(arguments);e.yield1(o,t);p.push(t)},a.$each(),0===p.length)return s;if(n===s)for(;;)for(u=0,d=p.length;u<d;u++)e.yield1(o,p[u]);else for(;n>1;){for(u=0,d=p.length;u<d;u++)e.yield1(o,p[u]);n--}},k.$$arity=-1),e.def(ce,"$detect",E=function(t){try{var n,r=E.$$p,i=r||s,o=this;return r&&(E.$$p=null),r&&(E.$$p=null),i===s?o.$enum_for("detect",t):(f(o,"each",[],(n=function(t){n.$$s;var r,o=s;if(r=e.slice.call(arguments,0,arguments.length),o=l(fe,"Opal").$destructure(r),!c(e.yield1(i,o)))return s;e.ret(o)},n.$$s=o,n.$$arity=-1,n)),void 0!==t?"function"===typeof t?t():t:s)}catch(a){if(a===e.returner)return a.$v;throw a}},E.$$arity=-1),e.def(ce,"$drop",O=function(e){var t=this;e=l(fe,"Opal").$coerce_to(e,l(fe,"Integer"),"to_int"),c(e<0)&&t.$raise(l(fe,"ArgumentError"),"attempt to drop negative size");var n=[],r=0;return t.$each.$$p=function(){e<=r&&n.push(l(fe,"Opal").$destructure(arguments)),r++},t.$each(),n},O.$$arity=1),e.def(ce,"$drop_while",A=function(){var t=A.$$p,n=t||s,r=this;if(t&&(A.$$p=null),t&&(A.$$p=null),n===s)return r.$enum_for("drop_while");var i=[],o=!0;return r.$each.$$p=function(){var t=l(fe,"Opal").$destructure(arguments);if(o){var r=e.yield1(n,t);d(r)&&(o=!1,i.push(t))}else i.push(t)},r.$each(),i},A.$$arity=0),e.def(ce,"$each_cons",S=function(t){var o,a=S.$$p,$=a||s,u=this;if(a&&(S.$$p=null),a&&(S.$$p=null),c(1!=arguments.length)&&u.$raise(l(fe,"ArgumentError"),"wrong number of arguments ("+arguments.length+" for 1)"),t=l(fe,"Opal").$try_convert(t,l(fe,"Integer"),"to_int"),c(t<=0)&&u.$raise(l(fe,"ArgumentError"),"invalid size"),$===s)return f(u,"enum_for",["each_cons",t],(o=function(){var e,a=o.$$s||this,$=s;return $=a.$enumerator_size(),c($["$nil?"]())?s:c(c(e=$["$=="](0))?e:n($,t))?0:r(i($,t),1)},o.$$s=u,o.$$arity=0,o));var d=[],p=s;return u.$each.$$p=function(){var n=l(fe,"Opal").$destructure(arguments);d.push(n),d.length>t&&d.shift(),d.length==t&&e.yield1($,d.slice(0,t))},u.$each(),p},S.$$arity=1),e.def(ce,"$each_entry",C=function(t){var n,r,i=C.$$p,o=i||s,a=this;return i&&(C.$$p=null),i&&(C.$$p=null),n=e.slice.call(arguments,0,arguments.length),o===s?f(a,"to_enum",["each_entry"].concat(e.to_a(n)),((r=function(){return(r.$$s||this).$enumerator_size()}).$$s=a,r.$$arity=0,r)):(a.$each.$$p=function(){var t=l(fe,"Opal").$destructure(arguments);e.yield1(o,t)},a.$each.apply(a,n),a)},C.$$arity=-1),e.def(ce,"$each_slice",R=function(t){var n,r=R.$$p,i=r||s,o=this;if(r&&(R.$$p=null),r&&(R.$$p=null),t=l(fe,"Opal").$coerce_to(t,l(fe,"Integer"),"to_int"),c(t<=0)&&o.$raise(l(fe,"ArgumentError"),"invalid slice size"),i===s)return f(o,"enum_for",["each_slice",t],(n=function(){var e,r,i=n.$$s||this;return c(i["$respond_to?"]("size"))?(e=i.$size(),r=t,"number"===typeof e&&"number"===typeof r?e/r:e["$/"](r)).$ceil():s},n.$$s=o,n.$$arity=0,n));var a=[];return o.$each.$$p=function(){var n=l(fe,"Opal").$destructure(arguments);a.push(n),a.length===t&&(e.yield1(i,a),a=[])},o.$each(),a.length>0&&e.yield1(i,a),s},R.$$arity=1),e.def(ce,"$each_with_index",T=function(t){var n,r,i=T.$$p,o=i||s,a=this;if(i&&(T.$$p=null),i&&(T.$$p=null),n=e.slice.call(arguments,0,arguments.length),o===s)return f(a,"enum_for",["each_with_index"].concat(e.to_a(n)),((r=function(){return(r.$$s||this).$enumerator_size()}).$$s=a,r.$$arity=0,r));var $,u=0;return a.$each.$$p=function(){var e=l(fe,"Opal").$destructure(arguments);o(e,u),u++},a.$each.apply(a,n),void 0!==$?$:a},T.$$arity=-1),e.def(ce,"$each_with_object",I=function(e){var t,n=I.$$p,r=n||s,i=this;return n&&(I.$$p=null),n&&(I.$$p=null),r===s?f(i,"enum_for",["each_with_object",e],((t=function(){return(t.$$s||this).$enumerator_size()}).$$s=i,t.$$arity=0,t)):(i.$each.$$p=function(){var t=l(fe,"Opal").$destructure(arguments);r(t,e)},i.$each(),e)},I.$$arity=1),e.def(ce,"$entries",N=function(t){var n,r=this;n=e.slice.call(arguments,0,arguments.length);var i=[];return r.$each.$$p=function(){i.push(l(fe,"Opal").$destructure(arguments))},r.$each.apply(r,n),i},N.$$arity=-1),e.alias(ce,"find","detect"),e.def(ce,"$find_all",L=function(){var t,n=L.$$p,r=n||s,i=this;if(n&&(L.$$p=null),n&&(L.$$p=null),r===s)return f(i,"enum_for",["find_all"],((t=function(){return(t.$$s||this).$enumerator_size()}).$$s=i,t.$$arity=0,t));var o=[];return i.$each.$$p=function(){var t=l(fe,"Opal").$destructure(arguments),n=e.yield1(r,t);c(n)&&o.push(t)},i.$each(),o},L.$$arity=0),e.def(ce,"$find_index",D=function(t){try{var n,r,i=D.$$p,o=i||s,a=this,$=s;return i&&(D.$$p=null),i&&(D.$$p=null),c(void 0===t&&o===s)?a.$enum_for("find_index"):(null!=t&&o!==s&&a.$warn("warning: given block not used"),$=0,c(null!=t)?f(a,"each",[],(n=function(r){var i;n.$$s;return i=e.slice.call(arguments,0,arguments.length),l(fe,"Opal").$destructure(i)["$=="](t)&&e.ret($),$+=1},n.$$s=a,n.$$arity=-1,n)):f(a,"each",[],(r=function(t){var n;r.$$s;return n=e.slice.call(arguments,0,arguments.length),c(e.yieldX(o,e.to_a(n)))&&e.ret($),$+=1},r.$$s=a,r.$$arity=-1,r)),s)}catch(u){if(u===e.returner)return u.$v;throw u}},D.$$arity=-1),e.def(ce,"$first",P=function(t){try{var n,r,i=this,o=s,a=s;return c(void 0===t)?f(i,"each",[],((n=function(t){n.$$s;null==t&&(t=s),e.ret(t)}).$$s=i,n.$$arity=1,n)):(o=[],t=l(fe,"Opal").$coerce_to(t,l(fe,"Integer"),"to_int"),c(t<0)&&i.$raise(l(fe,"ArgumentError"),"attempt to take negative size"),c(0==t)?[]:(a=0,f(i,"each",[],(r=function(n){var i;r.$$s;if(i=e.slice.call(arguments,0,arguments.length),o.push(l(fe,"Opal").$destructure(i)),!c(t<=++a))return s;e.ret(o)},r.$$s=i,r.$$arity=-1,r)),o))}catch($){if($===e.returner)return $.$v;throw $}},P.$$arity=-1),e.alias(ce,"flat_map","collect_concat"),e.def(ce,"$grep",M=function(n){var r,i=M.$$p,a=i||s,$=s;return i&&(M.$$p=null),i&&(M.$$p=null),$=[],f(this,"each",[],(r=function(i){r.$$s;var l,u=s;return u=de(l=e.slice.call(arguments,0,arguments.length)),c(f(n,"__send__",["==="].concat(e.to_a(u))))?(a!==s?(c(t(l.$length(),1))&&(l=[l]),l=e.yieldX(a,e.to_a(l))):c(o(l.$length(),1))&&(l=l["$[]"](0)),$.$push(l)):s},r.$$s=this,r.$$arity=-1,r)),$},M.$$arity=1),e.def(ce,"$grep_v",z=function(n){var r,i=z.$$p,a=i||s,$=s;return i&&(z.$$p=null),i&&(z.$$p=null),$=[],f(this,"each",[],(r=function(i){r.$$s;var l,u=s;return u=de(l=e.slice.call(arguments,0,arguments.length)),c(f(n,"__send__",["==="].concat(e.to_a(u))))?s:(a!==s?(c(t(l.$length(),1))&&(l=[l]),l=e.yieldX(a,e.to_a(l))):c(o(l.$length(),1))&&(l=l["$[]"](0)),$.$push(l))},r.$$s=this,r.$$arity=-1,r)),$},z.$$arity=1),e.def(ce,"$group_by",F=function(){var t,n,r=F.$$p,o=r||s,a=this,$=s,u=s;return r&&(F.$$p=null),r&&(F.$$p=null),o===s?f(a,"enum_for",["group_by"],((t=function(){return(t.$$s||this).$enumerator_size()}).$$s=a,t.$$arity=0,t)):($=p([],{}),a.$each.$$p=function(){var t=l(fe,"Opal").$destructure(arguments),r=e.yield1(o,t);(c(n=$["$[]"](r))?n:(u=[r,[]],f($,"[]=",e.to_a(u)),u[i(u.length,1)]))["$<<"](t)},a.$each(),$)},F.$$arity=0),e.def(ce,"$include?",j=function(t){try{var n;return f(this,"each",[],(n=function(r){var i;n.$$s;if(i=e.slice.call(arguments,0,arguments.length),!l(fe,"Opal").$destructure(i)["$=="](t))return s;e.ret(!0)},n.$$s=this,n.$$arity=-1,n)),!1}catch(r){if(r===e.returner)return r.$v;throw r}},j.$$arity=1),e.def(ce,"$inject",B=function(t,n){var r=B.$$p,i=r||s,o=this;r&&(B.$$p=null),r&&(B.$$p=null);var a=t;return i!==s&&void 0===n?o.$each.$$p=function(){var t=l(fe,"Opal").$destructure(arguments);void 0!==a?(t=e.yieldX(i,[a,t]),a=t):a=t}:(void 0===n&&(l(fe,"Symbol")["$==="](t)||o.$raise(l(fe,"TypeError"),t.$inspect()+" is not a Symbol"),n=t,a=void 0),o.$each.$$p=function(){var e=l(fe,"Opal").$destructure(arguments);a=void 0!==a?a.$__send__(n,e):e}),o.$each(),void 0==a?s:a},B.$$arity=-1),e.def(ce,"$lazy",q=function(){var t,n=this;return f($(l(fe,"Enumerator"),"Lazy"),"new",[n,n.$enumerator_size()],(t=function(n,r){var i;t.$$s;return null==n&&(n=s),i=e.slice.call(arguments,1,arguments.length),f(n,"yield",e.to_a(i))},t.$$s=n,t.$$arity=-2,t))},q.$$arity=0),e.def(ce,"$enumerator_size",U=function(){return c(this["$respond_to?"]("size"))?this.$size():s},U.$$arity=0),e.alias(ce,"map","collect"),e.def(ce,"$max",H=function(t){var n,r,i=H.$$p,o=i||s,a=this;return i&&(H.$$p=null),i&&(H.$$p=null),void 0===t||t===s?(a.$each.$$p=function(){var t=l(fe,"Opal").$destructure(arguments);void 0!==n?((r=o!==s?e.yieldX(o,[t,n]):t["$<=>"](n))===s&&a.$raise(l(fe,"ArgumentError"),"comparison failed"),r>0&&(n=t)):n=t},a.$each(),void 0===n?s:n):(t=l(fe,"Opal").$coerce_to(t,l(fe,"Integer"),"to_int"),f(a,"sort",[],o.$to_proc()).$reverse().$first(t))},H.$$arity=-1),e.def(ce,"$max_by",Y=function(){var t,n,r,i=Y.$$p,o=i||s,a=this;return i&&(Y.$$p=null),i&&(Y.$$p=null),c(o)?(a.$each.$$p=function(){var t=l(fe,"Opal").$destructure(arguments),i=e.yield1(o,t);if(void 0===n)return n=t,void(r=i);i["$<=>"](r)>0&&(n=t,r=i)},a.$each(),void 0===n?s:n):f(a,"enum_for",["max_by"],((t=function(){return(t.$$s||this).$enumerator_size()}).$$s=a,t.$$arity=0,t))},Y.$$arity=0),e.alias(ce,"member?","include?"),e.def(ce,"$min",W=function(){var e,t=W.$$p,n=t||s,r=this;return t&&(W.$$p=null),t&&(W.$$p=null),r.$each.$$p=n!==s?function(){var t=l(fe,"Opal").$destructure(arguments);if(void 0!==e){var i=n(t,e);i===s&&r.$raise(l(fe,"ArgumentError"),"comparison failed"),i<0&&(e=t)}else e=t}:function(){var t=l(fe,"Opal").$destructure(arguments);void 0!==e?l(fe,"Opal").$compare(t,e)<0&&(e=t):e=t},r.$each(),void 0===e?s:e},W.$$arity=0),e.def(ce,"$min_by",V=function(){var t,n,r,i=V.$$p,o=i||s,a=this;return i&&(V.$$p=null),i&&(V.$$p=null),c(o)?(a.$each.$$p=function(){var t=l(fe,"Opal").$destructure(arguments),i=e.yield1(o,t);if(void 0===n)return n=t,void(r=i);i["$<=>"](r)<0&&(n=t,r=i)},a.$each(),void 0===n?s:n):f(a,"enum_for",["min_by"],((t=function(){return(t.$$s||this).$enumerator_size()}).$$s=a,t.$$arity=0,t))},V.$$arity=0),e.def(ce,"$minmax",K=function(){var e,t,n=K.$$p,r=n||s,i=this;n&&(K.$$p=null),n&&(K.$$p=null),r=c(e=r)?e:f(i,"proc",[],((t=function(e,n){t.$$s;return null==e&&(e=s),null==n&&(n=s),e["$<=>"](n)}).$$s=i,t.$$arity=2,t));var o=s,a=s,$=!0;return i.$each.$$p=function(){var e=l(fe,"Opal").$destructure(arguments);if($)o=a=e,$=!1;else{var t=r.$call(o,e);t===s?i.$raise(l(fe,"ArgumentError"),"comparison failed"):t>0&&(o=e);var n=r.$call(a,e);n===s?i.$raise(l(fe,"ArgumentError"),"comparison failed"):n<0&&(a=e)}},i.$each(),[o,a]},K.$$arity=0),e.def(ce,"$minmax_by",G=function(){var e=G.$$p;return e&&(G.$$p=null),e&&(G.$$p=null),this.$raise(l(fe,"NotImplementedError"))},G.$$arity=0),e.def(ce,"$none?",X=function(t){try{var n,r,i,o=X.$$p,a=o||s,$=this;return o&&(X.$$p=null),o&&(X.$$p=null),c(void 0!==t)?f($,"each",[],(n=function(r){n.$$s;var i=s;if(i=de(e.slice.call(arguments,0,arguments.length)),!c(f(t,"public_send",["==="].concat(e.to_a(i)))))return s;e.ret(!1)},n.$$s=$,n.$$arity=-1,n)):f($,"each",[],a!==s?(r=function(t){var n;r.$$s;if(n=e.slice.call(arguments,0,arguments.length),!c(e.yieldX(a,e.to_a(n))))return s;e.ret(!1)},r.$$s=$,r.$$arity=-1,r):(i=function(t){i.$$s;var n,r=s;if(n=e.slice.call(arguments,0,arguments.length),r=l(fe,"Opal").$destructure(n),!c(r))return s;e.ret(!1)},i.$$s=$,i.$$arity=-1,i)),!0}catch(u){if(u===e.returner)return u.$v;throw u}},X.$$arity=-1),e.def(ce,"$one?",Q=function(n){try{var i,o,a,$=Q.$$p,u=$||s,d=this,p=s;return $&&(Q.$$p=null),$&&(Q.$$p=null),p=0,c(void 0!==n)?f(d,"each",[],(i=function(o){i.$$s;var a=s;return a=de(e.slice.call(arguments,0,arguments.length)),c(f(n,"public_send",["==="].concat(e.to_a(a))))?(p=r(p,1),c(t(p,1))?void e.ret(!1):s):s},i.$$s=d,i.$$arity=-1,i)):f(d,"each",[],u!==s?(o=function(n){var i;o.$$s;return i=e.slice.call(arguments,0,arguments.length),c(e.yieldX(u,e.to_a(i)))?(p=r(p,1),c(t(p,1))?void e.ret(!1):s):s},o.$$s=d,o.$$arity=-1,o):(a=function(n){var i;a.$$s;return i=e.slice.call(arguments,0,arguments.length),c(l(fe,"Opal").$destructure(i))?(p=r(p,1),c(t(p,1))?void e.ret(!1):s):s},a.$$s=d,a.$$arity=-1,a)),p["$=="](1)}catch(_){if(_===e.returner)return _.$v;throw _}},Q.$$arity=-1),e.def(ce,"$partition",J=function(){var t,n=J.$$p,r=n||s,i=this;if(n&&(J.$$p=null),n&&(J.$$p=null),r===s)return f(i,"enum_for",["partition"],((t=function(){return(t.$$s||this).$enumerator_size()}).$$s=i,t.$$arity=0,t));var o=[],a=[];return i.$each.$$p=function(){var t=l(fe,"Opal").$destructure(arguments),n=e.yield1(r,t);c(n)?o.push(t):a.push(t)},i.$each(),[o,a]},J.$$arity=0),e.alias(ce,"reduce","inject"),e.def(ce,"$reject",Z=function(){var t,n=Z.$$p,r=n||s,i=this;if(n&&(Z.$$p=null),n&&(Z.$$p=null),r===s)return f(i,"enum_for",["reject"],((t=function(){return(t.$$s||this).$enumerator_size()}).$$s=i,t.$$arity=0,t));var o=[];return i.$each.$$p=function(){var t=l(fe,"Opal").$destructure(arguments),n=e.yield1(r,t);d(n)&&o.push(t)},i.$each(),o},Z.$$arity=0),e.def(ce,"$reverse_each",ee=function(){var t,n=ee.$$p,r=n||s,i=this;if(n&&(ee.$$p=null),n&&(ee.$$p=null),r===s)return f(i,"enum_for",["reverse_each"],((t=function(){return(t.$$s||this).$enumerator_size()}).$$s=i,t.$$arity=0,t));var o=[];i.$each.$$p=function(){o.push(arguments)},i.$each();for(var a=o.length-1;a>=0;a--)e.yieldX(r,o[a]);return o},ee.$$arity=0),e.alias(ce,"select","find_all"),e.def(ce,"$slice_before",te=function(t){var n,r=te.$$p,i=r||s,o=this;return r&&(te.$$p=null),r&&(te.$$p=null),c(void 0===t&&i===s)&&o.$raise(l(fe,"ArgumentError"),"both pattern and block are given"),c(void 0!==t&&i!==s||arguments.length>1)&&o.$raise(l(fe,"ArgumentError"),"wrong number of arguments ("+arguments.length+" expected 1)"),f(l(fe,"Enumerator"),"new",[],(n=function(r){var o=n.$$s||this;null==r&&(r=s);var a=[];o.$each.$$p=i!==s?void 0===t?function(){var t=l(fe,"Opal").$destructure(arguments),n=e.yield1(i,t);c(n)&&a.length>0&&(r["$<<"](a),a=[]),a.push(t)}:function(){var e=l(fe,"Opal").$destructure(arguments),n=i(e,t.$dup());c(n)&&a.length>0&&(r["$<<"](a),a=[]),a.push(e)}:function(){var e=l(fe,"Opal").$destructure(arguments),n=t["$==="](e);c(n)&&a.length>0&&(r["$<<"](a),a=[]),a.push(e)},o.$each(),a.length>0&&r["$<<"](a)},n.$$s=o,n.$$arity=1,n))},te.$$arity=-1),e.def(ce,"$slice_after",ne=function(t){var n,r,i=ne.$$p,o=i||s,a=this;return i&&(ne.$$p=null),i&&(ne.$$p=null),c(void 0===t&&o===s)&&a.$raise(l(fe,"ArgumentError"),"both pattern and block are given"),c(void 0!==t&&o!==s||arguments.length>1)&&a.$raise(l(fe,"ArgumentError"),"wrong number of arguments ("+arguments.length+" expected 1)"),c(void 0!==t)&&(o=f(a,"proc",[],((n=function(e){n.$$s;return null==e&&(e=s),t["$==="](e)}).$$s=a,n.$$arity=1,n))),f(l(fe,"Enumerator"),"new",[],(r=function(t){var n,i=r.$$s||this;null==t&&(t=s),i.$each.$$p=function(){var r=l(fe,"Opal").$destructure(arguments),i=e.yield1(o,r);null==n&&(n=[]),c(i)?(n.push(r),t.$yield(n),n=null):n.push(r)},i.$each(),null!=n&&t.$yield(n)},r.$$s=a,r.$$arity=1,r))},ne.$$arity=-1),e.def(ce,"$slice_when",re=function(){var t,n=re.$$p,r=n||s;return n&&(re.$$p=null),n&&(re.$$p=null),r!==s||this.$raise(l(fe,"ArgumentError"),"wrong number of arguments (0 for 1)"),f(l(fe,"Enumerator"),"new",[],(t=function(n){var i=t.$$s||this;null==n&&(n=s);var o=s,a=s;i.$each_cons.$$p=function(){var t=l(fe,"Opal").$destructure(arguments),i=t[0],$=t[1],u=e.yieldX(r,[i,$]);a=$,o===s&&(o=[]),c(u)?(o.push(i),n.$yield(o),o=[]):o.push(i)},i.$each_cons(2),o!==s&&(o.push(a),n.$yield(o))},t.$$s=this,t.$$arity=1,t))},re.$$arity=0),e.def(ce,"$sort",ie=function(){var e,t,n=ie.$$p,r=n||s;return n&&(ie.$$p=null),n&&(ie.$$p=null),t=this.$to_a(),r!==s||(r=_(((e=function(t,n){e.$$s;return null==t&&(t=s),null==n&&(n=s),t["$<=>"](n)}).$$s=this,e.$$arity=2,e))),f(t,"sort",[],r.$to_proc())},ie.$$arity=0),e.def(ce,"$sort_by",oe=function(){var t,n,r,i,o,a=oe.$$p,$=a||s,u=this;return a&&(oe.$$p=null),a&&(oe.$$p=null),$===s?f(u,"enum_for",["sort_by"],((t=function(){return(t.$$s||this).$enumerator_size()}).$$s=u,t.$$arity=0,t)):(o=f(u,"map",[],(n=function(){n.$$s;var t=s;return t=l(fe,"Opal").$destructure(arguments),[e.yield1($,t),t]},n.$$s=u,n.$$arity=0,n)),f(o,"sort!",[],((r=function(e,t){r.$$s;return null==e&&(e=s),null==t&&(t=s),e[0]["$<=>"](t[0])}).$$s=u,r.$$arity=2,r)),f(o,"map!",[],((i=function(e){i.$$s;return null==e&&(e=s),e[1]}).$$s=u,i.$$arity=1,i)))},oe.$$arity=0),e.def(ce,"$sum",ae=function(t){var n,i=ae.$$p,o=i||s,a=s;return i&&(ae.$$p=null),null==t&&(t=0),a=t,f(this,"each",[],(n=function(t){n.$$s;var i,$,u=s;return i=e.slice.call(arguments,0,arguments.length),$=i,u=o!==s?e.yieldX(o,e.to_a($)):l(fe,"Opal").$destructure($),a=r(a,u)},n.$$s=this,n.$$arity=-1,n)),a},ae.$$arity=-1),e.def(ce,"$take",se=function(e){return this.$first(e)},se.$$arity=1),e.def(ce,"$take_while",$e=function(){try{var t,n=$e.$$p,r=n||s,i=this,o=s;return n&&($e.$$p=null),n&&($e.$$p=null),c(r)?(o=[],f(i,"each",[],(t=function(n){t.$$s;var i,a=s;return i=e.slice.call(arguments,0,arguments.length),a=l(fe,"Opal").$destructure(i),c(e.yield1(r,a))||e.ret(o),o.push(a)},t.$$s=i,t.$$arity=-1,t))):i.$enum_for("take_while")}catch(a){if(a===e.returner)return a.$v;throw a}},$e.$$arity=0),e.def(ce,"$uniq",le=function(){var t,n=le.$$p,r=n||s,o=s;return n&&(le.$$p=null),n&&(le.$$p=null),o=p([],{}),f(this,"each",[],(t=function(n){t.$$s;var a,$=s,u=s,d=s;return a=e.slice.call(arguments,0,arguments.length),$=l(fe,"Opal").$destructure(a),u=r!==s?e.yield1(r,$):$,c(o["$key?"](u))?s:(d=[u,$],f(o,"[]=",e.to_a(d)),d[i(d.length,1)])},t.$$s=this,t.$$arity=-1,t)),o.$values()},le.$$arity=0),e.alias(ce,"to_a","entries"),e.def(ce,"$zip",ue=function(t){var n,r=ue.$$p,i=this;return r&&(ue.$$p=null),r&&(ue.$$p=null),n=e.slice.call(arguments,0,arguments.length),f(i.$to_a(),"zip",e.to_a(n))},ue.$$arity=-1)}(a[0],a)},Opal.modules["corelib/enumerator"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e+t:e["$+"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e<t:e["$<"](t)}var r=e.top,i=[],o=e.nil,a=(e.const_get_qualified,e.const_get_relative),s=e.breaker,$=e.slice,l=e.klass,u=e.truthy,c=e.send,f=e.falsy;return e.add_stubs(["$require","$include","$allocate","$new","$to_proc","$coerce_to","$nil?","$empty?","$+","$class","$__send__","$===","$call","$enum_for","$size","$destructure","$inspect","$any?","$[]","$raise","$yield","$each","$enumerator_size","$respond_to?","$try_convert","$<","$for"]),r.$require("corelib/enumerable"),function(r,i,d){var p,_,h,m,y,g,v=l(r,null,"Enumerator"),b=[v].concat(d);return v.$$prototype.size=v.$$prototype.args=v.$$prototype.object=v.$$prototype.method=o,v.$include(a(b,"Enumerable")),v.$$prototype.$$is_enumerator=!0,e.defs(v,"$for",p=function(t,n,r){var i,a,s,$=p.$$p,l=$||o,u=this;$&&(p.$$p=null),$&&(p.$$p=null),(i=e.slice.call(arguments,1,arguments.length)).length>0&&(a=i[0],i.splice(0,1)),null==a&&(a="each"),s=i;var c=u.$allocate();return c.object=t,c.size=l,c.method=a,c.args=s,c},p.$$arity=-2),e.def(v,"$initialize",_=function(t){var n=_.$$p,r=n||o,i=this;return n&&(_.$$p=null),n&&(_.$$p=null),e.slice.call(arguments,0,arguments.length),u(r)?(i.object=c(a(b,"Generator"),"new",[],r.$to_proc()),i.method="each",i.args=[],i.size=arguments[0]||o,u(i.size)?i.size=a(b,"Opal").$coerce_to(i.size,a(b,"Integer"),"to_int"):o):(i.object=arguments[0],i.method=arguments[1]||"each",i.args=$.call(arguments,2),i.size=o)},_.$$arity=-1),e.def(v,"$each",h=function(n){var r,i,a=h.$$p,s=a||o,$=this;return a&&(h.$$p=null),a&&(h.$$p=null),r=e.slice.call(arguments,0,arguments.length),u(u(i=s["$nil?"]())?r["$empty?"]():i)?$:(r=t($.args,r),u(s["$nil?"]())?c($.$class(),"new",[$.object,$.method].concat(e.to_a(r))):c($.object,"__send__",[$.method].concat(e.to_a(r)),s.$to_proc()))},h.$$arity=-1),e.def(v,"$size",m=function(){var t=this;return u(a(b,"Proc")["$==="](t.size))?c(t.size,"call",e.to_a(t.args)):t.size},m.$$arity=0),e.def(v,"$with_index",y=function(e){var t,n=y.$$p,r=n||o,i=this;if(n&&(y.$$p=null),n&&(y.$$p=null),null==e&&(e=0),e=u(e)?a(b,"Opal").$coerce_to(e,a(b,"Integer"),"to_int"):0,!u(r))return c(i,"enum_for",["with_index",e],((t=function(){return(t.$$s||this).$size()}).$$s=i,t.$$arity=0,t));var s=e;return i.$each.$$p=function(){var e=a(b,"Opal").$destructure(arguments),t=r(e,s);return s++,t},i.$each()},y.$$arity=-1),e.alias(v,"with_object","each_with_object"),e.def(v,"$inspect",g=function(){var e=this,n=o;return n="#<"+e.$class()+": "+e.object.$inspect()+":"+e.method,u(e.args["$any?"]())&&(n=t(n,"("+e.args.$inspect()["$[]"](a(b,"Range").$new(1,-2))+")")),t(n,">")},g.$$arity=0),function(t,n,r){var i,$,f=l(t,null,"Generator"),d=[f].concat(r);f.$$prototype.block=o,f.$include(a(d,"Enumerable")),e.def(f,"$initialize",i=function(){var e=i.$$p,t=e||o;return e&&(i.$$p=null),e&&(i.$$p=null),u(t)||this.$raise(a(d,"LocalJumpError"),"no block given"),this.block=t},i.$$arity=0),e.def(f,"$each",$=function(t){var n,r=$.$$p,i=r||o,l=this,u=o;r&&($.$$p=null),r&&($.$$p=null),n=e.slice.call(arguments,0,arguments.length),u=c(a(d,"Yielder"),"new",[],i.$to_proc());try{n.unshift(u),e.yieldX(l.block,n)}catch(f){if(f===s)return s.$v;throw f}return l},$.$$arity=-1)}(b[0],0,b),function(t,n,r){var i,a,$,u=l(t,null,"Yielder");[u].concat(r);u.$$prototype.block=o,e.def(u,"$initialize",i=function(){var e=i.$$p,t=e||o;return e&&(i.$$p=null),e&&(i.$$p=null),this.block=t},i.$$arity=0),e.def(u,"$yield",a=function(t){var n,r=this;n=e.slice.call(arguments,0,arguments.length);var i=e.yieldX(r.block,n);if(i===s)throw s;return i},a.$$arity=-1),e.def(u,"$<<",$=function(t){var n,r=this;return n=e.slice.call(arguments,0,arguments.length),c(r,"yield",e.to_a(n)),r},$.$$arity=-1)}(b[0],0,b),function(r,i,s){var $,d,p,_,h,m,y,g,v,b,w,x,k,E=l(r,i,"Lazy"),O=[E].concat(s);return E.$$prototype.enumerator=o,function(e,t,n){[l(e,t,"StopLazyError")].concat(n)}(O[0],a(O,"Exception"),O),e.def(E,"$initialize",$=function(t,n){var r,i=$.$$p,s=i||o,l=this;return i&&($.$$p=null),i&&($.$$p=null),null==n&&(n=o),s!==o||l.$raise(a(O,"ArgumentError"),"tried to call lazy new without a block"),l.enumerator=t,c(l,e.find_super_dispatcher(l,"initialize",$,!1),[n],(r=function(n,i){var $,l,u=r.$$s||this;null==n&&(n=o),$=e.slice.call(arguments,1,arguments.length);try{return c(t,"each",e.to_a($),(l=function(t){var r;l.$$s;(r=e.slice.call(arguments,0,arguments.length)).unshift(n),e.yieldX(s,r)},l.$$s=u,l.$$arity=-1,l))}catch(f){if(!e.rescue(f,[a(O,"Exception")]))throw f;try{return o}finally{e.pop_exception()}}},r.$$s=l,r.$$arity=-2,r))},$.$$arity=-2),e.alias(E,"force","to_a"),e.def(E,"$lazy",d=function(){return this},d.$$arity=0),e.def(E,"$collect",p=function(){var t,n=p.$$p,r=n||o,i=this;return n&&(p.$$p=null),n&&(p.$$p=null),u(r)||i.$raise(a(O,"ArgumentError"),"tried to call lazy map without a block"),c(a(O,"Lazy"),"new",[i,i.$enumerator_size()],(t=function(n,i){var a;t.$$s;null==n&&(n=o),a=e.slice.call(arguments,1,arguments.length);var s=e.yieldX(r,a);n.$yield(s)},t.$$s=i,t.$$arity=-2,t))},p.$$arity=0),e.def(E,"$collect_concat",_=function(){var t,n=_.$$p,r=n||o,i=this;return n&&(_.$$p=null),n&&(_.$$p=null),u(r)||i.$raise(a(O,"ArgumentError"),"tried to call lazy map without a block"),c(a(O,"Lazy"),"new",[i,o],(t=function(n,i){var s,$,l,u=t.$$s||this;null==n&&(n=o),s=e.slice.call(arguments,1,arguments.length);var f=e.yieldX(r,s);if(f["$respond_to?"]("force")&&f["$respond_to?"]("each"))c(f,"each",[],(($=function(e){$.$$s;return null==e&&(e=o),n.$yield(e)}).$$s=u,$.$$arity=1,$));else{var d=a(O,"Opal").$try_convert(f,a(O,"Array"),"to_ary");d===o?n.$yield(f):c(f,"each",[],((l=function(e){l.$$s;return null==e&&(e=o),n.$yield(e)}).$$s=u,l.$$arity=1,l))}},t.$$s=i,t.$$arity=-2,t))},_.$$arity=0),e.def(E,"$drop",h=function(r){var i,s,$,l=this,f=o;return r=a(O,"Opal").$coerce_to(r,a(O,"Integer"),"to_int"),u(n(r,0))&&l.$raise(a(O,"ArgumentError"),"attempt to drop negative size"),s=l.$enumerator_size(),$=u(a(O,"Integer")["$==="](s))&&u(n(r,s))?r:s,f=0,c(a(O,"Lazy"),"new",[l,$],(i=function(a,s){var $;i.$$s;return null==a&&(a=o),$=e.slice.call(arguments,1,arguments.length),u(n(f,r))?f=t(f,1):c(a,"yield",e.to_a($))},i.$$s=l,i.$$arity=-2,i))},h.$$arity=1),e.def(E,"$drop_while",m=function(){var t,n=m.$$p,r=n||o,i=this,s=o;return n&&(m.$$p=null),n&&(m.$$p=null),u(r)||i.$raise(a(O,"ArgumentError"),"tried to call lazy drop_while without a block"),s=!0,c(a(O,"Lazy"),"new",[i,o],(t=function(n,i){var a;t.$$s;if(null==n&&(n=o),a=e.slice.call(arguments,1,arguments.length),!u(s))return c(n,"yield",e.to_a(a));var $=e.yieldX(r,a);f($)&&(s=!1,c(n,"yield",e.to_a(a)))},t.$$s=i,t.$$arity=-2,t))},m.$$arity=0),e.def(E,"$enum_for",y=function(t,n){var r,i,a,s=y.$$p,$=s||o,l=this;return s&&(y.$$p=null),s&&(y.$$p=null),(r=e.slice.call(arguments,0,arguments.length)).length>0&&(i=r[0],r.splice(0,1)),null==i&&(i="each"),a=r,c(l.$class(),"for",[l,i].concat(e.to_a(a)),$.$to_proc())},y.$$arity=-1),e.def(E,"$find_all",g=function(){var t,n=g.$$p,r=n||o,i=this;return n&&(g.$$p=null),n&&(g.$$p=null),u(r)||i.$raise(a(O,"ArgumentError"),"tried to call lazy select without a block"),c(a(O,"Lazy"),"new",[i,o],(t=function(n,i){var a;t.$$s;null==n&&(n=o),a=e.slice.call(arguments,1,arguments.length);var s=e.yieldX(r,a);u(s)&&c(n,"yield",e.to_a(a))},t.$$s=i,t.$$arity=-2,t))},g.$$arity=0),e.alias(E,"flat_map","collect_concat"),e.def(E,"$grep",v=function(t){var n,r,i=v.$$p,s=i||o,$=this;return i&&(v.$$p=null),i&&(v.$$p=null),u(s)?c(a(O,"Lazy"),"new",[$,o],(n=function(r,i){var $;n.$$s;null==r&&(r=o),$=e.slice.call(arguments,1,arguments.length);var l=a(O,"Opal").$destructure($),c=t["$==="](l);u(c)&&(c=e.yield1(s,l),r.$yield(e.yield1(s,l)))},n.$$s=$,n.$$arity=-2,n)):c(a(O,"Lazy"),"new",[$,o],(r=function(n,i){var s;r.$$s;null==n&&(n=o),s=e.slice.call(arguments,1,arguments.length);var $=a(O,"Opal").$destructure(s),l=t["$==="]($);u(l)&&n.$yield($)},r.$$s=$,r.$$arity=-2,r))},v.$$arity=1),e.alias(E,"map","collect"),e.alias(E,"select","find_all"),e.def(E,"$reject",b=function(){var t,n=b.$$p,r=n||o,i=this;return n&&(b.$$p=null),n&&(b.$$p=null),u(r)||i.$raise(a(O,"ArgumentError"),"tried to call lazy reject without a block"),c(a(O,"Lazy"),"new",[i,o],(t=function(n,i){var a;t.$$s;null==n&&(n=o),a=e.slice.call(arguments,1,arguments.length);var s=e.yieldX(r,a);f(s)&&c(n,"yield",e.to_a(a))},t.$$s=i,t.$$arity=-2,t))},b.$$arity=0),e.def(E,"$take",w=function(r){var i,s,$,l=this,f=o;return r=a(O,"Opal").$coerce_to(r,a(O,"Integer"),"to_int"),u(n(r,0))&&l.$raise(a(O,"ArgumentError"),"attempt to take negative size"),s=l.$enumerator_size(),$=u(a(O,"Integer")["$==="](s))&&u(n(r,s))?r:s,f=0,c(a(O,"Lazy"),"new",[l,$],(i=function(s,$){var l,d=i.$$s||this;return null==s&&(s=o),l=e.slice.call(arguments,1,arguments.length),u(n(f,r))?(c(s,"yield",e.to_a(l)),f=t(f,1)):d.$raise(a(O,"StopLazyError"))},i.$$s=l,i.$$arity=-2,i))},w.$$arity=1),e.def(E,"$take_while",x=function(){var t,n=x.$$p,r=n||o,i=this;return n&&(x.$$p=null),n&&(x.$$p=null),u(r)||i.$raise(a(O,"ArgumentError"),"tried to call lazy take_while without a block"),c(a(O,"Lazy"),"new",[i,o],(t=function(n,i){var s,$=t.$$s||this;null==n&&(n=o),s=e.slice.call(arguments,1,arguments.length);var l=e.yieldX(r,s);u(l)?c(n,"yield",e.to_a(s)):$.$raise(a(O,"StopLazyError"))},t.$$s=i,t.$$arity=-2,t))},x.$$arity=0),e.alias(E,"to_enum","enum_for"),e.def(E,"$inspect",k=function(){return"#<"+this.$class()+": "+this.enumerator.$inspect()+">"},k.$$arity=0),o&&"inspect"}(b[0],v,b)}(i[0],0,i)},Opal.modules["corelib/numeric"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e*t:e["$*"](t)}function r(e,t){return"number"===typeof e&&"number"===typeof t?e<t:e["$<"](t)}function i(e,t){return"number"===typeof e&&"number"===typeof t?e/t:e["$/"](t)}var o=e.top,a=[],s=e.nil,$=e.const_get_qualified,l=e.const_get_relative,u=(e.breaker,e.slice,e.klass),c=e.truthy,f=e.hash2;return e.add_stubs(["$require","$include","$instance_of?","$class","$Float","$respond_to?","$coerce","$__send__","$===","$raise","$equal?","$-","$*","$div","$<","$-@","$ceil","$to_f","$denominator","$to_r","$==","$floor","$/","$%","$Complex","$zero?","$numerator","$abs","$arg","$coerce_to!","$round","$to_i","$truncate","$>"]),o.$require("corelib/comparable"),function(o,a,d){var p,_,h,m,y,g,v,b,w,x,k,E,O,A,S,C,R,T,I,N,L,D,P,M,z,F,j,B,q,U,H,Y,W,V,K,G,X,Q=u(o,null,"Numeric"),J=[Q].concat(d);return Q.$include(l(J,"Comparable")),e.def(Q,"$coerce",p=function(e){var t=this;return c(e["$instance_of?"](t.$class()))?[e,t]:[t.$Float(e),t.$Float(t)]},p.$$arity=1),e.def(Q,"$__coerced__",_=function(t,n){var r,i,o=this,a=s,$=s,u=s;return c(n["$respond_to?"]("coerce"))?(i=n.$coerce(o),a=null==(r=e.to_ary(i))[0]?s:r[0],$=null==r[1]?s:r[1],a.$__send__(t,$)):"+"["$==="](u=t)||"-"["$==="](u)||"*"["$==="](u)||"/"["$==="](u)||"%"["$==="](u)||"&"["$==="](u)||"|"["$==="](u)||"^"["$==="](u)||"**"["$==="](u)?o.$raise(l(J,"TypeError"),n.$class()+" can't be coerced into Numeric"):">"["$==="](u)||">="["$==="](u)||"<"["$==="](u)||"<="["$==="](u)||"<=>"["$==="](u)?o.$raise(l(J,"ArgumentError"),"comparison of "+o.$class()+" with "+n.$class()+" failed"):s},_.$$arity=2),e.def(Q,"$<=>",h=function(e){return c(this["$equal?"](e))?0:s},h.$$arity=1),e.def(Q,"$+@",m=function(){return this},m.$$arity=0),e.def(Q,"$-@",y=function(){return t(0,this)},y.$$arity=0),e.def(Q,"$%",g=function(e){return t(this,n(e,this.$div(e)))},g.$$arity=1),e.def(Q,"$abs",v=function(){var e=this;return r(e,0)?e["$-@"]():e},v.$$arity=0),e.def(Q,"$abs2",b=function(){return n(this,this)},b.$$arity=0),e.def(Q,"$angle",w=function(){return r(this,0)?$(l(J,"Math"),"PI"):0},w.$$arity=0),e.alias(Q,"arg","angle"),e.def(Q,"$ceil",x=function(e){return null==e&&(e=0),this.$to_f().$ceil(e)},x.$$arity=-1),e.def(Q,"$conj",k=function(){return this},k.$$arity=0),e.alias(Q,"conjugate","conj"),e.def(Q,"$denominator",E=function(){return this.$to_r().$denominator()},E.$$arity=0),e.def(Q,"$div",O=function(e){return e["$=="](0)&&this.$raise(l(J,"ZeroDivisionError"),"divided by o"),i(this,e).$floor()},O.$$arity=1),e.def(Q,"$divmod",A=function(e){return[this.$div(e),this["$%"](e)]},A.$$arity=1),e.def(Q,"$fdiv",S=function(e){return i(this.$to_f(),e)},S.$$arity=1),e.def(Q,"$floor",C=function(e){return null==e&&(e=0),this.$to_f().$floor(e)},C.$$arity=-1),e.def(Q,"$i",R=function(){return this.$Complex(0,this)},R.$$arity=0),e.def(Q,"$imag",T=function(){return 0},T.$$arity=0),e.alias(Q,"imaginary","imag"),e.def(Q,"$integer?",I=function(){return!1},I.$$arity=0),e.alias(Q,"magnitude","abs"),e.alias(Q,"modulo","%"),e.def(Q,"$nonzero?",N=function(){return c(this["$zero?"]())?s:this},N.$$arity=0),e.def(Q,"$numerator",L=function(){return this.$to_r().$numerator()},L.$$arity=0),e.alias(Q,"phase","arg"),e.def(Q,"$polar",D=function(){return[this.$abs(),this.$arg()]},D.$$arity=0),e.def(Q,"$quo",P=function(e){return i(l(J,"Opal")["$coerce_to!"](this,l(J,"Rational"),"to_r"),e)},P.$$arity=1),e.def(Q,"$real",M=function(){return this},M.$$arity=0),e.def(Q,"$real?",z=function(){return!0},z.$$arity=0),e.def(Q,"$rect",F=function(){return[this,0]},F.$$arity=0),e.alias(Q,"rectangular","rect"),e.def(Q,"$round",j=function(e){return this.$to_f().$round(e)},j.$$arity=-1),e.def(Q,"$to_c",B=function(){return this.$Complex(this,0)},B.$$arity=0),e.def(Q,"$to_int",q=function(){return this.$to_i()},q.$$arity=0),e.def(Q,"$truncate",U=function(e){return null==e&&(e=0),this.$to_f().$truncate(e)},U.$$arity=-1),e.def(Q,"$zero?",H=function(){return this["$=="](0)},H.$$arity=0),e.def(Q,"$positive?",Y=function(){var e,t;return t=0,"number"===typeof(e=this)&&"number"===typeof t?e>t:e["$>"](t)},Y.$$arity=0),e.def(Q,"$negative?",W=function(){return r(this,0)},W.$$arity=0),e.def(Q,"$dup",V=function(){return this},V.$$arity=0),e.def(Q,"$clone",K=function(t){if(null==t)t=f([],{});else if(!t.$$is_hash)throw e.ArgumentError.$new("expected kwargs");return null==t.$$smap.freeze&&!0,this},K.$$arity=-1),e.def(Q,"$finite?",G=function(){return!0},G.$$arity=0),e.def(Q,"$infinite?",X=function(){return s},X.$$arity=0),s&&"infinite?"}(a[0],0,a)},Opal.modules["corelib/array"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e>t:e["$>"](t)}var n=e.top,r=[],i=e.nil,o=e.const_get_qualified,a=e.const_get_relative,s=(e.breaker,e.slice,e.klass),$=e.truthy,l=e.hash2,u=e.send,c=e.gvars;return e.add_stubs(["$require","$include","$to_a","$warn","$raise","$replace","$respond_to?","$to_ary","$coerce_to","$coerce_to?","$===","$join","$to_str","$class","$hash","$<=>","$==","$object_id","$inspect","$enum_for","$bsearch_index","$to_proc","$nil?","$coerce_to!","$>","$*","$enumerator_size","$empty?","$size","$map","$equal?","$dup","$each","$[]","$dig","$eql?","$length","$begin","$end","$exclude_end?","$flatten","$__id__","$to_s","$new","$max","$min","$!","$>=","$**","$delete_if","$reverse","$rotate","$rand","$at","$keep_if","$shuffle!","$<","$sort","$sort_by","$!=","$times","$[]=","$-","$<<","$values","$is_a?","$last","$first","$upto","$reject","$pristine","$singleton_class"]),n.$require("corelib/enumerable"),n.$require("corelib/numeric"),function(n,r,f){var d,p,_,h,m,y,g,v,b,w,x,k,E,O,A,S,C,R,T,I,N,L,D,P,M,z,F,j,B,q,U,H,Y,W,V,K,G,X,Q,J,Z,ee,te,ne,re,ie,oe,ae,se,$e,le,ue,ce,fe,de,pe,_e,he,me,ye,ge,ve,be,we,xe,ke,Ee,Oe,Ae,Se,Ce,Re,Te,Ie,Ne,Le,De,Pe,Me,ze,Fe,je,Be,qe,Ue,He,Ye,We,Ve,Ke,Ge,Xe,Qe,Je=s(n,Array,"Array"),Ze=[Je].concat(f);function et(t,n){return n.$$name===e.Array?t:n.$allocate().$replace(t.$to_a())}function tt(e,t){return e===t||0===t?1:t>0&&e>t?tt(e-1,t-1)+tt(e-1,t):0}return Je.$include(a(Ze,"Enumerable")),e.defineProperty(Je.$$prototype,"$$is_array",!0),e.defs(Je,"$[]",d=function(t){var n=this;return et(e.slice.call(arguments,0,arguments.length),n)},d.$$arity=-1),e.def(Je,"$initialize",p=function(e,t){var n,r,s=p.$$p,$=s||i,l=this;if(s&&(p.$$p=null),s&&(p.$$p=null),null==e&&(e=i),null==t&&(t=i),t!==i&&$!==i&&l.$warn("warning: block supersedes default value argument"),e>o(a(Ze,"Integer"),"MAX")&&l.$raise(a(Ze,"ArgumentError"),"array size too big"),arguments.length>2&&l.$raise(a(Ze,"ArgumentError"),"wrong number of arguments ("+arguments.length+" for 0..2)"),0===arguments.length)return l.splice(0,l.length),l;if(1===arguments.length){if(e.$$is_array)return l.$replace(e.$to_a()),l;if(e["$respond_to?"]("to_ary"))return l.$replace(e.$to_ary()),l}if((e=a(Ze,"Opal").$coerce_to(e,a(Ze,"Integer"),"to_int"))<0&&l.$raise(a(Ze,"ArgumentError"),"negative array size"),l.splice(0,l.length),$===i)for(n=0;n<e;n++)l.push(t);else for(n=0;n<e;n++)r=$(n),l[n]=r;return l},p.$$arity=-1),e.defs(Je,"$try_convert",_=function(e){return a(Ze,"Opal")["$coerce_to?"](e,a(Ze,"Array"),"to_ary")},_.$$arity=1),e.def(Je,"$&",h=function(t){t=$(a(Ze,"Array")["$==="](t))?t.$to_a():a(Ze,"Opal").$coerce_to(t,a(Ze,"Array"),"to_ary").$to_a();var n,r,i,o=[],s=l([],{});for(n=0,r=t.length;n<r;n++)e.hash_put(s,t[n],!0);for(n=0,r=this.length;n<r;n++)i=this[n],void 0!==e.hash_delete(s,i)&&o.push(i);return o},h.$$arity=1),e.def(Je,"$|",m=function(t){t=$(a(Ze,"Array")["$==="](t))?t.$to_a():a(Ze,"Opal").$coerce_to(t,a(Ze,"Array"),"to_ary").$to_a();var n,r,i=l([],{});for(n=0,r=this.length;n<r;n++)e.hash_put(i,this[n],!0);for(n=0,r=t.length;n<r;n++)e.hash_put(i,t[n],!0);return i.$keys()},m.$$arity=1),e.def(Je,"$*",y=function(e){var t=this;if($(e["$respond_to?"]("to_str")))return t.$join(e.$to_str());e=a(Ze,"Opal").$coerce_to(e,a(Ze,"Integer"),"to_int"),$(e<0)&&t.$raise(a(Ze,"ArgumentError"),"negative argument");for(var n=[],r=t.$to_a(),i=0;i<e;i++)n=n.concat(r);return et(n,t.$class())},y.$$arity=1),e.def(Je,"$+",g=function(e){return e=$(a(Ze,"Array")["$==="](e))?e.$to_a():a(Ze,"Opal").$coerce_to(e,a(Ze,"Array"),"to_ary").$to_a(),this.concat(e)},g.$$arity=1),e.def(Je,"$-",v=function(t){var n=this;if(t=$(a(Ze,"Array")["$==="](t))?t.$to_a():a(Ze,"Opal").$coerce_to(t,a(Ze,"Array"),"to_ary").$to_a(),$(0===n.length))return[];if($(0===t.length))return n.slice();var r,i,o,s=[],u=l([],{});for(r=0,i=t.length;r<i;r++)e.hash_put(u,t[r],!0);for(r=0,i=n.length;r<i;r++)o=n[r],void 0===e.hash_get(u,o)&&s.push(o);return s},v.$$arity=1),e.def(Je,"$<<",b=function(e){return this.push(e),this},b.$$arity=1),e.def(Je,"$<=>",w=function(e){var t=this;if($(a(Ze,"Array")["$==="](e)))e=e.$to_a();else{if(!$(e["$respond_to?"]("to_ary")))return i;e=e.$to_ary().$to_a()}if(t.$hash()===e.$hash())return 0;for(var n=Math.min(t.length,e.length),r=0;r<n;r++){var o=t[r]["$<=>"](e[r]);if(0!==o)return o}return t.length["$<=>"](e.length)},w.$$arity=1),e.def(Je,"$==",x=function(e){var t={};return function e(n,r){var i,o,s,$;if(n===r)return!0;if(!r.$$is_array)return!!a(Ze,"Opal")["$respond_to?"](r,"to_ary")&&r["$=="](n);if(n.$$constructor!==Array&&(n=n.$to_a()),r.$$constructor!==Array&&(r=r.$to_a()),n.length!==r.length)return!1;for(t[n.$object_id()]=!0,i=0,o=n.length;i<o;i++)if(s=n[i],$=r[i],s.$$is_array){if($.$$is_array&&$.length!==s.length)return!1;if(!t.hasOwnProperty(s.$object_id())&&!e(s,$))return!1}else if(!s["$=="]($))return!1;return!0}(this,e)},x.$$arity=1),e.def(Je,"$[]",k=function(t,n){return t.$$is_range?function(t,n){var r,o,a,s=t.length;return r=n.excl,o=e.Opal.$coerce_to(n.begin,e.Integer,"to_int"),a=e.Opal.$coerce_to(n.end,e.Integer,"to_int"),o<0&&(o+=s)<0||o>s?i:a<0&&(a+=s)<0?[]:(r||(a+=1),et(t.slice(o,a),t.$class()))}(this,t):function(t,n,r){var o=t.length;return(n=e.Opal.$coerce_to(n,e.Integer,"to_int"))<0&&(n+=o)<0?i:void 0===r?n>=o||n<0?i:t[n]:(r=e.Opal.$coerce_to(r,e.Integer,"to_int"))<0||n>o||n<0?i:et(t.slice(n,n+r),t.$class())}(this,t,n)},k.$$arity=-2),e.def(Je,"$[]=",E=function(e,t,n){var r,o,s=this,l=i,u=i,c=s.length;if($(a(Ze,"Range")["$==="](e))){l=$(a(Ze,"Array")["$==="](t))?t.$to_a():$(t["$respond_to?"]("to_ary"))?t.$to_ary().$to_a():[t];var f=e.excl,d=a(Ze,"Opal").$coerce_to(e.begin,a(Ze,"Integer"),"to_int"),p=a(Ze,"Opal").$coerce_to(e.end,a(Ze,"Integer"),"to_int");if(d<0&&(d+=c)<0&&s.$raise(a(Ze,"RangeError"),e.$inspect()+" out of range"),p<0&&(p+=c),f||(p+=1),d>c)for(r=c;r<d;r++)s[r]=i;return p<0?s.splice.apply(s,[d,0].concat(l)):s.splice.apply(s,[d,p-d].concat(l)),t}if($(void 0===n)?u=1:(u=t,t=n,l=$(a(Ze,"Array")["$==="](t))?t.$to_a():$(t["$respond_to?"]("to_ary"))?t.$to_ary().$to_a():[t]),e=a(Ze,"Opal").$coerce_to(e,a(Ze,"Integer"),"to_int"),u=a(Ze,"Opal").$coerce_to(u,a(Ze,"Integer"),"to_int"),e<0&&(o=e,(e+=c)<0&&s.$raise(a(Ze,"IndexError"),"index "+o+" too small for array; minimum "+-s.length)),u<0&&s.$raise(a(Ze,"IndexError"),"negative length ("+u+")"),e>c)for(r=c;r<e;r++)s[r]=i;return void 0===n?s[e]=t:s.splice.apply(s,[e,u].concat(l)),t},E.$$arity=-3),e.def(Je,"$any?",O=function(t){var n=O.$$p,r=this,o=i,a=i,s=i;for(n&&(O.$$p=null),a=0,s=arguments.length,o=new Array(s);a<s;a++)o[a]=arguments[a];return n&&(O.$$p=null),0!==r.length&&u(r,e.find_super_dispatcher(r,"any?",O,!1),o,n)},O.$$arity=-1),e.def(Je,"$assoc",A=function(e){for(var t,n=0,r=this.length;n<r;n++)if((t=this[n]).length&&t[0]["$=="](e))return t;return i},A.$$arity=1),e.def(Je,"$at",S=function(e){var t=this;return(e=a(Ze,"Opal").$coerce_to(e,a(Ze,"Integer"),"to_int"))<0&&(e+=t.length),e<0||e>=t.length?i:t[e]},S.$$arity=1),e.def(Je,"$bsearch_index",C=function(){var t=C.$$p,n=t||i,r=this;if(t&&(C.$$p=null),t&&(C.$$p=null),n===i)return r.$enum_for("bsearch_index");for(var o,s,$,l=0,u=r.length,c=!1,f=i;l<u;){if(s=r[o=l+Math.floor((u-l)/2)],!0===($=e.yield1(n,s)))f=o,c=!0;else if(!1===$||$===i)c=!1;else if($.$$is_number){if(0===$)return o;c=$<0}else r.$raise(a(Ze,"TypeError"),"wrong argument type "+$.$class()+" (must be numeric, true, false or nil)");c?u=o:l=o+1}return f},C.$$arity=0),e.def(Je,"$bsearch",R=function(){var e,t=R.$$p,n=t||i,r=this;return t&&(R.$$p=null),t&&(R.$$p=null),n===i?r.$enum_for("bsearch"):null!=(e=u(r,"bsearch_index",[],n.$to_proc()))&&e.$$is_number?r[e]:e},R.$$arity=0),e.def(Je,"$cycle",T=function(n){var r,s,l,c,f=T.$$p,d=f||i,p=this;if(f&&(T.$$p=null),f&&(T.$$p=null),null==n&&(n=i),d===i)return u(p,"enum_for",["cycle",n],(r=function(){var e,i,s=r.$$s||this;return $(n["$nil?"]())?o(a(Ze,"Float"),"INFINITY"):(n=a(Ze,"Opal")["$coerce_to!"](n,a(Ze,"Integer"),"to_int"),$(t(n,0))?(e=s.$enumerator_size(),i=n,"number"===typeof e&&"number"===typeof i?e*i:e["$*"](i)):0)},r.$$s=p,r.$$arity=0,r));if($($(s=p["$empty?"]())?s:n["$=="](0)))return i;if(n===i)for(;;)for(l=0,c=p.length;l<c;l++)e.yield1(d,p[l]);else{if((n=a(Ze,"Opal")["$coerce_to!"](n,a(Ze,"Integer"),"to_int"))<=0)return p;for(;n>0;){for(l=0,c=p.length;l<c;l++)e.yield1(d,p[l]);n--}}return p},T.$$arity=-1),e.def(Je,"$clear",I=function(){var e=this;return e.splice(0,e.length),e},I.$$arity=0),e.def(Je,"$count",N=function(t){var n,r=N.$$p,o=r||i,a=this,s=i,l=i,c=i;for(r&&(N.$$p=null),l=0,c=arguments.length,s=new Array(c);l<c;l++)s[l]=arguments[l];return r&&(N.$$p=null),null==t&&(t=i),$($(n=t)?n:o)?u(a,e.find_super_dispatcher(a,"count",N,!1),s,r):a.$size()},N.$$arity=-1),e.def(Je,"$initialize_copy",L=function(e){return this.$replace(e)},L.$$arity=1),e.def(Je,"$collect",D=function(){var t,n=D.$$p,r=n||i,o=this;if(n&&(D.$$p=null),n&&(D.$$p=null),r===i)return u(o,"enum_for",["collect"],((t=function(){return(t.$$s||this).$size()}).$$s=o,t.$$arity=0,t));for(var a=[],s=0,$=o.length;s<$;s++){var l=e.yield1(r,o[s]);a.push(l)}return a},D.$$arity=0),e.def(Je,"$collect!",P=function(){var t,n=P.$$p,r=n||i,o=this;if(n&&(P.$$p=null),n&&(P.$$p=null),r===i)return u(o,"enum_for",["collect!"],((t=function(){return(t.$$s||this).$size()}).$$s=o,t.$$arity=0,t));for(var a=0,s=o.length;a<s;a++){var $=e.yield1(r,o[a]);o[a]=$}return o},P.$$arity=0),e.def(Je,"$combination",M=function(t){var n,r,o,s,$,l,c,f,d,p=M.$$p,_=p||i,h=this;if(p&&(M.$$p=null),r=a(Ze,"Opal")["$coerce_to!"](t,a(Ze,"Integer"),"to_int"),_===i)return u(h,"enum_for",["combination",r],((n=function(){return tt((n.$$s||this).length,r)}).$$s=h,n.$$arity=0,n));if(0===r)e.yield1(_,[]);else if(1===r)for(o=0,s=h.length;o<s;o++)e.yield1(_,[h[o]]);else if(r===h.length)e.yield1(_,h.slice());else if(r>=0&&r<h.length){for($=[],o=0;o<=r+1;o++)$.push(0);for(l=[],c=0,f=!1,$[0]=-1;!f;){for(l[c]=h[$[c+1]];c<r-1;)d=$[++c+1]=$[c]+1,l[c]=h[d];e.yield1(_,l.slice()),c++;do{f=0===c,$[c]++,c--}while($[c+1]+r===h.length+c+1)}}return h},M.$$arity=1),e.def(Je,"$repeated_combination",z=function(t){var n,r,o=z.$$p,s=o||i,$=this;if(o&&(z.$$p=null),r=a(Ze,"Opal")["$coerce_to!"](t,a(Ze,"Integer"),"to_int"),s===i)return u($,"enum_for",["repeated_combination",r],((n=function(){return tt((n.$$s||this).length+r-1,r)}).$$s=$,n.$$arity=0,n));return r>=0&&function t(n,r,i,o){if(i.length!=n)for(var a=r;a<o.length;a++)i.push(o[a]),t(n,a,i,o),i.pop();else{var $=i.slice();e.yield1(s,$)}}(r,0,[],$),$},z.$$arity=1),e.def(Je,"$compact",F=function(){for(var e,t=[],n=0,r=this.length;n<r;n++)(e=this[n])!==i&&t.push(e);return t},F.$$arity=0),e.def(Je,"$compact!",j=function(){for(var e=this,t=e.length,n=0,r=e.length;n<r;n++)e[n]===i&&(e.splice(n,1),r--,n--);return e.length===t?i:e},j.$$arity=0),e.def(Je,"$concat",B=function(t){var n,r,o,s,l=this;return n=e.slice.call(arguments,0,arguments.length),r=u(r=n,"map",[],(o=function(e){var t=o.$$s||this;return null==e&&(e=i),e=$(a(Ze,"Array")["$==="](e))?e.$to_a():a(Ze,"Opal").$coerce_to(e,a(Ze,"Array"),"to_ary").$to_a(),$(e["$equal?"](t))&&(e=e.$dup()),e},o.$$s=l,o.$$arity=1,o)),u(r,"each",[],(s=function(e){var t=s.$$s||this;null==e&&(e=i);for(var n=0,r=e.length;n<r;n++)t.push(e[n])},s.$$s=l,s.$$arity=1,s)),l},B.$$arity=-1),e.def(Je,"$delete",q=function(t){var n=q.$$p,r=n||i,o=this;n&&(q.$$p=null);for(var a=o.length,s=0,$=a;s<$;s++)o[s]["$=="](t)&&(o.splice(s,1),$--,s--);return o.length===a?r!==i?e.yieldX(r,[]):i:t},q.$$arity=1),e.def(Je,"$delete_at",U=function(e){var t=this;if((e=a(Ze,"Opal").$coerce_to(e,a(Ze,"Integer"),"to_int"))<0&&(e+=t.length),e<0||e>=t.length)return i;var n=t[e];return t.splice(e,1),n},U.$$arity=1),e.def(Je,"$delete_if",H=function(){var e,t=H.$$p,n=t||i,r=this;if(t&&(H.$$p=null),t&&(H.$$p=null),n===i)return u(r,"enum_for",["delete_if"],((e=function(){return(e.$$s||this).$size()}).$$s=r,e.$$arity=0,e));for(var o,a=0,s=r.length;a<s;a++)!1!==(o=n(r[a]))&&o!==i&&(r.splice(a,1),s--,a--);return r},H.$$arity=0),e.def(Je,"$dig",Y=function(t,n){var r,o=this,s=i;return r=e.slice.call(arguments,1,arguments.length),(s=o["$[]"](t))===i||0===r.length?s:($(s["$respond_to?"]("dig"))||o.$raise(a(Ze,"TypeError"),s.$class()+" does not have #dig method"),u(s,"dig",e.to_a(r)))},Y.$$arity=-2),e.def(Je,"$drop",W=function(e){return e<0&&this.$raise(a(Ze,"ArgumentError")),this.slice(e)},W.$$arity=1),e.def(Je,"$dup",V=function(){var t=V.$$p,n=this,r=i,o=i,a=i;for(t&&(V.$$p=null),o=0,a=arguments.length,r=new Array(a);o<a;o++)r[o]=arguments[o];return n.$$class===e.Array&&n.$$class.$allocate.$$pristine&&n.$copy_instance_variables.$$pristine&&n.$initialize_dup.$$pristine?n.slice(0):u(n,e.find_super_dispatcher(n,"dup",V,!1),r,t)},V.$$arity=0),e.def(Je,"$each",K=function(){var t,n=K.$$p,r=n||i,o=this;if(n&&(K.$$p=null),n&&(K.$$p=null),r===i)return u(o,"enum_for",["each"],((t=function(){return(t.$$s||this).$size()}).$$s=o,t.$$arity=0,t));for(var a=0,s=o.length;a<s;a++)e.yield1(r,o[a]);return o},K.$$arity=0),e.def(Je,"$each_index",G=function(){var t,n=G.$$p,r=n||i,o=this;if(n&&(G.$$p=null),n&&(G.$$p=null),r===i)return u(o,"enum_for",["each_index"],((t=function(){return(t.$$s||this).$size()}).$$s=o,t.$$arity=0,t));for(var a=0,s=o.length;a<s;a++)e.yield1(r,a);return o},G.$$arity=0),e.def(Je,"$empty?",X=function(){return 0===this.length},X.$$arity=0),e.def(Je,"$eql?",Q=function(e){var t={};return function e(n,r){var i,o,a,s;if(!r.$$is_array)return!1;if(r=r.$to_a(),n.length!==r.length)return!1;for(t[n.$object_id()]=!0,i=0,o=n.length;i<o;i++)if(a=n[i],s=r[i],a.$$is_array){if(s.$$is_array&&s.length!==a.length)return!1;if(!t.hasOwnProperty(a.$object_id())&&!e(a,s))return!1}else if(!a["$eql?"](s))return!1;return!0}(this,e)},Q.$$arity=1),e.def(Je,"$fetch",J=function(e,t){var n=J.$$p,r=n||i,o=this;n&&(J.$$p=null),n&&(J.$$p=null);var s=e;return(e=a(Ze,"Opal").$coerce_to(e,a(Ze,"Integer"),"to_int"))<0&&(e+=o.length),e>=0&&e<o.length?o[e]:(r!==i&&null!=t&&o.$warn("warning: block supersedes default value argument"),r!==i?r(s):null!=t?t:void(0===o.length?o.$raise(a(Ze,"IndexError"),"index "+s+" outside of array bounds: 0...0"):o.$raise(a(Ze,"IndexError"),"index "+s+" outside of array bounds: -"+o.length+"..."+o.length)))},J.$$arity=-2),e.def(Je,"$fill",Z=function(t){var n,r,o,s,l,u=Z.$$p,c=u||i,f=this,d=i,p=i,_=i,h=i,m=i;if(u&&(Z.$$p=null),u&&(Z.$$p=null),n=e.slice.call(arguments,0,arguments.length),$(c)?($(n.length>2)&&f.$raise(a(Ze,"ArgumentError"),"wrong number of arguments ("+n.$length()+" for 0..2)"),o=n,d=null==(r=e.to_ary(o))[0]?i:r[0],p=null==r[1]?i:r[1]):($(0==n.length)?f.$raise(a(Ze,"ArgumentError"),"wrong number of arguments (0 for 1..3)"):$(n.length>3)&&f.$raise(a(Ze,"ArgumentError"),"wrong number of arguments ("+n.$length()+" for 1..3)"),o=n,_=null==(r=e.to_ary(o))[0]?i:r[0],d=null==r[1]?i:r[1],p=null==r[2]?i:r[2]),$(a(Ze,"Range")["$==="](d))){if($(p)&&f.$raise(a(Ze,"TypeError"),"length invalid with range"),h=a(Ze,"Opal").$coerce_to(d.$begin(),a(Ze,"Integer"),"to_int"),$(h<0)&&(h+=this.length),$(h<0)&&f.$raise(a(Ze,"RangeError"),d.$inspect()+" out of range"),m=a(Ze,"Opal").$coerce_to(d.$end(),a(Ze,"Integer"),"to_int"),$(m<0)&&(m+=this.length),$(d["$exclude_end?"]())||(m+=1),$(m<=h))return f}else if($(d))if(h=a(Ze,"Opal").$coerce_to(d,a(Ze,"Integer"),"to_int"),$(h<0)&&(h+=this.length),$(h<0)&&(h=0),$(p)){if(m=a(Ze,"Opal").$coerce_to(p,a(Ze,"Integer"),"to_int"),$(0==m))return f;m+=h}else m=this.length;else h=0,m=this.length;if($(h>this.length))for(s=this.length;s<m;s++)f[s]=i;if($(m>this.length)&&(this.length=m),$(c))for(this.length;h<m;h++)l=c(h),f[h]=l;else for(this.length;h<m;h++)f[h]=_;return f},Z.$$arity=-1),e.def(Je,"$first",ee=function(e){var t=this;return null==e?0===t.length?i:t[0]:((e=a(Ze,"Opal").$coerce_to(e,a(Ze,"Integer"),"to_int"))<0&&t.$raise(a(Ze,"ArgumentError"),"negative array size"),t.slice(0,e))},ee.$$arity=-1),e.def(Je,"$flatten",te=function(e){var t=this;return void 0!==e&&(e=a(Ze,"Opal").$coerce_to(e,a(Ze,"Integer"),"to_int")),et(function e(n,r){var o,s,$,l,u=[];for(o=0,s=(n=n.$to_a()).length;o<s;o++)if($=n[o],a(Ze,"Opal")["$respond_to?"]($,"to_ary",!0))if((l=$.$to_ary())!==i)switch(l.$$is_array||t.$raise(a(Ze,"TypeError")),l===t&&t.$raise(a(Ze,"ArgumentError")),r){case void 0:u=u.concat(e(l));break;case 0:u.push(l);break;default:u.push.apply(u,e(l,r-1))}else u.push($);else u.push($);return u}(t,e),t.$class())},te.$$arity=-1),e.def(Je,"$flatten!",ne=function(e){var t=this,n=t.$flatten(e);if(t.length==n.length){for(var r=0,o=t.length;r<o&&t[r]===n[r];r++);if(r==o)return i}return t.$replace(n),t},ne.$$arity=-1),e.def(Je,"$hash",re=function(){var t,n,r,i=this,o=void 0===e.hash_ids,a=["A"],s=i.$object_id();try{if(o&&(e.hash_ids=Object.create(null)),e.hash_ids[s])return"self";for(r in e.hash_ids)if(t=e.hash_ids[r],i["$eql?"](t))return"self";for(e.hash_ids[s]=i,n=0;n<i.length;n++)t=i[n],a.push(t.$hash());return a.join(",")}finally{o&&(e.hash_ids=void 0)}},re.$$arity=0),e.def(Je,"$include?",ie=function(e){for(var t=0,n=this.length;t<n;t++)if(this[t]["$=="](e))return!0;return!1},ie.$$arity=1),e.def(Je,"$index",oe=function(e){var t,n,r,o=oe.$$p,a=o||i,s=this;if(o&&(oe.$$p=null),o&&(oe.$$p=null),null!=e&&a!==i&&s.$warn("warning: given block not used"),null!=e){for(t=0,n=s.length;t<n;t++)if(s[t]["$=="](e))return t}else{if(a===i)return s.$enum_for("index");for(t=0,n=s.length;t<n;t++)if(!1!==(r=a(s[t]))&&r!==i)return t}return i},oe.$$arity=-1),e.def(Je,"$insert",ae=function(t,n){var r,o=this;if(r=e.slice.call(arguments,1,arguments.length),t=a(Ze,"Opal").$coerce_to(t,a(Ze,"Integer"),"to_int"),r.length>0){if(t<0&&(t+=o.length+1)<0&&o.$raise(a(Ze,"IndexError"),t+" is out of bounds"),t>o.length)for(var s=o.length;s<t;s++)o.push(i);o.splice.apply(o,[t,0].concat(r))}return o},ae.$$arity=-2),e.def(Je,"$inspect",se=function(){for(var e=this,t=[],n=e.$__id__(),r=0,i=e.length;r<i;r++){var o=e["$[]"](r);o.$__id__()===n?t.push("[...]"):t.push(o.$inspect())}return"["+t.join(", ")+"]"},se.$$arity=0),e.def(Je,"$join",$e=function(t){var n=this;if(null==c[","]&&(c[","]=i),null==t&&(t=i),$(0===n.length))return"";$(t===i)&&(t=c[","]);var r,o,s,l,u=[];for(r=0,o=n.length;r<o;r++)s=n[r],a(Ze,"Opal")["$respond_to?"](s,"to_str")&&(l=s.$to_str())!==i?u.push(l.$to_s()):a(Ze,"Opal")["$respond_to?"](s,"to_ary")&&((l=s.$to_ary())===n&&n.$raise(a(Ze,"ArgumentError")),l!==i)?u.push(l.$join(t)):a(Ze,"Opal")["$respond_to?"](s,"to_s")&&(l=s.$to_s())!==i?u.push(l):n.$raise(a(Ze,"NoMethodError").$new(e.inspect(s)+" doesn't respond to #to_str, #to_ary or #to_s","to_str"));return t===i?u.join(""):u.join(a(Ze,"Opal")["$coerce_to!"](t,a(Ze,"String"),"to_str").$to_s())},$e.$$arity=-1),e.def(Je,"$keep_if",le=function(){var e,t=le.$$p,n=t||i,r=this;if(t&&(le.$$p=null),t&&(le.$$p=null),n===i)return u(r,"enum_for",["keep_if"],((e=function(){return(e.$$s||this).$size()}).$$s=r,e.$$arity=0,e));for(var o,a=0,s=r.length;a<s;a++)!1!==(o=n(r[a]))&&o!==i||(r.splice(a,1),s--,a--);return r},le.$$arity=0),e.def(Je,"$last",ue=function(e){var t=this;return null==e?0===t.length?i:t[t.length-1]:((e=a(Ze,"Opal").$coerce_to(e,a(Ze,"Integer"),"to_int"))<0&&t.$raise(a(Ze,"ArgumentError"),"negative array size"),e>t.length&&(e=t.length),t.slice(t.length-e,t.length))},ue.$$arity=-1),e.def(Je,"$length",ce=function(){return this.length},ce.$$arity=0),e.alias(Je,"map","collect"),e.alias(Je,"map!","collect!"),e.def(Je,"$max",fe=function(e){var t=fe.$$p,n=t||i;return t&&(fe.$$p=null),t&&(fe.$$p=null),u(this.$each(),"max",[e],n.$to_proc())},fe.$$arity=-1),e.def(Je,"$min",de=function(){var e=de.$$p,t=e||i;return e&&(de.$$p=null),e&&(de.$$p=null),u(this.$each(),"min",[],t.$to_proc())},de.$$arity=0),e.def(Je,"$permutation",pe=function(t){var n,r,o,s,$=pe.$$p,l=$||i,c=this,f=i,d=i;if($&&(pe.$$p=null),$&&(pe.$$p=null),l===i)return u(c,"enum_for",["permutation",t],(n=function(){var e=n.$$s||this;return function(e,t){for(var n=t>=0?1:0;t;)n*=e,e--,t--;return n}(e.length,void 0===t?e.length:t)},n.$$s=c,n.$$arity=0,n));if((t=void 0===t?c.length:a(Ze,"Opal").$coerce_to(t,a(Ze,"Integer"),"to_int"))<0||c.length<t);else if(0===t)e.yield1(l,[]);else if(1===t)for(var p=0;p<c.length;p++)e.yield1(l,[c[p]]);else f=a(Ze,"Array").$new(t),d=a(Ze,"Array").$new(c.length,!1),r=function(t,n,i,o,a){c=this;for(var $=0;$<c.length;$++)if(o["$[]"]($)["$!"]())if(n[i]=$,i<t-1)o[$]=!0,r.call(c,t,n,i+1,o,a),o[$]=!1;else{s=[];for(var l=0;l<n.length;l++)s.push(c[n[l]]);e.yield1(a,s)}},l!==i?(o=c.slice(),r.call(o,t,f,0,d,l)):r.call(c,t,f,0,d,l);return c},pe.$$arity=-1),e.def(Je,"$repeated_permutation",_e=function(t){var n,r,o=_e.$$p,s=o||i,l=this;if(o&&(_e.$$p=null),r=a(Ze,"Opal")["$coerce_to!"](t,a(Ze,"Integer"),"to_int"),s===i)return u(l,"enum_for",["repeated_permutation",r],(n=function(){var e,t,i=n.$$s||this;return $((t=0,"number"===typeof(e=r)&&"number"===typeof t?e>=t:e["$>="](t)))?i.$size()["$**"](r):0},n.$$s=l,n.$$arity=0,n));return function t(n,r,i){if(r.length!=n)for(var o=0;o<i.length;o++)r.push(i[o]),t(n,r,i),r.pop();else{var a=r.slice();e.yield1(s,a)}}(r,[],l.slice()),l},_e.$$arity=1),e.def(Je,"$pop",he=function(e){var t=this;return $(void 0===e)?$(0===t.length)?i:t.pop():(e=a(Ze,"Opal").$coerce_to(e,a(Ze,"Integer"),"to_int"),$(e<0)&&t.$raise(a(Ze,"ArgumentError"),"negative array size"),$(0===t.length)?[]:$(e>t.length)?t.splice(0,t.length):t.splice(t.length-e,t.length))},he.$$arity=-1),e.def(Je,"$product",me=function(t){var n,r,o=me.$$p,s=o||i,$=this;o&&(me.$$p=null),o&&(me.$$p=null),n=e.slice.call(arguments,0,arguments.length);var l,u,c,f,d=s!==i?null:[],p=(r=n).length+1,_=new Array(p),h=new Array(p),m=new Array(p),y=1;for(m[0]=$,l=1;l<p;l++)m[l]=a(Ze,"Opal").$coerce_to(r[l-1],a(Ze,"Array"),"to_ary");for(l=0;l<p;l++){if(0===(f=m[l].length))return d||$;(y*=f)>2147483647&&$.$raise(a(Ze,"RangeError"),"too big to product"),h[l]=f,_[l]=0}e:for(;;){for(c=[],l=0;l<p;l++)c.push(m[l][_[l]]);for(d?d.push(c):e.yield1(s,c),_[u=p-1]++;_[u]===h[u];){if(_[u]=0,--u<0)break e;_[u]++}}return d||$},me.$$arity=-1),e.def(Je,"$push",ye=function(t){for(var n,r=this,i=0,o=(n=e.slice.call(arguments,0,arguments.length)).length;i<o;i++)r.push(n[i]);return r},ye.$$arity=-1),e.alias(Je,"append","push"),e.def(Je,"$rassoc",ge=function(e){for(var t,n=0,r=this.length;n<r;n++)if((t=this[n]).length&&void 0!==t[1]&&t[1]["$=="](e))return t;return i},ge.$$arity=1),e.def(Je,"$reject",ve=function(){var e,t=ve.$$p,n=t||i,r=this;if(t&&(ve.$$p=null),t&&(ve.$$p=null),n===i)return u(r,"enum_for",["reject"],((e=function(){return(e.$$s||this).$size()}).$$s=r,e.$$arity=0,e));for(var o,a=[],s=0,$=r.length;s<$;s++)!1!==(o=n(r[s]))&&o!==i||a.push(r[s]);return a},ve.$$arity=0),e.def(Je,"$reject!",be=function(){var e,t,n=be.$$p,r=n||i,o=this;return n&&(be.$$p=null),n&&(be.$$p=null),r===i?u(o,"enum_for",["reject!"],((e=function(){return(e.$$s||this).$size()}).$$s=o,e.$$arity=0,e)):(t=o.$length(),u(o,"delete_if",[],r.$to_proc()),o.$length()["$=="](t)?i:o)},be.$$arity=0),e.def(Je,"$replace",we=function(e){var t=this;return e=$(a(Ze,"Array")["$==="](e))?e.$to_a():a(Ze,"Opal").$coerce_to(e,a(Ze,"Array"),"to_ary").$to_a(),t.splice(0,t.length),t.push.apply(t,e),t},we.$$arity=1),e.def(Je,"$reverse",xe=function(){return this.slice(0).reverse()},xe.$$arity=0),e.def(Je,"$reverse!",ke=function(){return this.reverse()},ke.$$arity=0),e.def(Je,"$reverse_each",Ee=function(){var e,t=Ee.$$p,n=t||i,r=this;return t&&(Ee.$$p=null),t&&(Ee.$$p=null),n===i?u(r,"enum_for",["reverse_each"],((e=function(){return(e.$$s||this).$size()}).$$s=r,e.$$arity=0,e)):(u(r.$reverse(),"each",[],n.$to_proc()),r)},Ee.$$arity=0),e.def(Je,"$rindex",Oe=function(e){var t,n,r=Oe.$$p,o=r||i,a=this;if(r&&(Oe.$$p=null),r&&(Oe.$$p=null),null!=e&&o!==i&&a.$warn("warning: given block not used"),null!=e){for(t=a.length-1;t>=0&&!(t>=a.length);t--)if(a[t]["$=="](e))return t}else if(o!==i){for(t=a.length-1;t>=0&&!(t>=a.length);t--)if(!1!==(n=o(a[t]))&&n!==i)return t}else if(null==e)return a.$enum_for("rindex");return i},Oe.$$arity=-1),e.def(Je,"$rotate",Ae=function(e){var t,n,r,i,o=this;return null==e&&(e=1),e=a(Ze,"Opal").$coerce_to(e,a(Ze,"Integer"),"to_int"),1===o.length?o.slice():0===o.length?[]:(n=e%(t=o.slice()).length,r=t.slice(n),i=t.slice(0,n),r.concat(i))},Ae.$$arity=-1),e.def(Je,"$rotate!",Se=function(e){var t,n=this;return null==e&&(e=1),0===n.length||1===n.length?n:(e=a(Ze,"Opal").$coerce_to(e,a(Ze,"Integer"),"to_int"),t=n.$rotate(e),n.$replace(t))},Se.$$arity=-1),function(t,n,r){var o,l,u=s(t,null,"SampleRandom"),c=[u].concat(r);u.$$prototype.rng=i,e.def(u,"$initialize",o=function(e){return this.rng=e},o.$$arity=1),e.def(u,"$rand",l=function(e){var t,n=this;return t=a(c,"Opal").$coerce_to(n.rng.$rand(e),a(c,"Integer"),"to_int"),$(t<0)&&n.$raise(a(c,"RangeError"),"random value must be >= 0"),$(t<e)||n.$raise(a(c,"RangeError"),"random value must be less than Array size"),t},l.$$arity=1)}(Ze[0],0,Ze),e.def(Je,"$sample",Ce=function(e,t){var n,r,o,s,l,u,c,f,d,p=this,_=i,h=i;if($(void 0===e))return p.$at(a(Ze,"Kernel").$rand(p.length));if($(void 0===t)?$(_=a(Ze,"Opal")["$coerce_to?"](e,a(Ze,"Hash"),"to_hash"))?(t=_,e=i):(t=i,e=a(Ze,"Opal").$coerce_to(e,a(Ze,"Integer"),"to_int")):(e=a(Ze,"Opal").$coerce_to(e,a(Ze,"Integer"),"to_int"),t=a(Ze,"Opal").$coerce_to(t,a(Ze,"Hash"),"to_hash")),$($(n=e)?e<0:n)&&p.$raise(a(Ze,"ArgumentError"),"count must be greater than 0"),$(t)&&(h=t["$[]"]("random")),h=$($(n=h)?h["$respond_to?"]("rand"):n)?a(Ze,"SampleRandom").$new(h):a(Ze,"Kernel"),!$(e))return p[h.$rand(p.length)];switch(e>p.length&&(e=p.length),e){case 0:return[];case 1:return[p[h.$rand(p.length)]];case 2:return(l=h.$rand(p.length))===(u=h.$rand(p.length))&&(u=0===l?l+1:l-1),[p[l],p[u]];default:if(p.length/e>3){for(r=!1,o=0,l=1,(s=a(Ze,"Array").$new(e))[0]=h.$rand(p.length);l<e;){for(c=h.$rand(p.length),u=0;u<l;){for(;c===s[u];){if(++o>100){r=!0;break}c=h.$rand(p.length)}if(r)break;u++}if(r)break;s[l]=c,l++}if(!r){for(l=0;l<e;)s[l]=p[s[l]],l++;return s}}s=p.slice();for(var m=0;m<e;m++)f=h.$rand(p.length),d=s[m],s[m]=s[f],s[f]=d;return e===p.length?s:s["$[]"](0,e)}},Ce.$$arity=-1),e.def(Je,"$select",Re=function(){var t,n=Re.$$p,r=n||i,o=this;if(n&&(Re.$$p=null),n&&(Re.$$p=null),r===i)return u(o,"enum_for",["select"],((t=function(){return(t.$$s||this).$size()}).$$s=o,t.$$arity=0,t));for(var a,s,$=[],l=0,c=o.length;l<c;l++)a=o[l],s=e.yield1(r,a),e.truthy(s)&&$.push(a);return $},Re.$$arity=0),e.def(Je,"$select!",Te=function(){var e,t=Te.$$p,n=t||i,r=this;if(t&&(Te.$$p=null),t&&(Te.$$p=null),n===i)return u(r,"enum_for",["select!"],((e=function(){return(e.$$s||this).$size()}).$$s=r,e.$$arity=0,e));var o=r.length;return u(r,"keep_if",[],n.$to_proc()),r.length===o?i:r},Te.$$arity=0),e.def(Je,"$shift",Ie=function(e){var t=this;return $(void 0===e)?$(0===t.length)?i:function(e){for(var t=e[0],n=1,r=e.length;n<r;n++)e[n-1]=e[n];return e.pop(),t}(t):(e=a(Ze,"Opal").$coerce_to(e,a(Ze,"Integer"),"to_int"),$(e<0)&&t.$raise(a(Ze,"ArgumentError"),"negative array size"),$(0===t.length)?[]:t.splice(0,e))},Ie.$$arity=-1),e.alias(Je,"size","length"),e.def(Je,"$shuffle",Ne=function(e){return this.$dup().$to_a()["$shuffle!"](e)},Ne.$$arity=-1),e.def(Je,"$shuffle!",Le=function(e){var t,n,r,o=this,s=o.length;for(void 0!==e&&(e=a(Ze,"Opal")["$coerce_to?"](e,a(Ze,"Hash"),"to_hash"))!==i&&(e=e["$[]"]("random"))!==i&&e["$respond_to?"]("rand")&&(t=e);s;)t?((n=t.$rand(s).$to_int())<0&&o.$raise(a(Ze,"RangeError"),"random number too small "+n),n>=s&&o.$raise(a(Ze,"RangeError"),"random number too big "+n)):n=o.$rand(s),r=o[--s],o[s]=o[n],o[n]=r;return o},Le.$$arity=-1),e.alias(Je,"slice","[]"),e.def(Je,"$slice!",De=function(e,t){var n=this,r=i,o=i,s=i,l=i,u=i;if(r=i,$(void 0===t))if($(a(Ze,"Range")["$==="](e))){o=e,r=n["$[]"](o),s=a(Ze,"Opal").$coerce_to(o.$begin(),a(Ze,"Integer"),"to_int"),l=a(Ze,"Opal").$coerce_to(o.$end(),a(Ze,"Integer"),"to_int"),s<0&&(s+=n.length),l<0?l+=n.length:l>=n.length&&(l=n.length-1,o.excl&&(l+=1));var c=l-s;o.excl?l-=1:c+=1,s<n.length&&s>=0&&l<n.length&&l>=0&&c>0&&n.splice(s,c)}else{if((u=a(Ze,"Opal").$coerce_to(e,a(Ze,"Integer"),"to_int"))<0&&(u+=n.length),u<0||u>=n.length)return i;r=n[u],0===u?n.shift():n.splice(u,1)}else{if(u=a(Ze,"Opal").$coerce_to(e,a(Ze,"Integer"),"to_int"),(t=a(Ze,"Opal").$coerce_to(t,a(Ze,"Integer"),"to_int"))<0)return i;r=n["$[]"](u,t),u<0&&(u+=n.length),u+t>n.length&&(t=n.length-u),u<n.length&&u>=0&&n.splice(u,t)}return r},De.$$arity=-2),e.def(Je,"$sort",Pe=function(){var e=Pe.$$p,n=e||i,r=this;return e&&(Pe.$$p=null),e&&(Pe.$$p=null),$(r.length>1)?(n===i&&(n=function(e,t){return e["$<=>"](t)}),r.slice().sort((function(e,o){var s,$,l=n(e,o);return l===i&&r.$raise(a(Ze,"ArgumentError"),"comparison of "+e.$inspect()+" with "+o.$inspect()+" failed"),t(l,0)?1:($=0,("number"===typeof(s=l)&&"number"===typeof $?s<$:s["$<"]($))?-1:0)}))):r},Pe.$$arity=0),e.def(Je,"$sort!",Me=function(){var e,t=Me.$$p,n=t||i,r=this;t&&(Me.$$p=null),t&&(Me.$$p=null),e=n!==i?u(r.slice(),"sort",[],n.$to_proc()):r.slice().$sort(),r.length=0;for(var o=0,a=e.length;o<a;o++)r.push(e[o]);return r},Me.$$arity=0),e.def(Je,"$sort_by!",ze=function(){var e,t=ze.$$p,n=t||i,r=this;return t&&(ze.$$p=null),t&&(ze.$$p=null),n===i?u(r,"enum_for",["sort_by!"],((e=function(){return(e.$$s||this).$size()}).$$s=r,e.$$arity=0,e)):r.$replace(u(r,"sort_by",[],n.$to_proc()))},ze.$$arity=0),e.def(Je,"$take",Fe=function(e){return e<0&&this.$raise(a(Ze,"ArgumentError")),this.slice(0,e)},Fe.$$arity=1),e.def(Je,"$take_while",je=function(){var e=je.$$p,t=e||i;e&&(je.$$p=null),e&&(je.$$p=null);for(var n,r,o=[],a=0,s=this.length;a<s;a++){if(!1===(r=t(n=this[a]))||r===i)return o;o.push(n)}return o},je.$$arity=0),e.def(Je,"$to_a",Be=function(){return this},Be.$$arity=0),e.alias(Je,"to_ary","to_a"),e.def(Je,"$to_h",qe=function(){var t,n,r,i,o=this,s=o.length,$=l([],{});for(t=0;t<s;t++)(n=a(Ze,"Opal")["$coerce_to?"](o[t],a(Ze,"Array"),"to_ary")).$$is_array||o.$raise(a(Ze,"TypeError"),"wrong element type "+n.$class()+" at "+t+" (expected array)"),2!==n.length&&o.$raise(a(Ze,"ArgumentError"),"wrong array length at "+t+" (expected 2, was "+n.$length()+")"),r=n[0],i=n[1],e.hash_put($,r,i);return $},qe.$$arity=0),e.alias(Je,"to_s","inspect"),e.def(Je,"$transpose",Ue=function(){var t,n=this,r=i,o=i;return $(n["$empty?"]())?[]:(r=[],o=i,u(n,"each",[],(t=function(n){var s,l,c=t.$$s||this;return null==n&&(n=i),n=$(a(Ze,"Array")["$==="](n))?n.$to_a():a(Ze,"Opal").$coerce_to(n,a(Ze,"Array"),"to_ary").$to_a(),o=$(s=o)?s:n.length,$(n.length["$!="](o))&&c.$raise(a(Ze,"IndexError"),"element size differs ("+n.length+" should be "+o+")"),u(n.length,"times",[],((l=function(t){l.$$s;var o,a,s,c=i;return null==t&&(t=i),($(o=r["$[]"](t))?o:(c=[t,[]],u(r,"[]=",e.to_a(c)),c[(a=c.length,s=1,"number"===typeof a&&"number"===typeof s?a-s:a["$-"](s))]))["$<<"](n.$at(t))}).$$s=c,l.$$arity=1,l))},t.$$s=n,t.$$arity=1,t)),r)},Ue.$$arity=0),e.def(Je,"$uniq",He=function(){var t=He.$$p,n=t||i,r=this;t&&(He.$$p=null),t&&(He.$$p=null);var o,a,s,$,u=l([],{});if(n===i)for(o=0,a=r.length;o<a;o++)s=r[o],void 0===e.hash_get(u,s)&&e.hash_put(u,s,s);else for(o=0,a=r.length;o<a;o++)s=r[o],$=e.yield1(n,s),void 0===e.hash_get(u,$)&&e.hash_put(u,$,s);return et(u.$values(),r.$class())},He.$$arity=0),e.def(Je,"$uniq!",Ye=function(){var t=Ye.$$p,n=t||i,r=this;t&&(Ye.$$p=null),t&&(Ye.$$p=null);var o,a,s,$,u=r.length,c=l([],{});for(o=0,a=u;o<a;o++)s=r[o],$=n===i?s:e.yield1(n,s),void 0!==e.hash_get(c,$)?(r.splice(o,1),a--,o--):e.hash_put(c,$,s);return r.length===u?i:r},Ye.$$arity=0),e.def(Je,"$unshift",We=function(t){for(var n,r=this,i=(n=e.slice.call(arguments,0,arguments.length)).length-1;i>=0;i--)r.unshift(n[i]);return r},We.$$arity=-1),e.alias(Je,"prepend","unshift"),e.def(Je,"$values_at",Ve=function(t){var n,r,o=this,s=i;return n=e.slice.call(arguments,0,arguments.length),s=[],u(n,"each",[],(r=function(e){var t,n=r.$$s||this,o=i,l=i,c=i;return null==e&&(e=i),$(e["$is_a?"](a(Ze,"Range")))?(o=a(Ze,"Opal").$coerce_to(e.$last(),a(Ze,"Integer"),"to_int"),(l=a(Ze,"Opal").$coerce_to(e.$first(),a(Ze,"Integer"),"to_int"))<0?(l+=n.length,i):(o<0&&(o+=n.length),e["$exclude_end?"]()&&o--,o<l?i:u(l,"upto",[o],(t=function(e){var n=t.$$s||this;return null==e&&(e=i),s["$<<"](n.$at(e))},t.$$s=n,t.$$arity=1,t)))):(c=a(Ze,"Opal").$coerce_to(e,a(Ze,"Integer"),"to_int"),s["$<<"](n.$at(c)))},r.$$s=o,r.$$arity=1,r)),s},Ve.$$arity=-1),e.def(Je,"$zip",Ke=function(t){var n,r,o=Ke.$$p,s=o||i,l=this;o&&(Ke.$$p=null),o&&(Ke.$$p=null),n=e.slice.call(arguments,0,arguments.length);var u,c,f,d,p,_=[],h=l.length;for(d=0,p=n.length;d<p;d++)(c=n[d]).$$is_array||(c.$$is_enumerator?c.$size()===1/0?n[d]=c.$take(h):n[d]=c.$to_a():n[d]=($(r=a(Ze,"Opal")["$coerce_to?"](c,a(Ze,"Array"),"to_ary"))?r:a(Ze,"Opal")["$coerce_to!"](c,a(Ze,"Enumerator"),"each")).$to_a());for(f=0;f<h;f++){for(u=[l[f]],d=0,p=n.length;d<p;d++)null==(c=n[d][f])&&(c=i),u[d+1]=c;_[f]=u}if(s!==i){for(f=0;f<h;f++)s(_[f]);return i}return _},Ke.$$arity=-1),e.defs(Je,"$inherited",Ge=function(e){e.$$prototype.$to_a=function(){return this.slice(0,this.length)}},Ge.$$arity=1),e.def(Je,"$instance_variables",Xe=function(){var t,n=Xe.$$p,r=this,o=i,a=i,s=i;for(n&&(Xe.$$p=null),a=0,s=arguments.length,o=new Array(s);a<s;a++)o[a]=arguments[a];return u(u(r,e.find_super_dispatcher(r,"instance_variables",Xe,!1),o,n),"reject",[],((t=function(e){var n;t.$$s;return null==e&&(e=i),$(n=/^@\d+$/.test(e))?n:e["$=="]("@length")}).$$s=r,t.$$arity=1,t))},Xe.$$arity=0),a(Ze,"Opal").$pristine(Je.$singleton_class(),"allocate"),a(Ze,"Opal").$pristine(Je,"copy_instance_variables","initialize_dup"),e.def(Je,"$pack",Qe=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise("To use Array#pack, you must first require 'corelib/array/pack'.")},Qe.$$arity=-1),i&&"pack"}(r[0],0,r)},Opal.modules["corelib/hash"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e>=t:e["$>="](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}var r=e.top,i=[],o=e.nil,a=(e.const_get_qualified,e.const_get_relative),s=(e.breaker,e.slice,e.klass),$=e.send,l=e.hash2,u=e.truthy;return e.add_stubs(["$require","$include","$coerce_to?","$[]","$merge!","$allocate","$raise","$coerce_to!","$each","$fetch","$>=","$>","$==","$compare_by_identity","$lambda?","$abs","$arity","$enum_for","$size","$respond_to?","$class","$dig","$new","$inspect","$map","$to_proc","$flatten","$eql?","$default","$dup","$default_proc","$default_proc=","$-","$default=","$proc"]),r.$require("corelib/enumerable"),function(r,i,c){var f,d,p,_,h,m,y,g,v,b,w,x,k,E,O,A,S,C,R,T,I,N,L,D,P,M,z,F,j,B,q,U,H,Y,W,V,K,G,X,Q,J,Z,ee,te,ne,re,ie,oe,ae,se,$e,le,ue,ce,fe,de,pe,_e,he,me,ye,ge,ve,be=s(r,null,"Hash"),we=[be].concat(c);return be.$include(a(we,"Enumerable")),be.$$prototype.$$is_hash=!0,e.defs(be,"$[]",f=function(t){var n,r,i,s=this,$=(n=e.slice.call(arguments,0,arguments.length)).length;if(1===$){if((r=a(we,"Opal")["$coerce_to?"](n["$[]"](0),a(we,"Hash"),"to_hash"))!==o)return s.$allocate()["$merge!"](r);for((n=a(we,"Opal")["$coerce_to?"](n["$[]"](0),a(we,"Array"),"to_ary"))===o&&s.$raise(a(we,"ArgumentError"),"odd number of arguments for Hash"),$=n.length,r=s.$allocate(),i=0;i<$;i++)if(n[i].$$is_array)switch(n[i].length){case 1:r.$store(n[i][0],o);break;case 2:r.$store(n[i][0],n[i][1]);break;default:s.$raise(a(we,"ArgumentError"),"invalid number of elements ("+n[i].length+" for 1..2)")}return r}for($%2!==0&&s.$raise(a(we,"ArgumentError"),"odd number of arguments for Hash"),r=s.$allocate(),i=0;i<$;i+=2)r.$store(n[i],n[i+1]);return r},f.$$arity=-1),e.defs(be,"$allocate",d=function(){var t=new this.$$constructor;return e.hash_init(t),t.$$none=o,t.$$proc=o,t},d.$$arity=0),e.defs(be,"$try_convert",p=function(e){return a(we,"Opal")["$coerce_to?"](e,a(we,"Hash"),"to_hash")},p.$$arity=1),e.def(be,"$initialize",_=function(e){var t=_.$$p,n=t||o,r=this;return t&&(_.$$p=null),t&&(_.$$p=null),void 0!==e&&n!==o&&r.$raise(a(we,"ArgumentError"),"wrong number of arguments (1 for 0)"),r.$$none=void 0===e?o:e,r.$$proc=n,r},_.$$arity=-1),e.def(be,"$==",h=function(t){var n=this;if(n===t)return!0;if(!t.$$is_hash)return!1;if(n.$$keys.length!==t.$$keys.length)return!1;for(var r,i,o,a=0,s=n.$$keys,$=s.length;a<$;a++)if((r=s[a]).$$is_string?(i=n.$$smap[r],o=t.$$smap[r]):(i=r.value,o=e.hash_get(t,r.key)),void 0===o||!i["$eql?"](o))return!1;return!0},h.$$arity=1),e.def(be,"$>=",m=function(e){var t,n=o;return e=a(we,"Opal")["$coerce_to!"](e,a(we,"Hash"),"to_hash"),!(this.$$keys.length<e.$$keys.length)&&(n=!0,$(e,"each",[],(t=function(e,r){var i,a=t.$$s||this;null==e&&(e=o),null==r&&(r=o),null!=(i=a.$fetch(e,null))&&i===r||(n=!1)},t.$$s=this,t.$$arity=2,t)),n)},m.$$arity=1),e.def(be,"$>",y=function(e){return e=a(we,"Opal")["$coerce_to!"](e,a(we,"Hash"),"to_hash"),!(this.$$keys.length<=e.$$keys.length)&&t(this,e)},y.$$arity=1),e.def(be,"$<",g=function(e){var t,n;return e=a(we,"Opal")["$coerce_to!"](e,a(we,"Hash"),"to_hash"),n=this,"number"===typeof(t=e)&&"number"===typeof n?t>n:t["$>"](n)},g.$$arity=1),e.def(be,"$<=",v=function(e){return t(e=a(we,"Opal")["$coerce_to!"](e,a(we,"Hash"),"to_hash"),this)},v.$$arity=1),e.def(be,"$[]",b=function(t){var n=e.hash_get(this,t);return void 0!==n?n:this.$default(t)},b.$$arity=1),e.def(be,"$[]=",w=function(t,n){return e.hash_put(this,t,n),n},w.$$arity=2),e.def(be,"$assoc",x=function(e){for(var t,n=0,r=this.$$keys,i=r.length;n<i;n++)if((t=r[n]).$$is_string){if(t["$=="](e))return[t,this.$$smap[t]]}else if(t.key["$=="](e))return[t.key,t.value];return o},x.$$arity=1),e.def(be,"$clear",k=function(){return e.hash_init(this),this},k.$$arity=0),e.def(be,"$clone",E=function(){var t=new this.$$class;return e.hash_init(t),e.hash_clone(this,t),t},E.$$arity=0),e.def(be,"$compact",O=function(){for(var t,n,r=e.hash(),i=0,a=this.$$keys,s=a.length;i<s;i++)(t=a[i]).$$is_string?n=this.$$smap[t]:(n=t.value,t=t.key),n!==o&&e.hash_put(r,t,n);return r},O.$$arity=0),e.def(be,"$compact!",A=function(){for(var t,n,r=this,i=!1,a=0,s=r.$$keys,$=s.length;a<$;a++)(t=s[a]).$$is_string?n=r.$$smap[t]:(n=t.value,t=t.key),n===o&&void 0!==e.hash_delete(r,t)&&(i=!0,$--,a--);return i?r:o},A.$$arity=0),e.def(be,"$compare_by_identity",S=function(){var t,n,r,i,o=this,a=o.$$keys;if(o.$$by_identity)return o;if(0===o.$$keys.length)return o.$$by_identity=!0,o;for(i=l([],{}).$compare_by_identity(),t=0,n=a.length;t<n;t++)(r=a[t]).$$is_string||(r=r.key),e.hash_put(i,r,e.hash_get(o,r));return o.$$by_identity=!0,o.$$map=i.$$map,o.$$smap=i.$$smap,o},S.$$arity=0),e.def(be,"$compare_by_identity?",C=function(){return!0===this.$$by_identity},C.$$arity=0),e.def(be,"$default",R=function(e){var t=this;return void 0!==e&&t.$$proc!==o&&void 0!==t.$$proc?t.$$proc.$call(t,e):void 0===t.$$none?o:t.$$none},R.$$arity=-1),e.def(be,"$default=",T=function(e){return this.$$proc=o,this.$$none=e,e},T.$$arity=1),e.def(be,"$default_proc",I=function(){return void 0!==this.$$proc?this.$$proc:o},I.$$arity=0),e.def(be,"$default_proc=",N=function(e){var t=this,n=e;return n!==o&&(n=a(we,"Opal")["$coerce_to!"](n,a(we,"Proc"),"to_proc"))["$lambda?"]()&&2!==n.$arity().$abs()&&t.$raise(a(we,"TypeError"),"default_proc takes two arguments"),t.$$none=o,t.$$proc=n,e},N.$$arity=1),e.def(be,"$delete",L=function(t){var n=L.$$p,r=n||o;n&&(L.$$p=null),n&&(L.$$p=null);var i=e.hash_delete(this,t);return void 0!==i?i:r!==o?e.yield1(r,t):o},L.$$arity=1),e.def(be,"$delete_if",D=function(){var t,n=D.$$p,r=n||o,i=this;if(n&&(D.$$p=null),n&&(D.$$p=null),!u(r))return $(i,"enum_for",["delete_if"],((t=function(){return(t.$$s||this).$size()}).$$s=i,t.$$arity=0,t));for(var a,s,l,c=0,f=i.$$keys,d=f.length;c<d;c++)(a=f[c]).$$is_string?s=i.$$smap[a]:(s=a.value,a=a.key),!1!==(l=r(a,s))&&l!==o&&void 0!==e.hash_delete(i,a)&&(d--,c--);return i},D.$$arity=0),e.alias(be,"dup","clone"),e.def(be,"$dig",P=function(t,n){var r,i=this,s=o;return r=e.slice.call(arguments,1,arguments.length),(s=i["$[]"](t))===o||0===r.length?s:(u(s["$respond_to?"]("dig"))||i.$raise(a(we,"TypeError"),s.$class()+" does not have #dig method"),$(s,"dig",e.to_a(r)))},P.$$arity=-2),e.def(be,"$each",M=function(){var t,n=M.$$p,r=n||o,i=this;if(n&&(M.$$p=null),n&&(M.$$p=null),!u(r))return $(i,"enum_for",["each"],((t=function(){return(t.$$s||this).$size()}).$$s=i,t.$$arity=0,t));for(var a,s,l=0,c=i.$$keys,f=c.length;l<f;l++)(a=c[l]).$$is_string?s=i.$$smap[a]:(s=a.value,a=a.key),e.yield1(r,[a,s]);return i},M.$$arity=0),e.def(be,"$each_key",z=function(){var e,t=z.$$p,n=t||o,r=this;if(t&&(z.$$p=null),t&&(z.$$p=null),!u(n))return $(r,"enum_for",["each_key"],((e=function(){return(e.$$s||this).$size()}).$$s=r,e.$$arity=0,e));for(var i,a=0,s=r.$$keys,l=s.length;a<l;a++)n((i=s[a]).$$is_string?i:i.key);return r},z.$$arity=0),e.alias(be,"each_pair","each"),e.def(be,"$each_value",F=function(){var e,t=F.$$p,n=t||o,r=this;if(t&&(F.$$p=null),t&&(F.$$p=null),!u(n))return $(r,"enum_for",["each_value"],((e=function(){return(e.$$s||this).$size()}).$$s=r,e.$$arity=0,e));for(var i,a=0,s=r.$$keys,l=s.length;a<l;a++)n((i=s[a]).$$is_string?r.$$smap[i]:i.value);return r},F.$$arity=0),e.def(be,"$empty?",j=function(){return 0===this.$$keys.length},j.$$arity=0),e.alias(be,"eql?","=="),e.def(be,"$fetch",B=function(t,n){var r=B.$$p,i=r||o,s=this;r&&(B.$$p=null),r&&(B.$$p=null);var $=e.hash_get(s,t);return void 0!==$?$:i!==o?i(t):void 0!==n?n:s.$raise(a(we,"KeyError").$new("key not found: "+t.$inspect(),l(["key","receiver"],{key:t,receiver:s})))},B.$$arity=-2),e.def(be,"$fetch_values",q=function(t){var n,r,i=q.$$p,a=i||o,s=this;return i&&(q.$$p=null),i&&(q.$$p=null),n=e.slice.call(arguments,0,arguments.length),$(n,"map",[],(r=function(e){var t=r.$$s||this;return null==e&&(e=o),$(t,"fetch",[e],a.$to_proc())},r.$$s=s,r.$$arity=1,r))},q.$$arity=-1),e.def(be,"$flatten",U=function(e){null==e&&(e=1),e=a(we,"Opal")["$coerce_to!"](e,a(we,"Integer"),"to_int");for(var t,n,r=[],i=0,o=this.$$keys,s=o.length;i<s;i++)if((t=o[i]).$$is_string?n=this.$$smap[t]:(n=t.value,t=t.key),r.push(t),n.$$is_array){if(1===e){r.push(n);continue}r=r.concat(n.$flatten(e-2))}else r.push(n);return r},U.$$arity=-1),e.def(be,"$has_key?",H=function(t){return void 0!==e.hash_get(this,t)},H.$$arity=1),e.def(be,"$has_value?",Y=function(e){for(var t,n=0,r=this.$$keys,i=r.length;n<i;n++)if(((t=r[n]).$$is_string?this.$$smap[t]:t.value)["$=="](e))return!0;return!1},Y.$$arity=1),e.def(be,"$hash",W=function(){var t,n,r=this,i=void 0===e.hash_ids,o=r.$object_id(),a=["Hash"];try{if(i&&(e.hash_ids=Object.create(null)),e[o])return"self";for(t in e.hash_ids)if(n=e.hash_ids[t],r["$eql?"](n))return"self";e.hash_ids[o]=r;for(var s=0,$=r.$$keys,l=$.length;s<l;s++)(t=$[s]).$$is_string?a.push([t,r.$$smap[t].$hash()]):a.push([t.key_hash,t.value.$hash()]);return a.sort().join()}finally{i&&(e.hash_ids=void 0)}},W.$$arity=0),e.alias(be,"include?","has_key?"),e.def(be,"$index",V=function(e){for(var t,n,r=0,i=this.$$keys,a=i.length;r<a;r++)if((t=i[r]).$$is_string?n=this.$$smap[t]:(n=t.value,t=t.key),n["$=="](e))return t;return o},V.$$arity=1),e.def(be,"$indexes",K=function(t){for(var n,r,i,o=this,a=[],s=0,$=(n=e.slice.call(arguments,0,arguments.length)).length;s<$;s++)r=n[s],void 0!==(i=e.hash_get(o,r))?a.push(i):a.push(o.$default());return a},K.$$arity=-1),e.alias(be,"indices","indexes"),e.def(be,"$inspect",G=function(){var e=this,t=void 0===ve,n=e.$object_id(),r=[];try{if(t&&(ve={}),ve.hasOwnProperty(n))return"{...}";ve[n]=!0;for(var i,o,a=0,s=e.$$keys,$=s.length;a<$;a++)(i=s[a]).$$is_string?o=e.$$smap[i]:(o=i.value,i=i.key),r.push(i.$inspect()+"=>"+o.$inspect());return"{"+r.join(", ")+"}"}finally{t&&(ve=void 0)}},G.$$arity=0),e.def(be,"$invert",X=function(){for(var t,n,r=e.hash(),i=0,o=this.$$keys,a=o.length;i<a;i++)(t=o[i]).$$is_string?n=this.$$smap[t]:(n=t.value,t=t.key),e.hash_put(r,n,t);return r},X.$$arity=0),e.def(be,"$keep_if",Q=function(){var t,n=Q.$$p,r=n||o,i=this;if(n&&(Q.$$p=null),n&&(Q.$$p=null),!u(r))return $(i,"enum_for",["keep_if"],((t=function(){return(t.$$s||this).$size()}).$$s=i,t.$$arity=0,t));for(var a,s,l,c=0,f=i.$$keys,d=f.length;c<d;c++)(a=f[c]).$$is_string?s=i.$$smap[a]:(s=a.value,a=a.key),!1!==(l=r(a,s))&&l!==o||void 0!==e.hash_delete(i,a)&&(d--,c--);return i},Q.$$arity=0),e.alias(be,"key","index"),e.alias(be,"key?","has_key?"),e.def(be,"$keys",J=function(){for(var e,t=[],n=0,r=this.$$keys,i=r.length;n<i;n++)(e=r[n]).$$is_string?t.push(e):t.push(e.key);return t},J.$$arity=0),e.def(be,"$length",Z=function(){return this.$$keys.length},Z.$$arity=0),e.alias(be,"member?","has_key?"),e.def(be,"$merge",ee=function(e){var t=ee.$$p,n=t||o;return t&&(ee.$$p=null),t&&(ee.$$p=null),$(this.$dup(),"merge!",[e],n.$to_proc())},ee.$$arity=1),e.def(be,"$merge!",te=function(t){var n=te.$$p,r=n||o,i=this;n&&(te.$$p=null),n&&(te.$$p=null),t.$$is_hash||(t=a(we,"Opal")["$coerce_to!"](t,a(we,"Hash"),"to_hash"));var s,$,l,u,c=t.$$keys,f=c.length;if(r===o){for(s=0;s<f;s++)($=c[s]).$$is_string?u=t.$$smap[$]:(u=$.value,$=$.key),e.hash_put(i,$,u);return i}for(s=0;s<f;s++)($=c[s]).$$is_string?u=t.$$smap[$]:(u=$.value,$=$.key),void 0!==(l=e.hash_get(i,$))?e.hash_put(i,$,r($,l,u)):e.hash_put(i,$,u);return i},te.$$arity=1),e.def(be,"$rassoc",ne=function(e){for(var t,n,r=0,i=this.$$keys,a=i.length;r<a;r++)if((t=i[r]).$$is_string?n=this.$$smap[t]:(n=t.value,t=t.key),n["$=="](e))return[t,n];return o},ne.$$arity=1),e.def(be,"$rehash",re=function(){return e.hash_rehash(this),this},re.$$arity=0),e.def(be,"$reject",ie=function(){var t,n=ie.$$p,r=n||o,i=this;if(n&&(ie.$$p=null),n&&(ie.$$p=null),!u(r))return $(i,"enum_for",["reject"],((t=function(){return(t.$$s||this).$size()}).$$s=i,t.$$arity=0,t));for(var a,s,l,c=e.hash(),f=0,d=i.$$keys,p=d.length;f<p;f++)(a=d[f]).$$is_string?s=i.$$smap[a]:(s=a.value,a=a.key),!1!==(l=r(a,s))&&l!==o||e.hash_put(c,a,s);return c},ie.$$arity=0),e.def(be,"$reject!",oe=function(){var t,n=oe.$$p,r=n||o,i=this;if(n&&(oe.$$p=null),n&&(oe.$$p=null),!u(r))return $(i,"enum_for",["reject!"],((t=function(){return(t.$$s||this).$size()}).$$s=i,t.$$arity=0,t));for(var a,s,l,c=!1,f=0,d=i.$$keys,p=d.length;f<p;f++)(a=d[f]).$$is_string?s=i.$$smap[a]:(s=a.value,a=a.key),!1!==(l=r(a,s))&&l!==o&&void 0!==e.hash_delete(i,a)&&(c=!0,p--,f--);return c?i:o},oe.$$arity=0),e.def(be,"$replace",ae=function(t){var r=this,i=o;t=a(we,"Opal")["$coerce_to!"](t,a(we,"Hash"),"to_hash"),e.hash_init(r);for(var s,l,c=0,f=t.$$keys,d=f.length;c<d;c++)(s=f[c]).$$is_string?l=t.$$smap[s]:(l=s.value,s=s.key),e.hash_put(r,s,l);return u(t.$default_proc())?(i=[t.$default_proc()],$(r,"default_proc=",e.to_a(i)),i[n(i.length,1)]):(i=[t.$default()],$(r,"default=",e.to_a(i)),i[n(i.length,1)]),r},ae.$$arity=1),e.def(be,"$select",se=function(){var t,n=se.$$p,r=n||o,i=this;if(n&&(se.$$p=null),n&&(se.$$p=null),!u(r))return $(i,"enum_for",["select"],((t=function(){return(t.$$s||this).$size()}).$$s=i,t.$$arity=0,t));for(var a,s,l,c=e.hash(),f=0,d=i.$$keys,p=d.length;f<p;f++)(a=d[f]).$$is_string?s=i.$$smap[a]:(s=a.value,a=a.key),!1!==(l=r(a,s))&&l!==o&&e.hash_put(c,a,s);return c},se.$$arity=0),e.def(be,"$select!",$e=function(){var t,n=$e.$$p,r=n||o,i=this;if(n&&($e.$$p=null),n&&($e.$$p=null),!u(r))return $(i,"enum_for",["select!"],((t=function(){return(t.$$s||this).$size()}).$$s=i,t.$$arity=0,t));for(var a,s,l,c=o,f=0,d=i.$$keys,p=d.length;f<p;f++)(a=d[f]).$$is_string?s=i.$$smap[a]:(s=a.value,a=a.key),!1!==(l=r(a,s))&&l!==o||(void 0!==e.hash_delete(i,a)&&(p--,f--),c=i);return c},$e.$$arity=0),e.def(be,"$shift",le=function(){var t,n=this,r=n.$$keys;return r.length>0?[t=(t=r[0]).$$is_string?t:t.key,e.hash_delete(n,t)]:n.$default(o)},le.$$arity=0),e.alias(be,"size","length"),e.def(be,"$slice",ue=function(t){var n,r=this;n=e.slice.call(arguments,0,arguments.length);for(var i=e.hash(),o=0,a=n.length;o<a;o++){var s=n[o],$=e.hash_get(r,s);void 0!==$&&e.hash_put(i,s,$)}return i},ue.$$arity=-1),e.alias(be,"store","[]="),e.def(be,"$to_a",ce=function(){for(var e,t,n=[],r=0,i=this.$$keys,o=i.length;r<o;r++)(e=i[r]).$$is_string?t=this.$$smap[e]:(t=e.value,e=e.key),n.push([e,t]);return n},ce.$$arity=0),e.def(be,"$to_h",fe=function(){var t=this;if(t.$$class===e.Hash)return t;var n=new e.Hash;return e.hash_init(n),e.hash_clone(t,n),n},fe.$$arity=0),e.def(be,"$to_hash",de=function(){return this},de.$$arity=0),e.def(be,"$to_proc",pe=function(){var e;return $(this,"proc",[],(e=function(t){var n=e.$$s||this;return null==t&&n.$raise(a(we,"ArgumentError"),"no key given"),n["$[]"](t)},e.$$s=this,e.$$arity=-1,e))},pe.$$arity=0),e.alias(be,"to_s","inspect"),e.def(be,"$transform_keys",_e=function(){var t,n=_e.$$p,r=n||o,i=this;if(n&&(_e.$$p=null),n&&(_e.$$p=null),!u(r))return $(i,"enum_for",["transform_keys"],((t=function(){return(t.$$s||this).$size()}).$$s=i,t.$$arity=0,t));for(var a,s,l=e.hash(),c=0,f=i.$$keys,d=f.length;c<d;c++)(a=f[c]).$$is_string?s=i.$$smap[a]:(s=a.value,a=a.key),a=e.yield1(r,a),e.hash_put(l,a,s);return l},_e.$$arity=0),e.def(be,"$transform_keys!",he=function(){var t,n=he.$$p,r=n||o,i=this;if(n&&(he.$$p=null),n&&(he.$$p=null),!u(r))return $(i,"enum_for",["transform_keys!"],((t=function(){return(t.$$s||this).$size()}).$$s=i,t.$$arity=0,t));var a,s,l,c,f=e.slice.call(i.$$keys),d=f.length;for(a=0;a<d;a++)(s=f[a]).$$is_string?l=i.$$smap[s]:(l=s.value,s=s.key),c=e.yield1(r,s),e.hash_delete(i,s),e.hash_put(i,c,l);return i},he.$$arity=0),e.def(be,"$transform_values",me=function(){var t,n=me.$$p,r=n||o,i=this;if(n&&(me.$$p=null),n&&(me.$$p=null),!u(r))return $(i,"enum_for",["transform_values"],((t=function(){return(t.$$s||this).$size()}).$$s=i,t.$$arity=0,t));for(var a,s,l=e.hash(),c=0,f=i.$$keys,d=f.length;c<d;c++)(a=f[c]).$$is_string?s=i.$$smap[a]:(s=a.value,a=a.key),s=e.yield1(r,s),e.hash_put(l,a,s);return l},me.$$arity=0),e.def(be,"$transform_values!",ye=function(){var t,n=ye.$$p,r=n||o,i=this;if(n&&(ye.$$p=null),n&&(ye.$$p=null),!u(r))return $(i,"enum_for",["transform_values!"],((t=function(){return(t.$$s||this).$size()}).$$s=i,t.$$arity=0,t));for(var a,s,l=0,c=i.$$keys,f=c.length;l<f;l++)(a=c[l]).$$is_string?s=i.$$smap[a]:(s=a.value,a=a.key),s=e.yield1(r,s),e.hash_put(i,a,s);return i},ye.$$arity=0),e.alias(be,"update","merge!"),e.alias(be,"value?","has_value?"),e.alias(be,"values_at","indexes"),e.def(be,"$values",ge=function(){for(var e,t=[],n=0,r=this.$$keys,i=r.length;n<i;n++)(e=r[n]).$$is_string?t.push(this.$$smap[e]):t.push(e.value);return t},ge.$$arity=0),o&&"values"}(i[0],0,i)},Opal.modules["corelib/number"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e>t:e["$>"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e<t:e["$<"](t)}function r(e,t){return"number"===typeof e&&"number"===typeof t?e+t:e["$+"](t)}function i(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}function o(e,t){return"number"===typeof e&&"number"===typeof t?e/t:e["$/"](t)}function a(e,t){return"number"===typeof e&&"number"===typeof t?e*t:e["$*"](t)}var s=e.top,$=[],l=e.nil,u=e.const_get_qualified,c=e.const_get_relative,f=(e.breaker,e.slice,e.klass),d=e.truthy,p=e.send,_=e.hash2;return e.add_stubs(["$require","$bridge","$raise","$name","$class","$Float","$respond_to?","$coerce_to!","$__coerced__","$===","$!","$>","$**","$new","$<","$to_f","$==","$nan?","$infinite?","$enum_for","$+","$-","$gcd","$lcm","$%","$/","$frexp","$to_i","$ldexp","$rationalize","$*","$<<","$to_r","$truncate","$-@","$size","$<=","$>=","$<=>","$compare","$any?"]),s.$require("corelib/numeric"),function(s,$,h){var m,y,g,v,b,w,x,k,E,O,A,S,C,R,T,I,N,L,D,P,M,z,F,j,B,q,U,H,Y,W,V,K,G,X,Q,J,Z,ee,te,ne,re,ie,oe,ae,se,$e,le,ue,ce,fe,de,pe,_e,he,me,ye,ge,ve,be,we,xe,ke,Ee,Oe,Ae,Se,Ce,Re,Te,Ie,Ne,Le,De=f(s,$,"Number"),Pe=[De].concat(h);c(Pe,"Opal").$bridge(Number,De),e.defineProperty(De.$$prototype,"$$is_number",!0),De.$$is_number_class=!0,function(t,n){var r,i=[t].concat(n);e.def(t,"$allocate",r=function(){return this.$raise(c(i,"TypeError"),"allocator undefined for "+this.$name())},r.$$arity=0),e.udef(t,"$new")}(e.get_singleton_class(De),Pe),e.def(De,"$coerce",m=function(e){var t=this;if(e===l)t.$raise(c(Pe,"TypeError"),"can't convert "+e.$class()+" into Float");else{if(e.$$is_string)return[t.$Float(e),t];if(e["$respond_to?"]("to_f"))return[c(Pe,"Opal")["$coerce_to!"](e,c(Pe,"Float"),"to_f"),t];if(e.$$is_number)return[e,t];t.$raise(c(Pe,"TypeError"),"can't convert "+e.$class()+" into Float")}},m.$$arity=1),e.def(De,"$__id__",y=function(){return 2*this+1},y.$$arity=0),e.alias(De,"object_id","__id__"),e.def(De,"$+",g=function(e){return e.$$is_number?this+e:this.$__coerced__("+",e)},g.$$arity=1),e.def(De,"$-",v=function(e){return e.$$is_number?this-e:this.$__coerced__("-",e)},v.$$arity=1),e.def(De,"$*",b=function(e){return e.$$is_number?this*e:this.$__coerced__("*",e)},b.$$arity=1),e.def(De,"$/",w=function(e){return e.$$is_number?this/e:this.$__coerced__("/",e)},w.$$arity=1),e.alias(De,"fdiv","/"),e.def(De,"$%",x=function(e){var t=this;return e.$$is_number?e==-1/0?e:0!=e?e<0||t<0?(t%e+e)%e:t%e:void t.$raise(c(Pe,"ZeroDivisionError"),"divided by 0"):t.$__coerced__("%",e)},x.$$arity=1),e.def(De,"$&",k=function(e){return e.$$is_number?this&e:this.$__coerced__("&",e)},k.$$arity=1),e.def(De,"$|",E=function(e){return e.$$is_number?this|e:this.$__coerced__("|",e)},E.$$arity=1),e.def(De,"$^",O=function(e){return e.$$is_number?this^e:this.$__coerced__("^",e)},O.$$arity=1),e.def(De,"$<",A=function(e){return e.$$is_number?this<e:this.$__coerced__("<",e)},A.$$arity=1),e.def(De,"$<=",S=function(e){return e.$$is_number?this<=e:this.$__coerced__("<=",e)},S.$$arity=1),e.def(De,"$>",C=function(e){return e.$$is_number?this>e:this.$__coerced__(">",e)},C.$$arity=1),e.def(De,"$>=",R=function(e){return e.$$is_number?this>=e:this.$__coerced__(">=",e)},R.$$arity=1);e.def(De,"$<=>",T=function(t){try{return function(e,t){return t.$$is_number?isNaN(e)||isNaN(t)?l:e>t?1:e<t?-1:0:e.$__coerced__("<=>",t)}(this,t)}catch(n){if(!e.rescue(n,[c(Pe,"ArgumentError")]))throw n;try{return l}finally{e.pop_exception()}}},T.$$arity=1),e.def(De,"$<<",I=function(e){return(e=c(Pe,"Opal")["$coerce_to!"](e,c(Pe,"Integer"),"to_int"))>0?this<<e:this>>-e},I.$$arity=1),e.def(De,"$>>",N=function(e){return(e=c(Pe,"Opal")["$coerce_to!"](e,c(Pe,"Integer"),"to_int"))>0?this>>e:this<<-e},N.$$arity=1),e.def(De,"$[]",L=function(e){return(e=c(Pe,"Opal")["$coerce_to!"](e,c(Pe,"Integer"),"to_int"))<0?0:e>=32?this<0?1:0:this>>e&1},L.$$arity=1),e.def(De,"$+@",D=function(){return+this},D.$$arity=0),e.def(De,"$-@",P=function(){return-this},P.$$arity=0),e.def(De,"$~",M=function(){return~this},M.$$arity=0),e.def(De,"$**",z=function(e){var r,i,o=this;return d(c(Pe,"Integer")["$==="](e))?d(d(r=c(Pe,"Integer")["$==="](o)["$!"]())?r:t(e,0))?Math.pow(o,e):c(Pe,"Rational").$new(o,1)["$**"](e):d((r=n(o,0))?d(i=c(Pe,"Float")["$==="](e))?i:c(Pe,"Rational")["$==="](e):n(o,0))?c(Pe,"Complex").$new(o,0)["$**"](e.$to_f()):d(null!=e.$$is_number)?Math.pow(o,e):o.$__coerced__("**",e)},z.$$arity=1),e.def(De,"$===",F=function(e){return e.$$is_number?this.valueOf()===e.valueOf():!!e["$respond_to?"]("==")&&e["$=="](this)},F.$$arity=1),e.def(De,"$==",j=function(e){return e.$$is_number?this.valueOf()===e.valueOf():!!e["$respond_to?"]("==")&&e["$=="](this)},j.$$arity=1),e.def(De,"$abs",B=function(){return Math.abs(this)},B.$$arity=0),e.def(De,"$abs2",q=function(){return Math.abs(this*this)},q.$$arity=0),e.def(De,"$allbits?",U=function(e){return(this&(e=c(Pe,"Opal")["$coerce_to!"](e,c(Pe,"Integer"),"to_int")))==e},U.$$arity=1),e.def(De,"$anybits?",H=function(e){return 0!==(this&(e=c(Pe,"Opal")["$coerce_to!"](e,c(Pe,"Integer"),"to_int")))},H.$$arity=1),e.def(De,"$angle",Y=function(){var e=this;return d(e["$nan?"]())?e:0==e?1/e>0?0:Math.PI:e<0?Math.PI:0},Y.$$arity=0),e.alias(De,"arg","angle"),e.alias(De,"phase","angle"),e.def(De,"$bit_length",W=function(){var e=this;if(d(c(Pe,"Integer")["$==="](e))||e.$raise(c(Pe,"NoMethodError").$new("undefined method `bit_length` for "+e+":Float","bit_length")),0===e||-1===e)return 0;for(var t=0,n=e<0?~e:e;0!=n;)t+=1,n>>>=1;return t},W.$$arity=0),e.def(De,"$ceil",V=function(e){null==e&&(e=0);var t=this.$to_f();if(t%1===0&&e>=0)return t;var n=Math.pow(10,e),r=Math.ceil(t*n)/n;return t%1===0&&(r=Math.round(r)),r},V.$$arity=-1),e.def(De,"$chr",K=function(e){return String.fromCharCode(this)},K.$$arity=-1),e.def(De,"$denominator",G=function(){var t,n=G.$$p,r=this,i=l,o=l,a=l;for(n&&(G.$$p=null),o=0,a=arguments.length,i=new Array(a);o<a;o++)i[o]=arguments[o];return d(d(t=r["$nan?"]())?t:r["$infinite?"]())?1:p(r,e.find_super_dispatcher(r,"denominator",G,!1),i,n)},G.$$arity=0),e.def(De,"$downto",X=function(e){var n,o=X.$$p,a=o||l,s=this;if(o&&(X.$$p=null),o&&(X.$$p=null),a===l)return p(s,"enum_for",["downto",e],(n=function(){var o=n.$$s||this;return d(c(Pe,"Numeric")["$==="](e))||o.$raise(c(Pe,"ArgumentError"),"comparison of "+o.$class()+" with "+e.$class()+" failed"),d(t(e,o))?0:r(i(o,e),1)},n.$$s=s,n.$$arity=0,n));e.$$is_number||s.$raise(c(Pe,"ArgumentError"),"comparison of "+s.$class()+" with "+e.$class()+" failed");for(var $=s;$>=e;$--)a($);return s},X.$$arity=1),e.alias(De,"eql?","=="),e.def(De,"$equal?",Q=function(e){var t;return d(t=this["$=="](e))?t:isNaN(this)&&isNaN(e)},Q.$$arity=1),e.def(De,"$even?",J=function(){return this%2===0},J.$$arity=0),e.def(De,"$floor",Z=function(e){null==e&&(e=0);var t=this.$to_f();if(t%1===0&&e>=0)return t;var n=Math.pow(10,e),r=Math.floor(t*n)/n;return t%1===0&&(r=Math.round(r)),r},Z.$$arity=-1),e.def(De,"$gcd",ee=function(e){d(c(Pe,"Integer")["$==="](e))||this.$raise(c(Pe,"TypeError"),"not an integer");for(var t=Math.abs(this),n=Math.abs(e);t>0;){var r=t;t=n%t,n=r}return n},ee.$$arity=1),e.def(De,"$gcdlcm",te=function(e){return[this.$gcd(),this.$lcm()]},te.$$arity=1),e.def(De,"$integer?",ne=function(){return this%1===0},ne.$$arity=0),e.def(De,"$is_a?",re=function(t){var n=re.$$p,r=this,i=l,o=l,a=l;for(n&&(re.$$p=null),o=0,a=arguments.length,i=new Array(a);o<a;o++)i[o]=arguments[o];return!!d(t["$=="](c(Pe,"Integer"))?c(Pe,"Integer")["$==="](r):t["$=="](c(Pe,"Integer")))||(!!d(t["$=="](c(Pe,"Integer"))?c(Pe,"Integer")["$==="](r):t["$=="](c(Pe,"Integer")))||(!!d(t["$=="](c(Pe,"Float"))?c(Pe,"Float")["$==="](r):t["$=="](c(Pe,"Float")))||p(r,e.find_super_dispatcher(r,"is_a?",re,!1),i,n)))},re.$$arity=1),e.alias(De,"kind_of?","is_a?"),e.def(De,"$instance_of?",ie=function(t){var n=ie.$$p,r=this,i=l,o=l,a=l;for(n&&(ie.$$p=null),o=0,a=arguments.length,i=new Array(a);o<a;o++)i[o]=arguments[o];return!!d(t["$=="](c(Pe,"Integer"))?c(Pe,"Integer")["$==="](r):t["$=="](c(Pe,"Integer")))||(!!d(t["$=="](c(Pe,"Integer"))?c(Pe,"Integer")["$==="](r):t["$=="](c(Pe,"Integer")))||(!!d(t["$=="](c(Pe,"Float"))?c(Pe,"Float")["$==="](r):t["$=="](c(Pe,"Float")))||p(r,e.find_super_dispatcher(r,"instance_of?",ie,!1),i,n)))},ie.$$arity=1),e.def(De,"$lcm",oe=function(e){var t=this;return d(c(Pe,"Integer")["$==="](e))||t.$raise(c(Pe,"TypeError"),"not an integer"),0==t||0==e?0:Math.abs(t*e/t.$gcd(e))},oe.$$arity=1),e.alias(De,"magnitude","abs"),e.alias(De,"modulo","%"),e.def(De,"$next",ae=function(){return this+1},ae.$$arity=0),e.def(De,"$nobits?",se=function(e){return 0==(this&(e=c(Pe,"Opal")["$coerce_to!"](e,c(Pe,"Integer"),"to_int")))},se.$$arity=1),e.def(De,"$nonzero?",$e=function(){return 0==this?l:this},$e.$$arity=0),e.def(De,"$numerator",le=function(){var t,n=le.$$p,r=this,i=l,o=l,a=l;for(n&&(le.$$p=null),o=0,a=arguments.length,i=new Array(a);o<a;o++)i[o]=arguments[o];return d(d(t=r["$nan?"]())?t:r["$infinite?"]())?r:p(r,e.find_super_dispatcher(r,"numerator",le,!1),i,n)},le.$$arity=0),e.def(De,"$odd?",ue=function(){return this%2!==0},ue.$$arity=0),e.def(De,"$ord",ce=function(){return this},ce.$$arity=0),e.def(De,"$pow",fe=function(e,t){var n=this;return 0==n&&n.$raise(c(Pe,"ZeroDivisionError"),"divided by 0"),void 0===t?n["$**"](e):(c(Pe,"Integer")["$==="](e)||n.$raise(c(Pe,"TypeError"),"Integer#pow() 2nd argument not allowed unless a 1st argument is integer"),e<0&&n.$raise(c(Pe,"TypeError"),"Integer#pow() 1st argument cannot be negative when 2nd argument specified"),c(Pe,"Integer")["$==="](t)||n.$raise(c(Pe,"TypeError"),"Integer#pow() 2nd argument not allowed unless all arguments are integers"),0===t&&n.$raise(c(Pe,"ZeroDivisionError"),"divided by 0"),n["$**"](e)["$%"](t))},fe.$$arity=-2),e.def(De,"$pred",de=function(){return this-1},de.$$arity=0),e.def(De,"$quo",pe=function(t){var n=pe.$$p,r=this,i=l,a=l,s=l;for(n&&(pe.$$p=null),a=0,s=arguments.length,i=new Array(s);a<s;a++)i[a]=arguments[a];return d(c(Pe,"Integer")["$==="](r))?p(r,e.find_super_dispatcher(r,"quo",pe,!1),i,n):o(r,t)},pe.$$arity=1),e.def(De,"$rationalize",_e=function(t){var n,r,o=this,s=l,$=l;return arguments.length>1&&o.$raise(c(Pe,"ArgumentError"),"wrong number of arguments ("+arguments.length+" for 0..1)"),d(c(Pe,"Integer")["$==="](o))?c(Pe,"Rational").$new(o,1):d(o["$infinite?"]())?o.$raise(c(Pe,"FloatDomainError"),"Infinity"):d(o["$nan?"]())?o.$raise(c(Pe,"FloatDomainError"),"NaN"):d(null==t)?(r=c(Pe,"Math").$frexp(o),s=null==(n=e.to_ary(r))[0]?l:n[0],$=null==n[1]?l:n[1],s=c(Pe,"Math").$ldexp(s,u(c(Pe,"Float"),"MANT_DIG")).$to_i(),$=i($,u(c(Pe,"Float"),"MANT_DIG")),c(Pe,"Rational").$new(a(2,s),1["$<<"](i(1,$))).$rationalize(c(Pe,"Rational").$new(1,1["$<<"](i(1,$))))):o.$to_r().$rationalize(t)},_e.$$arity=-1),e.def(De,"$remainder",he=function(e){return i(this,a(e,o(this,e).$truncate()))},he.$$arity=1),e.def(De,"$round",me=function(a){var s,$,f,p,_=this,h=l;if(d(c(Pe,"Integer")["$==="](_))){if(d(null==a))return _;if(d(d(s=c(Pe,"Float")["$==="](a))?a["$infinite?"]():s)&&_.$raise(c(Pe,"RangeError"),"Infinity"),a=c(Pe,"Opal")["$coerce_to!"](a,c(Pe,"Integer"),"to_int"),d(n(a,u(c(Pe,"Integer"),"MIN")))&&_.$raise(c(Pe,"RangeError"),"out of bounds"),d(a>=0))return _;if(.415241*(a=a["$-@"]())-.125>_.$size())return 0;var m=Math.pow(10,a),y=Math.floor((Math.abs(y)+m/2)/m)*m;return _<0?-y:y}if(d(d(s=_["$nan?"]())?null==a:s)&&_.$raise(c(Pe,"FloatDomainError"),"NaN"),a=c(Pe,"Opal")["$coerce_to!"](a||0,c(Pe,"Integer"),"to_int"),d((p=0,"number"===typeof(f=a)&&"number"===typeof p?f<=p:f["$<="](p))))d(_["$nan?"]())?_.$raise(c(Pe,"RangeError"),"NaN"):d(_["$infinite?"]())&&_.$raise(c(Pe,"FloatDomainError"),"Infinity");else{if(a["$=="](0))return Math.round(_);if(d(d(s=_["$nan?"]())?s:_["$infinite?"]()))return _}return $=c(Pe,"Math").$frexp(_),null==(s=e.to_ary($))[0]?l:s[0],h=null==s[1]?l:s[1],d(function(e,t){return"number"===typeof e&&"number"===typeof t?e>=t:e["$>="](t)}(a,i(r(u(c(Pe,"Float"),"DIG"),2),d(t(h,0))?o(h,4):i(o(h,3),1))))?_:d(n(a,(d(t(h,0))?r(o(h,3),1):o(h,4))["$-@"]()))?0:Math.round(_*Math.pow(10,a))/Math.pow(10,a)},me.$$arity=-1),e.def(De,"$step",ye=function(t,n,r){var i,o,a,s,$,f,d,h=ye.$$p,m=h||l,y=this,g=l,v=l;if(h&&(ye.$$p=null),h&&(ye.$$p=null),i=e.slice.call(arguments,0,arguments.length),null==(o=e.extract_kwargs(i)))o=_([],{});else if(!o.$$is_hash)throw e.ArgumentError.$new("expected kwargs");function b(){void 0!==$&&(a=$),void 0===a&&(a=l),s===l&&y.$raise(c(Pe,"TypeError"),"step must be numeric"),0===s&&y.$raise(c(Pe,"ArgumentError"),"step can't be 0"),void 0!==f&&(s=f),s!==l&&null!=s||(s=1);var e=s["$<=>"](0);e===l&&y.$raise(c(Pe,"ArgumentError"),"0 can't be coerced into "+s.$class()),a!==l&&null!=a||(a=e>0?u(c(Pe,"Float"),"INFINITY"):u(c(Pe,"Float"),"INFINITY")["$-@"]()),c(Pe,"Opal").$compare(y,a)}function w(){if(s>0&&y>a||s<0&&y<a)return 0;if(s===1/0||s===-1/0)return 1;var e=Math.abs,t=Math.floor,n=(e(y)+e(a)+e(a-y))/e(s)*u(c(Pe,"Float"),"EPSILON");return n===1/0||n===-1/0?0:(n>.5&&(n=.5),t((a-y)/s+n)+1)}function x(){if(b(),0===s)return 1/0;if(s%1!==0)return w();if(s>0&&y>a||s<0&&y<a)return 0;var e=Math.ceil,t=Math.abs;return e((t(y-a)+1)/t(s))}if(i.length>0&&(a=i[0],i.splice(0,1)),i.length>0&&(s=i[0],i.splice(0,1)),$=o.$$smap.to,f=o.$$smap.by,void 0!==a&&void 0!==$&&y.$raise(c(Pe,"ArgumentError"),"to is given twice"),void 0!==s&&void 0!==f&&y.$raise(c(Pe,"ArgumentError"),"step is given twice"),m===l)return g=[],v=_([],{}),void 0!==a&&g.push(a),void 0!==s&&g.push(s),void 0!==$&&e.hash_put(v,"to",$),void 0!==f&&e.hash_put(v,"by",f),v["$any?"]()&&g.push(v),p(y,"enum_for",["step"].concat(e.to_a(g)),((d=function(){d.$$s;return x()}).$$s=y,d.$$arity=0,d));if(b(),0===s)for(;;)m(y);if(y%1!==0||a%1!==0||s%1!==0){var k=w();if(k>0)if(s===1/0||s===-1/0)m(y);else{var E,O=0;if(s>0)for(;O<k;)a<(E=O*s+y)&&(E=a),m(E),O+=1;else for(;O<k;)a>(E=O*s+y)&&(E=a),m(E),O+=1}}else{var A=y;if(s>0)for(;A<=a;)m(A),A+=s;else for(;A>=a;)m(A),A+=s}return y},ye.$$arity=-1),e.alias(De,"succ","next"),e.def(De,"$times",ge=function(){var e,t=ge.$$p,n=t||l,r=this;if(t&&(ge.$$p=null),t&&(ge.$$p=null),!d(n))return p(r,"enum_for",["times"],((e=function(){return e.$$s||this}).$$s=r,e.$$arity=0,e));for(var i=0;i<r;i++)n(i);return r},ge.$$arity=0),e.def(De,"$to_f",ve=function(){return this},ve.$$arity=0),e.def(De,"$to_i",be=function(){return parseInt(this,10)},be.$$arity=0),e.alias(De,"to_int","to_i"),e.def(De,"$to_r",we=function(){var t,n,r=this,o=l,s=l;return d(c(Pe,"Integer")["$==="](r))?c(Pe,"Rational").$new(r,1):(n=c(Pe,"Math").$frexp(r),o=null==(t=e.to_ary(n))[0]?l:t[0],s=null==t[1]?l:t[1],o=c(Pe,"Math").$ldexp(o,u(c(Pe,"Float"),"MANT_DIG")).$to_i(),s=i(s,u(c(Pe,"Float"),"MANT_DIG")),a(o,u(c(Pe,"Float"),"RADIX")["$**"](s)).$to_r())},we.$$arity=0),e.def(De,"$to_s",xe=function(e){var r;return null==e&&(e=10),e=c(Pe,"Opal")["$coerce_to!"](e,c(Pe,"Integer"),"to_int"),d(d(r=n(e,2))?r:t(e,36))&&this.$raise(c(Pe,"ArgumentError"),"invalid radix "+e),this.toString(e)},xe.$$arity=-1),e.def(De,"$truncate",ke=function(e){null==e&&(e=0);var t=this.$to_f();if(t%1===0&&e>=0)return t;var n=Math.pow(10,e),r=parseInt(t*n,10)/n;return t%1===0&&(r=Math.round(r)),r},ke.$$arity=-1),e.alias(De,"inspect","to_s"),e.def(De,"$digits",Ee=function(e){var t=this;null==e&&(e=10),n(t,0)&&t.$raise(u(c(Pe,"Math"),"DomainError"),"out of domain"),e=c(Pe,"Opal")["$coerce_to!"](e,c(Pe,"Integer"),"to_int"),d(n(e,2))&&t.$raise(c(Pe,"ArgumentError"),"invalid radix "+e);for(var r=t,i=[];0!==r;)i.push(r%e),r=parseInt(r/e,10);return i},Ee.$$arity=-1),e.def(De,"$divmod",Oe=function(t){var n,r=Oe.$$p,i=this,o=l,a=l,s=l;for(r&&(Oe.$$p=null),a=0,s=arguments.length,o=new Array(s);a<s;a++)o[a]=arguments[a];return d(d(n=i["$nan?"]())?n:t["$nan?"]())?i.$raise(c(Pe,"FloatDomainError"),"NaN"):d(i["$infinite?"]())?i.$raise(c(Pe,"FloatDomainError"),"Infinity"):p(i,e.find_super_dispatcher(i,"divmod",Oe,!1),o,r)},Oe.$$arity=1),e.def(De,"$upto",Ae=function(e){var t,o=Ae.$$p,a=o||l,s=this;if(o&&(Ae.$$p=null),o&&(Ae.$$p=null),a===l)return p(s,"enum_for",["upto",e],(t=function(){var o=t.$$s||this;return d(c(Pe,"Numeric")["$==="](e))||o.$raise(c(Pe,"ArgumentError"),"comparison of "+o.$class()+" with "+e.$class()+" failed"),d(n(e,o))?0:r(i(e,o),1)},t.$$s=s,t.$$arity=0,t));e.$$is_number||s.$raise(c(Pe,"ArgumentError"),"comparison of "+s.$class()+" with "+e.$class()+" failed");for(var $=s;$<=e;$++)a($);return s},Ae.$$arity=1),e.def(De,"$zero?",Se=function(){return 0==this},Se.$$arity=0),e.def(De,"$size",Ce=function(){return 4},Ce.$$arity=0),e.def(De,"$nan?",Re=function(){return isNaN(this)},Re.$$arity=0),e.def(De,"$finite?",Te=function(){var e=this;return e!=1/0&&e!=-1/0&&!isNaN(e)},Te.$$arity=0),e.def(De,"$infinite?",Ie=function(){return this==1/0?1:this==-1/0?-1:l},Ie.$$arity=0),e.def(De,"$positive?",Ne=function(){var e=this;return 0!=e&&(e==1/0||1/e>0)},Ne.$$arity=0),e.def(De,"$negative?",Le=function(){return this==-1/0||1/this<0},Le.$$arity=0)}($[0],c($,"Numeric"),$),e.const_set($[0],"Fixnum",c($,"Number")),function(t,n,r){var i=f(t,n,"Integer"),o=[i].concat(r);i.$$is_number_class=!0,function(t,n){var r,i,o,a=[t].concat(n);e.def(t,"$allocate",r=function(){return this.$raise(c(a,"TypeError"),"allocator undefined for "+this.$name())},r.$$arity=0),e.udef(t,"$new"),e.def(t,"$===",i=function(e){return!!e.$$is_number&&e%1===0},i.$$arity=1),e.def(t,"$sqrt",o=function(e){return(e=c(a,"Opal")["$coerce_to!"](e,c(a,"Integer"),"to_int"))<0&&this.$raise(u(c(a,"Math"),"DomainError"),'Numerical argument is out of domain - "isqrt"'),parseInt(Math.sqrt(e),10)},o.$$arity=1)}(e.get_singleton_class(i),o),e.const_set(o[0],"MAX",Math.pow(2,30)-1),e.const_set(o[0],"MIN",-Math.pow(2,30))}($[0],c($,"Numeric"),$),function(t,n,r){var i=f(t,n,"Float"),o=[i].concat(r);return i.$$is_number_class=!0,function(t,n){var r,i,o=[t].concat(n);e.def(t,"$allocate",r=function(){return this.$raise(c(o,"TypeError"),"allocator undefined for "+this.$name())},r.$$arity=0),e.udef(t,"$new"),e.def(t,"$===",i=function(e){return!!e.$$is_number},i.$$arity=1)}(e.get_singleton_class(i),o),e.const_set(o[0],"INFINITY",1/0),e.const_set(o[0],"MAX",Number.MAX_VALUE),e.const_set(o[0],"MIN",Number.MIN_VALUE),e.const_set(o[0],"NAN",NaN),e.const_set(o[0],"DIG",15),e.const_set(o[0],"MANT_DIG",53),e.const_set(o[0],"RADIX",2),e.const_set(o[0],"EPSILON",Number.EPSILON||2220446049250313e-31)}($[0],c($,"Numeric"),$)},Opal.modules["corelib/range"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e<=t:e["$<="](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e<t:e["$<"](t)}function r(e,t){return"number"===typeof e&&"number"===typeof t?e>t:e["$>"](t)}function i(e,t){return"number"===typeof e&&"number"===typeof t?e+t:e["$+"](t)}var o=e.top,a=[],s=e.nil,$=e.const_get_qualified,l=e.const_get_relative,u=(e.breaker,e.slice,e.klass),c=e.truthy,f=e.send;return e.add_stubs(["$require","$include","$attr_reader","$raise","$<=>","$include?","$<=","$<","$enum_for","$upto","$to_proc","$respond_to?","$class","$succ","$!","$==","$===","$exclude_end?","$eql?","$begin","$end","$last","$to_a","$>","$-","$abs","$to_i","$coerce_to!","$ceil","$/","$size","$loop","$+","$*","$>=","$each_with_index","$%","$bsearch","$inspect","$[]","$hash"]),o.$require("corelib/enumerable"),function(o,a,d){var p,_,h,m,y,g,v,b,w,x,k,E,O,A,S,C,R,T,I=u(o,null,"Range"),N=[I].concat(d);return I.$$prototype.begin=I.$$prototype.end=I.$$prototype.excl=s,I.$include(l(N,"Enumerable")),I.$$prototype.$$is_range=!0,I.$attr_reader("begin","end"),e.def(I,"$initialize",p=function(e,t,n){var r=this;return null==n&&(n=!1),c(r.begin)&&r.$raise(l(N,"NameError"),"'initialize' called twice"),c(e["$<=>"](t))||r.$raise(l(N,"ArgumentError"),"bad value for range"),r.begin=e,r.end=t,r.excl=n},p.$$arity=-3),e.def(I,"$==",_=function(e){var t=this;return!!e.$$is_range&&(t.excl===e.excl&&t.begin==e.begin&&t.end==e.end)},_.$$arity=1),e.def(I,"$===",h=function(e){return this["$include?"](e)},h.$$arity=1),e.def(I,"$cover?",m=function(e){var r,i,o,a=this;return i=a.begin["$<=>"](e),!!c(c(r=i)?t(i,0):r)&&(o=e["$<=>"](a.end),c(a.excl)?c(r=o)?n(o,0):r:c(r=o)?t(o,0):r)},m.$$arity=1),e.def(I,"$each",y=function(){var t,r,i,o,a=y.$$p,$=a||s,u=this,d=s;if(a&&(y.$$p=null),a&&(y.$$p=null),$===s)return u.$enum_for("each");if(u.begin.$$is_number&&u.end.$$is_number){for(u.begin%1===0&&u.end%1===0||u.$raise(l(N,"TypeError"),"can't iterate from Float"),i=u.begin,o=u.end+(c(u.excl)?0:1);i<o;i++)$(i);return u}if(u.begin.$$is_string&&u.end.$$is_string)return f(u.begin,"upto",[u.end,u.excl],$.$to_proc()),u;for(d=u.begin,r=u.end,c(d["$respond_to?"]("succ"))||u.$raise(l(N,"TypeError"),"can't iterate from "+d.$class());c(n(d["$<=>"](r),0));)e.yield1($,d),d=d.$succ();return c(c(t=u.excl["$!"]())?d["$=="](r):t)&&e.yield1($,d),u},y.$$arity=0),e.def(I,"$eql?",g=function(e){var t,n,r=this;return!!c(l(N,"Range")["$==="](e))&&(c(t=c(n=r.excl["$==="](e["$exclude_end?"]()))?r.begin["$eql?"](e.$begin()):n)?r.end["$eql?"](e.$end()):t)},g.$$arity=1),e.def(I,"$exclude_end?",v=function(){return this.excl},v.$$arity=0),e.def(I,"$first",b=function(t){var n=b.$$p,r=this,i=s,o=s,a=s;for(n&&(b.$$p=null),o=0,a=arguments.length,i=new Array(a);o<a;o++)i[o]=arguments[o];return c(null==t)?r.begin:f(r,e.find_super_dispatcher(r,"first",b,!1),i,n)},b.$$arity=-1),e.alias(I,"include?","cover?"),e.def(I,"$last",w=function(e){return c(null==e)?this.end:this.$to_a().$last(e)},w.$$arity=-1),e.def(I,"$max",x=function(){var t,n=x.$$p,i=n||s,o=this,a=s,$=s,l=s;for(n&&(x.$$p=null),$=0,l=arguments.length,a=new Array(l);$<l;$++)a[$]=arguments[$];return i!==s?f(o,e.find_super_dispatcher(o,"max",x,!1),a,n):c(r(o.begin,o.end))||c(c(t=o.excl)?o.begin["$=="](o.end):t)?s:o.excl?o.end-1:o.end},x.$$arity=0),e.alias(I,"member?","cover?"),e.def(I,"$min",k=function(){var t,n=k.$$p,i=n||s,o=this,a=s,$=s,l=s;for(n&&(k.$$p=null),$=0,l=arguments.length,a=new Array(l);$<l;$++)a[$]=arguments[$];return i!==s?f(o,e.find_super_dispatcher(o,"min",k,!1),a,n):c(r(o.begin,o.end))||c(c(t=o.excl)?o.begin["$=="](o.end):t)?s:o.begin},k.$$arity=0),e.def(I,"$size",E=function(){var e,t,r,i,o=this,a=s,u=s;return a=o.begin,u=o.end,c(o.excl)&&(i=1,u="number"===typeof(r=u)&&"number"===typeof i?r-i:r["$-"](i)),c(c(e=l(N,"Numeric")["$==="](a))?l(N,"Numeric")["$==="](u):e)?c(n(u,a))?0:(t=$(l(N,"Float"),"INFINITY"),c([a.$abs(),u.$abs()]["$include?"](t))?t:(Math.abs(u-a)+1).$to_i()):s},E.$$arity=0),e.def(I,"$step",O=function(t){var n,o,a,u=O.$$p,d=u||s,p=this,_=s;function h(){t.$$is_number||(t=l(N,"Opal")["$coerce_to!"](t,l(N,"Integer"),"to_int")),t<0?p.$raise(l(N,"ArgumentError"),"step can't be negative"):0===t&&p.$raise(l(N,"ArgumentError"),"step can't be 0")}function m(){if(!p.begin["$respond_to?"]("succ"))return s;if(p.begin.$$is_string&&p.end.$$is_string)return s;if(t%1===0)return(n=p.$size(),r=t,"number"===typeof n&&"number"===typeof r?n/r:n["$/"](r)).$ceil();var e,n,r,i=p.begin,o=p.end,a=Math.abs,u=Math.floor,c=(a(i)+a(o)+a(o-i))/a(t)*$(l(N,"Float"),"EPSILON");return c>.5&&(c=.5),p.excl?(e=u((o-i)/t-c))*t+i<o&&e++:e=u((o-i)/t+c)+1,e}return u&&(O.$$p=null),null==t&&(t=1),d===s?f(p,"enum_for",["step",t],((n=function(){n.$$s;return h(),m()}).$$s=p,n.$$arity=0,n)):(h(),c(p.begin.$$is_number&&p.end.$$is_number)?(_=0,function(){var n=e.new_brk();try{f(p,"loop",[],(o=function(){var a,$,l,u=o.$$s||this;return null==u.begin&&(u.begin=s),null==u.excl&&(u.excl=s),null==u.end&&(u.end=s),a=i(u.begin,(l=t,"number"===typeof($=_)&&"number"===typeof l?$*l:$["$*"](l))),c(u.excl)?c(function(e,t){return"number"===typeof e&&"number"===typeof t?e>=t:e["$>="](t)}(a,u.end))&&e.brk(s,n):c(r(a,u.end))&&e.brk(s,n),e.yield1(d,a),_=i(_,1)},o.$$s=p,o.$$brk=n,o.$$arity=0,o))}catch(a){if(a===n)return a.$v;throw a}}()):(p.begin.$$is_string&&p.end.$$is_string&&t%1!==0&&p.$raise(l(N,"TypeError"),"no implicit conversion to float from string"),f(p,"each_with_index",[],((a=function(n,r){a.$$s;return null==n&&(n=s),null==r&&(r=s),r["$%"](t)["$=="](0)?e.yield1(d,n):s}).$$s=p,a.$$arity=2,a))),p)},O.$$arity=-1),e.def(I,"$bsearch",A=function(){var e=A.$$p,t=e||s,n=this;return e&&(A.$$p=null),e&&(A.$$p=null),t===s?n.$enum_for("bsearch"):(c(n.begin.$$is_number&&n.end.$$is_number)||n.$raise(l(N,"TypeError"),"can't do binary search for "+n.begin.$class()),f(n.$to_a(),"bsearch",[],t.$to_proc()))},A.$$arity=0),e.def(I,"$to_s",S=function(){var e=this;return e.begin+(c(e.excl)?"...":"..")+e.end},S.$$arity=0),e.def(I,"$inspect",C=function(){var e=this;return e.begin.$inspect()+(c(e.excl)?"...":"..")+e.end.$inspect()},C.$$arity=0),e.def(I,"$marshal_load",R=function(e){var t=this;return t.begin=e["$[]"]("begin"),t.end=e["$[]"]("end"),t.excl=e["$[]"]("excl")},R.$$arity=1),e.def(I,"$hash",T=function(){var e=this;return[e.begin,e.end,e.excl].$hash()},T.$$arity=0),s&&"hash"}(a[0],0,a)},Opal.modules["corelib/proc"]=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative),i=(e.breaker,e.slice),o=e.klass,a=e.truthy;return e.add_stubs(["$raise","$coerce_to!"]),function(t,s,$){var l,u,c,f,d,p,_,h,m,y,g=o(t,Function,"Proc"),v=[g].concat($);return e.defineProperty(g.$$prototype,"$$is_proc",!0),e.defineProperty(g.$$prototype,"$$is_lambda",!1),e.defs(g,"$new",l=function(){var e=l.$$p,t=e||n;return e&&(l.$$p=null),e&&(l.$$p=null),a(t)||this.$raise(r(v,"ArgumentError"),"tried to create a Proc object without a block"),t},l.$$arity=0),e.def(g,"$call",u=function(t){var r,i=u.$$p,o=i||n,a=this;i&&(u.$$p=null),i&&(u.$$p=null),r=e.slice.call(arguments,0,arguments.length),o!==n&&(a.$$p=o);var s,$=a.$$brk;if($)try{s=a.$$is_lambda?a.apply(null,r):e.yieldX(a,r)}catch(l){if(l===$)return $.$v;throw l}else s=a.$$is_lambda?a.apply(null,r):e.yieldX(a,r);return s},u.$$arity=-1),e.alias(g,"[]","call"),e.alias(g,"===","call"),e.alias(g,"yield","call"),e.def(g,"$to_proc",c=function(){return this},c.$$arity=0),e.def(g,"$lambda?",f=function(){return!!this.$$is_lambda},f.$$arity=0),e.def(g,"$arity",d=function(){return this.$$is_curried?-1:this.$$arity},d.$$arity=0),e.def(g,"$source_location",p=function(){return this.$$is_curried,n},p.$$arity=0),e.def(g,"$binding",_=function(){return this.$$is_curried&&this.$raise(r(v,"ArgumentError"),"Can't create Binding"),n},_.$$arity=0),e.def(g,"$parameters",h=function(){var e=this;if(e.$$is_curried)return[["rest"]];if(e.$$parameters){if(e.$$is_lambda)return e.$$parameters;var t,n,r=[];for(t=0,n=e.$$parameters.length;t<n;t++){var i=e.$$parameters[t];"req"===i[0]&&(i=["opt",i[1]]),r.push(i)}return r}return[]},h.$$arity=0),e.def(g,"$curry",m=function(e){var t=this;function n(){var o,a=i.call(arguments),s=a.length;return s>e&&t.$$is_lambda&&!t.$$is_curried&&t.$raise(r(v,"ArgumentError"),"wrong number of arguments ("+s+" for "+e+")"),s>=e?t.$call.apply(t,a):(o=function(){return n.apply(null,a.concat(i.call(arguments)))},o.$$is_lambda=t.$$is_lambda,o.$$is_curried=!0,o)}return void 0===e?e=t.length:(e=r(v,"Opal")["$coerce_to!"](e,r(v,"Integer"),"to_int"),t.$$is_lambda&&e!==t.length&&t.$raise(r(v,"ArgumentError"),"wrong number of arguments ("+e+" for "+t.length+")")),n.$$is_lambda=t.$$is_lambda,n.$$is_curried=!0,n},m.$$arity=-1),e.def(g,"$dup",y=function(){var e=this,t=e.$$original_proc||e,n=function(){return t.apply(this,arguments)};for(var r in e)e.hasOwnProperty(r)&&(n[r]=e[r]);return n},y.$$arity=0),e.alias(g,"clone","dup")}(t[0],0,t)},Opal.modules["corelib/method"]=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative),i=(e.breaker,e.slice,e.klass),o=e.truthy;return e.add_stubs(["$attr_reader","$arity","$new","$class","$join","$source_location","$raise"]),function(t,a,s){var $,l,u,c,f,d,p,_,h,m=i(t,null,"Method"),y=[m].concat(s);m.$$prototype.method=m.$$prototype.receiver=m.$$prototype.owner=m.$$prototype.name=n,m.$attr_reader("owner","receiver","name"),e.def(m,"$initialize",$=function(e,t,n,r){var i=this;return i.receiver=e,i.owner=t,i.name=r,i.method=n},$.$$arity=4),e.def(m,"$arity",l=function(){return this.method.$arity()},l.$$arity=0),e.def(m,"$parameters",u=function(){return this.method.$$parameters},u.$$arity=0),e.def(m,"$source_location",c=function(){var e;return o(e=this.method.$$source_location)?e:["(eval)",0]},c.$$arity=0),e.def(m,"$comments",f=function(){var e;return o(e=this.method.$$comments)?e:[]},f.$$arity=0),e.def(m,"$call",d=function(t){var r,i=d.$$p,o=i||n,a=this;return i&&(d.$$p=null),i&&(d.$$p=null),r=e.slice.call(arguments,0,arguments.length),a.method.$$p=o,a.method.apply(a.receiver,r)},d.$$arity=-1),e.alias(m,"[]","call"),e.def(m,"$unbind",p=function(){var e=this;return r(y,"UnboundMethod").$new(e.receiver.$class(),e.owner,e.method,e.name)},p.$$arity=0),e.def(m,"$to_proc",_=function(){var e=this,t=e.$call.bind(e);return t.$$unbound=e.method,t.$$is_lambda=!0,t.$$arity=e.method.$$arity,t.$$parameters=e.method.$$parameters,t},_.$$arity=0),e.def(m,"$inspect",h=function(){var e=this;return"#<"+e.$class()+": "+e.receiver.$class()+"#"+e.name+" (defined in "+e.owner+" in "+e.$source_location().$join(":")+")>"},h.$$arity=0)}(t[0],0,t),function(t,a,s){var $,l,u,c,f,d,p,_=i(t,null,"UnboundMethod"),h=[_].concat(s);return _.$$prototype.method=_.$$prototype.owner=_.$$prototype.name=_.$$prototype.source=n,_.$attr_reader("source","owner","name"),e.def(_,"$initialize",$=function(e,t,n,r){var i=this;return i.source=e,i.owner=t,i.method=n,i.name=r},$.$$arity=4),e.def(_,"$arity",l=function(){return this.method.$arity()},l.$$arity=0),e.def(_,"$parameters",u=function(){return this.method.$$parameters},u.$$arity=0),e.def(_,"$source_location",c=function(){var e;return o(e=this.method.$$source_location)?e:["(eval)",0]},c.$$arity=0),e.def(_,"$comments",f=function(){var e;return o(e=this.method.$$comments)?e:[]},f.$$arity=0),e.def(_,"$bind",d=function(t){var n=this;if(n.owner.$$is_module||e.is_a(t,n.owner))return r(h,"Method").$new(t,n.owner,n.method,n.name);n.$raise(r(h,"TypeError"),"can't bind singleton method to a different class (expected "+t+".kind_of?("+n.owner+" to be true)")},d.$$arity=1),e.def(_,"$inspect",p=function(){var e=this;return"#<"+e.$class()+": "+e.source+"#"+e.name+" (defined in "+e.owner+" in "+e.$source_location().$join(":")+")>"},p.$$arity=0),n&&"inspect"}(t[0],0,t)},Opal.modules["corelib/variables"]=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative),i=(e.breaker,e.slice,e.gvars),o=e.hash2;return e.add_stubs(["$new"]),i["&"]=i["~"]=i["`"]=i["'"]=n,i.LOADED_FEATURES=i['"']=e.loaded_features,i.LOAD_PATH=i[":"]=[],i["/"]="\n",i[","]=n,e.const_set(t[0],"ARGV",[]),e.const_set(t[0],"ARGF",r(t,"Object").$new()),e.const_set(t[0],"ENV",o([],{})),i.VERBOSE=!1,i.DEBUG=!1,i.SAFE=0},Opal.modules["opal/regexp_anchors"]=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative),i=(e.breaker,e.slice,e.module);return e.add_stubs(["$==","$new"]),function(t,o){var a=[i(t,"Opal")].concat(o);e.const_set(a[0],"REGEXP_START",r(a,"RUBY_ENGINE")["$=="]("opal")?"^":n),e.const_set(a[0],"REGEXP_END",r(a,"RUBY_ENGINE")["$=="]("opal")?"$":n),e.const_set(a[0],"FORBIDDEN_STARTING_IDENTIFIER_CHARS","\\u0001-\\u002F\\u003A-\\u0040\\u005B-\\u005E\\u0060\\u007B-\\u007F"),e.const_set(a[0],"FORBIDDEN_ENDING_IDENTIFIER_CHARS","\\u0001-\\u0020\\u0022-\\u002F\\u003A-\\u003E\\u0040\\u005B-\\u005E\\u0060\\u007B-\\u007F"),e.const_set(a[0],"INLINE_IDENTIFIER_REGEXP",r(a,"Regexp").$new("[^"+r(a,"FORBIDDEN_STARTING_IDENTIFIER_CHARS")+"]*[^"+r(a,"FORBIDDEN_ENDING_IDENTIFIER_CHARS")+"]")),e.const_set(a[0],"FORBIDDEN_CONST_NAME_CHARS","\\u0001-\\u0020\\u0021-\\u002F\\u003B-\\u003F\\u0040\\u005B-\\u005E\\u0060\\u007B-\\u007F"),e.const_set(a[0],"CONST_NAME_REGEXP",r(a,"Regexp").$new(r(a,"REGEXP_START")+"(::)?[A-Z][^"+r(a,"FORBIDDEN_CONST_NAME_CHARS")+"]*"+r(a,"REGEXP_END")))}(t[0],t)},Opal.modules["opal/mini"]=function(e){var t=e.top;e.nil,e.const_get_qualified,e.const_get_relative,e.breaker,e.slice;return e.add_stubs(["$require"]),t.$require("opal/base"),t.$require("corelib/nil"),t.$require("corelib/boolean"),t.$require("corelib/string"),t.$require("corelib/comparable"),t.$require("corelib/enumerable"),t.$require("corelib/enumerator"),t.$require("corelib/array"),t.$require("corelib/hash"),t.$require("corelib/number"),t.$require("corelib/range"),t.$require("corelib/proc"),t.$require("corelib/method"),t.$require("corelib/regexp"),t.$require("corelib/variables"),t.$require("opal/regexp_anchors")},Opal.modules["corelib/string/encoding"]=function(e){var t,n,r,i,o,a=e.top,s=[],$=e.nil,l=e.const_get_qualified,u=e.const_get_relative,c=(e.breaker,e.slice,e.klass),f=e.hash2,d=e.truthy,p=e.send;return e.add_stubs(["$require","$+","$[]","$new","$to_proc","$each","$const_set","$sub","$==","$default_external","$upcase","$raise","$attr_accessor","$attr_reader","$register","$length","$bytes","$to_a","$each_byte","$dup","$bytesize","$enum_for","$coerce_to!","$find","$<"]),a.$require("corelib/string"),function(t,n,r){var i,o,a,s,l,_,h,m,y,g=c(t,null,"Encoding"),v=[g].concat(r);g.$$prototype.ascii=g.$$prototype.dummy=g.$$prototype.name=$,e.defineProperty(g,"$$register",{}),e.defs(g,"$register",i=function(e,t){var n,r,o,a,s,l=i.$$p,c=l||$,_=this,h=$,m=$;return l&&(i.$$p=null),l&&(i.$$p=null),null==t&&(t=f([],{})),a=[e],s=d(n=t["$[]"]("aliases"))?n:[],h="number"===typeof a&&"number"===typeof s?a+s:a["$+"](s),o=p(u(v,"Class"),"new",[_],c.$to_proc()).$new(e,h,!!d(n=t["$[]"]("ascii"))&&n,!!d(n=t["$[]"]("dummy"))&&n),m=_.$$register,p(h,"each",[],(r=function(e){var t=r.$$s||this;return null==e&&(e=$),t.$const_set(e.$sub("-","_"),o),m["$$"+e]=o},r.$$s=_,r.$$arity=1,r))},i.$$arity=-2),e.defs(g,"$find",o=function(e){var t,n,r,i=this;return e["$=="]("default_external")?i.$default_external():(n=i.$$register,r=d(t=n["$$"+e])?t:n["$$"+e.$upcase()],d(r)||i.$raise(u(v,"ArgumentError"),"unknown encoding name - "+e),r)},o.$$arity=1),function(e,t){[e].concat(t);e.$attr_accessor("default_external")}(e.get_singleton_class(g),v),g.$attr_reader("name","names"),e.def(g,"$initialize",a=function(e,t,n,r){var i=this;return i.name=e,i.names=t,i.ascii=n,i.dummy=r},a.$$arity=4),e.def(g,"$ascii_compatible?",s=function(){return this.ascii},s.$$arity=0),e.def(g,"$dummy?",l=function(){return this.dummy},l.$$arity=0),e.def(g,"$to_s",_=function(){return this.name},_.$$arity=0),e.def(g,"$inspect",h=function(){var e=this;return"#<Encoding:"+e.name+(d(e.dummy)?" (dummy)":$)+">"},h.$$arity=0),e.def(g,"$each_byte",m=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(u(v,"NotImplementedError"))},m.$$arity=-1),e.def(g,"$bytesize",y=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(u(v,"NotImplementedError"))},y.$$arity=-1),function(e,t,n){[c(e,t,"EncodingError")].concat(n)}(v[0],u(v,"StandardError"),v),function(e,t,n){[c(e,t,"CompatibilityError")].concat(n)}(v[0],u(v,"EncodingError"),v)}(s[0],0,s),p(u(s,"Encoding"),"register",["UTF-8",f(["aliases","ascii"],{aliases:["CP65001"],ascii:!0})],(t=function(){var n,r,i=t.$$s||this;return e.def(i,"$each_byte",n=function(t){var r=n.$$p,i=r||$;r&&(n.$$p=null),r&&(n.$$p=null);for(var o,a=1/0,s=t.length,l=null,u=0;u<s;++u){if((o=t.charCodeAt(u))>55295&&o<57344){if(!l){if(o>56319){(a-=3)>-1&&(e.yield1(i,239),e.yield1(i,191),e.yield1(i,189));continue}if(u+1===s){(a-=3)>-1&&(e.yield1(i,239),e.yield1(i,191),e.yield1(i,189));continue}l=o;continue}if(o<56320){(a-=3)>-1&&(e.yield1(i,239),e.yield1(i,191),e.yield1(i,189)),l=o;continue}o=65536+(l-55296<<10|o-56320)}else l&&(a-=3)>-1&&(e.yield1(i,239),e.yield1(i,191),e.yield1(i,189));if(l=null,o<128){if((a-=1)<0)break;e.yield1(i,o)}else if(o<2048){if((a-=2)<0)break;e.yield1(i,o>>6|192),e.yield1(i,63&o|128)}else if(o<65536){if((a-=3)<0)break;e.yield1(i,o>>12|224),e.yield1(i,o>>6&63|128),e.yield1(i,63&o|128)}else if(o<1114112){if((a-=4)<0)break;e.yield1(i,o>>18|240),e.yield1(i,o>>12&63|128),e.yield1(i,o>>6&63|128),e.yield1(i,63&o|128)}}},n.$$arity=1),e.def(i,"$bytesize",r=function(e){return e.$bytes().$length()},r.$$arity=1),$&&"bytesize"},t.$$s=a,t.$$arity=0,t)),p(u(s,"Encoding"),"register",["UTF-16LE"],(n=function(){var t,r,i=n.$$s||this;return e.def(i,"$each_byte",t=function(n){var r=t.$$p,i=r||$;r&&(t.$$p=null),r&&(t.$$p=null);for(var o=0,a=n.length;o<a;o++){var s=n.charCodeAt(o);e.yield1(i,255&s),e.yield1(i,s>>8)}},t.$$arity=1),e.def(i,"$bytesize",r=function(e){return e.$bytes().$length()},r.$$arity=1),$&&"bytesize"},n.$$s=a,n.$$arity=0,n)),p(u(s,"Encoding"),"register",["UTF-16BE"],(r=function(){var t,n,i=r.$$s||this;return e.def(i,"$each_byte",t=function(n){var r=t.$$p,i=r||$;r&&(t.$$p=null),r&&(t.$$p=null);for(var o=0,a=n.length;o<a;o++){var s=n.charCodeAt(o);e.yield1(i,s>>8),e.yield1(i,255&s)}},t.$$arity=1),e.def(i,"$bytesize",n=function(e){return e.$bytes().$length()},n.$$arity=1),$&&"bytesize"},r.$$s=a,r.$$arity=0,r)),p(u(s,"Encoding"),"register",["UTF-32LE"],(i=function(){var t,n,r=i.$$s||this;return e.def(r,"$each_byte",t=function(n){var r=t.$$p,i=r||$;r&&(t.$$p=null),r&&(t.$$p=null);for(var o=0,a=n.length;o<a;o++){var s=n.charCodeAt(o);e.yield1(i,255&s),e.yield1(i,s>>8)}},t.$$arity=1),e.def(r,"$bytesize",n=function(e){return e.$bytes().$length()},n.$$arity=1),$&&"bytesize"},i.$$s=a,i.$$arity=0,i)),p(u(s,"Encoding"),"register",["ASCII-8BIT",f(["aliases","ascii","dummy"],{aliases:["BINARY","US-ASCII","ASCII"],ascii:!0,dummy:!0})],(o=function(){var t,n,r=o.$$s||this;return e.def(r,"$each_byte",t=function(n){var r=t.$$p,i=r||$;r&&(t.$$p=null),r&&(t.$$p=null);for(var o=0,a=n.length;o<a;o++){var s=n.charCodeAt(o);e.yield1(i,255&s),e.yield1(i,s>>8)}},t.$$arity=1),e.def(r,"$bytesize",n=function(e){return e.$bytes().$length()},n.$$arity=1),$&&"bytesize"},o.$$s=a,o.$$arity=0,o)),function(t,n,r){var i,o,a,s,f,_,h,m=c(t,null,"String"),y=[m].concat(r);return m.$$prototype.bytes=m.$$prototype.internal_encoding=$,m.$attr_reader("encoding"),m.$attr_reader("internal_encoding"),e.defineProperty(String.prototype,"bytes",$),e.defineProperty(String.prototype,"encoding",l(u(y,"Encoding"),"UTF_8")),e.defineProperty(String.prototype,"internal_encoding",l(u(y,"Encoding"),"UTF_8")),e.def(m,"$bytes",i=function(){var e,t=this;return t.bytes=d(e=t.bytes)?e:t.$each_byte().$to_a(),t.bytes.$dup()},i.$$arity=0),e.def(m,"$bytesize",o=function(){return this.internal_encoding.$bytesize(this)},o.$$arity=0),e.def(m,"$each_byte",a=function(){var e=a.$$p,t=e||$,n=this;return e&&(a.$$p=null),e&&(a.$$p=null),t===$?n.$enum_for("each_byte"):(p(n.internal_encoding,"each_byte",[n],t.$to_proc()),n)},a.$$arity=0),e.def(m,"$encode",s=function(t){return e.enc(this,t)},s.$$arity=1),e.def(m,"$force_encoding",f=function(e){var t=this;return e===t.encoding?t:(e=u(y,"Opal")["$coerce_to!"](e,u(y,"String"),"to_s"),(e=u(y,"Encoding").$find(e))===t.encoding||(t.encoding=e),t)},f.$$arity=1),e.def(m,"$getbyte",_=function(e){var t,n,r=$;return r=this.$bytes(),e=u(y,"Opal")["$coerce_to!"](e,u(y,"Integer"),"to_int"),d((t=r.$length(),n=e,"number"===typeof t&&"number"===typeof n?t<n:t["$<"](n)))?$:r["$[]"](e)},_.$$arity=1),e.def(m,"$valid_encoding?",h=function(){return!0},h.$$arity=0),$&&"valid_encoding?"}(s[0],0,s)},Opal.modules["corelib/struct"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e>t:e["$>"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}function r(e,t){return"number"===typeof e&&"number"===typeof t?e<t:e["$<"](t)}function i(e,t){return"number"===typeof e&&"number"===typeof t?e>=t:e["$>="](t)}function o(e,t){return"number"===typeof e&&"number"===typeof t?e+t:e["$+"](t)}var a=e.top,s=[],$=e.nil,l=(e.const_get_qualified,e.const_get_relative),u=(e.breaker,e.slice,e.klass),c=e.hash2,f=e.truthy,d=e.send;return e.add_stubs(["$require","$include","$const_name!","$unshift","$map","$coerce_to!","$new","$each","$define_struct_attribute","$allocate","$initialize","$alias_method","$module_eval","$to_proc","$const_set","$==","$raise","$<<","$members","$define_method","$instance_eval","$class","$last","$>","$length","$-","$keys","$any?","$join","$[]","$[]=","$each_with_index","$hash","$===","$<","$-@","$size","$>=","$include?","$to_sym","$instance_of?","$__id__","$eql?","$enum_for","$name","$+","$each_pair","$inspect","$each_with_object","$flatten","$to_a","$respond_to?","$dig"]),a.$require("corelib/enumerable"),function(a,s,p){var _,h,m,y,g,v,b,w,x,k,E,O,A,S,C,R,T,I,N,L=u(a,null,"Struct"),D=[L].concat(p);return L.$include(l(D,"Enumerable")),e.defs(L,"$new",_=function(t,n,r){var i,o,a,s,u,p,h=_.$$p,m=h||$,y=this,g=$;if(h&&(_.$$p=null),h&&(_.$$p=null),i=e.slice.call(arguments,1,arguments.length),null==(o=e.extract_kwargs(i)))o=c([],{});else if(!o.$$is_hash)throw e.ArgumentError.$new("expected kwargs");if(a=i,null==(s=o.$$smap.keyword_init)&&(s=!1),f(t))try{t=l(D,"Opal")["$const_name!"](t)}catch(v){if(!e.rescue(v,[l(D,"TypeError"),l(D,"NameError")]))throw v;try{a.$unshift(t),t=$}finally{e.pop_exception()}}return d(a,"map",[],((u=function(e){u.$$s;return null==e&&(e=$),l(D,"Opal")["$coerce_to!"](e,l(D,"String"),"to_str")}).$$s=y,u.$$arity=1,u)),g=d(l(D,"Class"),"new",[y],(p=function(){var t,n=p.$$s||this;return d(a,"each",[],(t=function(e){var n=t.$$s||this;return null==e&&(e=$),n.$define_struct_attribute(e)},t.$$s=n,t.$$arity=1,t)),function(t,n){var r;[t].concat(n);return e.def(t,"$new",r=function(t){var n,r=this,i=$;return n=e.slice.call(arguments,0,arguments.length),(i=r.$allocate()).$$data={},d(i,"initialize",e.to_a(n)),i},r.$$arity=-1),t.$alias_method("[]","new")}(e.get_singleton_class(n),D)},p.$$s=y,p.$$arity=0,p)),f(m)&&d(g,"module_eval",[],m.$to_proc()),g.$$keyword_init=s,f(t)&&l(D,"Struct").$const_set(t,g),g},_.$$arity=-2),e.defs(L,"$define_struct_attribute",h=function(e){var t,n,r=this;return r["$=="](l(D,"Struct"))&&r.$raise(l(D,"ArgumentError"),"you cannot define attributes to the Struct class"),r.$members()["$<<"](e),d(r,"define_method",[e],((t=function(){return(t.$$s||this).$$data[e]}).$$s=r,t.$$arity=0,t)),d(r,"define_method",[e+"="],(n=function(t){var r=n.$$s||this;return null==t&&(t=$),r.$$data[e]=t},n.$$s=r,n.$$arity=1,n))},h.$$arity=1),e.defs(L,"$members",m=function(){var e,t=this;return null==t.members&&(t.members=$),t["$=="](l(D,"Struct"))&&t.$raise(l(D,"ArgumentError"),"the Struct class has no members"),t.members=f(e=t.members)?e:[]},m.$$arity=0),e.defs(L,"$inherited",y=function(e){var t,n,r=this;return null==r.members&&(r.members=$),n=r.members,d(e,"instance_eval",[],((t=function(){return(t.$$s||this).members=n}).$$s=r,t.$$arity=0,t))},y.$$arity=1),e.def(L,"$initialize",g=function(r){var i,o,a,s,u,p=this,_=$,h=$;return i=e.slice.call(arguments,0,arguments.length),o=i,f(p.$class().$$keyword_init)?(_=f(a=o.$last())?a:c([],{}),f(f(a=t(o.$length(),1))?a:1===o.length&&!_.$$is_hash)&&p.$raise(l(D,"ArgumentError"),"wrong number of arguments (given "+o.$length()+", expected 0)"),h=n(_.$keys(),p.$class().$members()),f(h["$any?"]())&&p.$raise(l(D,"ArgumentError"),"unknown keywords: "+h.$join(", ")),d(p.$class().$members(),"each",[],(s=function(t){var r,i=s.$$s||this;return null==t&&(t=$),r=[t,_["$[]"](t)],d(i,"[]=",e.to_a(r)),r[n(r.length,1)]},s.$$s=p,s.$$arity=1,s))):(f(t(o.$length(),p.$class().$members().$length()))&&p.$raise(l(D,"ArgumentError"),"struct size differs"),d(p.$class().$members(),"each_with_index",[],(u=function(t,r){var i,a=u.$$s||this;return null==t&&(t=$),null==r&&(r=$),i=[t,o["$[]"](r)],d(a,"[]=",e.to_a(i)),i[n(i.length,1)]},u.$$s=p,u.$$arity=2,u)))},g.$$arity=-1),e.def(L,"$members",v=function(){return this.$class().$members()},v.$$arity=0),e.def(L,"$hash",b=function(){return l(D,"Hash").$new(this.$$data).$hash()},b.$$arity=0),e.def(L,"$[]",w=function(e){var t=this;return f(l(D,"Integer")["$==="](e))?(f(r(e,t.$class().$members().$size()["$-@"]()))&&t.$raise(l(D,"IndexError"),"offset "+e+" too small for struct(size:"+t.$class().$members().$size()+")"),f(i(e,t.$class().$members().$size()))&&t.$raise(l(D,"IndexError"),"offset "+e+" too large for struct(size:"+t.$class().$members().$size()+")"),e=t.$class().$members()["$[]"](e)):f(l(D,"String")["$==="](e))?t.$$data.hasOwnProperty(e)||t.$raise(l(D,"NameError").$new("no member '"+e+"' in struct",e)):t.$raise(l(D,"TypeError"),"no implicit conversion of "+e.$class()+" into Integer"),e=l(D,"Opal")["$coerce_to!"](e,l(D,"String"),"to_str"),t.$$data[e]},w.$$arity=1),e.def(L,"$[]=",x=function(e,t){var n=this;return f(l(D,"Integer")["$==="](e))?(f(r(e,n.$class().$members().$size()["$-@"]()))&&n.$raise(l(D,"IndexError"),"offset "+e+" too small for struct(size:"+n.$class().$members().$size()+")"),f(i(e,n.$class().$members().$size()))&&n.$raise(l(D,"IndexError"),"offset "+e+" too large for struct(size:"+n.$class().$members().$size()+")"),e=n.$class().$members()["$[]"](e)):f(l(D,"String")["$==="](e))?f(n.$class().$members()["$include?"](e.$to_sym()))||n.$raise(l(D,"NameError").$new("no member '"+e+"' in struct",e)):n.$raise(l(D,"TypeError"),"no implicit conversion of "+e.$class()+" into Integer"),e=l(D,"Opal")["$coerce_to!"](e,l(D,"String"),"to_str"),n.$$data[e]=t},x.$$arity=2),e.def(L,"$==",k=function(e){if(!f(e["$instance_of?"](this.$class())))return!1;var t={},n={};return function e(r,i){var o,a,s;for(o in t[r.$__id__()]=!0,n[i.$__id__()]=!0,r.$$data)if(a=r.$$data[o],s=i.$$data[o],l(D,"Struct")["$==="](a)){if((!t.hasOwnProperty(a.$__id__())||!n.hasOwnProperty(s.$__id__()))&&!e(a,s))return!1}else if(!a["$=="](s))return!1;return!0}(this,e)},k.$$arity=1),e.def(L,"$eql?",E=function(e){if(!f(e["$instance_of?"](this.$class())))return!1;var t={},n={};return function e(r,i){var o,a,s;for(o in t[r.$__id__()]=!0,n[i.$__id__()]=!0,r.$$data)if(a=r.$$data[o],s=i.$$data[o],l(D,"Struct")["$==="](a)){if((!t.hasOwnProperty(a.$__id__())||!n.hasOwnProperty(s.$__id__()))&&!e(a,s))return!1}else if(!a["$eql?"](s))return!1;return!0}(this,e)},E.$$arity=1),e.def(L,"$each",O=function(){var t,n,r=O.$$p,i=r||$,o=this;return r&&(O.$$p=null),i===$?d(o,"enum_for",["each"],((t=function(){return(t.$$s||this).$size()}).$$s=o,t.$$arity=0,t)):(d(o.$class().$members(),"each",[],(n=function(t){var r=n.$$s||this;return null==t&&(t=$),e.yield1(i,r["$[]"](t))},n.$$s=o,n.$$arity=1,n)),o)},O.$$arity=0),e.def(L,"$each_pair",A=function(){var t,n,r=A.$$p,i=r||$,o=this;return r&&(A.$$p=null),i===$?d(o,"enum_for",["each_pair"],((t=function(){return(t.$$s||this).$size()}).$$s=o,t.$$arity=0,t)):(d(o.$class().$members(),"each",[],(n=function(t){var r=n.$$s||this;return null==t&&(t=$),e.yield1(i,[t,r["$[]"](t)])},n.$$s=o,n.$$arity=1,n)),o)},A.$$arity=0),e.def(L,"$length",S=function(){return this.$class().$members().$length()},S.$$arity=0),e.alias(L,"size","length"),e.def(L,"$to_a",C=function(){var e;return d(this.$class().$members(),"map",[],(e=function(t){var n=e.$$s||this;return null==t&&(t=$),n["$[]"](t)},e.$$s=this,e.$$arity=1,e))},C.$$arity=0),e.alias(L,"values","to_a"),e.def(L,"$inspect",R=function(){var e,t,n=this,r=$;return r="#<struct ",f(f(e=l(D,"Struct")["$==="](n))?n.$class().$name():e)&&(r=o(r,n.$class()+" ")),r=o(r,d(n.$each_pair(),"map",[],(t=function(e,n){t.$$s;return null==e&&(e=$),null==n&&(n=$),e+"="+n.$inspect()},t.$$s=n,t.$$arity=2,t)).$join(", ")),r=o(r,">")},R.$$arity=0),e.alias(L,"to_s","inspect"),e.def(L,"$to_h",T=function(){var t;return d(this.$class().$members(),"each_with_object",[c([],{})],(t=function(r,i){var o,a=t.$$s||this;return null==r&&(r=$),null==i&&(i=$),o=[r,a["$[]"](r)],d(i,"[]=",e.to_a(o)),o[n(o.length,1)]},t.$$s=this,t.$$arity=2,t))},T.$$arity=0),e.def(L,"$values_at",I=function(t){var n,r,i,o=this;n=e.slice.call(arguments,0,arguments.length);for(var a=[],s=0,u=(r=d(r=n,"map",[],(i=function(e){i.$$s;return null==e&&(e=$),e.$$is_range?e.$to_a():e},i.$$s=o,i.$$arity=1,i)).$flatten()).length;s<u;s++)r[s].$$is_number||o.$raise(l(D,"TypeError"),"no implicit conversion of "+r[s].$class()+" into Integer"),a.push(o["$[]"](r[s]));return a},I.$$arity=-1),e.def(L,"$dig",N=function(t,n){var r,i=this,o=$;return r=e.slice.call(arguments,1,arguments.length),(o=f(t.$$is_string&&i.$$data.hasOwnProperty(t))&&i.$$data[t]||$)===$||0===r.length?o:(f(o["$respond_to?"]("dig"))||i.$raise(l(D,"TypeError"),o.$class()+" does not have #dig method"),d(o,"dig",e.to_a(r)))},N.$$arity=-2),$&&"dig"}(s[0],0,s)},Opal.modules["corelib/io"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}e.top;var n=[],r=e.nil,i=e.const_get_qualified,o=e.const_get_relative,a=(e.breaker,e.slice,e.klass),s=e.module,$=e.send,l=e.gvars,u=e.truthy,c=r;e.add_stubs(["$attr_accessor","$size","$write","$join","$map","$String","$empty?","$concat","$chomp","$getbyte","$getc","$raise","$new","$write_proc=","$-","$extend"]),function(t,n,i){var c,f,d,p,_=a(t,null,"IO"),h=[_].concat(i);_.$$prototype.tty=_.$$prototype.closed=r,e.const_set(h[0],"SEEK_SET",0),e.const_set(h[0],"SEEK_CUR",1),e.const_set(h[0],"SEEK_END",2),e.def(_,"$tty?",c=function(){return this.tty},c.$$arity=0),e.def(_,"$closed?",f=function(){return this.closed},f.$$arity=0),_.$attr_accessor("write_proc"),e.def(_,"$write",d=function(e){return this.write_proc(e),e.$size()},d.$$arity=1),_.$attr_accessor("sync","tty"),e.def(_,"$flush",p=function(){return r},p.$$arity=0),function(t,n){var i,o,a,c=s(t,"Writable");[c].concat(n);e.def(c,"$<<",i=function(e){return this.$write(e),this},i.$$arity=1),e.def(c,"$print",o=function(t){var n,i,o=this;return null==l[","]&&(l[","]=r),n=e.slice.call(arguments,0,arguments.length),o.$write($(n,"map",[],(i=function(e){var t=i.$$s||this;return null==e&&(e=r),t.$String(e)},i.$$s=o,i.$$arity=1,i)).$join(l[","])),r},o.$$arity=-1),e.def(c,"$puts",a=function(t){var n,i,o=this,a=r;return null==l["/"]&&(l["/"]=r),n=e.slice.call(arguments,0,arguments.length),a=l["/"],u(n["$empty?"]())?o.$write(l["/"]):o.$write($(n,"map",[],(i=function(e){var t=i.$$s||this;return null==e&&(e=r),t.$String(e).$chomp()},i.$$s=o,i.$$arity=1,i)).$concat([r]).$join(a)),r},a.$$arity=-1)}(h[0],h),function(t,n){var i,a,$,u,c=s(t,"Readable"),f=[c].concat(n);e.def(c,"$readbyte",i=function(){return this.$getbyte()},i.$$arity=0),e.def(c,"$readchar",a=function(){return this.$getc()},a.$$arity=0),e.def(c,"$readline",$=function(e){return null==l["/"]&&(l["/"]=r),null==e&&(e=l["/"]),this.$raise(o(f,"NotImplementedError"))},$.$$arity=-1),e.def(c,"$readpartial",u=function(e,t){return null==t&&(t=r),this.$raise(o(f,"NotImplementedError"))},u.$$arity=-2)}(h[0],h)}(n[0],0,n),e.const_set(n[0],"STDERR",l.stderr=o(n,"IO").$new()),e.const_set(n[0],"STDIN",l.stdin=o(n,"IO").$new()),e.const_set(n[0],"STDOUT",l.stdout=o(n,"IO").$new());var f=e.global.console;return c=["object"===typeof process&&"object"===typeof process.stdout?function(e){process.stdout.write(e)}:function(e){f.log(e)}],$(o(n,"STDOUT"),"write_proc=",e.to_a(c)),c[t(c.length,1)],c=["object"===typeof process&&"object"===typeof process.stderr?function(e){process.stderr.write(e)}:function(e){f.warn(e)}],$(o(n,"STDERR"),"write_proc=",e.to_a(c)),c[t(c.length,1)],o(n,"STDOUT").$extend(i(o(n,"IO"),"Writable")),o(n,"STDERR").$extend(i(o(n,"IO"),"Writable"))},Opal.modules["corelib/main"]=function(e){var t,n,r=e.top,i=[],o=e.nil,a=(e.const_get_qualified,e.const_get_relative);e.breaker,e.slice;return e.add_stubs(["$include"]),e.defs(r,"$to_s",t=function(){return"main"},t.$$arity=0),e.defs(r,"$include",n=function(e){return a(i,"Object").$include(e)},n.$$arity=1),o&&"include"},Opal.modules["corelib/dir"]=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative),i=(e.breaker,e.slice,e.klass),o=e.truthy;return e.add_stubs(["$[]"]),function(t,a,s){var $=i(t,null,"Dir"),l=[$].concat(s);return function(t,i){var a,s,$,l=[t].concat(i);return e.def(t,"$chdir",a=function(t){var r=a.$$p,i=r||n,o=n;return r&&(a.$$p=null),function(){try{return o=e.current_dir,e.current_dir=t,e.yieldX(i,[])}finally{e.current_dir=o}}()},a.$$arity=1),e.def(t,"$pwd",s=function(){return e.current_dir||"."},s.$$arity=0),e.alias(t,"getwd","pwd"),e.def(t,"$home",$=function(){var e;return o(e=r(l,"ENV")["$[]"]("HOME"))?e:"."},$.$$arity=0),n&&"home"}(e.get_singleton_class($),l)}(t[0],0,t)},Opal.modules["corelib/file"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e+t:e["$+"](t)}e.top;var n=[],r=e.nil,i=(e.const_get_qualified,e.const_get_relative),o=(e.breaker,e.slice,e.klass),a=e.truthy,s=e.range,$=e.send;return e.add_stubs(["$respond_to?","$to_path","$pwd","$split","$sub","$+","$unshift","$join","$home","$raise","$start_with?","$absolute_path","$coerce_to!","$basename","$empty?","$rindex","$[]","$nil?","$==","$-","$length","$gsub","$find","$=~","$map","$each_with_index","$flatten","$reject","$to_proc","$end_with?"]),function(n,l,u){var c=o(n,l,"File"),f=[c].concat(u),d=r;return e.const_set(f[0],"Separator",e.const_set(f[0],"SEPARATOR","/")),e.const_set(f[0],"ALT_SEPARATOR",r),e.const_set(f[0],"PATH_SEPARATOR",":"),e.const_set(f[0],"FNM_SYSCASE",0),d=/^[a-zA-Z]:(?:\\|\/)/,function(n,o){var l,u,c,f,p,_,h,m,y,g=[n].concat(o);function v(e){return a(e["$respond_to?"]("to_path"))&&(e=e.$to_path()),e=i(g,"Opal")["$coerce_to!"](e,i(g,"String"),"to_str")}function b(){return i(g,"ALT_SEPARATOR")===r?e.escape_regexp(i(g,"SEPARATOR")):e.escape_regexp(t(i(g,"SEPARATOR"),i(g,"ALT_SEPARATOR")))}return e.def(n,"$absolute_path",l=function(e,n){var o,s,$,l,u,c,f=r,p=r,_=r,h=r,m=r;null==n&&(n=r),s=i(g,"SEPARATOR"),$=b(),f=[],e=a(e["$respond_to?"]("to_path"))?e.$to_path():e,n=a(o=n)?o:i(g,"Dir").$pwd(),l=e.substr(0,s.length)===s||d.test(e),u=n.substr(0,s.length)===s||d.test(n),a(l)?(p=e.$split(new RegExp("["+$+"]")),_=d.test(e)?"":e.$sub(new RegExp("^(["+$+"]+).*$"),"\\1"),h=!0):(p=t(n.$split(new RegExp("["+$+"]")),e.$split(new RegExp("["+$+"]"))),_=d.test(n)?"":n.$sub(new RegExp("^(["+$+"]+).*$"),"\\1"),h=u);for(var y=0,v=p.length;y<v;y++)(c=p[y])===r||""===c&&(0===f.length||h)||"."===c&&(0===f.length||h)||(".."===c?f.pop():f.push(c));return h||"."===p[0]||f.$unshift("."),m=f.$join(s),a(h)&&(m=t(_,m)),m},l.$$arity=-2),e.def(n,"$expand_path",u=function(e,n){var o,s,$=this,l=r,u=r,c=r;return null==n&&(n=r),o=i(g,"SEPARATOR"),s=b(),a("~"===e[0]||n&&"~"===n[0])&&(l=i(g,"Dir").$home(),a(l)||$.$raise(i(g,"ArgumentError"),"couldn't find HOME environment -- expanding `~'"),u=d.test(l)?"":l.$sub(new RegExp("^(["+s+"]+).*$"),"\\1"),a(l["$start_with?"](u))||$.$raise(i(g,"ArgumentError"),"non-absolute home"),l=t(l,o),c=new RegExp("^\\~(?:"+o+"|$)"),e=e.$sub(c,l),a(n)&&(n=n.$sub(c,l))),$.$absolute_path(e,n)},u.$$arity=-2),e.alias(n,"realpath","expand_path"),e.def(n,"$dirname",c=function(e){var t;t=b();var n=(e=v(e)).match(new RegExp("^["+t+"]"));return""===(e=(e=(e=e.replace(new RegExp("["+t+"]+$"),"")).replace(new RegExp("[^"+t+"]+$"),"")).replace(new RegExp("["+t+"]+$"),""))?n?"/":".":e},c.$$arity=1),e.def(n,"$basename",f=function(t,n){var o;return null==n&&(n=r),o=b(),0==(t=v(t)).length||(n=n!==r?i(g,"Opal")["$coerce_to!"](n,i(g,"String"),"to_str"):null,t=(t=t.replace(new RegExp("(.)["+o+"]*$"),"$1")).replace(new RegExp("^(?:.*["+o+"])?([^"+o+"]+)$"),"$1"),".*"===n?t=t.replace(/\.[^\.]+$/,""):null!==n&&(n=e.escape_regexp(n),t=t.replace(new RegExp(n+"$"),""))),t},f.$$arity=-2),e.def(n,"$extname",p=function(n){var i,o,$,l=r,u=r;return n=v(n),l=this.$basename(n),a(l["$empty?"]())?"":(u=l["$[]"](s(1,-1,!1)).$rindex("."),a(a(i=u["$nil?"]())?i:t(u,1)["$=="]((o=l.$length(),$=1,"number"===typeof o&&"number"===typeof $?o-$:o["$-"]($))))?"":l["$[]"](e.Range.$new(t(u,1),-1,!1)))},p.$$arity=1),e.def(n,"$exist?",_=function(t){return null!=e.modules[t]},_.$$arity=1),e.alias(n,"exists?","exist?"),e.def(n,"$directory?",h=function(t){var n,o=r;for(var a in o=[],e.modules)o.push(a);return t=t.$gsub(new RegExp("(^."+i(g,"SEPARATOR")+"+|"+i(g,"SEPARATOR")+"+$)")),$(o,"find",[],((n=function(e){n.$$s;return null==e&&(e=r),e["$=~"](new RegExp("^"+t))}).$$s=this,n.$$arity=1,n))},h.$$arity=1),e.def(n,"$join",m=function(n){var o,s,l,u,c=this,f=r;return o=e.slice.call(arguments,0,arguments.length),a((s=o)["$empty?"]())?"":(f="",s=$(s.$flatten().$each_with_index(),"map",[],((l=function(e,n){l.$$s;return null==e&&(e=r),null==n&&(n=r),a(n["$=="](0)?e["$empty?"]():n["$=="](0))||a(s.$length()["$=="](t(n,1))?e["$empty?"]():s.$length()["$=="](t(n,1)))?i(g,"SEPARATOR"):e}).$$s=c,l.$$arity=2,l)),s=$(s,"reject",[],"empty?".$to_proc()),$(s,"each_with_index",[],((u=function(e,n){u.$$s;var o,$=r;return null==e&&(e=r),null==n&&(n=r),$=s["$[]"](t(n,1)),a($["$nil?"]())?f=""+f+e:(a(a(o=e["$end_with?"](i(g,"SEPARATOR")))?$["$start_with?"](i(g,"SEPARATOR")):o)&&(e=e.$sub(new RegExp(i(g,"SEPARATOR")+"+$"),"")),f=a(a(o=e["$end_with?"](i(g,"SEPARATOR")))?o:$["$start_with?"](i(g,"SEPARATOR")))?""+f+e:""+f+e+i(g,"SEPARATOR"))}).$$s=c,u.$$arity=2,u)),f)},m.$$arity=-1),e.def(n,"$split",y=function(e){return e.$split(i(g,"SEPARATOR"))},y.$$arity=1),r&&"split"}(e.get_singleton_class(c),f)}(n[0],i(n,"IO"),n)},Opal.modules["corelib/process"]=function(e){e.top;var t=[],n=e.nil,r=e.const_get_qualified,i=e.const_get_relative,o=(e.breaker,e.slice,e.klass),a=e.truthy;return e.add_stubs(["$const_set","$size","$<<","$__register_clock__","$to_f","$now","$new","$[]","$raise"]),function(t,s,$){var l,u,c,f,d=o(t,null,"Process"),p=[d].concat($),_=n;if(d.__clocks__=[],e.defs(d,"$__register_clock__",l=function(e,t){var r=this;return null==r.__clocks__&&(r.__clocks__=n),r.$const_set(e,r.__clocks__.$size()),r.__clocks__["$<<"](t)},l.$$arity=2),d.$__register_clock__("CLOCK_REALTIME",(function(){return Date.now()})),_=!1,e.global.performance)_=function(){return performance.now()};else if(e.global.process&&process.hrtime){var h=process.hrtime();_=function(){var e=process.hrtime(h),t=e[1]/1e3|0;return 1e3*e[0]+t/1e3}}a(_)&&d.$__register_clock__("CLOCK_MONOTONIC",_),e.defs(d,"$pid",u=function(){return 0},u.$$arity=0),e.defs(d,"$times",c=function(){var e;return e=i(p,"Time").$now().$to_f(),r(i(p,"Benchmark"),"Tms").$new(e,e,e,e,e)},c.$$arity=0),e.defs(d,"$clock_gettime",f=function(e,t){var o=this,s=n;null==o.__clocks__&&(o.__clocks__=n),null==t&&(t="float_second"),a(s=o.__clocks__["$[]"](e))||o.$raise(r(i(p,"Errno"),"EINVAL"),"clock_gettime("+e+") "+o.__clocks__["$[]"](e));var $=s();switch(t){case"float_second":return $/1e3;case"float_millisecond":return $/1;case"float_microsecond":return 1e3*$;case"second":return $/1e3|0;case"millisecond":return $/1|0;case"microsecond":return 1e3*$|0;case"nanosecond":return 1e6*$|0;default:o.$raise(i(p,"ArgumentError"),"unexpected unit: "+t)}},f.$$arity=-2)}(t[0],0,t),function(t,r,i){var a,s=o(t,null,"Signal");[s].concat(i);e.defs(s,"$trap",a=function(t){return e.slice.call(arguments,0,arguments.length),n},a.$$arity=-1)}(t[0],0,t),function(t,r,i){var a,s=o(t,null,"GC");[s].concat(i);return e.defs(s,"$start",a=function(){return n},a.$$arity=0),n&&"start"}(t[0],0,t)},Opal.modules["corelib/unsupported"]=function(e){var t,n,r=e.top,i=[],o=e.nil,a=(e.const_get_qualified,e.const_get_relative),s=(e.breaker,e.slice,e.klass),$=e.module;e.add_stubs(["$raise","$warn","$%"]);var l={};function u(t){switch(e.config.unsupported_features_severity){case"error":a(i,"Kernel").$raise(a(i,"NotImplementedError"),t);break;case"warning":!function(e){if(l[e])return;l[e]=!0,r.$warn(e)}(t)}}return function(t,n,r){var i,o,$,l,u,c,f,d,p,_,h,m,y,g,v,b,w,x,k,E,O,A,S,C=s(t,null,"String"),R=[C].concat(r),T="String#%s not supported. Mutable String methods are not supported in Opal.";e.def(C,"$<<",i=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("<<"))},i.$$arity=-1),e.def(C,"$capitalize!",o=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("capitalize!"))},o.$$arity=-1),e.def(C,"$chomp!",$=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("chomp!"))},$.$$arity=-1),e.def(C,"$chop!",l=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("chop!"))},l.$$arity=-1),e.def(C,"$downcase!",u=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("downcase!"))},u.$$arity=-1),e.def(C,"$gsub!",c=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("gsub!"))},c.$$arity=-1),e.def(C,"$lstrip!",f=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("lstrip!"))},f.$$arity=-1),e.def(C,"$next!",d=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("next!"))},d.$$arity=-1),e.def(C,"$reverse!",p=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("reverse!"))},p.$$arity=-1),e.def(C,"$slice!",_=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("slice!"))},_.$$arity=-1),e.def(C,"$squeeze!",h=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("squeeze!"))},h.$$arity=-1),e.def(C,"$strip!",m=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("strip!"))},m.$$arity=-1),e.def(C,"$sub!",y=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("sub!"))},y.$$arity=-1),e.def(C,"$succ!",g=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("succ!"))},g.$$arity=-1),e.def(C,"$swapcase!",v=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("swapcase!"))},v.$$arity=-1),e.def(C,"$tr!",b=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("tr!"))},b.$$arity=-1),e.def(C,"$tr_s!",w=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("tr_s!"))},w.$$arity=-1),e.def(C,"$upcase!",x=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("upcase!"))},x.$$arity=-1),e.def(C,"$prepend",k=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("prepend"))},k.$$arity=-1),e.def(C,"$[]=",E=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("[]="))},E.$$arity=-1),e.def(C,"$clear",O=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("clear"))},O.$$arity=-1),e.def(C,"$encode!",A=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("encode!"))},A.$$arity=-1),e.def(C,"$unicode_normalize!",S=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(R,"NotImplementedError"),T["$%"]("unicode_normalize!"))},S.$$arity=-1)}(i[0],0,i),function(t,n){var r,i,o=$(t,"Kernel"),a=([o].concat(n),"Object freezing is not supported by Opal");e.def(o,"$freeze",r=function(){return u(a),this},r.$$arity=0),e.def(o,"$frozen?",i=function(){return u(a),!1},i.$$arity=0)}(i[0],i),function(t,n){var r,i,o,a=$(t,"Kernel"),s=([a].concat(n),"Object tainting is not supported by Opal");e.def(a,"$taint",r=function(){return u(s),this},r.$$arity=0),e.def(a,"$untaint",i=function(){return u(s),this},i.$$arity=0),e.def(a,"$tainted?",o=function(){return u(s),!1},o.$$arity=0)}(i[0],i),function(t,n,r){var i,a,$,l,u=s(t,null,"Module");[u].concat(r);e.def(u,"$public",i=function(t){var n=this;return 0===e.slice.call(arguments,0,arguments.length).length&&(n.$$module_function=!1),o},i.$$arity=-1),e.alias(u,"private","public"),e.alias(u,"protected","public"),e.alias(u,"nesting","public"),e.def(u,"$private_class_method",a=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n},a.$$arity=-1),e.alias(u,"public_class_method","private_class_method"),e.def(u,"$private_method_defined?",$=function(e){return!1},$.$$arity=1),e.def(u,"$private_constant",l=function(t){return e.slice.call(arguments,0,arguments.length),o},l.$$arity=-1),e.alias(u,"protected_method_defined?","private_method_defined?"),e.alias(u,"public_instance_methods","instance_methods"),e.alias(u,"public_instance_method","instance_method"),e.alias(u,"public_method_defined?","method_defined?")}(i[0],0,i),function(t,n){var r,i=$(t,"Kernel");[i].concat(n);e.def(i,"$private_methods",r=function(t){return e.slice.call(arguments,0,arguments.length),[]},r.$$arity=-1),e.alias(i,"private_instance_methods","private_methods")}(i[0],i),function(t,n){var r,i=$(t,"Kernel"),o=[i].concat(n);e.def(i,"$eval",r=function(t){var n=this;return e.slice.call(arguments,0,arguments.length),n.$raise(a(o,"NotImplementedError"),"To use Kernel#eval, you must first require 'opal-parser'. See https://github.com/opal/opal/blob/"+a(o,"RUBY_ENGINE_VERSION")+"/docs/opal_parser.md for details.")},r.$$arity=-1)}(i[0],i),e.defs(r,"$public",t=function(t){return e.slice.call(arguments,0,arguments.length),o},t.$$arity=-1),e.defs(r,"$private",n=function(t){return e.slice.call(arguments,0,arguments.length),o},n.$$arity=-1),o&&"private"},function(e){var t=e.top;e.nil,e.const_get_qualified,e.const_get_relative,e.breaker,e.slice;e.add_stubs(["$require"]),t.$require("opal/base"),t.$require("opal/mini"),t.$require("corelib/string/encoding"),t.$require("corelib/struct"),t.$require("corelib/io"),t.$require("corelib/main"),t.$require("corelib/dir"),t.$require("corelib/file"),t.$require("corelib/process"),t.$require("corelib/unsupported")}(Opal),factory=function(e){Opal.modules["asciidoctor/js/opal_ext/browser/file"]=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative),i=(e.breaker,e.slice,e.klass);return e.add_stubs(["$new"]),function(t,o,a){var s,$=i(t,null,"File"),l=[$].concat(a);return e.defs($,"$read",s=function(e){var t="",n=-1;try{var i=new XMLHttpRequest;i.open("GET",e,!1),i.addEventListener("load",(function(){0!==(n=this.status)&&200!==n||(t=this.responseText)})),i.overrideMimeType("text/plain"),i.send()}catch(o){throw r(l,"IOError").$new("Error reading file or directory: "+e+"; reason: "+o.message)}if(404===n||0===n&&!t)throw r(l,"IOError").$new("No such file or directory: "+e);return t},s.$$arity=1),n&&"read"}(t[0],0,t)},Opal.modules["asciidoctor/js/opal_ext/browser"]=function(t){var n,r,i,o,a=t.top,s=[];if(t.nil,t.const_get_qualified,t.const_get_relative,t.breaker,t.slice,t.add_stubs(["$require"]),"object"===typeof e&&"object"===typeof e.runtime){var $=e.runtime;n=$.platform,r=$.engine,i=$.framework,o=$.ioModule}return o=o||"xmlhttprequest",n=n||"browser",r=r||"",i=i||"",t.const_set(s[0],"JAVASCRIPT_IO_MODULE",o),t.const_set(s[0],"JAVASCRIPT_PLATFORM",n),t.const_set(s[0],"JAVASCRIPT_ENGINE",r),t.const_set(s[0],"JAVASCRIPT_FRAMEWORK",i),a.$require("asciidoctor/js/opal_ext/browser/file")},Opal.modules["asciidoctor/js/asciidoctor_ext/browser/abstract_node"]=function(e){e.top;var t=[],n=e.nil,r=e.const_get_qualified,i=e.const_get_relative,o=(e.breaker,e.slice,e.module),a=e.klass,s=e.hash2,$=e.truthy;return e.add_stubs(["$uriish?","$[]","$web_path","$path_resolver","$descends_from?","$base_dir","$start_with?","$attr?","$join","$prepare_source_string","$read","$fetch","$warn","$logger","$normalize_system_path","$read_asset"]),function(t,l){var u=[o(t,"Asciidoctor")].concat(l);!function(t,o,l){var u,c,f=a(t,null,"AbstractNode"),d=[f].concat(l);f.$$prototype.document=n,e.def(f,"$read_contents",u=function(t,o){var a,l,u,c=this,f=n,p=n;if(null==o&&(o=s([],{})),f=c.document,!$($(a=i(d,"Helpers")["$uriish?"](t))?a:$(l=$(u=p=o["$[]"]("start"))?i(d,"Helpers")["$uriish?"](p):u)?t=f.$path_resolver().$web_path(t,p):l))return t=c.$normalize_system_path(t,o["$[]"]("start"),n,s(["target_name"],{target_name:$(a=o["$[]"]("label"))?a:"asset"})),c.$read_asset(t,s(["normalize","warn_on_failure","label"],{normalize:o["$[]"]("normalize"),warn_on_failure:o.$fetch("warn_on_failure",!0),label:o["$[]"]("label")}));if(!$($(a=$(l=f.$path_resolver()["$descends_from?"](t,f.$base_dir()))?l:t["$start_with?"]("chrome://"))?a:f["$attr?"]("allow-uri-read")))return $(o.$fetch("warn_on_failure",!0))&&c.$logger().$warn("cannot retrieve contents of "+($(a=o["$[]"]("label"))?a:"asset")+" at URI: "+t+" (allow-uri-read attribute not enabled)"),n;try{return $(o["$[]"]("normalize"))?i(d,"Helpers").$prepare_source_string(r("::","File").$read(t)).$join(i(d,"LF")):r("::","File").$read(t)}catch(_){if(!e.rescue(_,[i(d,"StandardError")]))throw _;try{return $(o.$fetch("warn_on_failure",!0))&&c.$logger().$warn("could not retrieve contents of "+($(a=o["$[]"]("label"))?a:"asset")+" at URI: "+t),n}finally{e.pop_exception()}}},u.$$arity=-2),e.def(f,"$generate_data_uri_from_uri",c=function(e,t){null==t&&(t=!1);var n="",r="",i=-1;try{var o=new XMLHttpRequest;o.open("GET",e,!1),o.overrideMimeType("text/plain; charset=x-user-defined"),o.addEventListener("load",(function(){if(0===(i=this.status)||200===i){for(var e="",t=this.responseText,o=0,a=t.length;o<a;++o){var s=255&t.charCodeAt(o);e+=String.fromCharCode(s)}r=btoa(e),n=this.getResponseHeader("content-type")}})),o.send(null),n||(e.endsWith(".jpeg")||e.endsWith(".jpg")||e.endsWith(".jpe")?n="image/jpg":e.endsWith(".png")?n="image/png":e.endsWith(".svg")?n="image/svg+xml":e.endsWith(".bmp")?n="image/bmp":(e.endsWith(".tif")||e.endsWith(".tiff"))&&(n="image/tiff"))}catch(a){i=0}return 404!==i&&(0!==i||r&&n)?"data:"+n+";base64,"+r:(this.$logger().$warn("could not retrieve image data from URI: "+e),e)},c.$$arity=-2)}(u[0],0,u)}(t[0],t)},Opal.modules["asciidoctor/js/asciidoctor_ext/browser/open_uri"]=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative),i=(e.breaker,e.slice,e.module),o=e.send;return e.add_stubs(["$new","$path"]),function(t,a){var s,$=[i(t,"OpenURI")].concat(a);e.defs(r($,"OpenURI"),"$open_uri",s=function(t,i){var a,l=s.$$p,u=l||n,c=this,f=n;return l&&(s.$$p=null),a=e.slice.call(arguments,1,arguments.length),f=o(r($,"File"),"new",[c.$path()].concat(e.to_a(a))),u!==n?e.yield1(u,f):f},s.$$arity=-2)}(t[0],t)},Opal.modules["asciidoctor/js/asciidoctor_ext/browser/path_resolver"]=function(e){e.top;var t=[],n=(e.nil,e.const_get_qualified,e.const_get_relative,e.breaker,e.slice,e.module),r=e.klass,i=e.truthy;return e.add_stubs(["$absolute_path?","$start_with?"]),function(t,o){var a=[n(t,"Asciidoctor")].concat(o);!function(t,n,o){var a,s=r(t,null,"PathResolver");[s].concat(o),e.def(s,"$root?",a=function(e){var t;return i(t=this["$absolute_path?"](e))?t:e["$start_with?"]("file://","http://","https://","chrome://")},a.$$arity=1)}(a[0],0,a)}(t[0],t)},Opal.modules["asciidoctor/js/asciidoctor_ext/browser/reader"]=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative),i=(e.breaker,e.slice,e.module),o=e.klass,a=e.truthy;return e.add_stubs(["$posixify","$new","$base_dir","$start_with?","$uriish?","$descends_from?","$key?","$attributes","$replace_next_line","$absolute_path?","$==","$empty?","$!","$slice","$length"]),function(t,s){var $=[i(t,"Asciidoctor")].concat(s);!function(t,i,s){var $,l=o(t,i,"PreprocessorReader"),u=[l].concat(s);l.$$prototype.path_resolver=l.$$prototype.document=l.$$prototype.include_stack=l.$$prototype.dir=n,e.def(l,"$resolve_include_path",$=function(e,t,i){var o,s=this,$=n,l=n,c=n,f=n,d=n,p=n,_=n;if($=(s.path_resolver=a(o=s.path_resolver)?o:r(u,"PathResolver").$new("\\")).$posixify(e),o=["file",s.document.$base_dir()],l=o[1],a($["$start_with?"]("file://")))c=f=$;else if(a(r(u,"Helpers")["$uriish?"]($))){if(!a(a(o=s.path_resolver["$descends_from?"]($,l))?o:s.document.$attributes()["$key?"]("allow-uri-read")))return s.$replace_next_line("link:"+e+"["+t+"]");c=f=$}else if(a(s.path_resolver["$absolute_path?"]($)))c=f="file://"+(a($["$start_with?"]("/"))?"":"/")+$;else if((d=a(p=s.include_stack["$empty?"]())?l:s.dir)["$=="]("."))c=f=$;else if(a(a(o=d["$start_with?"]("file://"))?o:r(u,"Helpers")["$uriish?"](d)["$!"]()))c=d+"/"+$,f=a(p)?$:a(a(o=l["$=="]("."))?o:(_=s.path_resolver["$descends_from?"](c,l))["$!"]())?c:c.$slice(_,c.$length());else if(a(p))c=d+"/"+(f=$);else{if(!a(a(o=_=s.path_resolver["$descends_from?"](d,l))?o:s.document.$attributes()["$key?"]("allow-uri-read")))return s.$replace_next_line("link:"+e+"["+t+"]");c=d+"/"+$,f=a(_)?c.$slice(_,c.$length()):$}return[c,"file",f]},$.$$arity=3)}($[0],r($,"Reader"),$)}(t[0],t)},Opal.modules["asciidoctor/js/asciidoctor_ext/browser"]=function(e){var t=e.top,n=e.nil,r=(e.const_get_qualified,e.const_get_relative);return e.breaker,e.slice,e.add_stubs(["$==","$require"]),r([],"JAVASCRIPT_IO_MODULE")["$=="]("xmlhttprequest")?(t.$require("asciidoctor/js/asciidoctor_ext/browser/abstract_node"),t.$require("asciidoctor/js/asciidoctor_ext/browser/open_uri"),t.$require("asciidoctor/js/asciidoctor_ext/browser/path_resolver"),t.$require("asciidoctor/js/asciidoctor_ext/browser/reader")):n},Opal.modules.set=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e<t:e["$<"](t)}function r(e,t){return"number"===typeof e&&"number"===typeof t?e<=t:e["$<="](t)}e.top;var i=[],o=e.nil,a=(e.const_get_qualified,e.const_get_relative),s=(e.breaker,e.slice,e.klass),$=e.hash2,l=e.truthy,u=e.send,c=e.module;return e.add_stubs(["$include","$new","$nil?","$===","$raise","$each","$add","$merge","$class","$respond_to?","$subtract","$dup","$join","$to_a","$equal?","$instance_of?","$==","$instance_variable_get","$is_a?","$size","$all?","$include?","$[]=","$-","$enum_for","$[]","$<<","$replace","$delete","$select","$each_key","$to_proc","$empty?","$eql?","$instance_eval","$clear","$<","$<=","$keys"]),function(i,c,f){var d,p,_,h,m,y,g,v,b,w,x,k,E,O,A,S,C,R,T,I,N,L,D,P,M,z,F,j,B=s(i,null,"Set"),q=[B].concat(f);B.$$prototype.hash=o,B.$include(a(q,"Enumerable")),e.defs(B,"$[]",d=function(t){var n,r=this;return n=e.slice.call(arguments,0,arguments.length),r.$new(n)},d.$$arity=-1),e.def(B,"$initialize",p=function(t){var n,r=p.$$p,i=r||o,s=this;return r&&(p.$$p=null),r&&(p.$$p=null),null==t&&(t=o),s.hash=$([],{}),l(t["$nil?"]())?o:(l(a(q,"Enumerable")["$==="](t))||s.$raise(a(q,"ArgumentError"),"value must be enumerable"),l(i)?u(t,"each",[],(n=function(t){var r=n.$$s||this;return null==t&&(t=o),r.$add(e.yield1(i,t))},n.$$s=s,n.$$arity=1,n)):s.$merge(t))},p.$$arity=-1),e.def(B,"$dup",_=function(){return this.$class().$new().$merge(this)},_.$$arity=0),e.def(B,"$-",h=function(e){return l(e["$respond_to?"]("each"))||this.$raise(a(q,"ArgumentError"),"value must be enumerable"),this.$dup().$subtract(e)},h.$$arity=1),e.alias(B,"difference","-"),e.def(B,"$inspect",m=function(){return"#<Set: {"+this.$to_a().$join(",")+"}>"},m.$$arity=0),e.def(B,"$==",y=function(e){var t,n,r=this;return!!l(r["$equal?"](e))||(l(e["$instance_of?"](r.$class()))?r.hash["$=="](e.$instance_variable_get("@hash")):!!l(l(t=e["$is_a?"](a(q,"Set")))?r.$size()["$=="](e.$size()):t)&&u(e,"all?",[],(n=function(e){var t=n.$$s||this;return null==t.hash&&(t.hash=o),null==e&&(e=o),t.hash["$include?"](e)},n.$$s=r,n.$$arity=1,n)))},y.$$arity=1),e.def(B,"$add",g=function(n){var r;return r=[n,!0],u(this.hash,"[]=",e.to_a(r)),t(r.length,1),this},g.$$arity=1),e.alias(B,"<<","add"),e.def(B,"$classify",v=function(){var n,r,i=v.$$p,s=i||o,$=this,l=o;return i&&(v.$$p=null),i&&(v.$$p=null),s===o?$.$enum_for("classify"):(l=u(a(q,"Hash"),"new",[],(n=function(r,i){var a,s=n.$$s||this;return null==r&&(r=o),null==i&&(i=o),a=[i,s.$class().$new()],u(r,"[]=",e.to_a(a)),a[t(a.length,1)]},n.$$s=$,n.$$arity=2,n)),u($,"each",[],((r=function(t){return r.$$s,null==t&&(t=o),l["$[]"](e.yield1(s,t)).$add(t)}).$$s=$,r.$$arity=1,r)),l)},v.$$arity=0),e.def(B,"$collect!",b=function(){var t,n=b.$$p,r=n||o,i=this,a=o;return n&&(b.$$p=null),n&&(b.$$p=null),r===o?i.$enum_for("collect!"):(a=i.$class().$new(),u(i,"each",[],((t=function(n){return t.$$s,null==n&&(n=o),a["$<<"](e.yield1(r,n))}).$$s=i,t.$$arity=1,t)),i.$replace(a))},b.$$arity=0),e.alias(B,"map!","collect!"),e.def(B,"$delete",w=function(e){return this.hash.$delete(e),this},w.$$arity=1),e.def(B,"$delete?",x=function(e){var t=this;return l(t["$include?"](e))?(t.$delete(e),t):o},x.$$arity=1),e.def(B,"$delete_if",k=function(){var t,n,r=k.$$p,i=r||o,a=this;return r&&(k.$$p=null),i===o?a.$enum_for("delete_if"):(u(u(a,"select",[],((t=function(n){return t.$$s,null==n&&(n=o),e.yield1(i,n)}).$$s=a,t.$$arity=1,t)),"each",[],(n=function(e){var t=n.$$s||this;return null==t.hash&&(t.hash=o),null==e&&(e=o),t.hash.$delete(e)},n.$$s=a,n.$$arity=1,n)),a)},k.$$arity=0),e.def(B,"$add?",E=function(e){return l(this["$include?"](e))?o:this.$add(e)},E.$$arity=1),e.def(B,"$each",O=function(){var e=O.$$p,t=e||o,n=this;return e&&(O.$$p=null),e&&(O.$$p=null),t===o?n.$enum_for("each"):(u(n.hash,"each_key",[],t.$to_proc()),n)},O.$$arity=0),e.def(B,"$empty?",A=function(){return this.hash["$empty?"]()},A.$$arity=0),e.def(B,"$eql?",S=function(e){var t;return this.hash["$eql?"](u(e,"instance_eval",[],(t=function(){var e=t.$$s||this;return null==e.hash&&(e.hash=o),e.hash},t.$$s=this,t.$$arity=0,t)))},S.$$arity=1),e.def(B,"$clear",C=function(){return this.hash.$clear(),this},C.$$arity=0),e.def(B,"$include?",R=function(e){return this.hash["$include?"](e)},R.$$arity=1),e.alias(B,"member?","include?"),e.def(B,"$merge",T=function(e){var t;return u(e,"each",[],(t=function(e){var n=t.$$s||this;return null==e&&(e=o),n.$add(e)},t.$$s=this,t.$$arity=1,t)),this},T.$$arity=1),e.def(B,"$replace",I=function(e){var t=this;return t.$clear(),t.$merge(e),t},I.$$arity=1),e.def(B,"$size",N=function(){return this.hash.$size()},N.$$arity=0),e.alias(B,"length","size"),e.def(B,"$subtract",L=function(e){var t;return u(e,"each",[],(t=function(e){var n=t.$$s||this;return null==e&&(e=o),n.$delete(e)},t.$$s=this,t.$$arity=1,t)),this},L.$$arity=1),e.def(B,"$|",D=function(e){return l(e["$respond_to?"]("each"))||this.$raise(a(q,"ArgumentError"),"value must be enumerable"),this.$dup().$merge(e)},D.$$arity=1),e.def(B,"$superset?",P=function(e){var t,r=this;return l(e["$is_a?"](a(q,"Set")))||r.$raise(a(q,"ArgumentError"),"value must be a set"),!l(n(r.$size(),e.$size()))&&u(e,"all?",[],(t=function(e){var n=t.$$s||this;return null==e&&(e=o),n["$include?"](e)},t.$$s=r,t.$$arity=1,t))},P.$$arity=1),e.alias(B,">=","superset?"),e.def(B,"$proper_superset?",M=function(e){var t,n=this;return l(e["$is_a?"](a(q,"Set")))||n.$raise(a(q,"ArgumentError"),"value must be a set"),!l(r(n.$size(),e.$size()))&&u(e,"all?",[],(t=function(e){var n=t.$$s||this;return null==e&&(e=o),n["$include?"](e)},t.$$s=n,t.$$arity=1,t))},M.$$arity=1),e.alias(B,">","proper_superset?"),e.def(B,"$subset?",z=function(e){var t,r=this;return l(e["$is_a?"](a(q,"Set")))||r.$raise(a(q,"ArgumentError"),"value must be a set"),!l(n(e.$size(),r.$size()))&&u(r,"all?",[],((t=function(n){return t.$$s,null==n&&(n=o),e["$include?"](n)}).$$s=r,t.$$arity=1,t))},z.$$arity=1),e.alias(B,"<=","subset?"),e.def(B,"$proper_subset?",F=function(e){var t,n=this;return l(e["$is_a?"](a(q,"Set")))||n.$raise(a(q,"ArgumentError"),"value must be a set"),!l(r(e.$size(),n.$size()))&&u(n,"all?",[],((t=function(n){return t.$$s,null==n&&(n=o),e["$include?"](n)}).$$s=n,t.$$arity=1,t))},F.$$arity=1),e.alias(B,"<","proper_subset?"),e.alias(B,"+","|"),e.alias(B,"union","|"),e.def(B,"$to_a",j=function(){return this.hash.$keys()},j.$$arity=0)}(i[0],0,i),function(t,n){var r,i=c(t,"Enumerable"),s=[i].concat(n);e.def(i,"$to_set",r=function(t,n){var i,$,l,c=r.$$p,f=c||o,d=this;return c&&(r.$$p=null),c&&(r.$$p=null),(i=e.slice.call(arguments,0,arguments.length)).length>0&&($=i[0],i.splice(0,1)),null==$&&($=a(s,"Set")),l=i,u($,"new",[d].concat(e.to_a(l)),f.$to_proc())},r.$$arity=-1)}(i[0],i)},Opal.modules["asciidoctor/js/opal_ext/kernel"]=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative),i=(e.breaker,e.slice,e.module),o=e.send;return e.add_stubs(["$new"]),function(t,a){var s,$,l=i(t,"Kernel"),u=[l].concat(a);e.def(l,"$open",s=function(t,i){var a,$=s.$$p,l=$||n,c=n;return $&&(s.$$p=null),a=e.slice.call(arguments,1,arguments.length),c=o(r(u,"File"),"new",[t].concat(e.to_a(a))),l!==n?e.yield1(l,c):c},s.$$arity=-2),e.def(l,"$__dir__",$=function(){return""},$.$$arity=0)}(t[0],t)},Opal.modules["asciidoctor/js/opal_ext/file"]=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative),i=(e.breaker,e.slice,e.klass),o=e.truthy,a=e.gvars;return e.add_stubs(["$attr_reader","$delete","$gsub","$read","$size","$to_enum","$chomp","$each_line","$readlines","$split"]),function(t,s,$){var l,u,c,f,d=i(t,null,"File"),p=[d].concat($);d.$$prototype.eof=d.$$prototype.path=n,d.$attr_reader("eof"),d.$attr_reader("lineno"),d.$attr_reader("path"),e.def(d,"$initialize",l=function(e,t){var r,i=this;return null==t&&(t="r"),i.path=e,i.contents=n,i.eof=!1,i.lineno=0,r=/:(.*)/,t=(t=t.$delete("b")).$gsub(r,""),i.flags=t},l.$$arity=-2),e.def(d,"$read",u=function(){var e=this,t=n;return o(e.eof)?"":(t=r(p,"File").$read(e.path),e.eof=!0,e.lineno=t.$size(),t)},u.$$arity=0),e.def(d,"$each_line",c=function(t){var i=c.$$p,s=i||n,$=this,l=n;if(null==a["/"]&&(a["/"]=n),i&&(c.$$p=null),i&&(c.$$p=null),null==t&&(t=a["/"]),o($.eof))return s!==n?$:[].$to_enum();if(s!==n){l=r(p,"File").$read($.path),$.eof=!1,$.lineno=0;for(var u=l.$chomp(),f=l.length!=u.length,d=u.split(t),_=0,h=d.length;_<h;_++)$.lineno+=1,_<h-1||f?e.yield1(s,d[_]+t):e.yield1(s,d[_]);return $.eof=!0,$}return $.$read().$each_line()},c.$$arity=-1),e.def(d,"$readlines",f=function(){return r(p,"File").$readlines(this.path)},f.$$arity=0),function(t,i){var o,s,$,l,u=[t].concat(i);e.def(t,"$readlines",o=function(e,t){return null==a["/"]&&(a["/"]=n),null==t&&(t=a["/"]),r(u,"File").$read(e).$split(t)},o.$$arity=-2),e.def(t,"$file?",s=function(e){return!0},s.$$arity=1),e.def(t,"$readable?",$=function(e){return!0},$.$$arity=1),e.def(t,"$read",l=function(e){return""},l.$$arity=1)}(e.get_singleton_class(d),p)}(t[0],0,t),function(t,o,a){var s,$=i(t,null,"IO"),l=[$].concat(a);return e.defs($,"$read",s=function(e){return r(l,"File").$read(e)},s.$$arity=1),n&&"read"}(t[0],0,t)},Opal.modules["asciidoctor/js/opal_ext/match_data"]=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative,e.breaker,e.slice,e.klass),i=e.send;return e.add_stubs(["$[]=","$-"]),function(t,o,a){var s,$=r(t,null,"MatchData");return[$].concat(a),$.$$prototype.matches=n,e.def($,"$[]=",s=function(t,n){var r,o,a;return r=[t,n],i(this.matches,"[]=",e.to_a(r)),r[(o=r.length,a=1,"number"===typeof o&&"number"===typeof a?o-a:o["$-"](a))]},s.$$arity=2),n&&"[]="}(t[0],0,t)},Opal.modules["asciidoctor/js/opal_ext/string"]=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative,e.breaker,e.slice,e.klass),i=e.truthy;return e.add_stubs(["$method_defined?","$<","$length","$bytes","$to_s","$byteslice","$==","$>=","$-","$_original_byteslice","$_original_unpack"]),function(t,o,a){var s,$,l,u=r(t,null,"String");return[u].concat(a),i(u["$method_defined?"]("limit_bytesize"))||e.def(u,"$limit_bytesize",s=function(e){var t,n,r=this;return i((t=e,n=r.$bytes().$length(),"number"===typeof t&&"number"===typeof n?t<n:t["$<"](n)))?r.$byteslice(0,e).$to_s():r.$to_s()},s.$$arity=1),i(u["$method_defined?"]("limit"))||e.alias(u,"limit","limit_bytesize"),e.alias(u,"_original_byteslice","byteslice"),e.def(u,"$byteslice",$=function(e,t){var n,r,o,a=this;return null==t&&(t=1),i(i(n=e["$=="](3)?(o=e,"number"===typeof(r=t)&&"number"===typeof o?r>=o:r["$>="](o)):e["$=="](3))?65279===a.charCodeAt():n)?a.substr(1).$byteslice(0,function(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}(t,3)):a.$_original_byteslice(e,t)},$.$$arity=-2),e.alias(u,"_original_unpack","unpack"),e.def(u,"$unpack",l=function(e){var t=this;if(e["$=="]("C3")){if(i(65279===t.charCodeAt()))return[239,187,191];for(var r=[],o=0;o<3;o++)o<t.length?r.push(t.charCodeAt(o)):r.push(n);return r}return t.$_original_unpack(e)},l.$$arity=1),n&&"unpack"}(t[0],0,t)},Opal.modules["asciidoctor/js/opal_ext/uri"]=function(e){e.top;var t=[],n=(e.nil,e.const_get_qualified,e.const_get_relative),r=(e.breaker,e.slice,e.module);return e.add_stubs(["$extend"]),function(t,i){var o,a,s=r(t,"URI"),$=[s].concat(i);e.defs(s,"$parse",o=function(e){return e.$extend(n($,"URI"))},o.$$arity=1),e.def(s,"$path",a=function(){return this},a.$$arity=0)}(t[0],t)},Opal.modules["asciidoctor/js/opal_ext/base64"]=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative,e.breaker,e.slice,e.module),i=e.hash2,o=e.truthy;return e.add_stubs(["$delete"]),function(t,a){var s,$,l,u,c,f,d,p,_=r(t,"Base64");[_].concat(a),d=e.global.btoa||function(e){return(e instanceof Buffer?e:Buffer.from(e.toString(),"binary")).toString("base64")},p=e.global.atob||function(e){return Buffer.from(e,"base64").toString("binary")},e.defs(_,"$decode64",s=function(e){return p(e.replace(/\r?\n/g,""))},s.$$arity=1),e.defs(_,"$encode64",$=function(e){return d(e).replace(/(.{60})/g,"$1\n").replace(/([^\n])$/g,"$1\n")},$.$$arity=1),e.defs(_,"$strict_decode64",l=function(e){return p(e)},l.$$arity=1),e.defs(_,"$strict_encode64",u=function(e){return d(e)},u.$$arity=1),e.defs(_,"$urlsafe_decode64",c=function(e){return p(e.replace(/\-/g,"+").replace(/_/g,"/"))},c.$$arity=1),e.defs(_,"$urlsafe_encode64",f=function(t,r){var a,s=n;if(null==r)r=i([],{});else if(!r.$$is_hash)throw e.ArgumentError.$new("expected kwargs");return null==(a=r.$$smap.padding)&&(a=!0),s=d(t).replace(/\+/g,"-").replace(/\//g,"_"),o(a)||(s=s.$delete("=")),s},f.$$arity=-2)}(t[0],t)},Opal.modules["asciidoctor/js/opal_ext/number"]=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative),i=(e.breaker,e.slice,e.klass),o=e.truthy;return e.add_stubs(["$coerce_to!","$>"]),function(t,a,s){var $,l=i(t,a,"Number"),u=[l].concat(s);return e.def(l,"$round",$=function(e){var t,n;return e=r(u,"Opal")["$coerce_to!"](e,r(u,"Integer"),"to_int"),o((n=0,"number"===typeof(t=e)&&"number"===typeof n?t>n:t["$>"](n)))?Number(this.toFixed(e)):Math.round(this)},$.$$arity=-1),n&&"round"}(t[0],r(t,"Numeric"),t)},Opal.modules["asciidoctor/js/opal_ext"]=function(e){var t=e.top;e.nil,e.const_get_qualified,e.const_get_relative,e.breaker,e.slice,e.add_stubs(["$require"]),t.$require("asciidoctor/js/opal_ext/kernel"),t.$require("asciidoctor/js/opal_ext/file"),t.$require("asciidoctor/js/opal_ext/match_data"),t.$require("asciidoctor/js/opal_ext/string"),t.$require("asciidoctor/js/opal_ext/uri"),t.$require("asciidoctor/js/opal_ext/base64"),t.$require("asciidoctor/js/opal_ext/number"),e.config.unsupported_features_severity="ignore",t.$require("asciidoctor/js/opal_ext/browser")},Opal.modules["asciidoctor/js/rx"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e+t:e["$+"](t)}e.top;var n=[],r=e.nil,i=(e.const_get_qualified,e.const_get_relative),o=(e.breaker,e.slice,e.module),a=e.send,s=e.gvars,$=e.truthy;return e.add_stubs(["$gsub","$+","$unpack_hex_range"]),function(n,l){var u,c=o(n,"Asciidoctor"),f=[c].concat(l);e.const_set(f[0],"HEX_RANGE_RX",/([A-F0-9]{4})(?:-([A-F0-9]{4}))?/),e.defs(c,"$unpack_hex_range",u=function(e){var t;return a(e,"gsub",[i(f,"HEX_RANGE_RX")],((t=function(){var e,n;return t.$$s,"\\u"+((e=s["~"])===r?r:e["$[]"](1))+($(e=(n=s["~"])===r?r:n["$[]"](2))?"-\\u"+((n=s["~"])===r?r:n["$[]"](2)):e)}).$$s=this,t.$$arity=0,t))},u.$$arity=1),e.const_set(f[0],"P_L",t("A-Za-z",c.$unpack_hex_range("00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D037F03860388-038A038C038E-03A103A3-03F503F7-0481048A-052F0531-055605590561-058705D0-05EA05F0-05F20620-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280840-085808A0-08B20904-0939093D09500958-09610971-09800985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10CF10CF20D05-0D0C0D0E-0D100D12-0D3A0D3D0D4E0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC-0EDF0F000F40-0F470F49-0F6C0F88-0F8C1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510C710CD10D0-10FA10FC-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA16F1-16F81700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191E1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1BBA-1BE51C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11CF51CF61D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209C21022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2CF22CF32D00-2D252D272D2D2D30-2D672D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31BA31F0-31FF3400-4DB54E00-9FCCA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A66EA67F-A69DA6A0-A6E5A717-A71FA722-A788A78B-A78EA790-A7ADA7B0A7B1A7F7-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFA9E0-A9E4A9E6-A9EFA9FA-A9FEAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA7E-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDAAE0-AAEAAAF2-AAF4AB01-AB06AB09-AB0EAB11-AB16AB20-AB26AB28-AB2EAB30-AB5AAB5C-AB5FAB64AB65ABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC"))),e.const_set(f[0],"P_Nl",c.$unpack_hex_range("16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF")),e.const_set(f[0],"P_Nd",t("0-9",c.$unpack_hex_range("0660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0DE6-0DEF0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19D91A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9A9F0-A9F9AA50-AA59ABF0-ABF9FF10-FF19"))),e.const_set(f[0],"P_Pc",c.$unpack_hex_range("005F203F20402054FE33FE34FE4D-FE4FFF3F")),e.const_set(f[0],"CC_ALPHA",""+i(f,"P_L")+i(f,"P_Nl")),e.const_set(f[0],"CG_ALPHA","["+i(f,"CC_ALPHA")+"]"),e.const_set(f[0],"CC_ALNUM",""+i(f,"CC_ALPHA")+i(f,"P_Nd")),e.const_set(f[0],"CG_ALNUM","["+i(f,"CC_ALNUM")+"]"),e.const_set(f[0],"CC_WORD",""+i(f,"CC_ALNUM")+i(f,"P_Pc")),e.const_set(f[0],"CG_WORD","["+i(f,"CC_WORD")+"]"),e.const_set(f[0],"CG_BLANK","[ \\t]"),e.const_set(f[0],"CC_EOL","(?=\\n|$)"),e.const_set(f[0],"CG_GRAPH","[^\\s\\x00-\\x1F\\x7F]"),e.const_set(f[0],"CC_ALL","[\\s\\S]"),e.const_set(f[0],"CC_ANY","[^\\n]")}(n[0],n)},Opal.modules.strscan=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative,e.breaker,e.slice,e.klass),i=e.send;return e.add_stubs(["$attr_reader","$anchor","$scan_until","$length","$size","$rest","$pos=","$-","$private"]),function(t,o,a){var s,$,l,u,c,f,d,p,_,h,m,y,g,v,b,w,x,k,E,O,A,S,C,R,T,I=r(t,null,"StringScanner");return[I].concat(a),I.$$prototype.pos=I.$$prototype.string=I.$$prototype.working=I.$$prototype.matched=I.$$prototype.prev_pos=I.$$prototype.match=n,I.$attr_reader("pos"),I.$attr_reader("matched"),e.def(I,"$initialize",s=function(e){var t=this;return t.string=e,t.pos=0,t.matched=n,t.working=e,t.match=[]},s.$$arity=1),I.$attr_reader("string"),e.def(I,"$beginning_of_line?",$=function(){var e=this;return 0===e.pos||"\n"===e.string.charAt(e.pos-1)},$.$$arity=0),e.alias(I,"bol?","beginning_of_line?"),e.def(I,"$scan",l=function(e){var t=this,r=(e=t.$anchor(e)).exec(t.working);return null==r?t.matched=n:"object"===typeof r?(t.prev_pos=t.pos,t.pos+=r[0].length,t.working=t.working.substring(r[0].length),t.matched=r[0],t.match=r,r[0]):"string"===typeof r?(t.pos+=r.length,t.working=t.working.substring(r.length),r):n},l.$$arity=1),e.def(I,"$scan_until",u=function(e){var t=this;e=t.$anchor(e);for(var r,i=t.pos,o=t.working;;){if(r=e.exec(o),i+=1,o=o.substr(1),null!=r)return t.matched=t.string.substr(t.pos,i-t.pos-1+r[0].length),t.prev_pos=i-1,t.pos=i,t.working=o.substr(r[0].length),t.matched;if(0===o.length)return t.matched=n}},u.$$arity=1),e.def(I,"$[]",c=function(e){var t=this.match;return e<0&&(e+=t.length),e<0||e>=t.length||null==t[e]?n:t[e]},c.$$arity=1),e.def(I,"$check",f=function(e){var t=this,r=(e=t.$anchor(e)).exec(t.working);return t.matched=null==r?n:r[0]},f.$$arity=1),e.def(I,"$check_until",d=function(e){var t=this,r=t.prev_pos,i=t.pos,o=t.$scan_until(e);return o!==n&&(t.matched=o.substr(-1),t.working=t.string.substr(i)),t.prev_pos=r,t.pos=i,o},d.$$arity=1),e.def(I,"$peek",p=function(e){return this.working.substring(0,e)},p.$$arity=1),e.def(I,"$eos?",_=function(){return 0===this.working.length},_.$$arity=0),e.def(I,"$exist?",h=function(e){var t=e.exec(this.working);return null==t?n:0==t.index?0:t.index+1},h.$$arity=1),e.def(I,"$skip",m=function(e){var t=this,r=(e=t.$anchor(e)).exec(t.working);if(null==r)return t.matched=n;var i=r[0],o=i.length;return t.matched=i,t.prev_pos=t.pos,t.pos+=o,t.working=t.working.substring(o),o},m.$$arity=1),e.def(I,"$skip_until",y=function(e){var t=this.$scan_until(e);return t===n?n:(this.matched=t.substr(-1),t.length)},y.$$arity=1),e.def(I,"$get_byte",g=function(){var e=this,t=n;return e.pos<e.string.length?(e.prev_pos=e.pos,e.pos+=1,t=e.matched=e.working.substring(0,1),e.working=e.working.substring(1)):e.matched=n,t},g.$$arity=0),e.alias(I,"getch","get_byte"),e.def(I,"$match?",v=function(e){var t=this,r=(e=t.$anchor(e)).exec(t.working);return null==r?n:(t.prev_pos=t.pos,r[0].length)},v.$$arity=1),e.def(I,"$pos=",b=function(e){var t=this;return e<0&&(e+=t.string.$length()),t.pos=e,t.working=t.string.slice(e)},b.$$arity=1),e.def(I,"$matched_size",w=function(){return this.matched===n?n:this.matched.length},w.$$arity=0),e.def(I,"$post_match",x=function(){var e=this;return e.matched===n?n:e.string.substr(e.pos)},x.$$arity=0),e.def(I,"$pre_match",k=function(){var e=this;return e.matched===n?n:e.string.substr(0,e.prev_pos)},k.$$arity=0),e.def(I,"$reset",E=function(){var e=this;return e.working=e.string,e.matched=n,e.pos=0},E.$$arity=0),e.def(I,"$rest",O=function(){return this.working},O.$$arity=0),e.def(I,"$rest?",A=function(){return 0!==this.working.length},A.$$arity=0),e.def(I,"$rest_size",S=function(){return this.$rest().$size()},S.$$arity=0),e.def(I,"$terminate",C=function(){var t,r,o,a=this;return a.match=n,t=[a.string.$length()],i(a,"pos=",e.to_a(t)),t[(r=t.length,o=1,"number"===typeof r&&"number"===typeof o?r-o:r["$-"](o))]},C.$$arity=0),e.def(I,"$unscan",R=function(){var e=this;return e.pos=e.prev_pos,e.prev_pos=n,e.match=n,e},R.$$arity=0),I.$private(),e.def(I,"$anchor",T=function(e){var t=e.toString().match(/\/([^\/]+)$/);return t=t?t[1]:void 0,new RegExp("^(?:"+e.source+")",t)},T.$$arity=1),n&&"anchor"}(t[0],0,t)},Opal.modules["asciidoctor/js"]=function(e){var t=e.top;return e.nil,e.const_get_qualified,e.const_get_relative,e.breaker,e.slice,e.add_stubs(["$require"]),t.$require("asciidoctor/js/opal_ext"),t.$require("asciidoctor/js/rx"),t.$require("strscan")},Opal.modules["asciidoctor/core_ext/nil_or_empty"]=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative,e.breaker,e.slice,e.klass),i=e.truthy;return e.add_stubs(["$method_defined?"]),function(t,n,o){var a=r(t,null,"NilClass");[a].concat(o),i(a["$method_defined?"]("nil_or_empty?"))||e.alias(a,"nil_or_empty?","nil?")}(t[0],0,t),function(t,n,o){var a=r(t,null,"String");[a].concat(o),i(a["$method_defined?"]("nil_or_empty?"))||e.alias(a,"nil_or_empty?","empty?")}(t[0],0,t),function(t,n,o){var a=r(t,null,"Array");[a].concat(o),i(a["$method_defined?"]("nil_or_empty?"))||e.alias(a,"nil_or_empty?","empty?")}(t[0],0,t),function(t,n,o){var a=r(t,null,"Hash");[a].concat(o),i(a["$method_defined?"]("nil_or_empty?"))||e.alias(a,"nil_or_empty?","empty?")}(t[0],0,t),function(t,o,a){var s=r(t,null,"Numeric");return[s].concat(a),i(s["$method_defined?"]("nil_or_empty?"))?n:e.alias(s,"nil_or_empty?","nil?")}(t[0],0,t)},Opal.modules["asciidoctor/core_ext/hash/merge"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e<t:e["$<"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e>t:e["$>"](t)}var r,i=e.top,o=[],a=e.nil,s=(e.const_get_qualified,e.const_get_relative),$=(e.breaker,e.slice,e.send),l=e.truthy,u=e.hash2;return e.add_stubs(["$==","$arity","$instance_method","$send","$new","$<","$length","$>","$inject","$merge","$[]"]),s(o,"Hash").$instance_method("merge").$arity()["$=="](1)?s(o,"Hash").$send("prepend",$(s(o,"Module"),"new",[],(r=function(){var i,o=r.$$s||this;return e.def(o,"$merge",i=function(r){var o,s,c,f=i.$$p,d=this,p=a;return f&&(i.$$p=null),o=e.slice.call(arguments,0,arguments.length),l(t(p=(s=o).$length(),1))?$(d,e.find_super_dispatcher(d,"merge",i,!1),[u([],{})],null):l(n(p,1))?$(s,"inject",[d],((c=function(e,t){return c.$$s,null==e&&(e=a),null==t&&(t=a),e.$merge(t)}).$$s=d,c.$$arity=2,c)):$(d,e.find_super_dispatcher(d,"merge",i,!1),[s["$[]"](0)],null)},i.$$arity=-1),a&&"merge"},r.$$s=i,r.$$arity=0,r))):a},Opal.modules["asciidoctor/core_ext/match_data/names"]=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative),i=(e.breaker,e.slice,e.truthy),o=e.klass;return e.add_stubs(["$method_defined?"]),i(r(t,"MatchData")["$method_defined?"]("names"))?n:function(t,r,i){var a,s=o(t,null,"MatchData");return[s].concat(i),e.def(s,"$names",a=function(){return[]},a.$$arity=0),n&&"names"}(t[0],0,t)},Opal.modules["asciidoctor/core_ext"]=function(e){var t=e.top,n=e.nil,r=(e.const_get_qualified,e.const_get_relative);return e.breaker,e.slice,e.add_stubs(["$=="]),t.$require("asciidoctor/core_ext.rb/../core_ext/nil_or_empty"),t.$require("asciidoctor/core_ext.rb/../core_ext/hash/merge"),r([],"RUBY_ENGINE")["$=="]("opal")?t.$require("asciidoctor/core_ext.rb/../core_ext/match_data/names"):n},Opal.modules["asciidoctor/helpers"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e+t:e["$+"](t)}e.top;var r=[],i=e.nil,o=e.const_get_qualified,a=e.const_get_relative,s=(e.breaker,e.slice,e.module),$=e.truthy,l=e.gvars,u=e.send,c=e.hash2;return e.add_stubs(["$module_function","$require","$include?","$include","$==","$===","$path","$message","$raise","$warn","$logger","$chomp","$empty?","$slice","$unpack","$[]","$byteslice","$bytesize","$[]=","$-","$map","$rstrip","$encode","$encoding","$nil_or_empty?","$!=","$tap","$each_line","$<<","$match?","$gsub","$rindex","$index","$basename","$extname","$!","$length","$directory?","$dirname","$mkdir_p","$mkdir","$private_constant","$join","$divmod","$*","$+","$to_s","$to_i","$succ","$class_for_name","$const_get"]),function(r,f){var d=[s(r,"Asciidoctor")].concat(f);!function(r,f){var d,p,_,h,m,y,g,v,b,w,x,k,E,O,A,S,C=s(r,"Helpers"),R=[C].concat(f);C.$module_function(),e.def(C,"$require_library",d=function(t,n,r){var s=this,u=i,c=i;null==l["!"]&&(l["!"]=i),null==n&&(n=!0),null==r&&(r="abort");try{return s.$require(t)}catch(f){if(!e.rescue(f,[o("::","LoadError")]))throw f;try{return $(s["$include?"](a(R,"Logging")))||s.$include(a(R,"Logging")),$(n)?(n["$=="](!0)&&(n=t),"abort"["$==="](u=r)?(c=l["!"].$path()["$=="](n)?"":" (reason: "+($(l["!"].$path())?"cannot load '"+l["!"].$path()+"'":l["!"].$message())+")",s.$raise(o("::","LoadError"),"asciidoctor: FAILED: required gem '"+n+"' is not available"+c+". Processing aborted.")):"warn"["$==="](u)&&(c=l["!"].$path()["$=="](n)?"":" (reason: "+($(l["!"].$path())?"cannot load '"+l["!"].$path()+"'":l["!"].$message())+")",s.$logger().$warn("optional gem '"+n+"' is not available"+c+". Functionality disabled."))):"abort"["$==="](u=r)?s.$raise(o("::","LoadError"),"asciidoctor: FAILED: "+l["!"].$message().$chomp(".")+". Processing aborted."):"warn"["$==="](u)&&s.$logger().$warn(l["!"].$message().$chomp(".")+". Functionality disabled."),i}finally{e.pop_exception()}}},d.$$arity=-2),e.def(C,"$prepare_source_array",p=function(n,r){var s,l,c,f,d,p,_,h,m=this,y=i,g=i,v=i,b=i;return null==r&&(r=!0),$(n["$empty?"]())?[]:(y=(g=(v=n["$[]"](0)).$unpack("C3")).$slice(0,2))["$=="](a(R,"BOM_BYTES_UTF_16LE"))?(b=[0,v.$byteslice(2,v.$bytesize())],u(n,"[]=",e.to_a(b)),b[t(b.length,1)],$(r)?u(n,"map",[],((s=function(e){return s.$$s,null==e&&(e=i),e.$encode(a(R,"UTF_8"),o(o("::","Encoding"),"UTF_16LE")).$rstrip()}).$$s=m,s.$$arity=1,s)):u(n,"map",[],((l=function(e){return l.$$s,null==e&&(e=i),e.$encode(a(R,"UTF_8"),o(o("::","Encoding"),"UTF_16LE")).$chomp()}).$$s=m,l.$$arity=1,l))):y["$=="](a(R,"BOM_BYTES_UTF_16BE"))?(b=[0,v.$byteslice(2,v.$bytesize())],u(n,"[]=",e.to_a(b)),b[t(b.length,1)],$(r)?u(n,"map",[],((c=function(e){return c.$$s,null==e&&(e=i),e.$encode(a(R,"UTF_8"),o(o("::","Encoding"),"UTF_16BE")).$rstrip()}).$$s=m,c.$$arity=1,c)):u(n,"map",[],((f=function(e){return f.$$s,null==e&&(e=i),e.$encode(a(R,"UTF_8"),o(o("::","Encoding"),"UTF_16BE")).$chomp()}).$$s=m,f.$$arity=1,f))):(g["$=="](a(R,"BOM_BYTES_UTF_8"))&&(b=[0,v.$byteslice(3,v.$bytesize())],u(n,"[]=",e.to_a(b)),b[t(b.length,1)]),v.$encoding()["$=="](a(R,"UTF_8"))?$(r)?u(n,"map",[],((d=function(e){return d.$$s,null==e&&(e=i),e.$rstrip()}).$$s=m,d.$$arity=1,d)):u(n,"map",[],((p=function(e){return p.$$s,null==e&&(e=i),e.$chomp()}).$$s=m,p.$$arity=1,p)):$(r)?u(n,"map",[],((_=function(e){return _.$$s,null==e&&(e=i),e.$encode(a(R,"UTF_8")).$rstrip()}).$$s=m,_.$$arity=1,_)):u(n,"map",[],((h=function(e){return h.$$s,null==e&&(e=i),e.$encode(a(R,"UTF_8")).$chomp()}).$$s=m,h.$$arity=1,h)))},p.$$arity=-2),e.def(C,"$prepare_source_string",_=function(e,t){var n,r,s=i,l=i;return null==t&&(t=!0),$(e["$nil_or_empty?"]())?[]:((s=(l=e.$unpack("C3")).$slice(0,2))["$=="](a(R,"BOM_BYTES_UTF_16LE"))?e=e.$byteslice(2,e.$bytesize()).$encode(a(R,"UTF_8"),o(o("::","Encoding"),"UTF_16LE")):s["$=="](a(R,"BOM_BYTES_UTF_16BE"))?e=e.$byteslice(2,e.$bytesize()).$encode(a(R,"UTF_8"),o(o("::","Encoding"),"UTF_16BE")):l["$=="](a(R,"BOM_BYTES_UTF_8"))?(e=e.$byteslice(3,e.$bytesize())).$encoding()["$=="](a(R,"UTF_8"))||(e=e.$encode(a(R,"UTF_8"))):$(e.$encoding()["$!="](a(R,"UTF_8")))&&(e=e.$encode(a(R,"UTF_8"))),$(t)?u([],"tap",[],(n=function(t){var r,o=n.$$s||this;return null==t&&(t=i),u(e,"each_line",[],((r=function(e){return r.$$s,null==e&&(e=i),t["$<<"](e.$rstrip())}).$$s=o,r.$$arity=1,r))},n.$$s=this,n.$$arity=1,n)):u([],"tap",[],(r=function(t){var n,o=r.$$s||this;return null==t&&(t=i),u(e,"each_line",[],((n=function(e){return n.$$s,null==e&&(e=i),t["$<<"](e.$chomp())}).$$s=o,n.$$arity=1,n))},r.$$s=this,r.$$arity=1,r)))},_.$$arity=-2),e.def(C,"$uriish?",h=function(e){var t;return $(t=e["$include?"](":"))?a(R,"UriSniffRx")["$match?"](e):t},h.$$arity=1),a(R,"RUBY_ENGINE")["$=="]("opal")&&e.def(C,"$encode_uri_component",m=function(e){return encodeURIComponent(e).replace(/%20|[!'()*]/g,(function(e){return"%20"===e?"+":"%"+e.charCodeAt(0).toString(16)}))},m.$$arity=1),e.def(C,"$encode_spaces_in_uri",y=function(e){return $(e["$include?"](" "))?e.$gsub(" ","%20"):e},y.$$arity=1),e.def(C,"$rootname",g=function(e){var t;return $(t=e.$rindex("."))?$(e.$index("/",t))?e:e.$slice(0,t):e},g.$$arity=1),e.def(C,"$basename",v=function(e,t){var n=this;return null==t&&(t=i),$(t)?o("::","File").$basename(e,t["$=="](!0)?n.$extname(e):t):o("::","File").$basename(e)},v.$$arity=-2),e.def(C,"$extname?",b=function(e){var t,n;return $(t=n=e.$rindex("."))?e.$index("/",n)["$!"]():t},b.$$arity=1),$(o(o("::","File"),"ALT_SEPARATOR"))?e.def(C,"$extname",w=function(e,t){var n,r;return null==t&&(t=""),$(r=e.$rindex("."))?$($(n=e.$index("/",r))?n:e.$index(o(o("::","File"),"ALT_SEPARATOR"),r))?t:e.$slice(r,e.$length()):t},w.$$arity=-2):e.def(C,"$extname",x=function(e,t){var n;return null==t&&(t=""),$(n=e.$rindex("."))?$(e.$index("/",n))?t:e.$slice(n,e.$length()):t},x.$$arity=-2),e.def(C,"$mkdir_p",k=function(t){var n=i;if($(o("::","File")["$directory?"](t)))return i;(n=o("::","File").$dirname(t))["$=="](".")||this.$mkdir_p(n);try{return o("::","Dir").$mkdir(t)}catch(r){if(!e.rescue(r,[o("::","SystemCallError")]))throw r;try{return $(o("::","File")["$directory?"](t))?i:this.$raise()}finally{e.pop_exception()}}},k.$$arity=1),e.const_set(R[0],"ROMAN_NUMERALS",c(["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"],{M:1e3,CM:900,D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1})),C.$private_constant("ROMAN_NUMERALS"),e.def(C,"$int_to_roman",E=function(t){var n;return u(a(R,"ROMAN_NUMERALS"),"map",[],(n=function(r,o){var a,s,$,l,u;return n.$$s,null==r&&(r=i),null==o&&(o=i),s=t.$divmod(o),$=null==(a=e.to_ary(s))[0]?i:a[0],t=null==a[1]?i:a[1],u=$,"number"===typeof(l=r)&&"number"===typeof u?l*u:l["$*"](u)},n.$$s=this,n.$$arity=2,n)).$join()},E.$$arity=1),e.def(C,"$nextval",O=function(e){var t=i;return $(o("::","Integer")["$==="](e))?n(e,1):(t=e.$to_i()).$to_s()["$=="](e.$to_s())?n(t,1):e.$succ()},O.$$arity=1),e.def(C,"$resolve_class",A=function(e){return $(o("::","Class")["$==="](e))?e:$(o("::","String")["$==="](e))?this.$class_for_name(e):i},A.$$arity=1),e.def(C,"$class_for_name",S=function(t){var n=i;try{return $(o("::","Class")["$==="](n=o("::","Object").$const_get(t,!1)))||this.$raise(),n}catch(r){if(!e.rescue(r,[a(R,"StandardError")]))throw r;try{return this.$raise(o("::","NameError"),"Could not resolve class for name: "+t)}finally{e.pop_exception()}}},S.$$arity=1)}(d[0],d)}(r[0],r)},Opal.modules.logger=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e<=t:e["$<="](t)}e.top;var n=[],r=e.nil,i=e.const_get_qualified,o=e.const_get_relative,a=(e.breaker,e.slice,e.klass),s=e.module,$=e.send,l=e.truthy;return e.add_stubs(["$include","$to_h","$map","$constants","$const_get","$to_s","$format","$chr","$strftime","$message_as_string","$===","$+","$message","$class","$join","$backtrace","$inspect","$attr_reader","$attr_accessor","$new","$key","$upcase","$raise","$add","$to_proc","$<=","$<","$write","$call","$[]","$now"]),function(n,u,c){var f,d,p,_,h,m,y,g,v,b,w,x,k,E,O,A=a(n,null,"Logger"),S=[A].concat(c);return A.$$prototype.level=A.$$prototype.progname=A.$$prototype.pipe=A.$$prototype.formatter=r,function(t,n){var r=[s(t,"Severity")].concat(n);e.const_set(r[0],"DEBUG",0),e.const_set(r[0],"INFO",1),e.const_set(r[0],"WARN",2),e.const_set(r[0],"ERROR",3),e.const_set(r[0],"FATAL",4),e.const_set(r[0],"UNKNOWN",5)}(S[0],S),A.$include(o(S,"Severity")),e.const_set(S[0],"SEVERITY_LABELS",$(o(S,"Severity").$constants(),"map",[],(f=function(e){return f.$$s,null==e&&(e=r),[o(S,"Severity").$const_get(e),e.$to_s()]},f.$$s=A,f.$$arity=1,f)).$to_h()),function(t,n,s){var $,u,c=a(t,null,"Formatter"),f=[c].concat(s);e.const_set(f[0],"MESSAGE_FORMAT","%s, [%s] %5s -- %s: %s\n"),e.const_set(f[0],"DATE_TIME_FORMAT","%Y-%m-%dT%H:%M:%S.%6N"),e.def(c,"$call",$=function(e,t,n,r){return this.$format(o(f,"MESSAGE_FORMAT"),e.$chr(),t.$strftime(o(f,"DATE_TIME_FORMAT")),e,n,this.$message_as_string(r))},$.$$arity=4),e.def(c,"$message_as_string",u=function(e){var t,n=r;return function(){return n=e,i("::","String")["$==="](n)?e:i("::","Exception")["$==="](n)?(r=e.$message()+" ("+e.$class()+")\n",o=(l(t=e.$backtrace())?t:[]).$join("\n"),"number"===typeof r&&"number"===typeof o?r+o:r["$+"](o)):e.$inspect();var r,o}()},u.$$arity=1)}(S[0],0,S),A.$attr_reader("level"),A.$attr_accessor("progname"),A.$attr_accessor("formatter"),e.def(A,"$initialize",d=function(e){var t=this;return t.pipe=e,t.level=o(S,"DEBUG"),t.formatter=o(S,"Formatter").$new()},d.$$arity=1),e.def(A,"$level=",p=function(e){var t=this,n=r;return l(i("::","Integer")["$==="](e))?t.level=e:l(n=o(S,"SEVERITY_LABELS").$key(e.$to_s().$upcase()))?t.level=n:t.$raise(o(S,"ArgumentError"),"invalid log level: "+e)},p.$$arity=1),e.def(A,"$info",_=function(e){var t=_.$$p,n=t||r;return t&&(_.$$p=null),t&&(_.$$p=null),null==e&&(e=r),$(this,"add",[o(S,"INFO"),r,e],n.$to_proc())},_.$$arity=-1),e.def(A,"$debug",h=function(e){var t=h.$$p,n=t||r;return t&&(h.$$p=null),t&&(h.$$p=null),null==e&&(e=r),$(this,"add",[o(S,"DEBUG"),r,e],n.$to_proc())},h.$$arity=-1),e.def(A,"$warn",m=function(e){var t=m.$$p,n=t||r;return t&&(m.$$p=null),t&&(m.$$p=null),null==e&&(e=r),$(this,"add",[o(S,"WARN"),r,e],n.$to_proc())},m.$$arity=-1),e.def(A,"$error",y=function(e){var t=y.$$p,n=t||r;return t&&(y.$$p=null),t&&(y.$$p=null),null==e&&(e=r),$(this,"add",[o(S,"ERROR"),r,e],n.$to_proc())},y.$$arity=-1),e.def(A,"$fatal",g=function(e){var t=g.$$p,n=t||r;return t&&(g.$$p=null),t&&(g.$$p=null),null==e&&(e=r),$(this,"add",[o(S,"FATAL"),r,e],n.$to_proc())},g.$$arity=-1),e.def(A,"$unknown",v=function(e){var t=v.$$p,n=t||r;return t&&(v.$$p=null),t&&(v.$$p=null),null==e&&(e=r),$(this,"add",[o(S,"UNKNOWN"),r,e],n.$to_proc())},v.$$arity=-1),e.def(A,"$info?",b=function(){return t(this.level,o(S,"INFO"))},b.$$arity=0),e.def(A,"$debug?",w=function(){return t(this.level,o(S,"DEBUG"))},w.$$arity=0),e.def(A,"$warn?",x=function(){return t(this.level,o(S,"WARN"))},x.$$arity=0),e.def(A,"$error?",k=function(){return t(this.level,o(S,"ERROR"))},k.$$arity=0),e.def(A,"$fatal?",E=function(){return t(this.level,o(S,"FATAL"))},E.$$arity=0),e.def(A,"$add",O=function(t,n,a){var s,$,u,c=O.$$p,f=c||r,d=this;return c&&(O.$$p=null),c&&(O.$$p=null),null==n&&(n=r),null==a&&(a=r),l(($=t=l(s=t)?s:o(S,"UNKNOWN"),u=d.level,"number"===typeof $&&"number"===typeof u?$<u:$["$<"](u)))||(a=l(s=a)?s:d.progname,l(n)||(f!==r?n=e.yieldX(f,[]):(n=a,a=d.progname)),d.pipe.$write(d.formatter.$call(l(s=o(S,"SEVERITY_LABELS")["$[]"](t))?s:"ANY",i("::","Time").$now(),a,n))),!0},O.$$arity=-2),r&&"add"}(n[0],0,n)},Opal.modules["asciidoctor/logging"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e>t:e["$>"](t)}var r=e.top,i=[],o=e.nil,a=e.const_get_qualified,s=e.const_get_relative,$=(e.breaker,e.slice,e.module),l=e.klass,u=e.send,c=e.truthy,f=e.hash2,d=e.gvars;return e.add_stubs(["$require","$attr_reader","$progname=","$-","$new","$formatter=","$level=","$>","$[]","$===","$inspect","$to_h","$map","$constants","$const_get","$<<","$clear","$empty?","$max","$attr_accessor","$memoize_logger","$private","$extend","$private_class_method","$logger","$merge"]),r.$require("logger"),function(r,i){var p=[$(r,"Asciidoctor")].concat(i);!function(r,i,d){var p,_,h=l(r,i,"Logger"),m=[h].concat(d);h.$$prototype.max_severity=o,h.$attr_reader("max_severity"),e.def(h,"$initialize",p=function(n){var r=p.$$p,i=this,a=o,$=o,l=o,c=o;for(r&&(p.$$p=null),l=0,c=arguments.length,$=new Array(c);l<c;l++)$[l]=arguments[l];return e.slice.call(arguments,0,arguments.length),u(i,e.find_super_dispatcher(i,"initialize",p,!1),$,r),a=["asciidoctor"],u(i,"progname=",e.to_a(a)),a[t(a.length,1)],a=[s(m,"BasicFormatter").$new()],u(i,"formatter=",e.to_a(a)),a[t(a.length,1)],a=[s(m,"WARN")],u(i,"level=",e.to_a(a)),a[t(a.length,1)]},p.$$arity=-1),e.def(h,"$add",_=function(t,r,i){var a,$=_.$$p,l=this,f=o,d=o,p=o;for($&&(_.$$p=null),d=0,p=arguments.length,f=new Array(p);d<p;d++)f[d]=arguments[d];return null==r&&(r=o),null==i&&(i=o),c(n(t=c(a=t)?a:s(m,"UNKNOWN"),l.max_severity=c(a=l.max_severity)?a:t))&&(l.max_severity=t),u(l,e.find_super_dispatcher(l,"add",_,!1),f,$)},_.$$arity=-2),function(t,n,r){var i,o=l(t,n,"BasicFormatter"),$=[o].concat(r);e.const_set($[0],"SEVERITY_LABEL_SUBSTITUTES",f(["WARN","FATAL"],{WARN:"WARNING",FATAL:"FAILED"})),e.def(o,"$call",i=function(e,t,n,r){var i;return n+": "+(c(i=s($,"SEVERITY_LABEL_SUBSTITUTES")["$[]"](e))?i:e)+": "+(c(a("::","String")["$==="](r))?r:r.$inspect())+s($,"LF")},i.$$arity=4)}(m[0],s(m,"Formatter"),m),function(t,n){var r,i=$(t,"AutoFormattingMessage");[i].concat(n),e.def(i,"$inspect",r=function(){var e,t=this;return c(e=t["$[]"]("source_location"))?e+": "+t["$[]"]("text"):t["$[]"]("text")},r.$$arity=0)}(m[0],m)}(p[0],a("::","Logger"),p),function(n,r,i){var a,$,d,p,_,h,m=l(n,r,"MemoryLogger"),y=[m].concat(i);m.$$prototype.messages=o,e.const_set(y[0],"SEVERITY_SYMBOL_BY_VALUE",u(s(y,"Severity").$constants(!1),"map",[],(a=function(e){return a.$$s,null==e&&(e=o),[s(y,"Severity").$const_get(e),e]},a.$$s=m,a.$$arity=1,a)).$to_h()),m.$attr_reader("messages"),e.def(m,"$initialize",$=function(){var n;return n=[s(y,"WARN")],u(this,"level=",e.to_a(n)),t(n.length,1),this.messages=[]},$.$$arity=0),e.def(m,"$add",d=function(t,n,r){var i,a=d.$$p,$=a||o;return a&&(d.$$p=null),null==n&&(n=o),null==r&&(r=o),n=c(i=n)?i:$!==o?e.yieldX($,[]):r,this.messages["$<<"](f(["severity","message"],{severity:s(y,"SEVERITY_SYMBOL_BY_VALUE")["$[]"](c(i=t)?i:s(y,"UNKNOWN")),message:n})),!0},d.$$arity=-2),e.def(m,"$clear",p=function(){return this.messages.$clear()},p.$$arity=0),e.def(m,"$empty?",_=function(){return this.messages["$empty?"]()},_.$$arity=0),e.def(m,"$max_severity",h=function(){var e,t=this;return c(t["$empty?"]())?o:u(t.messages,"map",[],(e=function(t){return e.$$s,null==t&&(t=o),s(y,"Severity").$const_get(t["$[]"]("severity"))},e.$$s=t,e.$$arity=1,e)).$max()},h.$$arity=0)}(p[0],a("::","Logger"),p),function(r,i,a){var $,f,d=l(r,i,"NullLogger"),p=[d].concat(a);d.$$prototype.max_severity=o,d.$attr_reader("max_severity"),e.def(d,"$initialize",$=function(){var n;return n=[s(p,"WARN")],u(this,"level=",e.to_a(n)),n[t(n.length,1)]},$.$$arity=0),e.def(d,"$add",f=function(e,t,r){var i,a=this;return null==t&&(t=o),null==r&&(r=o),c(n(e=c(i=e)?i:s(p,"UNKNOWN"),a.max_severity=c(i=a.max_severity)?i:e))&&(a.max_severity=e),!0},f.$$arity=-2)}(p[0],a("::","Logger"),p),function(t,n){var r=$(t,"LoggerManager"),i=[r].concat(n);r.logger_class=s(i,"Logger"),function(t,n){var r,i,a,s=[t].concat(n);t.$attr_accessor("logger_class"),e.def(t,"$logger",r=function(e){var t,n=this;return null==n.logger&&(n.logger=o),null==n.logger_class&&(n.logger_class=o),null==d.stderr&&(d.stderr=o),null==e&&(e=d.stderr),n.$memoize_logger(),n.logger=c(t=n.logger)?t:n.logger_class.$new(e)},r.$$arity=-1),e.def(t,"$logger=",i=function(e){var t,n=this;return null==n.logger_class&&(n.logger_class=o),null==d.stderr&&(d.stderr=o),n.logger=c(t=e)?t:n.logger_class.$new(d.stderr)},i.$$arity=1),t.$private(),e.def(t,"$memoize_logger",a=function(){return function(t,n){return[t].concat(n),e.alias(t,"logger","logger"),t.$attr_reader("logger")}(e.get_singleton_class(this),s)},a.$$arity=0)}(e.get_singleton_class(r),i)}(p[0],p),function(t,n){var r,i,o,l=$(t,"Logging"),u=[l].concat(n);e.defs(l,"$included",r=function(e){return e.$extend(s(u,"Logging"))},r.$$arity=1),l.$private_class_method("included"),e.def(l,"$logger",i=function(){return s(u,"LoggerManager").$logger()},i.$$arity=0),e.def(l,"$message_with_context",o=function(e,t){return null==t&&(t=f([],{})),f(["text"],{text:e}).$merge(t).$extend(a(s(u,"Logger"),"AutoFormattingMessage"))},o.$$arity=-2)}(p[0],p)}(i[0],i)},Opal.modules["asciidoctor/rx"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}e.top;var n=[],r=e.nil,i=e.const_get_qualified,o=e.const_get_relative,a=(e.breaker,e.slice,e.module),s=e.hash2,$=e.send,l=e.truthy,u=e.hash;return e.add_stubs(["$==","$join","$to_a","$new","$empty?","$escape","$[]=","$-"]),function(n,c){var f,d,p=a(n,"Asciidoctor"),_=[p].concat(c);!function(e,t){[a(e,"Rx")].concat(t)}(_[0],_),e.const_set(_[0],"AuthorInfoLineRx",new RegExp("^("+o(_,"CG_WORD")+"["+o(_,"CC_WORD")+"\\-'.]*)(?: +("+o(_,"CG_WORD")+"["+o(_,"CC_WORD")+"\\-'.]*))?(?: +("+o(_,"CG_WORD")+"["+o(_,"CC_WORD")+"\\-'.]*))?(?: +<([^>]+)>)?$")),e.const_set(_[0],"AuthorDelimiterRx",/;(?: |$)/),e.const_set(_[0],"RevisionInfoLineRx",new RegExp("^(?:[^\\d{]*("+o(_,"CC_ANY")+"*?),)? *(?!:)("+o(_,"CC_ANY")+"*?)(?: *(?!^),?: *("+o(_,"CC_ANY")+"*))?$")),e.const_set(_[0],"ManpageTitleVolnumRx",new RegExp("^("+o(_,"CC_ANY")+"+?) *\\( *("+o(_,"CC_ANY")+"+?) *\\)$")),e.const_set(_[0],"ManpageNamePurposeRx",new RegExp("^("+o(_,"CC_ANY")+"+?) +- +("+o(_,"CC_ANY")+"+)$")),e.const_set(_[0],"ConditionalDirectiveRx",new RegExp("^(\\\\)?(ifdef|ifndef|ifeval|endif)::(\\S*?(?:([,+])\\S*?)?)\\[("+o(_,"CC_ANY")+"+)?\\]$")),e.const_set(_[0],"EvalExpressionRx",new RegExp("^("+o(_,"CC_ANY")+"+?) *([=!><]=|[><]) *("+o(_,"CC_ANY")+"+)$")),e.const_set(_[0],"IncludeDirectiveRx",new RegExp("^(\\\\)?include::([^\\[][^\\[]*)\\[("+o(_,"CC_ANY")+"+)?\\]$")),e.const_set(_[0],"TagDirectiveRx",/\b(?:tag|(e)nd)::(\S+?)\[\](?=$|[ \r])/m),e.const_set(_[0],"AttributeEntryRx",new RegExp("^:(!?"+o(_,"CG_WORD")+"[^:]*):(?:[ \\t]+("+o(_,"CC_ANY")+"*))?$")),e.const_set(_[0],"InvalidAttributeNameCharsRx",new RegExp("[^"+o(_,"CC_WORD")+"-]")),o(_,"RUBY_ENGINE")["$=="]("opal")&&e.const_set(_[0],"AttributeEntryPassMacroRx",new RegExp("^pass:([a-z]+(?:,[a-z-]+)*)?\\[("+o(_,"CC_ALL")+"*)\\]$")),e.const_set(_[0],"AttributeReferenceRx",new RegExp("(\\\\)?\\{("+o(_,"CG_WORD")+"["+o(_,"CC_WORD")+"-]*|(set|counter2?):"+o(_,"CC_ANY")+"+?)(\\\\)?\\}")),e.const_set(_[0],"BlockAnchorRx",new RegExp("^\\[\\[(?:|(["+o(_,"CC_ALPHA")+"_:]["+o(_,"CC_WORD")+"\\-:.]*)(?:, *("+o(_,"CC_ANY")+"+))?)\\]\\]$")),e.const_set(_[0],"BlockAttributeListRx",new RegExp("^\\[(|["+o(_,"CC_WORD")+".#%{,\"']"+o(_,"CC_ANY")+"*)\\]$")),e.const_set(_[0],"BlockAttributeLineRx",new RegExp("^\\[(?:|["+o(_,"CC_WORD")+".#%{,\"']"+o(_,"CC_ANY")+"*|\\[(?:|["+o(_,"CC_ALPHA")+"_:]["+o(_,"CC_WORD")+"\\-:.]*(?:, *"+o(_,"CC_ANY")+"+)?)\\])\\]$")),e.const_set(_[0],"BlockTitleRx",new RegExp("^\\.(\\.?[^ \\t.]"+o(_,"CC_ANY")+"*)$")),e.const_set(_[0],"AdmonitionParagraphRx",new RegExp("^("+o(_,"ADMONITION_STYLES").$to_a().$join("|")+"):[ \\t]+")),e.const_set(_[0],"LiteralParagraphRx",new RegExp("^([ \\t]+"+o(_,"CC_ANY")+"*)$")),e.const_set(_[0],"AtxSectionTitleRx",new RegExp("^(=={0,5})[ \\t]+("+o(_,"CC_ANY")+"+?)(?:[ \\t]+\\1)?$")),e.const_set(_[0],"ExtAtxSectionTitleRx",new RegExp("^(=={0,5}|#\\#{0,5})[ \\t]+("+o(_,"CC_ANY")+"+?)(?:[ \\t]+\\1)?$")),e.const_set(_[0],"SetextSectionTitleRx",new RegExp("^((?!\\.)"+o(_,"CC_ANY")+"*?"+o(_,"CG_ALNUM")+o(_,"CC_ANY")+"*)$")),e.const_set(_[0],"InlineSectionAnchorRx",new RegExp(" (\\\\)?\\[\\[(["+o(_,"CC_ALPHA")+"_:]["+o(_,"CC_WORD")+"\\-:.]*)(?:, *("+o(_,"CC_ANY")+"+))?\\]\\]$")),e.const_set(_[0],"InvalidSectionIdCharsRx",new RegExp("<[^>]+>|&(?:[a-z][a-z]+\\d{0,2}|#\\d\\d\\d{0,4}|#x[\\da-f][\\da-f][\\da-f]{0,3});|[^ "+o(_,"CC_WORD")+"\\-.]+?")),e.const_set(_[0],"SectionLevelStyleRx",/^sect\d$/),e.const_set(_[0],"AnyListRx",new RegExp("^(?:[ \\t]*(?:-|\\*\\**|\\.\\.*|\\u2022|\\d+\\.|[a-zA-Z]\\.|[IVXivx]+\\))[ \\t]|(?!//[^/])[ \\t]*[^ \\t]"+o(_,"CC_ANY")+"*?(?::::{0,2}|;;)(?:$|[ \\t])|<(?:\\d+|\\.)>[ \\t])")),e.const_set(_[0],"UnorderedListRx",new RegExp("^[ \\t]*(-|\\*\\**|\\u2022)[ \\t]+("+o(_,"CC_ANY")+"*)$")),e.const_set(_[0],"OrderedListRx",new RegExp("^[ \\t]*(\\.\\.*|\\d+\\.|[a-zA-Z]\\.|[IVXivx]+\\))[ \\t]+("+o(_,"CC_ANY")+"*)$")),e.const_set(_[0],"OrderedListMarkerRxMap",s(["arabic","loweralpha","lowerroman","upperalpha","upperroman"],{arabic:/\d+\./,loweralpha:/[a-z]\./,lowerroman:/[ivx]+\)/,upperalpha:/[A-Z]\./,upperroman:/[IVX]+\)/})),e.const_set(_[0],"DescriptionListRx",new RegExp("^(?!//[^/])[ \\t]*([^ \\t]"+o(_,"CC_ANY")+"*?)(:::{0,2}|;;)(?:$|[ \\t]+("+o(_,"CC_ANY")+"*)$)")),e.const_set(_[0],"DescriptionListSiblingRx",s(["::",":::","::::",";;"],{"::":new RegExp("^(?!//[^/])[ \\t]*([^ \\t]"+o(_,"CC_ANY")+"*?[^:]|[^ \\t:])(::)(?:$|[ \\t]+("+o(_,"CC_ANY")+"*)$)"),":::":new RegExp("^(?!//[^/])[ \\t]*([^ \\t]"+o(_,"CC_ANY")+"*?[^:]|[^ \\t:])(:::)(?:$|[ \\t]+("+o(_,"CC_ANY")+"*)$)"),"::::":new RegExp("^(?!//[^/])[ \\t]*([^ \\t]"+o(_,"CC_ANY")+"*?[^:]|[^ \\t:])(::::)(?:$|[ \\t]+("+o(_,"CC_ANY")+"*)$)"),";;":new RegExp("^(?!//[^/])[ \\t]*([^ \\t]"+o(_,"CC_ANY")+"*?)(;;)(?:$|[ \\t]+("+o(_,"CC_ANY")+"*)$)")})),e.const_set(_[0],"CalloutListRx",new RegExp("^<(\\d+|\\.)>[ \\t]+("+o(_,"CC_ANY")+"*)$")),e.const_set(_[0],"CalloutExtractRx",/((?:\/\/|#|--|;;) ?)?(\\)?<!?(|--)(\d+|\.)\3>(?=(?: ?\\?<!?\3(?:\d+|\.)\3>)*$)/),e.const_set(_[0],"CalloutExtractRxt","(\\\\)?<()(\\d+|\\.)>(?=(?: ?\\\\?<(?:\\d+|\\.)>)*$)"),e.const_set(_[0],"CalloutExtractRxMap",$(i("::","Hash"),"new",[],((f=function(n,a){var s;return f.$$s,null==n&&(n=r),null==a&&(a=r),s=[a,new RegExp("("+(l(a["$empty?"]())?"":i("::","Regexp").$escape(a)+" ?")+")?"+o(_,"CalloutExtractRxt"))],$(n,"[]=",e.to_a(s)),s[t(s.length,1)]}).$$s=p,f.$$arity=2,f))),e.const_set(_[0],"CalloutScanRx",new RegExp("\\\\?<!?(|--)(\\d+|\\.)\\1>(?=(?: ?\\\\?<!?\\1(?:\\d+|\\.)\\1>)*"+o(_,"CC_EOL")+")")),e.const_set(_[0],"CalloutSourceRx",new RegExp("((?://|#|--|;;) ?)?(\\\\)?<!?(|--)(\\d+|\\.)\\3>(?=(?: ?\\\\?<!?\\3(?:\\d+|\\.)\\3>)*"+o(_,"CC_EOL")+")")),e.const_set(_[0],"CalloutSourceRxt","(\\\\)?<()(\\d+|\\.)>(?=(?: ?\\\\?<(?:\\d+|\\.)>)*"+o(_,"CC_EOL")+")"),e.const_set(_[0],"CalloutSourceRxMap",$(i("::","Hash"),"new",[],((d=function(n,a){var s;return d.$$s,null==n&&(n=r),null==a&&(a=r),s=[a,new RegExp("("+(l(a["$empty?"]())?"":i("::","Regexp").$escape(a)+" ?")+")?"+o(_,"CalloutSourceRxt"))],$(n,"[]=",e.to_a(s)),s[t(s.length,1)]}).$$s=p,d.$$arity=2,d))),e.const_set(_[0],"ListRxMap",s(["ulist","olist","dlist","colist"],{ulist:o(_,"UnorderedListRx"),olist:o(_,"OrderedListRx"),dlist:o(_,"DescriptionListRx"),colist:o(_,"CalloutListRx")})),e.const_set(_[0],"ColumnSpecRx",/^(?:(\d+)\*)?([<^>](?:\.[<^>]?)?|(?:[<^>]?\.)?[<^>])?(\d+%?|~)?([a-z])?$/),e.const_set(_[0],"CellSpecStartRx",/^[ \t]*(?:(\d+(?:\.\d*)?|(?:\d*\.)?\d+)([*+]))?([<^>](?:\.[<^>]?)?|(?:[<^>]?\.)?[<^>])?([a-z])?$/),e.const_set(_[0],"CellSpecEndRx",/[ \t]+(?:(\d+(?:\.\d*)?|(?:\d*\.)?\d+)([*+]))?([<^>](?:\.[<^>]?)?|(?:[<^>]?\.)?[<^>])?([a-z])?$/),e.const_set(_[0],"CustomBlockMacroRx",new RegExp("^("+o(_,"CG_WORD")+"["+o(_,"CC_WORD")+"-]*)::(|\\S|\\S"+o(_,"CC_ANY")+"*?\\S)\\[("+o(_,"CC_ANY")+"+)?\\]$")),e.const_set(_[0],"BlockMediaMacroRx",new RegExp("^(image|video|audio)::(\\S|\\S"+o(_,"CC_ANY")+"*?\\S)\\[("+o(_,"CC_ANY")+"+)?\\]$")),e.const_set(_[0],"BlockTocMacroRx",new RegExp("^toc::\\[("+o(_,"CC_ANY")+"+)?\\]$")),e.const_set(_[0],"InlineAnchorRx",new RegExp("(\\\\)?(?:\\[\\[(["+o(_,"CC_ALPHA")+"_:]["+o(_,"CC_WORD")+"\\-:.]*)(?:, *("+o(_,"CC_ANY")+"+?))?\\]\\]|anchor:(["+o(_,"CC_ALPHA")+"_:]["+o(_,"CC_WORD")+"\\-:.]*)\\[(?:\\]|("+o(_,"CC_ANY")+"*?[^\\\\])\\]))")),e.const_set(_[0],"InlineAnchorScanRx",new RegExp("(?:^|[^\\\\\\[])\\[\\[(["+o(_,"CC_ALPHA")+"_:]["+o(_,"CC_WORD")+"\\-:.]*)(?:, *("+o(_,"CC_ANY")+"+?))?\\]\\]|(?:^|[^\\\\])anchor:(["+o(_,"CC_ALPHA")+"_:]["+o(_,"CC_WORD")+"\\-:.]*)\\[(?:\\]|("+o(_,"CC_ANY")+"*?[^\\\\])\\])")),e.const_set(_[0],"LeadingInlineAnchorRx",new RegExp("^\\[\\[(["+o(_,"CC_ALPHA")+"_:]["+o(_,"CC_WORD")+"\\-:.]*)(?:, *("+o(_,"CC_ANY")+"+?))?\\]\\]")),e.const_set(_[0],"InlineBiblioAnchorRx",new RegExp("^\\[\\[\\[(["+o(_,"CC_ALPHA")+"_:]["+o(_,"CC_WORD")+"\\-:.]*)(?:, *("+o(_,"CC_ANY")+"+?))?\\]\\]\\]")),e.const_set(_[0],"InlineEmailRx",new RegExp("([\\\\>:/])?"+o(_,"CG_WORD")+"(?:&|["+o(_,"CC_WORD")+"\\-.%+])*@"+o(_,"CG_ALNUM")+"["+o(_,"CC_ALNUM")+"_\\-.]*\\.[a-zA-Z]{2,5}\\b")),e.const_set(_[0],"InlineFootnoteMacroRx",new RegExp("\\\\?footnote(?:(ref):|:(["+o(_,"CC_WORD")+"-]+)?)\\[(?:|("+o(_,"CC_ALL")+"*?[^\\\\]))\\](?!</a>)","m")),e.const_set(_[0],"InlineImageMacroRx",new RegExp("\\\\?i(?:mage|con):([^:\\s\\[](?:[^\\n\\[]*[^\\s\\[])?)\\[(|"+o(_,"CC_ALL")+"*?[^\\\\])\\]","m")),e.const_set(_[0],"InlineIndextermMacroRx",new RegExp("\\\\?(?:(indexterm2?):\\[("+o(_,"CC_ALL")+"*?[^\\\\])\\]|\\(\\(("+o(_,"CC_ALL")+"+?)\\)\\)(?!\\)))","m")),e.const_set(_[0],"InlineKbdBtnMacroRx",new RegExp("(\\\\)?(kbd|btn):\\[("+o(_,"CC_ALL")+"*?[^\\\\])\\]","m")),e.const_set(_[0],"InlineLinkRx",new RegExp("(^|link:|"+o(_,"CG_BLANK")+"|<|[>\\(\\)\\[\\];\"'])(\\\\?(?:https?|file|ftp|irc)://[^\\s\\[\\]<]*([^\\s.,\\[\\]<]))(?:\\[(|"+o(_,"CC_ALL")+"*?[^\\\\])\\])?","m")),e.const_set(_[0],"InlineLinkMacroRx",new RegExp("\\\\?(?:link|(mailto)):(|[^:\\s\\[][^\\s\\[]*)\\[(|"+o(_,"CC_ALL")+"*?[^\\\\])\\]","m")),e.const_set(_[0],"MacroNameRx",new RegExp("^"+o(_,"CG_WORD")+"["+o(_,"CC_WORD")+"-]*$")),e.const_set(_[0],"InlineStemMacroRx",new RegExp("\\\\?(stem|(?:latex|ascii)math):([a-z]+(?:,[a-z-]+)*)?\\[("+o(_,"CC_ALL")+"*?[^\\\\])\\]","m")),e.const_set(_[0],"InlineMenuMacroRx",new RegExp("\\\\?menu:("+o(_,"CG_WORD")+"|["+o(_,"CC_WORD")+"&][^\\n\\[]*[^\\s\\[])\\[ *(?:|("+o(_,"CC_ALL")+"*?[^\\\\]))\\]","m")),e.const_set(_[0],"InlineMenuRx",new RegExp('\\\\?"(['+o(_,"CC_WORD")+'&][^"]*?[ \\n]+>[ \\n]+[^"]*)"')),e.const_set(_[0],"InlinePassRx",u(!1,["+","`",new RegExp("(^|[^"+o(_,"CC_WORD")+";:])(?:\\[([^\\]]+)\\])?(\\\\?(\\+|`)(\\S|\\S"+o(_,"CC_ALL")+"*?\\S)\\4)(?!"+o(_,"CG_WORD")+")","m")],!0,["`",r,new RegExp("(^|[^`"+o(_,"CC_WORD")+"])(?:\\[([^\\]]+)\\])?(\\\\?(`)([^`\\s]|[^`\\s]"+o(_,"CC_ALL")+"*?\\S)\\4)(?![`"+o(_,"CC_WORD")+"])","m")])),e.const_set(_[0],"SinglePlusInlinePassRx",new RegExp("^(\\\\)?\\+(\\S|\\S"+o(_,"CC_ALL")+"*?\\S)\\+$","m")),e.const_set(_[0],"InlinePassMacroRx",new RegExp("(?:(?:(\\\\?)\\[([^\\]]+)\\])?(\\\\{0,2})(\\+\\+\\+?|\\$\\$)("+o(_,"CC_ALL")+"*?)\\4|(\\\\?)pass:([a-z]+(?:,[a-z-]+)*)?\\[(|"+o(_,"CC_ALL")+"*?[^\\\\])\\])","m")),e.const_set(_[0],"InlineXrefMacroRx",new RegExp("\\\\?(?:<<(["+o(_,"CC_WORD")+"#/.:{]"+o(_,"CC_ALL")+"*?)>>|xref:(["+o(_,"CC_WORD")+"#/.:{]"+o(_,"CC_ALL")+"*?)\\[(?:\\]|("+o(_,"CC_ALL")+"*?[^\\\\])\\]))","m")),o(_,"RUBY_ENGINE")["$=="]("opal")&&e.const_set(_[0],"HardLineBreakRx",new RegExp("^("+o(_,"CC_ANY")+"*) \\+$","m")),e.const_set(_[0],"MarkdownThematicBreakRx",/^ {0,3}([-*_])( *)\1\2\1$/),e.const_set(_[0],"ExtLayoutBreakRx",/^(?:'{3,}|<{3,}|([-*_])( *)\1\2\1)$/),e.const_set(_[0],"BlankLineRx",/\n{2,}/),e.const_set(_[0],"EscapedSpaceRx",/\\([ \t\n])/),e.const_set(_[0],"ReplaceableTextRx",/[&']|--|\.\.\.|\([CRT]M?\)/),e.const_set(_[0],"SpaceDelimiterRx",/([^\\])[ \t\n]+/),e.const_set(_[0],"SubModifierSniffRx",/[+-]/),e.const_set(_[0],"TrailingDigitsRx",/\d+$/),e.const_set(_[0],"UriSniffRx",new RegExp("^"+o(_,"CG_ALPHA")+"["+o(_,"CC_ALNUM")+".+-]+:/{0,2}")),e.const_set(_[0],"XmlSanitizeRx",/<[^>]+>/)}(n[0],n)},Opal.modules["asciidoctor/substitutors"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e+t:e["$+"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}function r(e,t){return"number"===typeof e&&"number"===typeof t?e>t:e["$>"](t)}function i(e,t){return"number"===typeof e&&"number"===typeof t?e<t:e["$<"](t)}function o(e,t){return"number"===typeof e&&"number"===typeof t?e*t:e["$*"](t)}e.top;var a=[],s=e.nil,$=e.const_get_qualified,l=e.const_get_relative,u=(e.breaker,e.slice),c=e.module,f=e.hash2,d=e.hash,p=e.truthy,_=e.send,h=e.gvars;return e.add_stubs(["$freeze","$+","$keys","$empty?","$!","$===","$[]","$join","$include?","$extract_passthroughs","$each","$sub_specialchars","$sub_quotes","$sub_attributes","$sub_replacements","$sub_macros","$highlight_source","$sub_callouts","$sub_post_replacements","$warn","$logger","$restore_passthroughs","$clear","$split","$apply_subs","$==","$gsub","$match?","$compat_mode","$convert_quoted_text","$attributes","$shift","$store_attribute","$!=","$attribute_undefined","$counter","$key?","$downcase","$attribute_missing","$info","$squeeze","$delete","$reject","$start_with?","$do_replacement","$extensions","$inline_macros?","$inline_macros","$regexp","$instance","$slice","$length","$names","$config","$merge","$[]=","$-","$normalize_text","$parse_attributes","$process_method","$expand_subs","$text","$text=","$convert","$class","$strip","$>","$index","$min","$compact","$end_with?","$map","$chop","$new","$pop","$rstrip","$register","$tr","$basename","$parse","$lstrip","$split_simple_csv","$partition","$extract_attributes_from_text","$sub","$encode_uri_component","$style","$extname?","$rindex","$info?","$catalog","$fetch","$outfilesuffix","$natural_xrefs","$resolve_id","$find","$footnotes","$id","$<","$size","$<<","$attr?","$attr","$to_s","$read_next_id","$callouts","$syntax_highlighter","$highlight?","$sub_source","$extract_callouts","$name","$to_sym","$to_i","$resolve_lines_to_highlight","$highlight","$nil_or_empty?","$restore_callouts","$count","$to_a","$|","$sort","$*","$parse_quoted_text_attributes","$resolve_pass_subs","$extract_inner_passthrough","$basebackend?","$error","$chr","$drop","$&","$resolve_subs","$resolve_block_subs","$parse_into","$private","$=~","$shorthand_property_syntax","$each_char"]),function(a,m){var y=[c(a,"Asciidoctor")].concat(m);!function(a,m){var y,g,v,b,w,x,k,E,O,A,S,C,R,T,I,N,L,D,P,M,z,F,j,B,q,U,H,Y,W,V,K,G=c(a,"Substitutors"),X=[G].concat(m);e.const_set(X[0],"SpecialCharsRx",/[<&>]/),e.const_set(X[0],"SpecialCharsTr",f([">","<","&"],{">":">","<":"<","&":"&"})),e.const_set(X[0],"QuotedTextSniffRx",d(!1,/[*_`#^~]/,!0,/[*'_+#^~]/)),e.const_set(X[0],"BASIC_SUBS",["specialcharacters"]).$freeze(),e.const_set(X[0],"HEADER_SUBS",["specialcharacters","attributes"]).$freeze(),e.const_set(X[0],"NO_SUBS",[]).$freeze(),e.const_set(X[0],"NORMAL_SUBS",["specialcharacters","quotes","attributes","replacements","macros","post_replacements"]).$freeze(),e.const_set(X[0],"REFTEXT_SUBS",["specialcharacters","quotes","replacements"]).$freeze(),e.const_set(X[0],"VERBATIM_SUBS",["specialcharacters","callouts"]).$freeze(),e.const_set(X[0],"SUB_GROUPS",f(["none","normal","verbatim","specialchars"],{none:l(X,"NO_SUBS"),normal:l(X,"NORMAL_SUBS"),verbatim:l(X,"VERBATIM_SUBS"),specialchars:l(X,"BASIC_SUBS")})),e.const_set(X[0],"SUB_HINTS",f(["a","m","n","p","q","r","c","v"],{a:"attributes",m:"macros",n:"normal",p:"post_replacements",q:"quotes",r:"replacements",c:"specialcharacters",v:"verbatim"})),e.const_set(X[0],"SUB_OPTIONS",f(["block","inline"],{block:t(t(l(X,"SUB_GROUPS").$keys(),l(X,"NORMAL_SUBS")),["callouts"]),inline:t(l(X,"SUB_GROUPS").$keys(),l(X,"NORMAL_SUBS"))})),e.const_set(X[0],"CAN","\x18"),e.const_set(X[0],"DEL","\x7f"),e.const_set(X[0],"PASS_START","\x96"),e.const_set(X[0],"PASS_END","\x97"),e.const_set(X[0],"PassSlotRx",new RegExp(l(X,"PASS_START")+"(\\d+)"+l(X,"PASS_END"))),e.const_set(X[0],"HighlightedPassSlotRx",new RegExp("<span\\b[^>]*>"+l(X,"PASS_START")+"</span>[^\\d]*(\\d+)[^\\d]*<span\\b[^>]*>"+l(X,"PASS_END")+"</span>")),e.const_set(X[0],"RS","\\"),e.const_set(X[0],"R_SB","]"),e.const_set(X[0],"ESC_R_SB","\\]"),e.const_set(X[0],"PLUS","+"),e.def(G,"$apply_subs",y=function(e,t){var n,r,i,o=this,a=s,u=s;return null==o.passthroughs&&(o.passthroughs=s),null==o.passthroughs_locked&&(o.passthroughs_locked=s),null==t&&(t=l(X,"NORMAL_SUBS")),p(p(n=e["$empty?"]())?n:t["$!"]())?e:(p(i=$("::","Array")["$==="](e))&&(e=p(e["$[]"](1))?e.$join(l(X,"LF")):e["$[]"](0)),p(t["$include?"]("macros"))&&(e=o.$extract_passthroughs(e),p(o.passthroughs["$empty?"]())||(a=o.passthroughs,o.passthroughs_locked=p(n=o.passthroughs_locked)?n:u=!0)),_(t,"each",[],(r=function(n){var i=r.$$s||this,o=s;return null==n&&(n=s),"specialcharacters"["$==="](o=n)?e=i.$sub_specialchars(e):"quotes"["$==="](o)?e=i.$sub_quotes(e):"attributes"["$==="](o)?p(e["$include?"](l(X,"ATTR_REF_HEAD")))?e=i.$sub_attributes(e):s:"replacements"["$==="](o)?e=i.$sub_replacements(e):"macros"["$==="](o)?e=i.$sub_macros(e):"highlight"["$==="](o)?e=i.$highlight_source(e,t["$include?"]("callouts")):"callouts"["$==="](o)?p(t["$include?"]("highlight"))?s:e=i.$sub_callouts(e):"post_replacements"["$==="](o)?e=i.$sub_post_replacements(e):i.$logger().$warn("unknown substitution type "+n)},r.$$s=o,r.$$arity=1,r)),p(a)&&(e=o.$restore_passthroughs(e),p(u)&&(a.$clear(),o.passthroughs_locked=s)),p(i)?e.$split(l(X,"LF"),-1):e)},y.$$arity=-2),e.def(G,"$apply_normal_subs",g=function(e){return this.$apply_subs(e,l(X,"NORMAL_SUBS"))},g.$$arity=1),e.def(G,"$apply_header_subs",v=function(e){return this.$apply_subs(e,l(X,"HEADER_SUBS"))},v.$$arity=1),e.alias(G,"apply_title_subs","apply_subs"),e.def(G,"$apply_reftext_subs",b=function(e){return this.$apply_subs(e,l(X,"REFTEXT_SUBS"))},b.$$arity=1),l(X,"RUBY_ENGINE")["$=="]("opal")&&e.def(G,"$sub_specialchars",w=function(e){var t,n;return p(p(t=p(n=e["$include?"](">"))?n:e["$include?"]("&"))?t:e["$include?"]("<"))?e.$gsub(l(X,"SpecialCharsRx"),l(X,"SpecialCharsTr")):e},w.$$arity=1),e.alias(G,"sub_specialcharacters","sub_specialchars"),e.def(G,"$sub_quotes",x=function(e){var t,n,r=this;return null==r.document&&(r.document=s),p(l(X,"QuotedTextSniffRx")["$[]"](n=r.document.$compat_mode())["$match?"](e))&&_(l(X,"QUOTE_SUBS")["$[]"](n),"each",[],(t=function(n,r,i){var o,a=t.$$s||this;return null==n&&(n=s),null==r&&(r=s),null==i&&(i=s),e=_(e,"gsub",[i],(o=function(){var e=o.$$s||this;return null==h["~"]&&(h["~"]=s),e.$convert_quoted_text(h["~"],n,r)},o.$$s=a,o.$$arity=0,o))},t.$$s=r,t.$$arity=3,t)),e},x.$$arity=1),e.def(G,"$sub_attributes",k=function(t,n){var r,i,o,a,$=this,u=s,c=s,d=s,m=s,y=s,g=s,v=s,b=s;return null==$.document&&($.document=s),null==n&&(n=f([],{})),u=$.document.$attributes(),c=d=m=y=g=v=s,t=_(t,"gsub",[l(X,"AttributeReferenceRx")],(r=function(){var t,i,o,a,$=r.$$s||this,f=s,b=s,w=s,x=s;return null==$.document&&($.document=s),p(p(t=((i=h["~"])===s?s:i["$[]"](1))["$=="](l(X,"RS")))?t:((i=h["~"])===s?s:i["$[]"](4))["$=="](l(X,"RS")))?"{"+((t=h["~"])===s?s:t["$[]"](2))+"}":p((t=h["~"])===s?s:t["$[]"](3))?(f=(b=((t=h["~"])===s?s:t["$[]"](2)).$split(":",3)).$shift(),"set"["$==="](f)?(i=l(X,"Parser").$store_attribute(b["$[]"](0),p(o=b["$[]"](1))?o:"",$.document),null==(t=e.to_ary(i))[0]||t[0],w=null==t[1]?s:t[1],c=p(p(t=w)?t:(g=p(i=g)?i:p(o=u["$[]"]("attribute-undefined"))?o:l(X,"Compliance").$attribute_undefined())["$!="]("drop-line"))?y=l(X,"DEL"):d=l(X,"CAN")):"counter2"["$==="](f)?(_($.document,"counter",e.to_a(b)),c=y=l(X,"DEL")):_($.document,"counter",e.to_a(b))):p(u["$key?"](x=((t=h["~"])===s?s:t["$[]"](2)).$downcase()))?u["$[]"](x):p(w=l(X,"INTRINSIC_ATTRIBUTES")["$[]"](x))?w:(f=v=p(t=v)?t:p(i=p(o=n["$[]"]("attribute_missing"))?o:u["$[]"]("attribute-missing"))?i:l(X,"Compliance").$attribute_missing(),"drop"["$==="](f)?c=y=l(X,"DEL"):"drop-line"["$==="](f)?((m=p(t=m)?t:p(i=n["$[]"]("drop_line_severity"))?i:"info")["$=="]("info")&&_($.$logger(),"info",[],((a=function(){return a.$$s,"dropping line containing reference to missing attribute: "+x}).$$s=$,a.$$arity=0,a)),c=d=l(X,"CAN")):"warn"["$==="](f)?($.$logger().$warn("skipping reference to missing attribute: "+x),(t=h["~"])===s?s:t["$[]"](0)):(t=h["~"])===s?s:t["$[]"](0))},r.$$s=$,r.$$arity=0,r)),p(c)?p(y)?(b=t.$squeeze(l(X,"DEL")).$split(l(X,"LF"),-1),p(d)?_(b,"reject",[],(i=function(e){var t,n,r;return i.$$s,null==e&&(e=s),p(t=p(n=p(r=e["$=="](l(X,"DEL")))?r:e["$=="](l(X,"CAN")))?n:e["$start_with?"](l(X,"CAN")))?t:e["$include?"](l(X,"CAN"))},i.$$s=$,i.$$arity=1,i)).$join(l(X,"LF")).$delete(l(X,"DEL")):_(b,"reject",[],(o=function(e){return o.$$s,null==e&&(e=s),e["$=="](l(X,"DEL"))},o.$$s=$,o.$$arity=1,o)).$join(l(X,"LF")).$delete(l(X,"DEL"))):p(t["$include?"](l(X,"LF")))?_(t.$split(l(X,"LF"),-1),"reject",[],(a=function(e){var t,n;return a.$$s,null==e&&(e=s),p(t=p(n=e["$=="](l(X,"CAN")))?n:e["$start_with?"](l(X,"CAN")))?t:e["$include?"](l(X,"CAN"))},a.$$s=$,a.$$arity=1,a)).$join(l(X,"LF")):"":t},k.$$arity=-2),e.def(G,"$sub_replacements",E=function(e){var t;return p(l(X,"ReplaceableTextRx")["$match?"](e))&&_(l(X,"REPLACEMENTS"),"each",[],(t=function(n,r,i){var o,a=t.$$s||this;return null==n&&(n=s),null==r&&(r=s),null==i&&(i=s),e=_(e,"gsub",[n],(o=function(){var e=o.$$s||this;return null==h["~"]&&(h["~"]=s),e.$do_replacement(h["~"],r,i)},o.$$s=a,o.$$arity=0,o))},t.$$s=this,t.$$arity=3,t)),e},E.$$arity=1),e.def(G,"$sub_macros",O=function(i){var o,a,c,d,m,y,g,v,b,w,x,k,E,O,A,S,C,R,T,I=this,N=s,L=s,D=s;return null==I.document&&(I.document=s),null==I.context&&(I.context=s),null==I.parent&&(I.parent=s),S=i["$include?"]("["),C=i["$include?"](":"),R=p(o=S)?C:o,T=p(o=R)?i["$include?"](":["):o,N=(L=I.document).$attributes(),p(p(o=D=L.$extensions())?D["$inline_macros?"]():o)&&_(D.$inline_macros(),"each",[],(a=function(t){var r,o=a.$$s||this;return null==t&&(t=s),i=_(i,"gsub",[t.$instance().$regexp()],(r=function(){var i,o,a,$,u=r.$$s||this,c=s,d=s,m=s,y=s,g=s,v=s,b=s,w=s;return null==h["~"]&&(h["~"]=s),p((c=(i=h["~"])===s?s:i["$[]"](0))["$start_with?"](l(X,"RS")))?((i=h["~"])===s?s:i["$[]"](0)).$slice(1,((i=h["~"])===s?s:i["$[]"](0)).$length()):(p(h["~"].$names()["$empty?"]())?(i=[(o=h["~"])===s?s:o["$[]"](1),(o=h["~"])===s?s:o["$[]"](2)],d=i[0],m=i[1]):(i=[function(){try{return h["~"]["$[]"]("target")}catch(t){if(!e.rescue(t,[l(X,"StandardError")]))throw t;try{return s}finally{e.pop_exception()}}}(),function(){try{return h["~"]["$[]"]("content")}catch(t){if(!e.rescue(t,[l(X,"StandardError")]))throw t;try{return s}finally{e.pop_exception()}}}()],d=i[0],m=i[1]),$=p(y=(g=t.$config())["$[]"]("default_attrs"))?y.$merge():f([],{}),p(m)&&(p(m["$empty?"]())?g["$[]"]("content_model")["$=="]("attributes")||(v=["text",m],_($,"[]=",e.to_a(v)),v[n(v.length,1)]):(m=u.$normalize_text(m,!0,!0),g["$[]"]("content_model")["$=="]("attributes")?u.$parse_attributes(m,p(i=p(o=g["$[]"]("positional_attrs"))?o:g["$[]"]("pos_attrs"))?i:[],f(["into"],{into:$})):(v=["text",m],_($,"[]=",e.to_a(v)),v[n(v.length,1)])),d=p(i=d)?i:g["$[]"]("format")["$=="]("short")?m:d),p(l(X,"Inline")["$==="](b=t.$process_method()["$[]"](u,d,$)))?(p(p(i=w=b.$attributes().$delete("subs"))?w=u.$expand_subs(w,"custom inline macro"):i)&&(v=[u.$apply_subs(b.$text(),w)],_(b,"text=",e.to_a(v)),v[n(v.length,1)]),b.$convert()):p(b)?(_(u.$logger(),"info",[],((a=function(){return a.$$s,"expected substitution value for custom inline macro to be of type Inline; got "+b.$class()+": "+c}).$$s=u,a.$$arity=0,a)),b):"")},r.$$s=o,r.$$arity=0,r))},a.$$s=I,a.$$arity=1,a)),p(N["$key?"]("experimental"))&&(p(p(o=T)?p(c=i["$include?"]("kbd:"))?c:i["$include?"]("btn:"):o)&&(i=_(i,"gsub",[l(X,"InlineKbdBtnMacroRx")],(d=function(){var i,o,a,$=d.$$s||this,u=s,c=s,m=s,y=s;return p((i=h["~"])===s?s:i["$[]"](1))?((i=h["~"])===s?s:i["$[]"](0)).$slice(1,((i=h["~"])===s?s:i["$[]"](0)).$length()):((i=h["~"])===s?s:i["$[]"](2))["$=="]("kbd")?(p((u=((i=h["~"])===s?s:i["$[]"](3)).$strip())["$include?"](l(X,"R_SB")))&&(u=u.$gsub(l(X,"ESC_R_SB"),l(X,"R_SB"))),p(p(i=r(u.$length(),1))?c=p(c=u.$index(",",1))?[c,u.$index("+",1)].$compact().$min():u.$index("+",1):i)?(m=u.$slice(c,1),p(u["$end_with?"](m))?(y=[-1,t((u=_(u.$chop().$split(m,-1),"map",[],((o=function(e){return o.$$s,null==e&&(e=s),e.$strip()}).$$s=$,o.$$arity=1,o)))["$[]"](-1),m)],_(u,"[]=",e.to_a(y)),y[n(y.length,1)]):u=_(u.$split(m),"map",[],((a=function(e){return a.$$s,null==e&&(e=s),e.$strip()}).$$s=$,a.$$arity=1,a))):u=[u],l(X,"Inline").$new($,"kbd",s,f(["attributes"],{attributes:f(["keys"],{keys:u})})).$convert()):l(X,"Inline").$new($,"button",$.$normalize_text((i=h["~"])===s?s:i["$[]"](3),!0,!0)).$convert()},d.$$s=I,d.$$arity=0,d))),p(p(o=R)?i["$include?"]("menu:"):o)&&(i=_(i,"gsub",[l(X,"InlineMenuMacroRx")],(m=function(){var e,t,n,r=m.$$s||this,i=s,o=s,a=s,$=s;return p(((e=h["~"])===s?s:e["$[]"](0))["$start_with?"](l(X,"RS")))?((e=h["~"])===s?s:e["$[]"](0)).$slice(1,((e=h["~"])===s?s:e["$[]"](0)).$length()):(n=(e=h["~"])===s?s:e["$[]"](1),p(i=(e=h["~"])===s?s:e["$[]"](2))?(p(i["$include?"](l(X,"R_SB")))&&(i=i.$gsub(l(X,"ESC_R_SB"),l(X,"R_SB"))),p(o=p(i["$include?"](">"))?">":p(i["$include?"](","))?",":s)?$=(a=_(i.$split(o),"map",[],((t=function(e){return t.$$s,null==e&&(e=s),e.$strip()}).$$s=r,t.$$arity=1,t))).$pop():(a=(e=[[],i.$rstrip()])[0],$=e[1])):(a=(e=[[],s])[0],$=e[1]),l(X,"Inline").$new(r,"menu",s,f(["attributes"],{attributes:f(["menu","submenus","menuitem"],{menu:n,submenus:a,menuitem:$})})).$convert())},m.$$s=I,m.$$arity=0,m))),p(p(o=i["$include?"]('"'))?i["$include?"](">"):o)&&(i=_(i,"gsub",[l(X,"InlineMenuRx")],(y=function(){var t,n,r,i,o,a,$=y.$$s||this,c=s;return p(((t=h["~"])===s?s:t["$[]"](0))["$start_with?"](l(X,"RS")))?((t=h["~"])===s?s:t["$[]"](0)).$slice(1,((t=h["~"])===s?s:t["$[]"](0)).$length()):(n=_(((r=h["~"])===s?s:r["$[]"](1)).$split(">"),"map",[],((i=function(e){return i.$$s,null==e&&(e=s),e.$strip()}).$$s=$,i.$$arity=1,i)),o=null==(t=e.to_ary(n))[0]?s:t[0],a=(c=u.call(t,1)).$pop(),l(X,"Inline").$new($,"menu",s,f(["attributes"],{attributes:f(["menu","submenus","menuitem"],{menu:o,submenus:c,menuitem:a})})).$convert())},y.$$s=I,y.$$arity=0,y)))),p(p(o=R)?p(c=i["$include?"]("image:"))?c:i["$include?"]("icon:"):o)&&(i=_(i,"gsub",[l(X,"InlineImageMacroRx")],(g=function(){var t,r,i=g.$$s||this,o=s,a=s,$=s,u=s;return p(((t=h["~"])===s?s:t["$[]"](0))["$start_with?"](l(X,"RS")))?((t=h["~"])===s?s:t["$[]"](0)).$slice(1,((t=h["~"])===s?s:t["$[]"](0)).$length()):(p(((t=h["~"])===s?s:t["$[]"](0))["$start_with?"]("icon:"))?(o=(t=["icon",["size"]])[0],a=t[1]):(o=(t=["image",["alt","width","height"]])[0],a=t[1]),r=(t=h["~"])===s?s:t["$[]"](1),$=i.$parse_attributes((t=h["~"])===s?s:t["$[]"](2),a,f(["unescape_input"],{unescape_input:!0})),o["$=="]("icon")||(L.$register("images",r),u=["imagesdir",N["$[]"]("imagesdir")],_($,"[]=",e.to_a(u)),u[n(u.length,1)]),p(t=$["$[]"]("alt"))||(u=["alt",(u=["default-alt",l(X,"Helpers").$basename(r,!0).$tr("_-"," ")],_($,"[]=",e.to_a(u)),u[n(u.length,1)])],_($,"[]=",e.to_a(u)),u[n(u.length,1)]),l(X,"Inline").$new(i,"image",s,f(["type","target","attributes"],{type:o,target:r,attributes:$})).$convert())},g.$$s=I,g.$$arity=0,g))),p(p(o=p(c=i["$include?"]("(("))?i["$include?"]("))"):c)?o:p(c=T)?i["$include?"]("dexterm"):c)&&(i=_(i,"gsub",[l(X,"InlineIndextermMacroRx")],(v=function(){var t,r,i,o,a=v.$$s||this,$=s,c=s,d=s,m=s,y=s,g=s,b=s,w=s,x=s,k=s,E=s,O=s,A=s,S=s;return function(){if($=(t=h["~"])===s?s:t["$[]"](1),"indexterm"["$==="]($))return p(((t=h["~"])===s?s:t["$[]"](0))["$start_with?"](l(X,"RS")))?((t=h["~"])===s?s:t["$[]"](0)).$slice(1,((t=h["~"])===s?s:t["$[]"](0)).$length()):(p((c=a.$normalize_text((t=h["~"])===s?s:t["$[]"](2),!0,!0))["$include?"]("="))?p(d=(m=l(X,"AttributeList").$new(c,a).$parse())["$[]"](1))?(y=["terms",[d]],_(m,"[]=",e.to_a(y)),y[n(y.length,1)],p(g=m["$[]"]("see-also"))&&(y=["see-also",p(g["$include?"](","))?_(g.$split(","),"map",[],((r=function(e){return r.$$s,null==e&&(e=s),e.$lstrip()}).$$s=a,r.$$arity=1,r)):[g]],_(m,"[]=",e.to_a(y)),y[n(y.length,1)])):m=f(["terms"],{terms:c}):m=f(["terms"],{terms:a.$split_simple_csv(c)}),l(X,"Inline").$new(a,"indexterm",s,f(["attributes"],{attributes:m})).$convert());if("indexterm2"["$==="]($))return p(((t=h["~"])===s?s:t["$[]"](0))["$start_with?"](l(X,"RS")))?((t=h["~"])===s?s:t["$[]"](0)).$slice(1,((t=h["~"])===s?s:t["$[]"](0)).$length()):(p((b=a.$normalize_text((t=h["~"])===s?s:t["$[]"](2),!0,!0))["$include?"]("="))&&(b=p(t=p(i=(m=l(X,"AttributeList").$new(b,a).$parse())["$[]"](1))?i:m=s)?t:b,p(p(t=m)?g=m["$[]"]("see-also"):t)&&(y=["see-also",p(g["$include?"](","))?_(g.$split(","),"map",[],((o=function(e){return o.$$s,null==e&&(e=s),e.$lstrip()}).$$s=a,o.$$arity=1,o)):[g]],_(m,"[]=",e.to_a(y)),y[n(y.length,1)])),l(X,"Inline").$new(a,"indexterm",b,f(["attributes","type"],{attributes:m,type:"visible"})).$convert());if(w=(t=h["~"])===s?s:t["$[]"](3),p(((t=h["~"])===s?s:t["$[]"](0))["$start_with?"](l(X,"RS")))){if(!p(p(t=w["$start_with?"]("("))?w["$end_with?"](")"):t))return((t=h["~"])===s?s:t["$[]"](0)).$slice(1,((t=h["~"])===s?s:t["$[]"](0)).$length());w=w.$slice(1,n(w.$length(),2)),x=(t=[!0,"(",")"])[0],k=t[1],E=t[2]}else x=!0,p(w["$start_with?"]("("))?p(w["$end_with?"](")"))?(t=[w.$slice(1,n(w.$length(),2)),!1],w=t[0],x=t[1]):(t=[w.$slice(1,w.$length()),"(",""],w=t[0],k=t[1],E=t[2]):p(w["$end_with?"](")"))&&(t=[w.$chop(),"",")"],w=t[0],k=t[1],E=t[2]);return p(x)?(p((b=a.$normalize_text(w,!0))["$include?"](";&"))&&(p(b["$include?"](" >> "))?(i=b.$partition(" >> "),t=e.to_ary(i),b=null==t[0]?s:t[0],null==t[1]||t[1],O=null==t[2]?s:t[2],m=f(["see"],{see:O})):p(b["$include?"](" &> "))&&(i=b.$split(" &> "),t=e.to_ary(i),b=null==t[0]?s:t[0],g=u.call(t,1),m=f(["see-also"],{"see-also":g}))),A=l(X,"Inline").$new(a,"indexterm",b,f(["attributes","type"],{attributes:m,type:"visible"})).$convert()):(m=f([],{}),p((S=a.$normalize_text(w,!0))["$include?"](";&"))&&(p(S["$include?"](" >> "))?(i=S.$partition(" >> "),t=e.to_ary(i),S=null==t[0]?s:t[0],null==t[1]||t[1],O=null==t[2]?s:t[2],y=["see",O],_(m,"[]=",e.to_a(y)),y[n(y.length,1)]):p(S["$include?"](" &> "))&&(i=S.$split(" &> "),t=e.to_ary(i),S=null==t[0]?s:t[0],g=u.call(t,1),y=["see-also",g],_(m,"[]=",e.to_a(y)),y[n(y.length,1)])),y=["terms",a.$split_simple_csv(S)],_(m,"[]=",e.to_a(y)),y[n(y.length,1)],A=l(X,"Inline").$new(a,"indexterm",s,f(["attributes"],{attributes:m})).$convert()),p(k)?""+k+A+E:A}()},v.$$s=I,v.$$arity=0,v))),p(p(o=C)?i["$include?"]("://"):o)&&(i=_(i,"gsub",[l(X,"InlineLinkRx")],(b=function(){var r,i,o,a=b.$$s||this,$=s,u=s,c=s,d=s,m=s,y=s,g=s,v=s,w=s;if(p(($=(r=h["~"])===s?s:r["$[]"](2))["$start_with?"](l(X,"RS"))))return""+((r=h["~"])===s?s:r["$[]"](1))+$.$slice(1,$.$length())+((r=h["~"])===s?s:r["$[]"](4));if(u=(r=[(i=h["~"])===s?s:i["$[]"](1),""])[0],c=r[1],p((r=h["~"])===s?s:r["$[]"](4)))u["$=="]("link:")&&(u=""),p((d=(r=h["~"])===s?s:r["$[]"](4))["$empty?"]())&&(d=s);else{if("link:"["$==="](m=u)||'"'["$==="](m)||"'"["$==="](m))return(r=h["~"])===s?s:r["$[]"](0);if(m=(r=h["~"])===s?s:r["$[]"](3),")"["$==="](m)||"?"["$==="](m)||"!"["$==="](m)){if($=$.$chop(),p((r=(c=(i=h["~"])===s?s:i["$[]"](3))["$=="](")"))?$["$end_with?"](".","?","!"):(c=(i=h["~"])===s?s:i["$[]"](3))["$=="](")"))&&(c=t($["$[]"](-1),c),$=$.$chop()),p($["$end_with?"]("://")))return(r=h["~"])===s?s:r["$[]"](0)}else if(";"["$==="](m)){if(p(p(r=u["$start_with?"]("<"))?$["$end_with?"](">"):r)?(u=u.$slice(4,u.$length()),$=$.$slice(0,n($.$length(),4))):p(($=$.$chop())["$end_with?"](")"))?($=$.$chop(),c=");"):c=";",p($["$end_with?"]("://")))return(r=h["~"])===s?s:r["$[]"](0)}else if(":"["$==="](m)&&(p(($=$.$chop())["$end_with?"](")"))?($=$.$chop(),c="):"):c=":",p($["$end_with?"]("://"))))return(r=h["~"])===s?s:r["$[]"](0)}return r=[s,f(["type"],{type:"link"})],y=r[0],o=r[1],p(d)?(p(d["$include?"](l(X,"R_SB")))&&(g=d=d.$gsub(l(X,"ESC_R_SB"),l(X,"R_SB"))),p(p(r=L.$compat_mode()["$!"]())?d["$include?"]("="):r)&&(i=a.$extract_attributes_from_text(d,""),g=d=null==(r=e.to_ary(i))[0]?s:r[0],v=["id",(y=null==r[1]?s:r[1])["$[]"]("id")],_(o,"[]=",e.to_a(v)),v[n(v.length,1)]),p(d["$end_with?"]("^"))&&(g=d=d.$chop(),p(y)?p(r=y["$[]"]("window"))||(v=["window","_blank"],_(y,"[]=",e.to_a(v)),v[n(v.length,1)]):y=f(["window"],{window:"_blank"})),p(p(r=g)?g["$empty?"]():r)&&(d=p(N["$key?"]("hide-uri-scheme"))?$.$sub(l(X,"UriSniffRx"),""):$,w=!0)):(d=p(N["$key?"]("hide-uri-scheme"))?$.$sub(l(X,"UriSniffRx"),""):$,w=!0),p(w)&&(p(y)?(v=["role",p(y["$key?"]("role"))?"bare "+y["$[]"]("role"):"bare"],_(y,"[]=",e.to_a(v)),v[n(v.length,1)]):y=f(["role"],{role:"bare"})),L.$register("links",(v=["target",$],_(o,"[]=",e.to_a(v)),v[n(v.length,1)])),p(y)&&(v=["attributes",y],_(o,"[]=",e.to_a(v)),v[n(v.length,1)]),""+u+l(X,"Inline").$new(a,"anchor",d,o).$convert()+c},b.$$s=I,b.$$arity=0,b))),p(p(o=R)?p(c=i["$include?"]("link:"))?c:i["$include?"]("ilto:"):o)&&(i=_(i,"gsub",[l(X,"InlineLinkMacroRx")],(w=function(){var r,i,o,a=w.$$s||this,$=s,u=s,c=s,d=s,m=s,y=s;return p(((r=h["~"])===s?s:r["$[]"](0))["$start_with?"](l(X,"RS")))?((r=h["~"])===s?s:r["$[]"](0)).$slice(1,((r=h["~"])===s?s:r["$[]"](0)).$length()):(u=p($=(r=h["~"])===s?s:r["$[]"](1))?t("mailto:",c=(r=h["~"])===s?s:r["$[]"](2)):(r=h["~"])===s?s:r["$[]"](2),r=[s,f(["type"],{type:"link"})],d=r[0],o=r[1],p((m=(r=h["~"])===s?s:r["$[]"](3))["$empty?"]())||(p(m["$include?"](l(X,"R_SB")))&&(m=m.$gsub(l(X,"ESC_R_SB"),l(X,"R_SB"))),p($)?p(p(r=L.$compat_mode()["$!"]())?m["$include?"](","):r)&&(i=a.$extract_attributes_from_text(m,""),m=null==(r=e.to_ary(i))[0]?s:r[0],y=["id",(d=null==r[1]?s:r[1])["$[]"]("id")],_(o,"[]=",e.to_a(y)),y[n(y.length,1)],p(d["$key?"](2))&&(u=p(d["$key?"](3))?u+"?subject="+l(X,"Helpers").$encode_uri_component(d["$[]"](2))+"&body="+l(X,"Helpers").$encode_uri_component(d["$[]"](3)):u+"?subject="+l(X,"Helpers").$encode_uri_component(d["$[]"](2)))):p(p(r=L.$compat_mode()["$!"]())?m["$include?"]("="):r)&&(i=a.$extract_attributes_from_text(m,""),m=null==(r=e.to_ary(i))[0]?s:r[0],y=["id",(d=null==r[1]?s:r[1])["$[]"]("id")],_(o,"[]=",e.to_a(y)),y[n(y.length,1)]),p(m["$end_with?"]("^"))&&(m=m.$chop(),p(d)?p(r=d["$[]"]("window"))||(y=["window","_blank"],_(d,"[]=",e.to_a(y)),y[n(y.length,1)]):d=f(["window"],{window:"_blank"}))),p(m["$empty?"]())&&(p($)?m=c:(p(N["$key?"]("hide-uri-scheme"))?p((m=u.$sub(l(X,"UriSniffRx"),""))["$empty?"]())&&(m=u):m=u,p(d)?(y=["role",p(d["$key?"]("role"))?"bare "+d["$[]"]("role"):"bare"],_(d,"[]=",e.to_a(y)),y[n(y.length,1)]):d=f(["role"],{role:"bare"}))),L.$register("links",(y=["target",u],_(o,"[]=",e.to_a(y)),y[n(y.length,1)])),p(d)&&(y=["attributes",d],_(o,"[]=",e.to_a(y)),y[n(y.length,1)]),l(X,"Inline").$new(a,"anchor",m,o).$convert())},w.$$s=I,w.$$arity=0,w))),p(i["$include?"]("@"))&&(i=_(i,"gsub",[l(X,"InlineEmailRx")],(x=function(){var e,n,r,i=x.$$s||this;return p((e=h["~"])===s?s:e["$[]"](1))?((e=h["~"])===s?s:e["$[]"](1))["$=="](l(X,"RS"))?((e=h["~"])===s?s:e["$[]"](0)).$slice(1,((e=h["~"])===s?s:e["$[]"](0)).$length()):(e=h["~"])===s?s:e["$[]"](0):(n=t("mailto:",r=(e=h["~"])===s?s:e["$[]"](0)),L.$register("links",n),l(X,"Inline").$new(i,"anchor",r,f(["type","target"],{type:"link",target:n})).$convert())},x.$$s=I,x.$$arity=0,x))),p(p(o=p(c=S)?I.context["$=="]("list_item"):c)?I.parent.$style()["$=="]("bibliography"):o)&&(i=_(i,"sub",[l(X,"InlineBiblioAnchorRx")],(k=function(){var e,t=k.$$s||this;return l(X,"Inline").$new(t,"anchor",(e=h["~"])===s?s:e["$[]"](2),f(["type","id"],{type:"bibref",id:(e=h["~"])===s?s:e["$[]"](1)})).$convert()},k.$$s=I,k.$$arity=0,k))),p(p(o=p(c=S)?i["$include?"]("[["):c)?o:p(c=R)?i["$include?"]("or:"):c)&&(i=_(i,"gsub",[l(X,"InlineAnchorRx")],(E=function(){var e,t,n=E.$$s||this,r=s,i=s;return p((e=h["~"])===s?s:e["$[]"](1))?((e=h["~"])===s?s:e["$[]"](0)).$slice(1,((e=h["~"])===s?s:e["$[]"](0)).$length()):(p(r=(e=h["~"])===s?s:e["$[]"](2))?i=(e=h["~"])===s?s:e["$[]"](3):(r=(e=h["~"])===s?s:e["$[]"](4),p(p(e=i=(t=h["~"])===s?s:t["$[]"](5))?i["$include?"](l(X,"R_SB")):e)&&(i=i.$gsub(l(X,"ESC_R_SB"),l(X,"R_SB")))),l(X,"Inline").$new(n,"anchor",i,f(["type","id"],{type:"ref",id:r})).$convert())},E.$$s=I,E.$$arity=0,E))),p(p(o=p(c=i["$include?"]("&"))?i["$include?"](";&l"):c)?o:p(c=R)?i["$include?"]("xref:"):c)&&(i=_(i,"gsub",[l(X,"InlineXrefMacroRx")],(O=function(){var i,o,a=O.$$s||this,$=s,u=s,c=s,d=s,m=s,y=s,g=s,v=s,b=s,w=s,x=s;return p(((i=h["~"])===s?s:i["$[]"](0))["$start_with?"](l(X,"RS")))?((i=h["~"])===s?s:i["$[]"](0)).$slice(1,((i=h["~"])===s?s:i["$[]"](0)).$length()):($=f([],{}),p(u=(i=h["~"])===s?s:i["$[]"](1))?p(u["$include?"](","))&&(o=u.$partition(","),u=null==(i=e.to_ary(o))[0]?s:i[0],null==i[1]||i[1],c=null==i[2]?s:i[2],p((c=c.$lstrip())["$empty?"]())&&(c=s)):(d=!0,u=(i=h["~"])===s?s:i["$[]"](2),p(c=(i=h["~"])===s?s:i["$[]"](3))&&(p(c["$include?"](l(X,"R_SB")))&&(c=c.$gsub(l(X,"ESC_R_SB"),l(X,"R_SB"))),p(p(i=L.$compat_mode()["$!"]())?c["$include?"]("="):i)&&(o=a.$extract_attributes_from_text(c),c=null==(i=e.to_ary(o))[0]?s:i[0],$=null==i[1]?s:i[1]))),p(L.$compat_mode())?m=u:p(y=u.$index("#"))?p(r(y,0))?(p(r(g=n(n(u.$length(),1),y),0))?(v=(i=[u.$slice(0,y),u.$slice(t(y,1),g)])[0],m=i[1]):v=u.$chop(),p(d)?p(v["$end_with?"](".adoc"))?b=v=v.$slice(0,n(v.$length(),5)):p(l(X,"Helpers")["$extname?"](v)["$!"]())&&(b=v):b=p(_(v,"end_with?",e.to_a(l(X,"ASCIIDOC_EXTENSIONS").$keys())))?v=v.$slice(0,v.$rindex(".")):v):(w=(i=[u,u.$slice(1,u.$length())])[0],m=i[1]):p(d)?p(u["$end_with?"](".adoc"))?b=v=u.$slice(0,n(u.$length(),5)):p(l(X,"Helpers")["$extname?"](u))?v=u:m=u:m=u,p(w)?(u=m,p(p(i=a.$logger()["$info?"]())?L.$catalog()["$[]"]("refs")["$[]"](u)["$!"]():i)&&a.$logger().$info("possible invalid reference: "+u)):p(v)?p(p(i=b)?p(o=L.$attributes()["$[]"]("docname")["$=="](v))?o:L.$catalog()["$[]"]("includes")["$[]"](v):i)?p(m)?(u=(i=[m,s,"#"+m])[0],v=i[1],w=i[2],p(p(i=a.$logger()["$info?"]())?L.$catalog()["$[]"]("refs")["$[]"](u)["$!"]():i)&&a.$logger().$info("possible invalid reference: "+u)):(u=(i=[s,s,"#"])[0],v=i[1],w=i[2]):(u=(i=[v,""+(p(o=L.$attributes()["$[]"]("relfileprefix"))?o:"")+v+(p(b)?L.$attributes().$fetch("relfilesuffix",L.$outfilesuffix()):"")])[0],v=i[1],p(m)?(u=(i=[u+"#"+m,v+"#"+m])[0],w=i[1]):w=v):p(p(i=L.$compat_mode())?i:l(X,"Compliance").$natural_xrefs()["$!"]())?(u=(i=[m,"#"+m])[0],w=i[1],p(p(i=a.$logger()["$info?"]())?L.$catalog()["$[]"]("refs")["$[]"](u)["$!"]():i)&&a.$logger().$info("possible invalid reference: "+u)):p(L.$catalog()["$[]"]("refs")["$[]"](m))?(u=(i=[m,"#"+m])[0],w=i[1]):p(p(i=p(o=m["$include?"](" "))?o:m.$downcase()["$!="](m))?u=L.$resolve_id(m):i)?(m=(i=[u,"#"+u])[0],w=i[1]):(u=(i=[m,"#"+m])[0],w=i[1],p(a.$logger()["$info?"]())&&a.$logger().$info("possible invalid reference: "+u)),x=["path",v],_($,"[]=",e.to_a(x)),x[n(x.length,1)],x=["fragment",m],_($,"[]=",e.to_a(x)),x[n(x.length,1)],x=["refid",u],_($,"[]=",e.to_a(x)),x[n(x.length,1)],l(X,"Inline").$new(a,"anchor",c,f(["type","target","attributes"],{type:"xref",target:w,attributes:$})).$convert())},O.$$s=I,O.$$arity=0,O))),p(p(o=R)?i["$include?"]("tnote"):o)&&(i=_(i,"gsub",[l(X,"InlineFootnoteMacroRx")],(A=function(){var t,n,r,i,o=A.$$s||this,a=s,u=s,c=s,d=s,m=s,y=s;if(p(((t=h["~"])===s?s:t["$[]"](0))["$start_with?"](l(X,"RS"))))return((t=h["~"])===s?s:t["$[]"](0)).$slice(1,((t=h["~"])===s?s:t["$[]"](0)).$length());if(p((t=h["~"])===s?s:t["$[]"](1))){if(!p((t=h["~"])===s?s:t["$[]"](3)))return(t=h["~"])===s?s:t["$[]"](0);n=((r=h["~"])===s?s:r["$[]"](3)).$split(",",2),t=e.to_ary(n),a=null==t[0]?s:t[0],u=null==t[1]?s:t[1],p(L.$compat_mode())||o.$logger().$warn("found deprecated footnoteref macro: "+((t=h["~"])===s?s:t["$[]"](0))+"; use footnote macro with target instead")}else a=(t=h["~"])===s?s:t["$[]"](2),u=(t=h["~"])===s?s:t["$[]"](3);if(p(a))p(c=_(L.$footnotes(),"find",[],((i=function(e){return i.$$s,null==e&&(e=s),e.$id()["$=="](a)}).$$s=o,i.$$arity=1,i)))?(d=(t=[c.$index(),c.$text()])[0],u=t[1],m=(t=["xref",a,s])[0],y=t[1],a=t[2]):p(u)?(u=o.$restore_passthroughs(o.$normalize_text(u,!0,!0)),d=L.$counter("footnote-number"),L.$register("footnotes",$(l(X,"Document"),"Footnote").$new(d,a,u)),m=(t=["ref",s])[0],y=t[1]):(o.$logger().$warn("invalid footnote reference: "+a),m=(t=["xref",a,a,s])[0],y=t[1],u=t[2],a=t[3]);else{if(!p(u))return(t=h["~"])===s?s:t["$[]"](0);u=o.$restore_passthroughs(o.$normalize_text(u,!0,!0)),d=L.$counter("footnote-number"),L.$register("footnotes",$(l(X,"Document"),"Footnote").$new(d,a,u)),m=y=s}return l(X,"Inline").$new(o,"footnote",u,f(["attributes","id","target","type"],{attributes:f(["index"],{index:d}),id:a,target:y,type:m})).$convert()},A.$$s=I,A.$$arity=0,A))),i},O.$$arity=1),e.def(G,"$sub_post_replacements",A=function(e){var t,r,o,a=this,$=s,u=s;return null==a.attributes&&(a.attributes=s),null==a.document&&(a.document=s),p(p(t=a.attributes["$[]"]("hardbreaks-option"))?t:a.document.$attributes()["$[]"]("hardbreaks-option"))?($=e.$split(l(X,"LF"),-1),p(i($.$size(),2))?e:(u=$.$pop(),_($,"map",[],(r=function(e){var t=r.$$s||this;return null==e&&(e=s),l(X,"Inline").$new(t,"break",p(e["$end_with?"](l(X,"HARD_LINE_BREAK")))?e.$slice(0,n(e.$length(),2)):e,f(["type"],{type:"line"})).$convert()},r.$$s=a,r.$$arity=1,r))["$<<"](u).$join(l(X,"LF")))):p(p(t=e["$include?"](l(X,"PLUS")))?e["$include?"](l(X,"HARD_LINE_BREAK")):t)?_(e,"gsub",[l(X,"HardLineBreakRx")],(o=function(){var e,t=o.$$s||this;return l(X,"Inline").$new(t,"break",(e=h["~"])===s?s:e["$[]"](1),f(["type"],{type:"line"})).$convert()},o.$$s=a,o.$$arity=0,o)):e},A.$$arity=1),e.def(G,"$sub_source",S=function(e,t){var n=this;return p(t)?n.$sub_callouts(n.$sub_specialchars(e)):n.$sub_specialchars(e)},S.$$arity=2),e.def(G,"$sub_callouts",C=function(e){var n,r,i=this,o=s;return r=p(i["$attr?"]("line-comment"))?l(X,"CalloutSourceRxMap")["$[]"](i.$attr("line-comment")):l(X,"CalloutSourceRx"),o=0,_(e,"gsub",[r],(n=function(){var e,r,i=n.$$s||this;return null==i.document&&(i.document=s),p((e=h["~"])===s?s:e["$[]"](2))?((e=h["~"])===s?s:e["$[]"](0)).$sub(l(X,"RS"),""):l(X,"Inline").$new(i,"callout",((e=h["~"])===s?s:e["$[]"](4))["$=="](".")?(o=t(o,1)).$to_s():(e=h["~"])===s?s:e["$[]"](4),f(["id","attributes"],{id:i.document.$callouts().$read_next_id(),attributes:f(["guard"],{guard:p(e=(r=h["~"])===s?s:r["$[]"](1))?e:((r=h["~"])===s?s:r["$[]"](3))["$=="]("--")?["\x3c!--","--\x3e"]:s})})).$convert()},n.$$s=i,n.$$arity=0,n))},C.$$arity=1),e.def(G,"$highlight_source",R=function(t,n){var r,o,a,$,u,c,d=this,_=s,h=s,m=s,y=s,g=s,v=s;return null==d.document&&(d.document=s),null==d.passthroughs&&(d.passthroughs=s),p(p(r=_=d.document.$syntax_highlighter())?_["$highlight?"]():r)?(p(n)&&(o=d.$extract_callouts(t),t=null==(r=e.to_ary(o))[0]?s:r[0],h=null==r[1]?s:r[1]),m=d.document.$attributes(),$=_.$name(),p(p(r=u=p(d["$attr?"]("linenums"))?(p(o=m["$[]"]($+"-linenums-mode"))?o:"table").$to_sym():s)?i(y=d.$attr("start",1).$to_i(),1):r)&&(y=1),p(d["$attr?"]("highlight"))&&(g=d.$resolve_lines_to_highlight(t,d.$attr("highlight"),y)),o=_.$highlight(d,t,d.$attr("language"),f(["callouts","css_mode","highlight_lines","number_lines","start_line_number","style"],{callouts:h,css_mode:(p(a=m["$[]"]($+"-css"))?a:"class").$to_sym(),highlight_lines:g,number_lines:u,start_line_number:y,style:m["$[]"]($+"-style")})),v=null==(r=e.to_ary(o))[0]?s:r[0],c=null==r[1]?s:r[1],p(d.passthroughs["$empty?"]())||(v=v.$gsub(l(X,"HighlightedPassSlotRx"),l(X,"PASS_START")+"\\1"+l(X,"PASS_END"))),p(h["$nil_or_empty?"]())?v:d.$restore_callouts(v,h,c)):d.$sub_source(t,n)},R.$$arity=2),e.def(G,"$resolve_lines_to_highlight",T=function(r,o,a){var $,u,c=s,f=s;return null==a&&(a=s),c=[],p(o["$include?"](" "))&&(o=o.$delete(" ")),_(p(o["$include?"](","))?o.$split(","):o.$split(";"),"map",[],(($=function(o){$.$$s;var a,u,f,d=s,_=s,h=s,m=s;return null==o&&(o=s),p(o["$start_with?"]("!"))&&(o=o.$slice(1,o.$length()),d=!0),p(f=p(o["$include?"](".."))?"..":p(o["$include?"]("-"))?"-":s)?(u=o.$partition(f),_=null==(a=e.to_ary(u))[0]?s:a[0],null==a[1]||a[1],h=null==a[2]?s:a[2],p(p(a=h["$empty?"]())?a:i(h=h.$to_i(),0))&&(h=t(r.$count(l(X,"LF")),1)),c=p(d)?n(c,e.Range.$new(_.$to_i(),h,!1).$to_a()):c["$|"](e.Range.$new(_.$to_i(),h,!1).$to_a())):p(d)?c.$delete(o.$to_i()):p(c["$include?"](m=o.$to_i())["$!"]())?c["$<<"](m):s}).$$s=this,$.$$arity=1,$)),(f=p(a)?n(a,1):0)["$=="](0)||(c=_(c,"map",[],((u=function(e){return u.$$s,null==e&&(e=s),n(e,f)}).$$s=this,u.$$arity=1,u))),c.$sort()},T.$$arity=-3),e.def(G,"$extract_passthroughs",I=function(t){var i,a,$,u,c,d,m,y,g,v=this,b=s;return null==v.document&&(v.document=s),null==v.passthroughs&&(v.passthroughs=s),d=v.document.$compat_mode(),b=v.passthroughs,p(p(i=p(a=t["$include?"]("++"))?a:t["$include?"]("$$"))?i:t["$include?"]("ss:"))&&(t=_(t,"gsub",[l(X,"InlinePassMacroRx")],($=function(){var t,i=$.$$s||this,a=s,u=s,c=s,m=s,y=s,g=s,v=s,w=s,x=s;if(p(a=(t=h["~"])===s?s:t["$[]"](4))){if(p(p(t=d)?a["$=="]("++"):t))return(p((t=h["~"])===s?s:t["$[]"](2))?((t=h["~"])===s?s:t["$[]"](1))+"["+((t=h["~"])===s?s:t["$[]"](2))+"]"+((t=h["~"])===s?s:t["$[]"](3)):""+((t=h["~"])===s?s:t["$[]"](1))+((t=h["~"])===s?s:t["$[]"](3)))+"++"+i.$extract_passthroughs((t=h["~"])===s?s:t["$[]"](5))+"++";if(p(u=(t=h["~"])===s?s:t["$[]"](2))){if(p(r(c=((t=h["~"])===s?s:t["$[]"](3)).$length(),0)))return((t=h["~"])===s?s:t["$[]"](1))+"["+u+"]"+o(l(X,"RS"),n(c,1))+a+((t=h["~"])===s?s:t["$[]"](5))+a;((t=h["~"])===s?s:t["$[]"](1))["$=="](l(X,"RS"))?m="["+u+"]":(p((t=a["$=="]("++"))?u["$end_with?"]("x-"):a["$=="]("++"))&&(y=!0,u=u.$slice(0,n(u.$length(),2))),g=i.$parse_quoted_text_attributes(u))}else if(p(r(c=((t=h["~"])===s?s:t["$[]"](3)).$length(),0)))return""+o(l(X,"RS"),n(c,1))+a+((t=h["~"])===s?s:t["$[]"](5))+a;v=a["$=="]("+++")?[]:l(X,"BASIC_SUBS"),p(g)?p(y)?(w=[x=b.$size(),f(["text","subs","type","attributes"],{text:(t=h["~"])===s?s:t["$[]"](5),subs:l(X,"NORMAL_SUBS"),type:"monospaced",attributes:g})],_(b,"[]=",e.to_a(w)),w[n(w.length,1)]):(w=[x=b.$size(),f(["text","subs","type","attributes"],{text:(t=h["~"])===s?s:t["$[]"](5),subs:v,type:"unquoted",attributes:g})],_(b,"[]=",e.to_a(w)),w[n(w.length,1)]):(w=[x=b.$size(),f(["text","subs"],{text:(t=h["~"])===s?s:t["$[]"](5),subs:v})],_(b,"[]=",e.to_a(w)),w[n(w.length,1)])}else{if(((t=h["~"])===s?s:t["$[]"](6))["$=="](l(X,"RS")))return((t=h["~"])===s?s:t["$[]"](0)).$slice(1,((t=h["~"])===s?s:t["$[]"](0)).$length());p(v=(t=h["~"])===s?s:t["$[]"](7))?(w=[x=b.$size(),f(["text","subs"],{text:i.$normalize_text((t=h["~"])===s?s:t["$[]"](8),s,!0),subs:i.$resolve_pass_subs(v)})],_(b,"[]=",e.to_a(w)),w[n(w.length,1)]):(w=[x=b.$size(),f(["text"],{text:i.$normalize_text((t=h["~"])===s?s:t["$[]"](8),s,!0)})],_(b,"[]=",e.to_a(w)),w[n(w.length,1)])}return""+(p(t=m)?t:"")+l(X,"PASS_START")+x+l(X,"PASS_END")},$.$$s=v,$.$$arity=0,$))),a=l(X,"InlinePassRx")["$[]"](d),m=null==(i=e.to_ary(a))[0]?s:i[0],y=null==i[1]?s:i[1],g=null==i[2]?s:i[2],p(p(i=t["$include?"](m))?i:p(a=y)?t["$include?"](y):a)&&(t=_(t,"gsub",[g],(u=function(){var t,r,i=u.$$s||this,o=s,a=s,$=s,c=s,m=s,y=s,g=s,v=s,w=s,x=s;if(o=(t=h["~"])===s?s:t["$[]"](1),a=(t=h["~"])===s?s:t["$[]"](2),p(($=(t=h["~"])===s?s:t["$[]"](3))["$start_with?"](l(X,"RS")))&&(c=l(X,"RS")),m=(t=h["~"])===s?s:t["$[]"](4),r=(t=h["~"])===s?s:t["$[]"](5),p(d)?y=!0:p(y=p(t=a)?a["$end_with?"]("x-"):t)&&(a=a.$slice(0,n(a.$length(),2))),p(a)){if(p((t=m["$=="]("`"))?y["$!"]():m["$=="]("`")))return i.$extract_inner_passthrough(r,o+"["+a+"]"+c);if(p(c))return o+"["+a+"]"+$.$slice(1,$.$length());o["$=="](l(X,"RS"))?o="["+a+"]":g=i.$parse_quoted_text_attributes(a)}else{if(p((t=m["$=="]("`"))?y["$!"]():m["$=="]("`")))return i.$extract_inner_passthrough(r,""+o+c);if(p(c))return""+o+$.$slice(1,$.$length())}return p(d)?(v=[w=b.$size(),f(["text","subs","attributes","type"],{text:r,subs:l(X,"BASIC_SUBS"),attributes:g,type:"monospaced"})],_(b,"[]=",e.to_a(v)),v[n(v.length,1)]):p(g)?p(y)?(x=m["$=="]("`")?l(X,"BASIC_SUBS"):l(X,"NORMAL_SUBS"),v=[w=b.$size(),f(["text","subs","attributes","type"],{text:r,subs:x,attributes:g,type:"monospaced"})],_(b,"[]=",e.to_a(v)),v[n(v.length,1)]):(v=[w=b.$size(),f(["text","subs","attributes","type"],{text:r,subs:l(X,"BASIC_SUBS"),attributes:g,type:"unquoted"})],_(b,"[]=",e.to_a(v)),v[n(v.length,1)]):(v=[w=b.$size(),f(["text","subs"],{text:r,subs:l(X,"BASIC_SUBS")})],_(b,"[]=",e.to_a(v)),v[n(v.length,1)]),""+o+l(X,"PASS_START")+w+l(X,"PASS_END")},u.$$s=v,u.$$arity=0,u))),p(p(i=t["$include?"](":"))?p(a=t["$include?"]("stem:"))?a:t["$include?"]("math:"):i)&&(t=_(t,"gsub",[l(X,"InlineStemMacroRx")],(c=function(){var t,r,i,o=c.$$s||this,a=s,$=s,u=s;return null==o.document&&(o.document=s),p(((t=h["~"])===s?s:t["$[]"](0))["$start_with?"](l(X,"RS")))?((t=h["~"])===s?s:t["$[]"](0)).$slice(1,((t=h["~"])===s?s:t["$[]"](0)).$length()):((a=((t=h["~"])===s?s:t["$[]"](1)).$to_sym())["$=="]("stem")&&(a=l(X,"STEM_TYPE_ALIASES")["$[]"](o.document.$attributes()["$[]"]("stem")).$to_sym()),$=(t=h["~"])===s?s:t["$[]"](2),u=o.$normalize_text((t=h["~"])===s?s:t["$[]"](3),s,!0),p(p(t=a["$=="]("latexmath")?u["$start_with?"]("$"):a["$=="]("latexmath"))?u["$end_with?"]("$"):t)&&(u=u.$slice(1,n(u.$length(),2))),$=p($)?o.$resolve_pass_subs($):p(o.document["$basebackend?"]("html"))?l(X,"BASIC_SUBS"):s,r=[i=b.$size(),f(["text","subs","type"],{text:u,subs:$,type:a})],_(b,"[]=",e.to_a(r)),n(r.length,1),""+l(X,"PASS_START")+i+l(X,"PASS_END"))},c.$$s=v,c.$$arity=0,c))),t},I.$$arity=1),e.def(G,"$restore_passthroughs",N=function(e){var t,n=this,r=s;return null==n.passthroughs&&(n.passthroughs=s),r=n.passthroughs,_(e,"gsub",[l(X,"PassSlotRx")],(t=function(){var n,i=t.$$s||this,o=s,a=s,$=s,u=s,c=s;return p(o=r["$[]"](((n=h["~"])===s?s:n["$[]"](1)).$to_i()))?(a=i.$apply_subs(o["$[]"]("text"),o["$[]"]("subs")),p($=o["$[]"]("type"))&&(p(u=o["$[]"]("attributes"))&&(c=u["$[]"]("id")),a=l(X,"Inline").$new(i,"quoted",a,f(["type","id","attributes"],{type:$,id:c,attributes:u})).$convert()),p(a["$include?"](l(X,"PASS_START")))?i.$restore_passthroughs(a):a):(i.$logger().$error("unresolved passthrough detected: "+e),"??pass??")},t.$$s=n,t.$$arity=0,t))},N.$$arity=1),e.def(G,"$resolve_subs",L=function(e,i,o,a){var $,u,c,f=s,d=s;return null==i&&(i="block"),null==o&&(o=s),null==a&&(a=s),p(e["$nil_or_empty?"]())?s:(f=s,p(e["$include?"](" "))&&(e=e.$delete(" ")),u=l(X,"SubModifierSniffRx")["$match?"](e),_(e.$split(","),"each",[],(($=function(e){$.$$s;var r,a,c=s,d=s,_=s,h=s,m=s,y=s;return null==e&&(e=s),c=s,p(u)&&((d=e.$chr())["$=="]("+")?(c="append",e=e.$slice(1,e.$length())):d["$=="]("-")?(c="remove",e=e.$slice(1,e.$length())):p(e["$end_with?"]("+"))&&(c="prepend",e=e.$chop())),e=e.$to_sym(),p((r=i["$=="]("inline"))?p(a=e["$=="]("verbatim"))?a:e["$=="]("v"):i["$=="]("inline"))?_=l(X,"BASIC_SUBS"):p(l(X,"SUB_GROUPS")["$key?"](e))?_=l(X,"SUB_GROUPS")["$[]"](e):p(p(r=(a=i["$=="]("inline"))?e.$length()["$=="](1):i["$=="]("inline"))?l(X,"SUB_HINTS")["$key?"](e):r)?(h=l(X,"SUB_HINTS")["$[]"](e),_=p(m=l(X,"SUB_GROUPS")["$[]"](h))?m:[h]):_=[e],p(c)?(f=p(r=f)?r:p(o)?o.$drop(0):[],"append"["$==="](y=c)?f=t(f,_):"prepend"["$==="](y)?f=t(_,f):"remove"["$==="](y)?f=n(f,_):s):f=t(f=p(r=f)?r:[],_)}).$$s=this,$.$$arity=1,$)),p(f)?(c=f["$&"](l(X,"SUB_OPTIONS")["$[]"](i)),p(n(f,c)["$empty?"]())||(d=n(f,c),this.$logger().$warn("invalid substitution type"+(p(r(d.$size(),1))?"s":"")+(p(a)?" for ":"")+a+": "+d.$join(", "))),c):s)},L.$$arity=-2),e.def(G,"$resolve_block_subs",D=function(e,t,n){return this.$resolve_subs(e,"block",t,n)},D.$$arity=3),e.def(G,"$resolve_pass_subs",P=function(e){return this.$resolve_subs(e,"inline",s,"passthrough macro")},P.$$arity=1),e.def(G,"$expand_subs",M=function(e,n){var r,i,o=this,a=s,u=s;return null==n&&(n=s),a=e,$("::","Symbol")["$==="](a)?e["$=="]("none")?s:p(r=l(X,"SUB_GROUPS")["$[]"](e))?r:[e]:$("::","Array")["$==="](a)?(u=[],_(e,"each",[],((i=function(e){i.$$s;var n=s;return null==e&&(e=s),e["$=="]("none")?s:p(n=l(X,"SUB_GROUPS")["$[]"](e))?u=t(u,n):u["$<<"](e)}).$$s=o,i.$$arity=1,i)),p(u["$empty?"]())?s:u):o.$resolve_subs(e,"inline",s,n)},M.$$arity=-2),e.def(G,"$commit_subs",z=function(){var t,r,i,o,a=this,$=s,u=s,c=s,f=s,d=s;if(null==a.default_subs&&(a.default_subs=s),null==a.content_model&&(a.content_model=s),null==a.context&&(a.context=s),null==a.subs&&(a.subs=s),null==a.attributes&&(a.attributes=s),null==a.style&&(a.style=s),null==a.document&&(a.document=s),p($=a.default_subs));else if(u=a.content_model,"simple"["$==="](u))$=l(X,"NORMAL_SUBS");else if("verbatim"["$==="](u))$=a.context["$=="]("verse")?l(X,"NORMAL_SUBS"):l(X,"VERBATIM_SUBS");else{if(!"raw"["$==="](u))return a.subs;$=a.context["$=="]("stem")?l(X,"BASIC_SUBS"):l(X,"NO_SUBS")}return p(o=a.attributes["$[]"]("subs"))?a.subs=p(t=a.$resolve_block_subs(o,$,a.context))?t:[]:a.subs=$.$drop(0),p(p(t=p(r=p(i=a.context["$=="]("listing")?a.style["$=="]("source"):a.context["$=="]("listing"))?c=a.document.$syntax_highlighter():i)?c["$highlight?"]():r)?f=a.subs.$index("specialcharacters"):t)&&(d=[f,"highlight"],_(a.subs,"[]=",e.to_a(d)),d[n(d.length,1)]),s},z.$$arity=0),e.def(G,"$parse_attributes",F=function(e,t,n){var r,i,o=this,a=s;return null==o.document&&(o.document=s),null==t&&(t=[]),null==n&&(n=f([],{})),p(!p(e)||e["$empty?"]())?f([],{}):(p(n["$[]"]("unescape_input"))&&(e=o.$normalize_text(e,!0,!0)),p(p(r=n["$[]"]("sub_input"))?e["$include?"](l(X,"ATTR_REF_HEAD")):r)&&(e=o.document.$sub_attributes(e)),p(n["$[]"]("sub_result"))&&(a=o),p(i=n["$[]"]("into"))?l(X,"AttributeList").$new(e,a).$parse_into(i,t):l(X,"AttributeList").$new(e,a).$parse(t))},F.$$arity=-2),G.$private(),e.def(G,"$extract_attributes_from_text",j=function(e,t){var n,r=s,i=s;return null==t&&(t=s),n=p(e["$include?"](l(X,"LF")))?e.$tr(l(X,"LF")," "):e,p(r=(i=l(X,"AttributeList").$new(n,this).$parse())["$[]"](1))?r["$=="](n)?[e,i.$clear()]:[r,i]:[t,i]},j.$$arity=-2),e.def(G,"$extract_callouts",B=function(r){var i,o,a=this,$=s,u=s,c=s,d=s;return $=f([],{}),u=c=0,d=s,o=p(a["$attr?"]("line-comment"))?l(X,"CalloutExtractRxMap")["$[]"](a.$attr("line-comment")):l(X,"CalloutExtractRx"),r=_(r.$split(l(X,"LF"),-1),"map",[],(i=function(r){var a,f=i.$$s||this;return null==r&&(r=s),c=t(c,1),_(r,"gsub",[o],((a=function(){a.$$s;var r,i,o=s;return p((r=h["~"])===s?s:r["$[]"](2))?((r=h["~"])===s?s:r["$[]"](0)).$sub(l(X,"RS"),""):((p(r=$["$[]"](c))?r:(o=[c,[]],_($,"[]=",e.to_a(o)),o[n(o.length,1)]))["$<<"]([p(r=(i=h["~"])===s?s:i["$[]"](1))?r:((i=h["~"])===s?s:i["$[]"](3))["$=="]("--")?["\x3c!--","--\x3e"]:s,((r=h["~"])===s?s:r["$[]"](4))["$=="](".")?(u=t(u,1)).$to_s():(r=h["~"])===s?s:r["$[]"](4)]),d=c,"")}).$$s=f,a.$$arity=0,a))},i.$$s=a,i.$$arity=1,i)).$join(l(X,"LF")),p(d)?d["$=="](c)&&(r=""+r+l(X,"LF")):$=s,[r,$]},B.$$arity=1),e.def(G,"$restore_callouts",q=function(n,r,i){var o,a=s,$=s;return null==i&&(i=s),p(i)?(a=n.$slice(0,i),n=n.$slice(i,n.$length())):a="",$=0,t(a,_(n.$split(l(X,"LF"),-1),"map",[],(o=function(n){var i,a,u,c=o.$$s||this,d=s,h=s,m=s;return null==c.document&&(c.document=s),null==n&&(n=s),p(d=r.$delete($=t($,1)))?d.$size()["$=="](1)?(a=d["$[]"](0),h=null==(i=e.to_ary(a))[0]?s:i[0],m=null==i[1]?s:i[1],""+n+l(X,"Inline").$new(c,"callout",m,f(["id","attributes"],{id:c.document.$callouts().$read_next_id(),attributes:f(["guard"],{guard:h})})).$convert()):""+n+_(d,"map",[],(u=function(e,t){var n=u.$$s||this;return null==n.document&&(n.document=s),null==e&&(e=s),null==t&&(t=s),l(X,"Inline").$new(n,"callout",t,f(["id","attributes"],{id:n.document.$callouts().$read_next_id(),attributes:f(["guard"],{guard:e})})).$convert()},u.$$s=c,u.$$arity=2,u)).$join(" "):n},o.$$s=this,o.$$arity=1,o)).$join(l(X,"LF")))},q.$$arity=-3),e.def(G,"$extract_inner_passthrough",U=function(t,r){var i,o,a=this,$=s,u=s;return null==a.passthroughs&&(a.passthroughs=s),p(p(i=p(o=t["$end_with?"]("+"))?t["$start_with?"]("+","\\+"):o)?l(X,"SinglePlusInlinePassRx")["$=~"](t):i)?p((i=h["~"])===s?s:i["$[]"](1))?r+"`+"+((i=h["~"])===s?s:i["$[]"](2))+"+`":($=[u=a.passthroughs.$size(),f(["text","subs"],{text:(i=h["~"])===s?s:i["$[]"](2),subs:l(X,"BASIC_SUBS")})],_(a.passthroughs,"[]=",e.to_a($)),$[n($.length,1)],r+"`"+l(X,"PASS_START")+u+l(X,"PASS_END")+"`"):r+"`"+t+"`"},U.$$arity=2),e.def(G,"$convert_quoted_text",H=function(e,t,n){var r=this,i=s,o=s,a=s,$=s,u=s;if(p(e["$[]"](0)["$start_with?"](l(X,"RS")))){if(!p(n["$=="]("constrained")?i=e["$[]"](2):n["$=="]("constrained")))return e["$[]"](0).$slice(1,e["$[]"](0).$length());o="["+i+"]"}return n["$=="]("constrained")?p(o)?""+o+l(X,"Inline").$new(r,"quoted",e["$[]"](3),f(["type"],{type:t})).$convert():(p(a=e["$[]"](2))&&($=(u=r.$parse_quoted_text_attributes(a))["$[]"]("id"),t["$=="]("mark")&&(t="unquoted")),""+e["$[]"](1)+l(X,"Inline").$new(r,"quoted",e["$[]"](3),f(["type","id","attributes"],{type:t,id:$,attributes:u})).$convert()):(p(a=e["$[]"](1))&&($=(u=r.$parse_quoted_text_attributes(a))["$[]"]("id"),t["$=="]("mark")&&(t="unquoted")),l(X,"Inline").$new(r,"quoted",e["$[]"](2),f(["type","id","attributes"],{type:t,id:$,attributes:u})).$convert())},H.$$arity=3),e.def(G,"$do_replacement",Y=function(e,n,r){var i=s,o=s;return p((i=e["$[]"](0))["$include?"](l(X,"RS")))?i.$sub(l(X,"RS"),""):"none"["$==="](o=r)?n:"bounding"["$==="](o)?t(t(e["$[]"](1),n),e["$[]"](2)):t(e["$[]"](1),n)},Y.$$arity=3),l(X,"RUBY_ENGINE")["$=="]("opal"),e.def(G,"$parse_quoted_text_attributes",W=function(i){var o,a,$=s,u=s,c=s,d=s,h=s,m=s;return p(i["$include?"](l(X,"ATTR_REF_HEAD")))&&(i=this.$sub_attributes(i)),p(i["$include?"](","))&&(i=i.$slice(0,i.$index(","))),p((i=i.$strip())["$empty?"]())?f([],{}):p(p(o=i["$start_with?"](".","#"))?l(X,"Compliance").$shorthand_property_syntax():o)?(a=i.$partition("#"),$=null==(o=e.to_ary(a))[0]?s:o[0],null==o[1]||o[1],u=null==o[2]?s:o[2],c=f([],{}),p(u["$empty?"]())?p(r($.$length(),1))&&(d=["role",$.$tr("."," ").$lstrip()],_(c,"[]=",e.to_a(d)),d[n(d.length,1)]):(a=u.$partition("."),h=null==(o=e.to_ary(a))[0]?s:o[0],null==o[1]||o[1],m=null==o[2]?s:o[2],p(h["$empty?"]())||(d=["id",h],_(c,"[]=",e.to_a(d)),d[n(d.length,1)]),p(m["$empty?"]())?p(r($.$length(),1))&&(d=["role",$.$tr("."," ").$lstrip()],_(c,"[]=",e.to_a(d)),d[n(d.length,1)]):p(r($.$length(),1))?(d=["role",t(t($,"."),m).$tr("."," ").$lstrip()],_(c,"[]=",e.to_a(d)),d[n(d.length,1)]):(d=["role",m.$tr("."," ")],_(c,"[]=",e.to_a(d)),d[n(d.length,1)])),c):f(["role"],{role:i})},W.$$arity=1),e.def(G,"$normalize_text",V=function(e,t,n){var r;return null==t&&(t=s),null==n&&(n=s),p(e["$empty?"]())||(p(t)&&(e=e.$strip().$tr(l(X,"LF")," ")),p(p(r=n)?e["$include?"](l(X,"R_SB")):r)&&(e=e.$gsub(l(X,"ESC_R_SB"),l(X,"R_SB")))),e},V.$$arity=-2),e.def(G,"$split_simple_csv",K=function(e){var n,r,i=s,o=s,a=s;return p(e["$empty?"]())?[]:p(e["$include?"]('"'))?(i=[],o="",a=s,_(e,"each_char",[],((n=function(e){n.$$s;var r=s;return null==e&&(e=s),","["$==="](r=e)?p(a)?o=t(o,e):(i["$<<"](o.$strip()),o=""):'"'["$==="](r)?a=a["$!"]():o=t(o,e)}).$$s=this,n.$$arity=1,n)),i["$<<"](o.$strip())):_(e.$split(","),"map",[],((r=function(e){return r.$$s,null==e&&(e=s),e.$strip()}).$$s=this,r.$$arity=1,r))},K.$$arity=1)}(y[0],y)}(a[0],a)},Opal.modules["asciidoctor/version"]=function(e){e.top;var t=[],n=(e.nil,e.const_get_qualified,e.const_get_relative,e.breaker,e.slice,e.module);return function(t,r){var i=[n(t,"Asciidoctor")].concat(r);e.const_set(i[0],"VERSION","2.0.16")}(t[0],t)},Opal.modules["asciidoctor/abstract_node"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e<t:e["$<"](t)}e.top;var r=[],i=e.nil,o=e.const_get_qualified,a=e.const_get_relative,s=(e.breaker,e.slice,e.module),$=e.klass,l=e.hash2,u=e.truthy,c=e.send;return e.add_stubs(["$include","$attr_reader","$attr_accessor","$==","$document","$to_s","$[]","$merge","$raise","$converter","$attributes","$key?","$[]=","$-","$delete","$tap","$new","$each_key","$end_with?","$<<","$slice","$length","$update","$split","$include?","$===","$join","$empty?","$apply_reftext_subs","$attr?","$attr","$extname?","$image_uri","$<","$safe","$uriish?","$encode_spaces_in_uri","$normalize_web_path","$generate_data_uri_from_uri","$generate_data_uri","$extname","$normalize_system_path","$readable?","$strict_encode64","$binread","$warn","$logger","$require_library","$!","$open_uri","$content_type","$read","$base_dir","$root?","$path_resolver","$system_path","$web_path","$!=","$prepare_source_string","$fetch","$read_asset"]),function(r,f){var d=[s(r,"Asciidoctor")].concat(f);!function(r,s,f){var d,p,_,h,m,y,g,v,b,w,x,k,E,O,A,S,C,R,T,I,N,L,D,P,M,z,F,j,B,q,U,H,Y,W=$(r,null,"AbstractNode"),V=[W].concat(f);W.$$prototype.document=W.$$prototype.attributes=W.$$prototype.parent=i,W.$include(a(V,"Logging")),W.$include(a(V,"Substitutors")),W.$attr_reader("attributes"),W.$attr_reader("context"),W.$attr_reader("document"),W.$attr_accessor("id"),W.$attr_reader("node_name"),W.$attr_reader("parent"),e.def(W,"$initialize",d=function(e,t,n){var r=this,o=i;return null==n&&(n=l([],{})),t["$=="]("document")?r.document=r:u(e)&&(r.document=(r.parent=e).$document()),r.node_name=(r.context=t).$to_s(),r.attributes=u(o=n["$[]"]("attributes"))?o.$merge():l([],{}),r.passthroughs=[]},d.$$arity=-3),e.def(W,"$block?",p=function(){return this.$raise(o("::","NotImplementedError"))},p.$$arity=0),e.def(W,"$inline?",_=function(){return this.$raise(o("::","NotImplementedError"))},_.$$arity=0),e.def(W,"$converter",h=function(){return this.document.$converter()},h.$$arity=0),e.def(W,"$parent=",m=function(e){var t;return t=[e,e.$document()],this.parent=t[0],this.document=t[1],t},m.$$arity=1),e.def(W,"$attr",y=function(e,t,n){var r,o,a,s,$=this;return null==t&&(t=i),null==n&&(n=i),u(r=$.attributes["$[]"](e.$to_s()))?r:u(o=u(a=u(s=n)?$.parent:s)?$.document.$attributes()["$[]"]((n["$=="](!0)?e:n).$to_s()):a)?o:t},y.$$arity=-2),e.def(W,"$attr?",g=function(e,t,n){var r,o,a=this;return null==t&&(t=i),null==n&&(n=i),u(t)?t["$=="](u(r=a.attributes["$[]"](e.$to_s()))?r:u(u(o=n)?a.parent:o)?a.document.$attributes()["$[]"]((n["$=="](!0)?e:n).$to_s()):i):u(r=a.attributes["$key?"](e.$to_s()))?r:!!u(u(o=n)?a.parent:o)&&a.document.$attributes()["$key?"]((n["$=="](!0)?e:n).$to_s())},g.$$arity=-2),e.def(W,"$set_attr",v=function(n,r,o){var a=i;return null==r&&(r=""),null==o&&(o=!0),!u(o["$=="](!1)?this.attributes["$key?"](n):o["$=="](!1))&&(a=[n,r],c(this.attributes,"[]=",e.to_a(a)),a[t(a.length,1)],!0)},v.$$arity=-2),e.def(W,"$remove_attr",b=function(e){return this.attributes.$delete(e)},b.$$arity=1),e.def(W,"$option?",w=function(e){return!!u(this.attributes["$[]"](e+"-option"))},w.$$arity=1),e.def(W,"$set_option",x=function(n){var r;return r=[n+"-option",""],c(this.attributes,"[]=",e.to_a(r)),t(r.length,1),i},x.$$arity=1),e.def(W,"$enabled_options",k=function(){var e;return c(o("::","Set").$new(),"tap",[],(e=function(n){var r,o=e.$$s||this;return null==o.attributes&&(o.attributes=i),null==n&&(n=i),c(o.attributes,"each_key",[],((r=function(e){return r.$$s,null==e&&(e=i),u(e.$to_s()["$end_with?"]("-option"))?n["$<<"](e.$slice(0,t(e.$length(),7))):i}).$$s=o,r.$$arity=1,r))},e.$$s=this,e.$$arity=1,e))},k.$$arity=0),e.def(W,"$update_attributes",E=function(e){return this.attributes.$update(e)},E.$$arity=1),e.def(W,"$role",O=function(){return this.attributes["$[]"]("role")},O.$$arity=0),e.def(W,"$roles",A=function(){var e=i;return u(e=this.attributes["$[]"]("role"))?e.$split():[]},A.$$arity=0),e.def(W,"$role?",S=function(e){return null==e&&(e=i),u(e)?e["$=="](this.attributes["$[]"]("role")):this.attributes["$key?"]("role")},S.$$arity=-1),e.def(W,"$has_role?",C=function(e){var t;return!!u(t=this.attributes["$[]"]("role"))&&(" "+t+" ")["$include?"](" "+e+" ")},C.$$arity=1),e.def(W,"$role=",R=function(n){var r;return r=["role",u(o("::","Array")["$==="](n))?n.$join(" "):n],c(this.attributes,"[]=",e.to_a(r)),r[t(r.length,1)]},R.$$arity=1),e.def(W,"$add_role",T=function(n){var r,o=this,a=i;return u(r=o.attributes["$[]"]("role"))?!u((" "+r+" ")["$include?"](" "+n+" "))&&(a=["role",r+" "+n],c(o.attributes,"[]=",e.to_a(a)),a[t(a.length,1)],!0):(a=["role",n],c(o.attributes,"[]=",e.to_a(a)),a[t(a.length,1)],!0)},T.$$arity=1),e.def(W,"$remove_role",I=function(n){var r,o=this,a=i,s=i;return!!u(u(r=a=o.attributes["$[]"]("role"))?(a=a.$split()).$delete(n):r)&&(u(a["$empty?"]())?o.attributes.$delete("role"):(s=["role",a.$join(" ")],c(o.attributes,"[]=",e.to_a(s)),s[t(s.length,1)]),!0)},I.$$arity=1),e.def(W,"$reftext",N=function(){var e;return u(e=this.attributes["$[]"]("reftext"))?this.$apply_reftext_subs(e):i},N.$$arity=0),e.def(W,"$reftext?",L=function(){return this.attributes["$key?"]("reftext")},L.$$arity=0),e.def(W,"$icon_uri",D=function(e){var t=this,n=i;return u(t["$attr?"]("icon"))?(n=t.$attr("icon"),u(a(V,"Helpers")["$extname?"](n))||(n=n+"."+t.document.$attr("icontype","png"))):n=e+"."+t.document.$attr("icontype","png"),t.$image_uri(n,"iconsdir")},D.$$arity=1),e.def(W,"$image_uri",P=function(e,t){var r,s,$,l,c=this,f=i,d=i;return null==t&&(t="imagesdir"),u(u(r=n((f=c.document).$safe(),o(a(V,"SafeMode"),"SECURE")))?f["$attr?"]("data-uri"):r)?u(u(r=u(s=a(V,"Helpers")["$uriish?"](e))?e=a(V,"Helpers").$encode_spaces_in_uri(e):s)?r:u(s=u($=u(l=t)?d=f.$attr(t):l)?a(V,"Helpers")["$uriish?"](d):$)?e=c.$normalize_web_path(e,d,!1):s)?u(f["$attr?"]("allow-uri-read"))?c.$generate_data_uri_from_uri(e,f["$attr?"]("cache-uri")):e:c.$generate_data_uri(e,t):c.$normalize_web_path(e,u(t)?f.$attr(t):i)},P.$$arity=-2),e.def(W,"$media_uri",M=function(e,t){var n=this;return null==t&&(t="imagesdir"),n.$normalize_web_path(e,u(t)?n.document.$attr(t):i)},M.$$arity=-2),e.def(W,"$generate_data_uri",z=function(e,t){var n=this,r=i,s=i,$=i;return null==t&&(t=i),s=u(r=a(V,"Helpers").$extname(e,i))?r["$=="](".svg")?"image/svg+xml":"image/"+r.$slice(1,r.$length()):"application/octet-stream",$=u(t)?n.$normalize_system_path(e,n.document.$attr(t),i,l(["target_name"],{target_name:"image"})):n.$normalize_system_path(e),u(o("::","File")["$readable?"]($))?"data:"+s+";base64,"+o("::","Base64").$strict_encode64(o("::","File").$binread($)):(n.$logger().$warn("image to embed not found or not readable: "+$),"data:"+s+";base64,")},z.$$arity=-2),e.def(W,"$generate_data_uri_from_uri",F=function(t,n){var r,s,$,l=i,f=i;null==n&&(n=!1),u(n)?a(V,"Helpers").$require_library("open-uri/cached","open-uri-cached"):u(a(V,"RUBY_ENGINE_OPAL")["$!"]())&&o("::","OpenURI");try{return s=c(o("::","OpenURI"),"open_uri",[t,a(V,"URI_READ_MODE")],(($=function(e){return $.$$s,null==e&&(e=i),[e.$content_type(),e.$read()]}).$$s=this,$.$$arity=1,$)),l=null==(r=e.to_ary(s))[0]?i:r[0],f=null==r[1]?i:r[1],"data:"+l+";base64,"+o("::","Base64").$strict_encode64(f)}catch(d){if(!e.rescue(d,[a(V,"StandardError")]))throw d;try{return this.$logger().$warn("could not retrieve image data from URI: "+t),t}finally{e.pop_exception()}}},F.$$arity=-2),e.def(W,"$normalize_asset_path",j=function(e,t,n){return null==t&&(t="path"),null==n&&(n=!0),this.$normalize_system_path(e,this.document.$base_dir(),i,l(["target_name","recover"],{target_name:t,recover:n}))},j.$$arity=-2),e.def(W,"$normalize_system_path",B=function(e,t,r,s){var $,c=i;return null==t&&(t=i),null==r&&(r=i),null==s&&(s=l([],{})),u(n((c=this.document).$safe(),o(a(V,"SafeMode"),"SAFE")))?u(t)?u(c.$path_resolver()["$root?"](t))||(t=o("::","File").$join(c.$base_dir(),t)):t=c.$base_dir():(t=u($=t)?$:c.$base_dir(),r=u($=r)?$:c.$base_dir()),c.$path_resolver().$system_path(e,t,r,s)},B.$$arity=-2),e.def(W,"$normalize_web_path",q=function(e,t,n){var r;return null==t&&(t=i),null==n&&(n=!0),u(u(r=n)?a(V,"Helpers")["$uriish?"](e):r)?a(V,"Helpers").$encode_spaces_in_uri(e):this.document.$path_resolver().$web_path(e,t)},q.$$arity=-2),e.def(W,"$read_asset",U=function(e,t){var n;return null==t&&(t=l([],{})),u(o("::","Hash")["$==="](t))||(t=l(["warn_on_failure"],{warn_on_failure:t["$!="](!1)})),u(o("::","File")["$readable?"](e))?u(t["$[]"]("normalize"))?a(V,"Helpers").$prepare_source_string(o("::","File").$read(e,l(["mode"],{mode:a(V,"FILE_READ_MODE")}))).$join(a(V,"LF")):o("::","File").$read(e,l(["mode"],{mode:a(V,"FILE_READ_MODE")})):u(t["$[]"]("warn_on_failure"))?(this.$logger().$warn((u(n=this.$attr("docfile"))?n:"<stdin>")+": "+(u(n=t["$[]"]("label"))?n:"file")+" does not exist or cannot be read: "+e),i):i},U.$$arity=-2),e.def(W,"$read_contents",H=function(t,n){var r,s,$,f,d,p=this,_=i,h=i,m=i;if(null==n&&(n=l([],{})),_=p.document,u(u(r=a(V,"Helpers")["$uriish?"](t))?r:u(s=u($=h=n["$[]"]("start"))?a(V,"Helpers")["$uriish?"](h):$)?t=_.$path_resolver().$web_path(t,h):s))if(u(_["$attr?"]("allow-uri-read"))){u(_["$attr?"]("cache-uri"))&&a(V,"Helpers").$require_library("open-uri/cached","open-uri-cached");try{m=u(n["$[]"]("normalize"))?a(V,"Helpers").$prepare_source_string(c(o("::","OpenURI"),"open_uri",[t,a(V,"URI_READ_MODE")],(f=function(e){return f.$$s,null==e&&(e=i),e.$read()},f.$$s=p,f.$$arity=1,f))).$join(a(V,"LF")):c(o("::","OpenURI"),"open_uri",[t,a(V,"URI_READ_MODE")],((d=function(e){return d.$$s,null==e&&(e=i),e.$read()}).$$s=p,d.$$arity=1,d))}catch(y){if(!e.rescue(y,[a(V,"StandardError")]))throw y;try{u(n.$fetch("warn_on_failure",!0))&&p.$logger().$warn("could not retrieve contents of "+(u(r=n["$[]"]("label"))?r:"asset")+" at URI: "+t)}finally{e.pop_exception()}}}else u(n.$fetch("warn_on_failure",!0))&&p.$logger().$warn("cannot retrieve contents of "+(u(r=n["$[]"]("label"))?r:"asset")+" at URI: "+t+" (allow-uri-read attribute not enabled)");else t=p.$normalize_system_path(t,n["$[]"]("start"),i,l(["target_name"],{target_name:u(r=n["$[]"]("label"))?r:"asset"})),m=p.$read_asset(t,l(["normalize","warn_on_failure","label"],{normalize:n["$[]"]("normalize"),warn_on_failure:n.$fetch("warn_on_failure",!0),label:n["$[]"]("label")}));return u(u(r=u(s=m)?n["$[]"]("warn_if_empty"):s)?m["$empty?"]():r)&&p.$logger().$warn("contents of "+(u(r=n["$[]"]("label"))?r:"asset")+" is empty: "+t),m},H.$$arity=-2),e.def(W,"$is_uri?",Y=function(e){return a(V,"Helpers")["$uriish?"](e)},Y.$$arity=1)}(d[0],0,d)}(r[0],r)},Opal.modules["asciidoctor/abstract_block"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e+t:e["$+"](t)}e.top;var r=[],i=e.nil,o=e.const_get_qualified,a=e.const_get_relative,s=(e.breaker,e.slice,e.module),$=e.klass,l=e.hash2,u=e.send,c=e.truthy;return e.add_stubs(["$attr_reader","$attr_writer","$attr_accessor","$==","$===","$level","$file","$lineno","$playback_attributes","$convert","$converter","$join","$map","$to_s","$parent","$parent=","$-","$<<","$empty?","$>","$Integer","$find_by_internal","$to_proc","$context","$[]","$items","$+","$find_index","$include?","$next_adjacent_block","$blocks","$select","$sub_specialchars","$match?","$sub_replacements","$title","$apply_title_subs","$delete","$reftext","$!","$nil_or_empty?","$sub_placeholder","$sub_quotes","$compat_mode","$attributes","$chomp","$increment_and_store_counter","$index=","$numbered","$sectname","$counter","$numeral=","$numeral","$caption=","$int_to_roman","$each","$assign_numeral","$reindex_sections","$protected","$has_role?","$raise","$header?","$!=","$flatten","$head","$rows","$merge","$body","$foot","$style","$inner_document"]),function(r,f){var d=[s(r,"Asciidoctor")].concat(f);!function(r,s,f){var d,p,_,h,m,y,g,v,b,w,x,k,E,O,A,S,C,R,T,I,N,L,D,P,M,z,F,j,B,q,U=$(r,s,"AbstractBlock"),H=[U].concat(f);U.$$prototype.source_location=U.$$prototype.document=U.$$prototype.attributes=U.$$prototype.blocks=U.$$prototype.next_section_index=U.$$prototype.numeral=U.$$prototype.context=U.$$prototype.parent=U.$$prototype.caption=U.$$prototype.style=U.$$prototype.converted_title=U.$$prototype.title=U.$$prototype.subs=U.$$prototype.next_section_ordinal=U.$$prototype.id=U.$$prototype.header=i,U.$attr_reader("blocks"),U.$attr_writer("caption"),U.$attr_accessor("content_model"),U.$attr_accessor("level"),U.$attr_accessor("numeral"),U.$attr_accessor("source_location"),U.$attr_accessor("style"),U.$attr_reader("subs"),e.def(U,"$initialize",d=function(t,n,r){var o,s=d.$$p,$=this,f=i,p=i,_=i;for(s&&(d.$$p=null),p=0,_=arguments.length,f=new Array(_);p<_;p++)f[p]=arguments[p];return null==r&&(r=l([],{})),u($,e.find_super_dispatcher($,"initialize",d,!1),f,s),$.content_model="compound",$.blocks=[],$.subs=[],$.id=$.title=$.caption=$.numeral=$.style=$.default_subs=$.source_location=i,c(c(o=n["$=="]("document"))?o:n["$=="]("section"))?($.level=$.next_section_index=0,$.next_section_ordinal=1):c(a(H,"AbstractBlock")["$==="](t))?$.level=t.$level():$.level=i},d.$$arity=-3),e.def(U,"$block?",p=function(){return!0},p.$$arity=0),e.def(U,"$inline?",_=function(){return!1},_.$$arity=0),e.def(U,"$file",h=function(){var e;return c(e=this.source_location)?this.source_location.$file():e},h.$$arity=0),e.def(U,"$lineno",m=function(){var e;return c(e=this.source_location)?this.source_location.$lineno():e},m.$$arity=0),e.def(U,"$convert",y=function(){var e=this;return e.document.$playback_attributes(e.attributes),e.$converter().$convert(e)},y.$$arity=0),e.alias(U,"render","convert"),e.def(U,"$content",g=function(){var e;return u(this.blocks,"map",[],(e=function(t){return e.$$s,null==t&&(t=i),t.$convert()},e.$$s=this,e.$$arity=1,e)).$join(a(H,"LF"))},g.$$arity=0),e.def(U,"$context=",v=function(e){return this.node_name=(this.context=e).$to_s()},v.$$arity=1),e.def(U,"$<<",b=function(n){var r=this,o=i;return n.$parent()["$=="](r)||(o=[r],u(n,"parent=",e.to_a(o)),o[t(o.length,1)]),r.blocks["$<<"](n),r},b.$$arity=1),e.alias(U,"append","<<"),e.def(U,"$blocks?",w=function(){return!c(this.blocks["$empty?"]())},w.$$arity=0),e.def(U,"$sections?",x=function(){var e,t;return e=this.next_section_index,t=0,"number"===typeof e&&"number"===typeof t?e>t:e["$>"](t)},x.$$arity=0),e.def(U,"$number",k=function(){var t=this;try{return t.$Integer(t.numeral)}catch(n){if(!e.rescue(n,[a(H,"StandardError")]))throw n;try{return t.numeral}finally{e.pop_exception()}}},k.$$arity=0),e.def(U,"$number=",E=function(e){return this.numeral=e.$to_s()},E.$$arity=1),e.def(U,"$find_by",O=function(t){var n=O.$$p,r=n||i,a=i;n&&(O.$$p=null),n&&(O.$$p=null),null==t&&(t=l([],{}));try{return u(this,"find_by_internal",[t,a=[]],r.$to_proc())}catch(s){if(!e.rescue(s,[o("::","StopIteration")]))throw s;try{return a}finally{e.pop_exception()}}},O.$$arity=-1),e.alias(U,"query","find_by"),e.def(U,"$next_adjacent_block",A=function(){var e,t=this,r=i,o=i;return t.context["$=="]("document")?i:c((r=t.parent).$context()["$=="]("dlist")?t.context["$=="]("list_item"):(r=t.parent).$context()["$=="]("dlist"))?c(o=r.$items()["$[]"](n(u(r.$items(),"find_index",[],(e=function(t,n){var r,o=e.$$s||this;return null==t&&(t=i),null==n&&(n=i),c(r=t["$include?"](o))?r:n["$=="](o)},e.$$s=t,e.$$arity=2,e)),1)))?o:r.$next_adjacent_block():c(o=r.$blocks()["$[]"](n(r.$blocks().$find_index(t),1)))?o:r.$next_adjacent_block()},A.$$arity=0),e.def(U,"$sections",S=function(){var e;return u(this.blocks,"select",[],((e=function(t){return e.$$s,null==t&&(t=i),t.$context()["$=="]("section")}).$$s=this,e.$$arity=1,e))},S.$$arity=0),e.def(U,"$alt",C=function(){var e=this,t=i;return c(t=e.attributes["$[]"]("alt"))?t["$=="](e.attributes["$[]"]("default-alt"))?e.$sub_specialchars(t):(t=e.$sub_specialchars(t),c(a(H,"ReplaceableTextRx")["$match?"](t))?e.$sub_replacements(t):t):""},C.$$arity=0),e.def(U,"$caption",R=function(){var e=this;return e.context["$=="]("admonition")?e.attributes["$[]"]("textlabel"):e.caption},R.$$arity=0),e.def(U,"$captioned_title",T=function(){return""+this.caption+this.$title()},T.$$arity=0),e.def(U,"$list_marker_keyword",I=function(e){var t;return null==e&&(e=i),a(H,"ORDERED_LIST_KEYWORDS")["$[]"](c(t=e)?t:this.style)},I.$$arity=-1),e.def(U,"$title",N=function(){var e,t,n=this;return n.converted_title=c(e=n.converted_title)?e:c(t=n.title)?n.$apply_title_subs(n.title):t},N.$$arity=0),e.def(U,"$title?",L=function(){return!!c(this.title)},L.$$arity=0),e.def(U,"$title=",D=function(e){return this.converted_title=i,this.title=e},D.$$arity=1),e.def(U,"$sub?",P=function(e){return this.subs["$include?"](e)},P.$$arity=1),e.def(U,"$remove_sub",M=function(e){return this.subs.$delete(e),i},M.$$arity=1),e.def(U,"$xreftext",z=function(e){var t,n,r=this,o=i,s=i,$=i,l=i,u=i;return null==e&&(e=i),c(c(t=o=r.$reftext())?o["$empty?"]()["$!"]():t)?o:c(c(t=c(n=e)?r.title:n)?r.caption["$nil_or_empty?"]()["$!"]():t)?"full"["$==="](s=e)?($=r.$sub_placeholder(r.$sub_quotes(c(r.document.$compat_mode())?"``%s''":'"`%s`"'),r.$title()),c(c(t=c(n=r.numeral)?l=a(H,"CAPTION_ATTRIBUTE_NAMES")["$[]"](r.context):n)?u=r.document.$attributes()["$[]"](l):t)?u+" "+r.numeral+", "+$:r.caption.$chomp(". ")+", "+$):"short"["$==="](s)?c(c(t=c(n=r.numeral)?l=a(H,"CAPTION_ATTRIBUTE_NAMES")["$[]"](r.context):n)?u=r.document.$attributes()["$[]"](l):t)?u+" "+r.numeral:r.caption.$chomp(". "):r.$title():r.$title()},z.$$arity=-1),e.def(U,"$assign_caption",F=function(e,t){var n,r,o=this,s=i,$=i;return null==t&&(t=o.context),c(c(n=c(r=o.caption)?r:o.title["$!"]())?n:o.caption=c(r=e)?r:o.document.$attributes()["$[]"]("caption"))?i:c(c(n=s=a(H,"CAPTION_ATTRIBUTE_NAMES")["$[]"](t))?$=o.document.$attributes()["$[]"](s):n)?(o.caption=$+" "+(o.numeral=o.document.$increment_and_store_counter(t+"-number",o))+". ",i):i},F.$$arity=-2),e.def(U,"$assign_numeral",j=function(r){var o,s=this,$=i,l=i,f=i,d=i;return s.next_section_index=n(($=[s.next_section_index],u(r,"index=",e.to_a($)),$[t($.length,1)]),1),c(l=r.$numbered())&&((f=r.$sectname())["$=="]("appendix")?($=[s.document.$counter("appendix-number","A")],u(r,"numeral=",e.to_a($)),$[t($.length,1)],$=[c(d=s.document.$attributes()["$[]"]("appendix-caption"))?d+" "+r.$numeral()+": ":r.$numeral()+". "],u(r,"caption=",e.to_a($)),$[t($.length,1)]):c(c(o=f["$=="]("chapter"))?o:l["$=="]("chapter"))?($=[s.document.$counter("chapter-number",1).$to_s()],u(r,"numeral=",e.to_a($)),$[t($.length,1)]):($=[f["$=="]("part")?a(H,"Helpers").$int_to_roman(s.next_section_ordinal):s.next_section_ordinal.$to_s()],u(r,"numeral=",e.to_a($)),$[t($.length,1)],s.next_section_ordinal=n(s.next_section_ordinal,1))),i},j.$$arity=1),e.def(U,"$reindex_sections",B=function(){var e,t=this;return t.next_section_index=0,t.next_section_ordinal=1,u(t.blocks,"each",[],(e=function(t){var n=e.$$s||this;return null==t&&(t=i),t.$context()["$=="]("section")?(n.$assign_numeral(t),t.$reindex_sections()):i},e.$$s=t,e.$$arity=1,e))},B.$$arity=0),U.$protected(),e.def(U,"$find_by_internal",q=function(t,r){var a,s,$,f,d,p,_,h,m,y,g,v=q.$$p,b=v||i,w=this,x=i,k=i,E=i,O=i,A=i,S=i;if(v&&(q.$$p=null),v&&(q.$$p=null),null==t&&(t=l([],{})),null==r&&(r=[]),c(c(a=c(s=c($=c(f=g=!c(x=t["$[]"]("context"))||i)?f:x["$=="](w.context))?c(f=(k=t["$[]"]("style"))["$!"]())?f:k["$=="](w.style):$)?c($=(E=t["$[]"]("role"))["$!"]())?$:w["$has_role?"](E):s)?c(s=(O=t["$[]"]("id"))["$!"]())?s:O["$=="](w.id):a))if(b!==i)if(c(A=e.yield1(b,w))){if("prune"["$==="](S=A))return r["$<<"](w),c(O)&&w.$raise(o("::","StopIteration")),r;if("reject"["$==="](S))return c(O)&&w.$raise(o("::","StopIteration")),r;"stop"["$==="](S)?w.$raise(o("::","StopIteration")):(r["$<<"](w),c(O)&&w.$raise(o("::","StopIteration")))}else c(O)&&w.$raise(o("::","StopIteration"));else r["$<<"](w),c(O)&&w.$raise(o("::","StopIteration"));return S=w.context,"document"["$==="](S)?x["$=="]("document")||(c(c(a=w["$header?"]())?c(s=g)?s:x["$=="]("section"):a)&&u(w.header,"find_by_internal",[t,r],b.$to_proc()),u(w.blocks,"each",[],((d=function(e){return d.$$s,null==e&&(e=i),c(x["$=="]("section")?e.$context()["$!="]("section"):x["$=="]("section"))?i:u(e,"find_by_internal",[t,r],b.$to_proc())}).$$s=w,d.$$arity=1,d))):"dlist"["$==="](S)?c(c(a=g)?a:x["$!="]("section"))&&u(w.blocks.$flatten(),"each",[],((p=function(e){return p.$$s,null==e&&(e=i),c(e)?u(e,"find_by_internal",[t,r],b.$to_proc()):i}).$$s=w,p.$$arity=1,p)):"table"["$==="](S)?c(t["$[]"]("traverse_documents"))?(u(w.$rows().$head(),"each",[],(_=function(e){var n,o=_.$$s||this;return null==e&&(e=i),u(e,"each",[],((n=function(e){return n.$$s,null==e&&(e=i),u(e,"find_by_internal",[t,r],b.$to_proc())}).$$s=o,n.$$arity=1,n))},_.$$s=w,_.$$arity=1,_)),x["$=="]("inner_document")&&(t=t.$merge(l(["context"],{context:"document"}))),u(n(w.$rows().$body(),w.$rows().$foot()),"each",[],(h=function(e){var n,o=h.$$s||this;return null==e&&(e=i),u(e,"each",[],((n=function(e){return n.$$s,null==e&&(e=i),u(e,"find_by_internal",[t,r],b.$to_proc()),e.$style()["$=="]("asciidoc")?u(e.$inner_document(),"find_by_internal",[t,r],b.$to_proc()):i}).$$s=o,n.$$arity=1,n))},h.$$s=w,h.$$arity=1,h))):u(n(n(w.$rows().$head(),w.$rows().$body()),w.$rows().$foot()),"each",[],(m=function(e){var n,o=m.$$s||this;return null==e&&(e=i),u(e,"each",[],((n=function(e){return n.$$s,null==e&&(e=i),u(e,"find_by_internal",[t,r],b.$to_proc())}).$$s=o,n.$$arity=1,n))},m.$$s=w,m.$$arity=1,m)):u(w.blocks,"each",[],((y=function(e){return y.$$s,null==e&&(e=i),c(x["$=="]("section")?e.$context()["$!="]("section"):x["$=="]("section"))?i:u(e,"find_by_internal",[t,r],b.$to_proc())}).$$s=w,y.$$arity=1,y)),r},q.$$arity=-1)}(d[0],a(d,"AbstractNode"),d)}(r[0],r)},Opal.modules["asciidoctor/attribute_list"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e+t:e["$+"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}e.top;var r=[],i=e.nil,o=e.const_get_qualified,a=e.const_get_relative,s=(e.breaker,e.slice,e.module),$=e.klass,l=e.hash,u=e.hash2,c=e.truthy,f=e.send;return e.add_stubs(["$new","$[]","$update","$parse","$parse_attribute","$eos?","$skip_delimiter","$+","$rekey","$each_with_index","$[]=","$-","$private","$skip_blank","$peek","$===","$parse_attribute_value","$get_byte","$start_with?","$scan_name","$end_with?","$rstrip","$string","$==","$unscan","$scan_to_delimiter","$*","$include?","$delete","$each","$split","$empty?","$apply_subs","$scan_to_quote","$gsub","$skip","$scan"]),function(r,d){var p=[s(r,"Asciidoctor")].concat(d);!function(r,s,d){var p,_,h,m,y,g,v,b,w,x,k,E,O=$(r,null,"AttributeList"),A=[O].concat(d);O.$$prototype.attributes=O.$$prototype.scanner=O.$$prototype.delimiter=O.$$prototype.block=O.$$prototype.delimiter_skip_pattern=O.$$prototype.delimiter_boundary_pattern=i,e.const_set(A[0],"APOS","'"),e.const_set(A[0],"BACKSLASH","\\"),e.const_set(A[0],"QUOT",'"'),e.const_set(A[0],"BoundaryRx",l(a(A,"QUOT"),/.*?[^\\](?=")/,a(A,"APOS"),/.*?[^\\](?=')/,",",/.*?(?=[ \t]*(,|$))/)),e.const_set(A[0],"EscapedQuotes",l(a(A,"QUOT"),'\\"',a(A,"APOS"),"\\'")),e.const_set(A[0],"NameRx",new RegExp(a(A,"CG_WORD")+"["+a(A,"CC_WORD")+"\\-.]*")),e.const_set(A[0],"BlankRx",/[ \t]+/),e.const_set(A[0],"SkipRx",u([","],{",":/[ \t]*(,|$)/})),e.def(O,"$initialize",p=function(e,t,n){var r=this;return null==t&&(t=i),null==n&&(n=","),r.scanner=o("::","StringScanner").$new(e),r.block=t,r.delimiter=n,r.delimiter_skip_pattern=a(A,"SkipRx")["$[]"](n),r.delimiter_boundary_pattern=a(A,"BoundaryRx")["$[]"](n),r.attributes=i},p.$$arity=-2),e.def(O,"$parse_into",_=function(e,t){return null==t&&(t=[]),e.$update(this.$parse(t))},_.$$arity=-2),e.def(O,"$parse",h=function(e){var n=this,r=i;if(null==e&&(e=[]),c(n.attributes))return n.attributes;for(n.attributes=u([],{}),r=0;c(n.$parse_attribute(r,e))&&!c(n.scanner["$eos?"]());)n.$skip_delimiter(),r=t(r,1);return n.attributes},h.$$arity=-1),e.def(O,"$rekey",m=function(e){return a(A,"AttributeList").$rekey(this.attributes,e)},m.$$arity=1),e.defs(O,"$rekey",y=function(r,o){var a;return f(o,"each_with_index",[],((a=function(o,s){a.$$s;var $,l=i,u=i;return null==o&&(o=i),null==s&&(s=i),c(c($=o)?l=r["$[]"](t(s,1)):$)?(u=[o,l],f(r,"[]=",e.to_a(u)),u[n(u.length,1)]):i}).$$s=this,a.$$arity=2,a)),r},y.$$arity=2),O.$private(),e.def(O,"$parse_attribute",g=function(r,o){var s,$,l,u,d,p=this,_=i,h=i,m=i,y=i,g=i,v=i,b=i,w=i,x=i;if(_=!0,p.$skip_blank(),h=p.scanner.$peek(1),a(A,"QUOT")["$==="](h))m=p.$parse_attribute_value(p.scanner.$get_byte());else if(a(A,"APOS")["$==="](h))m=p.$parse_attribute_value(p.scanner.$get_byte()),c(m["$start_with?"](a(A,"APOS")))||(y=!0);else if(g=c(s=c($=m=p.$scan_name())?p.$skip_blank():$)?s:0,c(p.scanner["$eos?"]())){if(!c(c(s=m)?s:p.scanner.$string().$rstrip()["$end_with?"](p.delimiter)))return i;_=i}else if((v=p.scanner.$get_byte())["$=="](p.delimiter))p.scanner.$unscan();else if(c(m))if(v["$=="]("=")){if(p.$skip_blank(),h=v=p.scanner.$get_byte(),a(A,"QUOT")["$==="](h))b=p.$parse_attribute_value(v);else if(a(A,"APOS")["$==="](h))b=p.$parse_attribute_value(v),c(b["$start_with?"](a(A,"APOS")))||(y=!0);else if(p.delimiter["$==="](h))b="",p.scanner.$unscan();else if(i["$==="](h))b="";else if((b=""+v+p.$scan_to_delimiter())["$=="]("None"))return!0}else m=""+m+(d=g,"number"===typeof(u=" ")&&"number"===typeof d?u*d:u["$*"](d))+v+p.$scan_to_delimiter();else m=""+v+p.$scan_to_delimiter();return c(b)?"options"["$==="](h=m)||"opts"["$==="](h)?c(b["$include?"](","))?(c(b["$include?"](" "))&&(b=b.$delete(" ")),f(b.$split(","),"each",[],(l=function(t){var r=l.$$s||this,o=i;return null==r.attributes&&(r.attributes=i),null==t&&(t=i),c(t["$empty?"]())?i:(o=[t+"-option",""],f(r.attributes,"[]=",e.to_a(o)),o[n(o.length,1)])},l.$$s=p,l.$$arity=1,l))):c(b["$empty?"]())||(w=[b+"-option",""],f(p.attributes,"[]=",e.to_a(w)),w[n(w.length,1)]):c(c(s=y)?p.block:s)?"title"["$==="](h=m)||"reftext"["$==="](h)?(w=[m,b],f(p.attributes,"[]=",e.to_a(w)),w[n(w.length,1)]):(w=[m,p.block.$apply_subs(b)],f(p.attributes,"[]=",e.to_a(w)),w[n(w.length,1)]):(w=[m,b],f(p.attributes,"[]=",e.to_a(w)),w[n(w.length,1)]):(c(c(s=y)?p.block:s)&&(m=p.block.$apply_subs(m)),c(c(s=x=o["$[]"](r))?m:s)&&(w=[x,m],f(p.attributes,"[]=",e.to_a(w)),w[n(w.length,1)]),w=[t(r,1),m],f(p.attributes,"[]=",e.to_a(w)),w[n(w.length,1)]),_},g.$$arity=2),e.def(O,"$parse_attribute_value",v=function(e){var t=this,n=i;return t.scanner.$peek(1)["$=="](e)?(t.scanner.$get_byte(),""):c(n=t.$scan_to_quote(e))?(t.scanner.$get_byte(),c(n["$include?"](a(A,"BACKSLASH")))?n.$gsub(a(A,"EscapedQuotes")["$[]"](e),e):n):""+e+t.$scan_to_delimiter()},v.$$arity=1),e.def(O,"$skip_blank",b=function(){return this.scanner.$skip(a(A,"BlankRx"))},b.$$arity=0),e.def(O,"$skip_delimiter",w=function(){return this.scanner.$skip(this.delimiter_skip_pattern)},w.$$arity=0),e.def(O,"$scan_name",x=function(){return this.scanner.$scan(a(A,"NameRx"))},x.$$arity=0),e.def(O,"$scan_to_delimiter",k=function(){return this.scanner.$scan(this.delimiter_boundary_pattern)},k.$$arity=0),e.def(O,"$scan_to_quote",E=function(e){return this.scanner.$scan(a(A,"BoundaryRx")["$[]"](e))},E.$$arity=1)}(p[0],0,p)}(r[0],r)},Opal.modules["asciidoctor/block"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e<t:e["$<"](t)}e.top;var r=[],i=e.nil,o=e.const_get_qualified,a=e.const_get_relative,s=(e.breaker,e.slice,e.module),$=e.klass,l=e.send,u=e.hash2,c=e.truthy;return e.add_stubs(["$default=","$-","$attr_accessor","$[]","$key?","$===","$drop","$delete","$to_s","$[]=","$commit_subs","$nil_or_empty?","$prepare_source_string","$apply_subs","$join","$<","$size","$empty?","$rstrip","$shift","$pop","$==","$warn","$logger","$class","$object_id","$inspect"]),function(r,f){var d=[s(r,"Asciidoctor")].concat(f);!function(r,s,f){var d,p,_,h,m,y=$(r,s,"Block"),g=[y].concat(f);y.$$prototype.attributes=y.$$prototype.content_model=y.$$prototype.lines=y.$$prototype.subs=y.$$prototype.blocks=y.$$prototype.context=y.$$prototype.style=i,m=["simple"],l(e.const_set(g[0],"DEFAULT_CONTENT_MODEL",u(["audio","image","listing","literal","stem","open","page_break","pass","thematic_break","video"],{audio:"empty",image:"empty",listing:"verbatim",literal:"verbatim",stem:"raw",open:"compound",page_break:"empty",pass:"raw",thematic_break:"empty",video:"empty"})),"default=",e.to_a(m)),t(m.length,1),e.alias(y,"blockname","context"),y.$attr_accessor("lines"),e.def(y,"$initialize",d=function(n,r,s){var $,f=d.$$p,p=this,_=i,h=i,m=i,y=i,v=i,b=i,w=i;for(f&&(d.$$p=null),b=0,w=arguments.length,v=new Array(w);b<w;b++)v[b]=arguments[b];return null==s&&(s=u([],{})),l(p,e.find_super_dispatcher(p,"initialize",d,!1),v,f),p.content_model=c($=s["$[]"]("content_model"))?$:a(g,"DEFAULT_CONTENT_MODEL")["$[]"](r),c(s["$key?"]("subs"))?c(_=s["$[]"]("subs"))?("default"["$==="](h=_)?p.default_subs=s["$[]"]("default_subs"):o("::","Array")["$==="](h)?(p.default_subs=_.$drop(0),p.attributes.$delete("subs")):(p.default_subs=i,m=["subs",_.$to_s()],l(p.attributes,"[]=",e.to_a(m)),m[t(m.length,1)]),p.$commit_subs()):(p.default_subs=[],p.attributes.$delete("subs")):p.default_subs=i,c((y=s["$[]"]("source"))["$nil_or_empty?"]())?p.lines=[]:c(o("::","String")["$==="](y))?p.lines=a(g,"Helpers").$prepare_source_string(y):p.lines=y.$drop(0)},d.$$arity=-3),e.def(y,"$content",p=function(){var t,r=p.$$p,o=this,s=i,$=i,u=i,f=i,d=i,_=i,h=i;for(r&&(p.$$p=null),_=0,h=arguments.length,d=new Array(h);_<h;_++)d[_]=arguments[_];return function(){if(s=o.content_model,"compound"["$==="](s))return l(o,e.find_super_dispatcher(o,"content",p,!1),d,r);if("simple"["$==="](s))return o.$apply_subs(o.lines.$join(a(g,"LF")),o.subs);if("verbatim"["$==="](s)||"raw"["$==="](s)){if($=o.$apply_subs(o.lines,o.subs),c(n($.$size(),2)))return $["$[]"](0);for(;c(c(t=u=$["$[]"](0))?u.$rstrip()["$empty?"]():t);)$.$shift();for(;c(c(t=f=$["$[]"](-1))?f.$rstrip()["$empty?"]():t);)$.$pop();return $.$join(a(g,"LF"))}return o.content_model["$=="]("empty")||o.$logger().$warn("Unknown content model '"+o.content_model+"' for block: "+o),i}()},p.$$arity=0),e.def(y,"$source",_=function(){return this.lines.$join(a(g,"LF"))},_.$$arity=0),e.def(y,"$to_s",h=function(){var e,t=this;return e=t.content_model["$=="]("compound")?"blocks: "+t.blocks.$size():"lines: "+t.lines.$size(),"#<"+t.$class()+"@"+t.$object_id()+" {context: "+t.context.$inspect()+", content_model: "+t.content_model.$inspect()+", style: "+t.style.$inspect()+", "+e+"}>"},h.$$arity=0)}(d[0],a(d,"AbstractBlock"),d)}(r[0],r)},Opal.modules["asciidoctor/callouts"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e+t:e["$+"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}e.top;var r=[],i=e.nil,o=(e.const_get_qualified,e.const_get_relative,e.breaker,e.slice,e.module),a=e.klass,s=e.hash2,$=e.truthy,l=e.send;return e.add_stubs(["$next_list","$<<","$current_list","$to_i","$generate_next_callout_id","$+","$<=","$size","$[]","$-","$chop","$join","$map","$==","$<","$private","$generate_callout_id"]),function(r,u){var c=[o(r,"Asciidoctor")].concat(u);!function(r,o,u){var c,f,d,p,_,h,m,y,g,v=a(r,null,"Callouts");[v].concat(u),v.$$prototype.co_index=v.$$prototype.lists=v.$$prototype.list_index=i,e.def(v,"$initialize",c=function(){var e=this;return e.lists=[],e.list_index=0,e.$next_list()},c.$$arity=0),e.def(v,"$register",f=function(e){var n,r=this;return r.$current_list()["$<<"](s(["ordinal","id"],{ordinal:e.$to_i(),id:n=r.$generate_next_callout_id()})),r.co_index=t(r.co_index,1),n},f.$$arity=1),e.def(v,"$read_next_id",d=function(){var e,r,o=this,a=i,s=i;return a=i,s=o.$current_list(),$((e=o.co_index,r=s.$size(),"number"===typeof e&&"number"===typeof r?e<=r:e["$<="](r)))&&(a=s["$[]"](n(o.co_index,1))["$[]"]("id")),o.co_index=t(o.co_index,1),a},d.$$arity=0),e.def(v,"$callout_ids",p=function(e){var t;return l(this.$current_list(),"map",[],(t=function(n){return t.$$s,null==n&&(n=i),n["$[]"]("ordinal")["$=="](e)?n["$[]"]("id")+" ":""},t.$$s=this,t.$$arity=1,t)).$join().$chop()},p.$$arity=1),e.def(v,"$current_list",_=function(){return this.lists["$[]"](n(this.list_index,1))},_.$$arity=0),e.def(v,"$next_list",h=function(){var e,n,r=this;return r.list_index=t(r.list_index,1),$((e=r.lists.$size(),n=r.list_index,"number"===typeof e&&"number"===typeof n?e<n:e["$<"](n)))&&r.lists["$<<"]([]),r.co_index=1,i},h.$$arity=0),e.def(v,"$rewind",m=function(){return this.list_index=1,this.co_index=1,i},m.$$arity=0),v.$private(),e.def(v,"$generate_next_callout_id",y=function(){var e=this;return e.$generate_callout_id(e.list_index,e.co_index)},y.$$arity=0),e.def(v,"$generate_callout_id",g=function(e,t){return"CO"+e+"-"+t},g.$$arity=2)}(c[0],0,c)}(r[0],r)},Opal.modules["asciidoctor/converter"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e+t:e["$+"](t)}e.top;var r=[],i=e.nil,o=e.const_get_qualified,a=e.const_get_relative,s=(e.breaker,e.slice,e.module),$=e.hash2,l=e.truthy,u=e.send,c=e.klass,f=e.gvars;return e.add_stubs(["$autoload","$__dir__","$attr_reader","$raise","$class","$[]","$sub","$slice","$length","$==","$[]=","$backend_traits","$-","$derive_backend_traits","$register","$map","$to_s","$new","$create","$default","$each","$default=","$registry","$for","$===","$supports_templates?","$merge","$private","$include","$delete","$clear","$send","$extend","$private_class_method","$node_name","$+","$receiver","$name","$warn","$logger","$respond_to?","$content"]),function(r,d){var p=[s(r,"Asciidoctor")].concat(d);!function(r,d){var p,_,h,m,y,g=s(r,"Converter"),v=[g].concat(d);g.$autoload("CompositeConverter",g.$__dir__()+"/converter/composite"),g.$autoload("TemplateConverter",g.$__dir__()+"/converter/template"),g.$attr_reader("backend"),e.def(g,"$initialize",p=function(e,t){return null==t&&(t=$([],{})),this.backend=e},p.$$arity=-2),e.def(g,"$convert",_=function(e,t,n){var r=this;return null==r.backend&&(r.backend=i),null==t&&(t=i),null==n&&(n=i),r.$raise(o("::","NotImplementedError"),r.$class()+" (backend: "+r.backend+") must implement the #convert method")},_.$$arity=-2),e.def(g,"$handles?",h=function(e){return!0},h.$$arity=1),e.defs(g,"$derive_backend_traits",m=function(e,t){var n,r=i,o=i;return null==t&&(t=i),l(e)?(l(r=a(v,"DEFAULT_EXTENSIONS")["$[]"](t=l(n=t)?n:e.$sub(a(v,"TrailingDigitsRx"),"")))?o=r.$slice(1,r.$length()):r="."+(o=t),o["$=="]("html")?$(["basebackend","filetype","htmlsyntax","outfilesuffix"],{basebackend:t,filetype:o,htmlsyntax:"html",outfilesuffix:r}):$(["basebackend","filetype","outfilesuffix"],{basebackend:t,filetype:o,outfilesuffix:r})):$([],{})},m.$$arity=-2),function(n,r){var o,c,f,d,p,_,h,m,y,g=s(n,"BackendTraits"),v=[g].concat(r);e.def(g,"$basebackend",o=function(n){var r=i;return null==n&&(n=i),l(n)?(r=["basebackend",n],u(this.$backend_traits(n),"[]=",e.to_a(r)),r[t(r.length,1)]):this.$backend_traits()["$[]"]("basebackend")},o.$$arity=-1),e.def(g,"$filetype",c=function(n){var r=i;return null==n&&(n=i),l(n)?(r=["filetype",n],u(this.$backend_traits(),"[]=",e.to_a(r)),r[t(r.length,1)]):this.$backend_traits()["$[]"]("filetype")},c.$$arity=-1),e.def(g,"$htmlsyntax",f=function(n){var r=i;return null==n&&(n=i),l(n)?(r=["htmlsyntax",n],u(this.$backend_traits(),"[]=",e.to_a(r)),r[t(r.length,1)]):this.$backend_traits()["$[]"]("htmlsyntax")},f.$$arity=-1),e.def(g,"$outfilesuffix",d=function(n){var r=i;return null==n&&(n=i),l(n)?(r=["outfilesuffix",n],u(this.$backend_traits(),"[]=",e.to_a(r)),r[t(r.length,1)]):this.$backend_traits()["$[]"]("outfilesuffix")},d.$$arity=-1),e.def(g,"$supports_templates",p=function(n){var r;return null==n&&(n=!0),r=["supports_templates",n],u(this.$backend_traits(),"[]=",e.to_a(r)),r[t(r.length,1)]},p.$$arity=-1),e.def(g,"$supports_templates?",_=function(){return this.$backend_traits()["$[]"]("supports_templates")},_.$$arity=0),e.def(g,"$init_backend_traits",h=function(e){var t;return null==e&&(e=i),this.backend_traits=l(t=e)?t:$([],{})},h.$$arity=-1),e.def(g,"$backend_traits",m=function(e){var t,n=this;return null==n.backend_traits&&(n.backend_traits=i),null==n.backend&&(n.backend=i),null==e&&(e=i),n.backend_traits=l(t=n.backend_traits)?t:a(v,"Converter").$derive_backend_traits(n.backend,e)},m.$$arity=-1),e.alias(g,"backend_info","backend_traits"),e.defs(g,"$derive_backend_traits",y=function(e,t){return null==t&&(t=i),a(v,"Converter").$derive_backend_traits(e,t)},y.$$arity=-2)}(v[0],v),function(t,n){var r,o=s(t,"Config"),$=[o].concat(n);e.def(o,"$register_for",r=function(t){var n,r,o=this;return n=e.slice.call(arguments,0,arguments.length),u(a($,"Converter"),"register",[o].concat(e.to_a(u(n,"map",[],((r=function(e){return r.$$s,null==e&&(e=i),e.$to_s()}).$$s=o,r.$$arity=1,r)))))},r.$$arity=-1)}(v[0],v),function(n,r){var c,f,d,p,_,h,m,y,g=s(n,"Factory"),v=[g].concat(r);e.defs(g,"$new",c=function(t,n){var r,o,s,u;if(r=e.slice.call(arguments,0,arguments.length),null==(o=e.extract_kwargs(r)))o=$([],{});else if(!o.$$is_hash)throw e.ArgumentError.$new("expected kwargs");return r.length>0&&(s=r[0],r.splice(0,1)),null==s&&(s=i),null==(u=o.$$smap.proxy_default)&&(u=!0),l(u)?a(v,"DefaultFactoryProxy").$new(s):a(v,"CustomFactory").$new(s)},c.$$arity=-1),e.defs(g,"$default",f=function(t){return e.slice.call(arguments,0,arguments.length),a(v,"Converter")},f.$$arity=-1),e.defs(g,"$create",d=function(e,t){return null==t&&(t=$([],{})),this.$default().$create(e,t)},d.$$arity=-2),e.def(g,"$register",p=function(n,r){var o,a,s=this;return o=e.slice.call(arguments,1,arguments.length),u(o,"each",[],(a=function(r){var o=a.$$s||this,s=i;return null==r&&(r=i),r["$=="]("*")?(s=[n],u(o.$registry(),"default=",e.to_a(s)),s[t(s.length,1)]):(s=[r,n],u(o.$registry(),"[]=",e.to_a(s)),s[t(s.length,1)])},a.$$s=s,a.$$arity=1,a))},p.$$arity=-2),e.def(g,"$for",_=function(e){return this.$registry()["$[]"](e)},_.$$arity=1),e.def(g,"$create",h=function(e,t){var n,r,s=i,u=i,c=i;return null==t&&(t=$([],{})),l(s=this.$for(e))?(l(o("::","Class")["$==="](s))&&(s=s.$new(e,t)),l(l(n=l(r=u=t["$[]"]("template_dirs"))?a(v,"BackendTraits")["$==="](s):r)?s["$supports_templates?"]():n)?a(v,"CompositeConverter").$new(e,a(v,"TemplateConverter").$new(e,u,t),s,$(["backend_traits_source"],{backend_traits_source:s})):s):l(u=t["$[]"]("template_dirs"))?l(l(n=c=t["$[]"]("delegate_backend"))?s=this.$for(c):n)?(l(o("::","Class")["$==="](s))&&(s=s.$new(c,t)),a(v,"CompositeConverter").$new(e,a(v,"TemplateConverter").$new(e,u,t),s,$(["backend_traits_source"],{backend_traits_source:s}))):a(v,"TemplateConverter").$new(e,u,t):i},h.$$arity=-2),e.def(g,"$converters",m=function(){return this.$registry().$merge()},m.$$arity=0),g.$private(),e.def(g,"$registry",y=function(){return this.$raise(o("::","NotImplementedError"),a(v,"Factory")+" subclass "+this.$class()+" must implement the #registry method")},y.$$arity=0)}(v[0],v),function(n,r,o){var s,f,d=c(n,null,"CustomFactory"),p=[d].concat(o);d.$include(a(p,"Factory")),e.def(d,"$initialize",s=function(n){var r=i;return null==n&&(n=i),l(n)?(r=[n.$delete("*")],u(n,"default=",e.to_a(r)),r[t(r.length,1)],this.registry=n):this.registry=$([],{})},s.$$arity=-1),e.def(d,"$unregister_all",f=function(){var n;return n=[i],u(this.$registry().$clear(),"default=",e.to_a(n)),n[t(n.length,1)]},f.$$arity=0),d.$private(),d.$attr_reader("registry")}(v[0],0,v),function(t,n){var r,o=s(t,"DefaultFactory"),l=[o].concat(n);o.$include(a(l,"Factory")),o.$private(),e.class_variable_set(l[0],"@@registry",$([],{})),e.def(o,"$registry",r=function(){var e;return null==(e=l[0].$$cvars["@@registry"])?i:e},r.$$arity=0),a(l,"RUBY_ENGINE")["$=="]("opal")}(v[0],v),function(e,t,n){var r=c(e,t,"DefaultFactoryProxy"),i=[r].concat(n);r.$include(a(i,"DefaultFactory")),a(i,"RUBY_ENGINE")["$=="]("opal")}(v[0],a(v,"CustomFactory"),v),e.defs(g,"$included",y=function(e){return e.$send("include",a(v,"BackendTraits")),e.$extend(a(v,"Config"))},y.$$arity=1),g.$private_class_method("included"),function(t,r,s){var $,u,d,p,_=c(t,null,"Base"),h=[_].concat(s);_.$$prototype.backend=i,_.$include(a(h,"Logging")),_.$include(a(h,"Converter")),e.def(_,"$convert",$=function(t,r,s){var $,u,c=this,d=i;null==f["!"]&&(f["!"]=i),null==r&&(r=t.$node_name()),null==s&&(s=i);try{return l(s)?c.$send(n("convert_",r),t,s):c.$send(n("convert_",r),t)}catch(p){if(!e.rescue(p,[a(h,"StandardError")]))throw p;try{return l(l($=l(u=o("::","NoMethodError")["$==="](d=f["!"]))?d.$receiver()["$=="](c):u)?d.$name().$to_s()["$=="](r):$)||c.$raise(),c.$logger().$warn("missing convert handler for "+d.$name()+" node in "+c.backend+" backend ("+c.$class()+")"),i}finally{e.pop_exception()}}},$.$$arity=-2),e.def(_,"$handles?",u=function(e){return this["$respond_to?"]("convert_"+e)},u.$$arity=1),e.def(_,"$content_only",d=function(e){return e.$content()},d.$$arity=1),e.def(_,"$skip",p=function(e){return i},p.$$arity=1)}(v[0],0,v),g.$extend(a(v,"DefaultFactory"))}(p[0],p)}(r[0],r)},Opal.modules["asciidoctor/document"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e>=t:e["$>="](t)}function r(e,t){return"number"===typeof e&&"number"===typeof t?e+t:e["$+"](t)}function i(e,t){return"number"===typeof e&&"number"===typeof t?e>t:e["$>"](t)}function o(e,t){return"number"===typeof e&&"number"===typeof t?e<t:e["$<"](t)}e.top;var a=[],s=e.nil,$=e.const_get_qualified,l=e.const_get_relative,u=(e.breaker,e.slice,e.module),c=e.klass,f=e.send,d=e.truthy,p=e.hash2,_=e.hash,h=e.gvars;return e.add_stubs(["$new","$attr_reader","$nil?","$<<","$[]","$[]=","$-","$include?","$strip","$squeeze","$gsub","$empty?","$!","$rpartition","$attr_accessor","$delete","$base_dir","$options","$merge","$catalog","$instance_variable_get","$attributes","$safe","$compat_mode","$outfilesuffix","$sourcemap","$path_resolver","$converter","$extensions","$syntax_highlighter","$each","$end_with?","$start_with?","$slice","$length","$chop","$==","$downcase","$===","$extname","$value_for_name","$key?","$freeze","$attribute_undefined","$attribute_missing","$update","$&","$keys","$name_for_value","$expand_path","$pwd","$to_s","$>=","$+","$abs","$to_i","$delete_if","$update_doctype_attributes","$cursor","$parse","$restore_attributes","$update_backend_attributes","$fetch","$fill_datetime_attributes","$activate","$groups","$create","$to_proc","$preprocessors?","$preprocessors","$process_method","$tree_processors?","$tree_processors","$!=","$counter","$attribute_locked?","$nil_or_empty?","$nextval","$value","$save_to","$register","$tap","$xreftext","$source","$source_lines","$doctitle","$sectname=","$title=","$first_section","$title","$reftext","$>","$<","$find","$context","$assign_numeral","$clear_playback_attributes","$save_attributes","$name","$negate","$rewind","$replace","$apply_attribute_value_subs","$delete?","$start","$doctype","$content_model","$warn","$logger","$content","$convert","$postprocessors?","$postprocessors","$record","$write","$respond_to?","$chomp","$class","$write_alternate_pages","$map","$split","$resolve_docinfo_subs","$normalize_system_path","$read_asset","$apply_subs","$docinfo_processors?","$join","$concat","$compact","$docinfo_processors","$object_id","$inspect","$size","$private","$=~","$resolve_pass_subs","$apply_header_subs","$limit_bytesize","$bytesize","$valid_encoding?","$byteslice","$resolve_subs","$utc","$at","$Integer","$now","$index","$strftime","$year","$utc_offset","$partition","$create_converter","$basebackend","$filetype","$htmlsyntax","$derive_backend_traits","$raise"]),function(a,m){var y=[u(a,"Asciidoctor")].concat(m);!function(a,u,m){var y,g,v,b,w,x,k,E,O,A,S,C,R,T,I,N,L,D,P,M,z,F,j,B,q,U,H,Y,W,V,K,G,X,Q,J,Z,ee,te,ne,re,ie,oe,ae,se,$e,le,ue,ce,fe,de,pe,_e,he=c(a,u,"Document"),me=[he].concat(m);he.$$prototype.attributes=he.$$prototype.safe=he.$$prototype.sourcemap=he.$$prototype.reader=he.$$prototype.base_dir=he.$$prototype.parsed=he.$$prototype.parent_document=he.$$prototype.extensions=he.$$prototype.options=he.$$prototype.counters=he.$$prototype.catalog=he.$$prototype.reftexts=he.$$prototype.header=he.$$prototype.blocks=he.$$prototype.header_attributes=he.$$prototype.attributes_modified=he.$$prototype.backend=he.$$prototype.attribute_overrides=he.$$prototype.timings=he.$$prototype.converter=he.$$prototype.outfilesuffix=he.$$prototype.docinfo_processor_extensions=he.$$prototype.document=he.$$prototype.max_attribute_value_size=he.$$prototype.id=he.$$prototype.doctype=s,e.const_set(me[0],"ImageReference",f($("::","Struct"),"new",["target","imagesdir"],(y=function(){var t=y.$$s||this;return e.alias(t,"to_s","target")},y.$$s=he,y.$$arity=0,y))),e.const_set(me[0],"Footnote",$("::","Struct").$new("index","id","text")),function(n,r,i){var o,a,$=c(n,null,"AttributeEntry");[$].concat(i),$.$attr_reader("name","value","negate"),e.def($,"$initialize",o=function(e,t,n){var r=this;return null==n&&(n=s),r.name=e,r.value=t,r.negate=d(n["$nil?"]())?t["$nil?"]():n},o.$$arity=-3),e.def($,"$save_to",a=function(n){var r,i=s;return(d(r=n["$[]"]("attribute_entries"))?r:(i=["attribute_entries",[]],f(n,"[]=",e.to_a(i)),i[t(i.length,1)]))["$<<"](this),this},a.$$arity=1)}(me[0],0,me),function(t,n,r){var i,o,a,$,u=c(t,null,"Title"),f=[u].concat(r);u.$$prototype.sanitized=u.$$prototype.subtitle=u.$$prototype.combined=s,u.$attr_reader("main"),e.alias(u,"title","main"),u.$attr_reader("subtitle"),u.$attr_reader("combined"),e.def(u,"$initialize",i=function(t,n){var r,i,o=this,a=s;return null==n&&(n=p([],{})),d(d(r=o.sanitized=n["$[]"]("sanitize"))?t["$include?"]("<"):r)&&(t=t.$gsub(l(f,"XmlSanitizeRx"),"").$squeeze(" ").$strip()),d(d(r=(a=d(i=n["$[]"]("separator"))?i:":")["$empty?"]())?r:t["$include?"](a+=" ")["$!"]())?(o.main=t,o.subtitle=s):(i=t.$rpartition(a),r=e.to_ary(i),o.main=null==r[0]?s:r[0],null==r[1]||r[1],o.subtitle=null==r[2]?s:r[2]),o.combined=t},i.$$arity=-2),e.def(u,"$sanitized?",o=function(){return this.sanitized},o.$$arity=0),e.def(u,"$subtitle?",a=function(){return!!d(this.subtitle)},a.$$arity=0),e.def(u,"$to_s",$=function(){return this.combined},$.$$arity=0)}(me[0],0,me),e.const_set(me[0],"Author",$("::","Struct").$new("name","firstname","middlename","lastname","initials","email")),he.$attr_reader("safe"),he.$attr_reader("compat_mode"),he.$attr_reader("backend"),he.$attr_reader("doctype"),he.$attr_accessor("sourcemap"),he.$attr_reader("catalog"),e.alias(he,"references","catalog"),he.$attr_reader("counters"),he.$attr_reader("header"),he.$attr_reader("base_dir"),he.$attr_reader("options"),he.$attr_reader("outfilesuffix"),he.$attr_reader("parent_document"),he.$attr_reader("reader"),he.$attr_reader("path_resolver"),he.$attr_reader("converter"),he.$attr_reader("syntax_highlighter"),he.$attr_reader("extensions"),e.def(he,"$initialize",g=function(i,o){var a,u,c,h,m,y,v,b,w,x,k=g.$$p,E=this,O=s,A=s,S=s,C=s,R=s,T=s,I=s,N=s,L=s,D=s,P=s,M=s,z=s,F=s,j=s;return k&&(g.$$p=null),null==i&&(i=s),null==o&&(o=p([],{})),f(E,e.find_super_dispatcher(E,"initialize",g,!1),[E,"document"],null),d(O=o.$delete("parent"))?(E.parent_document=O,d(a=o["$[]"]("base_dir"))||(A=["base_dir",O.$base_dir()],f(o,"[]=",e.to_a(A)),A[t(A.length,1)]),d(O.$options()["$[]"]("catalog_assets"))&&(A=["catalog_assets",!0],f(o,"[]=",e.to_a(A)),A[t(A.length,1)]),E.catalog=O.$catalog().$merge(p(["footnotes"],{footnotes:[]})),E.attribute_overrides=S=O.$instance_variable_get("@attribute_overrides").$merge(O.$attributes()),S.$delete("compat-mode"),C=S.$delete("doctype"),S.$delete("notitle"),S.$delete("showtitle"),S.$delete("toc"),A=["toc-placement",d(a=S.$delete("toc-placement"))?a:"auto"],f(E.attributes,"[]=",e.to_a(A)),A[t(A.length,1)],S.$delete("toc-position"),E.safe=O.$safe(),d(E.compat_mode=O.$compat_mode())&&(A=["compat-mode",""],f(E.attributes,"[]=",e.to_a(A)),A[t(A.length,1)]),E.outfilesuffix=O.$outfilesuffix(),E.sourcemap=O.$sourcemap(),E.timings=s,E.path_resolver=O.$path_resolver(),E.converter=O.$converter(),R=s,E.extensions=O.$extensions(),E.syntax_highlighter=O.$syntax_highlighter()):(E.parent_document=s,E.catalog=p(["ids","refs","footnotes","links","images","callouts","includes"],{ids:p([],{}),refs:p([],{}),footnotes:[],links:[],images:[],callouts:l(me,"Callouts").$new(),includes:p([],{})}),E.attribute_overrides=S=p([],{}),f(d(a=o["$[]"]("attributes"))?a:p([],{}),"each",[],(u=function(n,r){var i;return u.$$s,null==n&&(n=s),null==r&&(r=s),d(n["$end_with?"]("@"))?d(n["$start_with?"]("!"))?(i=[n.$slice(1,t(n.$length(),2)),!1],n=i[0],r=i[1]):d(n["$end_with?"]("!@"))?(i=[n.$slice(0,t(n.$length(),2)),!1],n=i[0],r=i[1]):(i=[n.$chop(),r+"@"],n=i[0],r=i[1]):d(n["$start_with?"]("!"))?(i=[n.$slice(1,n.$length()),!r["$=="]("@")&&s],n=i[0],r=i[1]):d(n["$end_with?"]("!"))&&(i=[n.$chop(),!r["$=="]("@")&&s],n=i[0],r=i[1]),A=[n.$downcase(),r],f(S,"[]=",e.to_a(A)),A[t(A.length,1)]},u.$$s=E,u.$$arity=2,u)),d($("::","String")["$==="](T=o["$[]"]("to_file")))&&(A=["outfilesuffix",l(me,"Helpers").$extname(T)],f(S,"[]=",e.to_a(A)),A[t(A.length,1)]),d((I=o["$[]"]("safe"))["$!"]())?E.safe=$(l(me,"SafeMode"),"SECURE"):d($("::","Integer")["$==="](I))?E.safe=I:E.safe=function(){try{return l(me,"SafeMode").$value_for_name(I)}catch(t){if(!e.rescue(t,[l(me,"StandardError")]))throw t;try{return $(l(me,"SafeMode"),"SECURE")}finally{e.pop_exception()}}}(),N=o.$delete("input_mtime"),E.compat_mode=S["$key?"]("compat-mode"),E.sourcemap=o["$[]"]("sourcemap"),E.timings=o.$delete("timings"),E.path_resolver=l(me,"PathResolver").$new(),R=d(d(a=(c=$("::","Asciidoctor","skip_raise"))&&$(c,"Extensions","skip_raise")?"constant":s)?a:o["$key?"]("extensions"))?$($("::","Asciidoctor"),"Extensions"):s,E.extensions=s,d(d(a=o["$key?"]("header_footer"))?o["$key?"]("standalone")["$!"]():a)&&(A=["standalone",o["$[]"]("header_footer")],f(o,"[]=",e.to_a(A)),A[t(A.length,1)])),E.parsed=E.reftexts=E.header=E.header_attributes=s,E.counters=p([],{}),E.attributes_modified=$("::","Set").$new(),E.docinfo_processor_extensions=p([],{}),b=o["$[]"]("standalone"),(E.options=o).$freeze(),L=E.attributes,d(O)||(A=["attribute-undefined",l(me,"Compliance").$attribute_undefined()],f(L,"[]=",e.to_a(A)),A[t(A.length,1)],A=["attribute-missing",l(me,"Compliance").$attribute_missing()],f(L,"[]=",e.to_a(A)),A[t(A.length,1)],L.$update(l(me,"DEFAULT_ATTRIBUTES"))),d(b)?(A=["embedded",s],f(S,"[]=",e.to_a(A)),A[t(A.length,1)],A=["copycss",""],f(L,"[]=",e.to_a(A)),A[t(A.length,1)],A=["iconfont-remote",""],f(L,"[]=",e.to_a(A)),A[t(A.length,1)],A=["stylesheet",""],f(L,"[]=",e.to_a(A)),A[t(A.length,1)],A=["webfonts",""],f(L,"[]=",e.to_a(A)),A[t(A.length,1)]):(A=["embedded",""],f(S,"[]=",e.to_a(A)),A[t(A.length,1)],d(d(a=S["$key?"]("showtitle"))?S.$keys()["$&"](["notitle","showtitle"])["$[]"](-1)["$=="]("showtitle"):a)?(A=["notitle",_(s,"",!1,"@","@",!1)["$[]"](S["$[]"]("showtitle"))],f(S,"[]=",e.to_a(A)),A[t(A.length,1)]):d(S["$key?"]("notitle"))?(A=["showtitle",_(s,"",!1,"@","@",!1)["$[]"](S["$[]"]("notitle"))],f(S,"[]=",e.to_a(A)),A[t(A.length,1)]):(A=["notitle",""],f(L,"[]=",e.to_a(A)),A[t(A.length,1)])),A=["asciidoctor",""],f(S,"[]=",e.to_a(A)),A[t(A.length,1)],A=["asciidoctor-version",$($("::","Asciidoctor"),"VERSION")],f(S,"[]=",e.to_a(A)),A[t(A.length,1)],A=["safe-mode-name",w=l(me,"SafeMode").$name_for_value(E.safe)],f(S,"[]=",e.to_a(A)),A[t(A.length,1)],A=["safe-mode-"+w,""],f(S,"[]=",e.to_a(A)),A[t(A.length,1)],A=["safe-mode-level",E.safe],f(S,"[]=",e.to_a(A)),A[t(A.length,1)],d(a=S["$[]"]("max-include-depth"))||(A=["max-include-depth",64],f(S,"[]=",e.to_a(A)),A[t(A.length,1)]),d(a=S["$[]"]("allow-uri-read"))||(A=["allow-uri-read",s],f(S,"[]=",e.to_a(A)),A[t(A.length,1)]),d(S["$key?"]("numbered"))&&(A=["sectnums",S.$delete("numbered")],f(S,"[]=",e.to_a(A)),A[t(A.length,1)]),d(S["$key?"]("hardbreaks"))&&(A=["hardbreaks-option",S.$delete("hardbreaks")],f(S,"[]=",e.to_a(A)),A[t(A.length,1)]),d(x=o["$[]"]("base_dir"))?E.base_dir=(A=["docdir",$("::","File").$expand_path(x)],f(S,"[]=",e.to_a(A)),A[t(A.length,1)]):d(S["$[]"]("docdir"))?E.base_dir=S["$[]"]("docdir"):E.base_dir=(A=["docdir",$("::","Dir").$pwd()],f(S,"[]=",e.to_a(A)),A[t(A.length,1)]),d(D=o["$[]"]("backend"))&&(A=["backend",D.$to_s()],f(S,"[]=",e.to_a(A)),A[t(A.length,1)]),d(P=o["$[]"]("doctype"))&&(A=["doctype",P.$to_s()],f(S,"[]=",e.to_a(A)),A[t(A.length,1)]),d(n(E.safe,$(l(me,"SafeMode"),"SERVER")))?(d(a=S["$[]"]("copycss"))||(A=["copycss",s],f(S,"[]=",e.to_a(A)),A[t(A.length,1)]),d(a=S["$[]"]("source-highlighter"))||(A=["source-highlighter",s],f(S,"[]=",e.to_a(A)),A[t(A.length,1)]),d(a=S["$[]"]("backend"))||(A=["backend",l(me,"DEFAULT_BACKEND")],f(S,"[]=",e.to_a(A)),A[t(A.length,1)]),d(d(a=O["$!"]())?S["$key?"]("docfile"):a)&&(A=["docfile",S["$[]"]("docfile")["$[]"](e.Range.$new(r(S["$[]"]("docdir").$length(),1),-1,!1))],f(S,"[]=",e.to_a(A)),A[t(A.length,1)]),A=["docdir",""],f(S,"[]=",e.to_a(A)),A[t(A.length,1)],d(a=S["$[]"]("user-home"))||(A=["user-home","."],f(S,"[]=",e.to_a(A)),A[t(A.length,1)]),d(n(E.safe,$(l(me,"SafeMode"),"SECURE")))&&(d(S["$key?"]("max-attribute-value-size"))||(A=["max-attribute-value-size",4096],f(S,"[]=",e.to_a(A)),A[t(A.length,1)]),d(S["$key?"]("linkcss"))||(A=["linkcss",""],f(S,"[]=",e.to_a(A)),A[t(A.length,1)]),d(a=S["$[]"]("icons"))||(A=["icons",s],f(S,"[]=",e.to_a(A)),A[t(A.length,1)]))):d(a=S["$[]"]("user-home"))||(A=["user-home",l(me,"USER_HOME")],f(S,"[]=",e.to_a(A)),A[t(A.length,1)]),E.max_attribute_value_size=d(M=d(a=S["$[]"]("max-attribute-value-size"))?a:(A=["max-attribute-value-size",s],f(S,"[]=",e.to_a(A)),A[t(A.length,1)]))?M.$to_i().$abs():s,f(S,"delete_if",[],(h=function(n,r){h.$$s;var i,o=s;return null==n&&(n=s),null==r&&(r=s),d(r)?(d(d(i=$("::","String")["$==="](r))?r["$end_with?"]("@"):i)&&(i=[r.$chop(),!0],r=i[0],o=i[1]),A=[n,r],f(L,"[]=",e.to_a(A)),A[t(A.length,1)]):(L.$delete(n),o=r["$=="](!1)),o},h.$$s=E,h.$$arity=2,h)),d(O)?(E.backend=L["$[]"]("backend"),(E.doctype=(A=["doctype",C],f(L,"[]=",e.to_a(A)),A[t(A.length,1)]))["$=="](l(me,"DEFAULT_DOCTYPE"))||E.$update_doctype_attributes(l(me,"DEFAULT_DOCTYPE")),E.reader=l(me,"Reader").$new(i,o["$[]"]("cursor")),d(E.sourcemap)&&(E.source_location=E.reader.$cursor()),l(me,"Parser").$parse(E.reader,E),E.$restore_attributes(),E.parsed=!0):(E.backend=s,(z=d(a=L["$[]"]("backend"))?a:l(me,"DEFAULT_BACKEND"))["$=="]("manpage")?E.doctype=(A=["doctype",(A=["doctype","manpage"],f(S,"[]=",e.to_a(A)),A[t(A.length,1)])],f(L,"[]=",e.to_a(A)),A[t(A.length,1)]):E.doctype=d(a=L["$[]"]("doctype"))?a:(A=["doctype",l(me,"DEFAULT_DOCTYPE")],f(L,"[]=",e.to_a(A)),A[t(A.length,1)]),E.$update_backend_attributes(z,!0),d(a=L["$[]"]("stylesdir"))||(A=["stylesdir","."],f(L,"[]=",e.to_a(A)),A[t(A.length,1)]),d(a=L["$[]"]("iconsdir"))||(A=["iconsdir",L.$fetch("imagesdir","./images")+"/icons"],f(L,"[]=",e.to_a(A)),A[t(A.length,1)]),E.$fill_datetime_attributes(L,N),d(R)&&(d(F=o["$[]"]("extension_registry"))?d(d(a=$(l(me,"Extensions"),"Registry")["$==="](F))?a:d(m=(v=$("::","AsciidoctorJ","skip_raise"))&&(y=$(v,"Extensions","skip_raise"))&&$(y,"ExtensionRegistry","skip_raise")?"constant":s)?$($($("::","AsciidoctorJ"),"Extensions"),"ExtensionRegistry")["$==="](F):m)&&(E.extensions=F.$activate(E)):d((j=o["$[]"]("extensions"))["$nil?"]())?d(l(me,"Extensions").$groups()["$empty?"]())||(E.extensions=$(l(me,"Extensions"),"Registry").$new().$activate(E)):d($("::","Proc")["$==="](j))&&(E.extensions=f(l(me,"Extensions"),"create",[],j.$to_proc()).$activate(E))),E.reader=l(me,"PreprocessorReader").$new(E,i,$(l(me,"Reader"),"Cursor").$new(L["$[]"]("docfile"),E.base_dir),p(["normalize"],{normalize:!0})),d(E.sourcemap)?E.source_location=E.reader.$cursor():s)},g.$$arity=-1),e.def(he,"$parse",v=function(e){var t,n,r,i=this,o=s,a=s;return null==e&&(e=s),d(i.parsed)?i:(o=i,d(e)&&(i.reader=l(me,"PreprocessorReader").$new(o,e,$(l(me,"Reader"),"Cursor").$new(i.attributes["$[]"]("docfile"),i.base_dir),p(["normalize"],{normalize:!0})),d(i.sourcemap)&&(i.source_location=i.reader.$cursor())),d(d(t=a=d(i.parent_document)?s:i.extensions)?a["$preprocessors?"]():t)&&f(a.$preprocessors(),"each",[],(n=function(e){var t,r=n.$$s||this;return null==r.reader&&(r.reader=s),null==e&&(e=s),r.reader=d(t=e.$process_method()["$[]"](o,r.reader))?t:r.reader},n.$$s=i,n.$$arity=1,n)),l(me,"Parser").$parse(i.reader,o,p(["header_only"],{header_only:i.options["$[]"]("parse_header_only")})),i.$restore_attributes(),d(d(t=a)?a["$tree_processors?"]():t)&&f(a.$tree_processors(),"each",[],((r=function(e){r.$$s;var t,n,i=s;return null==e&&(e=s),d(d(t=d(n=i=e.$process_method()["$[]"](o))?l(me,"Document")["$==="](i):n)?i["$!="](o):t)?o=i:s}).$$s=i,r.$$arity=1,r)),i.parsed=!0,o)},v.$$arity=-1),e.def(he,"$parsed?",b=function(){return this.parsed},b.$$arity=0),e.def(he,"$counter",w=function(n,r){var i,o,a,$=this,u=s,c=s,p=s;return null==r&&(r=s),d($.parent_document)?$.parent_document.$counter(n,r):(d(d(i=d(o=a=$["$attribute_locked?"](n))?u=$.counters["$[]"](n):o)?i:(u=$.attributes["$[]"](n))["$nil_or_empty?"]()["$!"]())?(p=[n,l(me,"Helpers").$nextval(u)],f($.counters,"[]=",e.to_a(p)),c=p[t(p.length,1)]):d(r)?(p=[n,r["$=="](r.$to_i().$to_s())?r.$to_i():r],f($.counters,"[]=",e.to_a(p)),c=p[t(p.length,1)]):(p=[n,1],f($.counters,"[]=",e.to_a(p)),c=p[t(p.length,1)]),d(a)||(p=[n,c],f($.attributes,"[]=",e.to_a(p)),p[t(p.length,1)]),c)},w.$$arity=-2),e.def(he,"$increment_and_store_counter",x=function(e,t){return l(me,"AttributeEntry").$new(e,this.$counter(e)).$save_to(t.$attributes()).$value()},x.$$arity=2),e.alias(he,"counter_increment","increment_and_store_counter"),e.def(he,"$register",k=function(n,r){var i=this,o=s,a=s,$=s,u=s,c=s;return"ids"["$==="](o=n)?i.$register("refs",[a=r["$[]"](0),l(me,"Inline").$new(i,"anchor",r["$[]"](1),p(["type","id"],{type:"ref",id:a}))]):"refs"["$==="](o)?($=i.catalog["$[]"]("refs"),d($["$[]"](r["$[]"](0)))||(u=[r["$[]"](0),c=r["$[]"](1)],f($,"[]=",e.to_a(u)),u[t(u.length,1)]),c):"footnotes"["$==="](o)?i.catalog["$[]"](n)["$<<"](r):d(i.options["$[]"]("catalog_assets"))?i.catalog["$[]"](n)["$<<"](n["$=="]("images")?l(me,"ImageReference").$new(r,i.attributes["$[]"]("imagesdir")):r):s},k.$$arity=2),e.def(he,"$resolve_id",E=function(n){var r,i,o=this,a=s,$=s;return d(o.reftexts)?o.reftexts["$[]"](n):d(o.parsed)?f(o.reftexts=p([],{}),"tap",[],(r=function(n){var i,o=r.$$s||this;return null==o.catalog&&(o.catalog=s),null==n&&(n=s),f(o.catalog["$[]"]("refs"),"each",[],((i=function(r,o){i.$$s;var a,$=s;return null==r&&(r=s),null==o&&(o=s),d(a=n["$[]"](o.$xreftext()))?a:($=[o.$xreftext(),r],f(n,"[]=",e.to_a($)),$[t($.length,1)])}).$$s=o,i.$$arity=2,i))},r.$$s=o,r.$$arity=1,r))["$[]"](n):(a=s,o.reftexts=$=p([],{}),function(){var r=e.new_brk();try{f(o.catalog["$[]"]("refs"),"each",[],((i=function(o,l){i.$$s;var u,c=s,p=s;return null==o&&(o=s),null==l&&(l=s),(c=l.$xreftext())["$=="](n)&&(a=o,e.brk(s,r)),d(u=$["$[]"](c))?u:(p=[c,o],f($,"[]=",e.to_a(p)),p[t(p.length,1)])}).$$s=o,i.$$brk=r,i.$$arity=2,i))}catch(l){if(l===r)return l.$v;throw l}}(),o.reftexts=s,a)},E.$$arity=1),e.def(he,"$footnotes?",O=function(){return!d(this.catalog["$[]"]("footnotes")["$empty?"]())},O.$$arity=0),e.def(he,"$footnotes",A=function(){return this.catalog["$[]"]("footnotes")},A.$$arity=0),e.def(he,"$callouts",S=function(){return this.catalog["$[]"]("callouts")},S.$$arity=0),e.def(he,"$nested?",C=function(){return!!d(this.parent_document)},C.$$arity=0),e.def(he,"$embedded?",R=function(){return this.attributes["$key?"]("embedded")},R.$$arity=0),e.def(he,"$extensions?",T=function(){return!!d(this.extensions)},T.$$arity=0),e.def(he,"$source",I=function(){return d(this.reader)?this.reader.$source():s},I.$$arity=0),e.def(he,"$source_lines",N=function(){return d(this.reader)?this.reader.$source_lines():s},N.$$arity=0),e.def(he,"$basebackend?",L=function(e){return this.attributes["$[]"]("basebackend")["$=="](e)},L.$$arity=1),e.def(he,"$title",D=function(){return this.$doctitle()},D.$$arity=0),e.def(he,"$title=",P=function(n){var r=this,i=s,o=s;return d(i=r.header)||(o=["header"],f(i=r.header=l(me,"Section").$new(r,0),"sectname=",e.to_a(o)),o[t(o.length,1)]),o=[n],f(i,"title=",e.to_a(o)),o[t(o.length,1)]},P.$$arity=1),e.def(he,"$doctitle",M=function(e){var t,n=this,r=s,i=s,o=s;if(null==e&&(e=p([],{})),d(r=n.attributes["$[]"]("title")));else if(d(i=n.$first_section()))r=i.$title();else if(d((d(t=e["$[]"]("use_fallback"))?r=n.attributes["$[]"]("untitled-label"):t)["$!"]()))return s;return d(o=e["$[]"]("partition"))?l(me,"Title").$new(r,e.$merge(p(["separator"],{separator:o["$=="](!0)?n.attributes["$[]"]("title-separator"):o}))):d(d(t=e["$[]"]("sanitize"))?r["$include?"]("<"):t)?r.$gsub(l(me,"XmlSanitizeRx"),"").$squeeze(" ").$strip():r},M.$$arity=-1),e.alias(he,"name","doctitle"),e.def(he,"$xreftext",z=function(e){var t,n=s;return null==e&&(e=s),d(d(t=n=this.$reftext())?n["$empty?"]()["$!"]():t)?n:this.$title()},z.$$arity=-1),e.def(he,"$author",F=function(){return this.attributes["$[]"]("author")},F.$$arity=0),e.def(he,"$authors",j=function(){var e,t=s,n=s,a=s,$=s;if(d((t=this.attributes)["$key?"]("author"))){if(n=[l(me,"Author").$new(t["$[]"]("author"),t["$[]"]("firstname"),t["$[]"]("middlename"),t["$[]"]("lastname"),t["$[]"]("authorinitials"),t["$[]"]("email"))],d(i(a=d(e=t["$[]"]("authorcount"))?e:0,1)))for($=1;d(o($,a));)$=r($,1),n["$<<"](l(me,"Author").$new(t["$[]"]("author_"+$),t["$[]"]("firstname_"+$),t["$[]"]("middlename_"+$),t["$[]"]("lastname_"+$),t["$[]"]("authorinitials_"+$),t["$[]"]("email_"+$)));return n}return[]},j.$$arity=0),e.def(he,"$revdate",B=function(){return this.attributes["$[]"]("revdate")},B.$$arity=0),e.def(he,"$notitle",q=function(){return this.attributes["$key?"]("notitle")},q.$$arity=0),e.def(he,"$noheader",U=function(){return this.attributes["$key?"]("noheader")},U.$$arity=0),e.def(he,"$nofooter",H=function(){return this.attributes["$key?"]("nofooter")},H.$$arity=0),e.def(he,"$first_section",Y=function(){var e,t,n=this;return d(e=n.header)?e:f(n.blocks,"find",[],((t=function(e){return t.$$s,null==e&&(e=s),e.$context()["$=="]("section")}).$$s=n,t.$$arity=1,t))},Y.$$arity=0),e.def(he,"$header?",W=function(){return!!d(this.header)},W.$$arity=0),e.alias(he,"has_header?","header?"),e.def(he,"$<<",V=function(t){var n=V.$$p,r=this,i=s,o=s,a=s;for(n&&(V.$$p=null),o=0,a=arguments.length,i=new Array(a);o<a;o++)i[o]=arguments[o];return t.$context()["$=="]("section")&&r.$assign_numeral(t),f(r,e.find_super_dispatcher(r,"<<",V,!1),i,n)},V.$$arity=1),e.def(he,"$finalize_header",K=function(n,r){var i=s;return null==r&&(r=!0),this.$clear_playback_attributes(n),this.$save_attributes(),d(r)||(i=["invalid-header",!0],f(n,"[]=",e.to_a(i)),i[t(i.length,1)]),n},K.$$arity=-2),e.def(he,"$playback_attributes",G=function(n){var r;return d(n["$key?"]("attribute_entries"))?f(n["$[]"]("attribute_entries"),"each",[],(r=function(n){var i=r.$$s||this,o=s,a=s;return null==i.attributes&&(i.attributes=s),null==n&&(n=s),o=n.$name(),d(n.$negate())?(i.attributes.$delete(o),o["$=="]("compat-mode")?i.compat_mode=!1:s):(a=[o,n.$value()],f(i.attributes,"[]=",e.to_a(a)),a[t(a.length,1)],o["$=="]("compat-mode")?i.compat_mode=!0:s)},r.$$s=this,r.$$arity=1,r)):s},G.$$arity=1),e.def(he,"$restore_attributes",X=function(){var e=this;return d(e.parent_document)||e.catalog["$[]"]("callouts").$rewind(),e.attributes.$replace(e.header_attributes)},X.$$arity=0),e.def(he,"$set_attribute",Q=function(n,r){var i,o=this,a=s,$=s;return null==r&&(r=""),d(o["$attribute_locked?"](n))?s:(d(r["$empty?"]())||(r=o.$apply_attribute_value_subs(r)),d(o.header_attributes)?(a=[n,r],f(o.attributes,"[]=",e.to_a(a)),a[t(a.length,1)]):("backend"["$==="]($=n)?o.$update_backend_attributes(r,d(i=o.attributes_modified["$delete?"]("htmlsyntax"))?r["$=="](o.backend):i):"doctype"["$==="]($)?o.$update_doctype_attributes(r):(a=[n,r],f(o.attributes,"[]=",e.to_a(a)),a[t(a.length,1)]),o.attributes_modified["$<<"](n)),r)},Q.$$arity=-2),e.def(he,"$delete_attribute",J=function(e){var t=this;return!d(t["$attribute_locked?"](e))&&(t.attributes.$delete(e),t.attributes_modified["$<<"](e),!0)},J.$$arity=1),e.def(he,"$attribute_locked?",Z=function(e){return this.attribute_overrides["$key?"](e)},Z.$$arity=1),e.def(he,"$set_header_attribute",ee=function(n,r,i){var o,a=s,$=s;return null==r&&(r=""),null==i&&(i=!0),a=d(o=this.header_attributes)?o:this.attributes,!d((o=i["$=="](!1))?a["$key?"](n):i["$=="](!1))&&($=[n,r],f(a,"[]=",e.to_a($)),$[t($.length,1)],!0)},ee.$$arity=-2),e.def(he,"$convert",te=function(r){var i,o,a=this,u=s,c=s,_=s,h=s,m=s;return null==r&&(r=p([],{})),d(a.timings)&&a.timings.$start("convert"),d(a.parsed)||a.$parse(),d(d(i=n(a.safe,$(l(me,"SafeMode"),"SERVER")))?i:r["$empty?"]())||(d((u=["outfile",r["$[]"]("outfile")],f(a.attributes,"[]=",e.to_a(u)),u[t(u.length,1)]))||a.attributes.$delete("outfile"),d((u=["outdir",r["$[]"]("outdir")],f(a.attributes,"[]=",e.to_a(u)),u[t(u.length,1)]))||a.attributes.$delete("outdir")),a.$doctype()["$=="]("inline")?d(c=d(i=a.blocks["$[]"](0))?i:a.header)&&(d(d(i=c.$content_model()["$=="]("compound"))?i:c.$content_model()["$=="]("empty"))?a.$logger().$warn("no inline candidate; use the inline doctype to convert a single paragragh, verbatim, or raw block"):_=c.$content()):(h=d(r["$key?"]("standalone"))?d(r["$[]"]("standalone"))?"document":"embedded":d(r["$key?"]("header_footer"))?d(r["$[]"]("header_footer"))?"document":"embedded":d(a.options["$[]"]("standalone"))?"document":"embedded",_=a.converter.$convert(a,h)),d(a.parent_document)||d(d(i=m=a.extensions)?m["$postprocessors?"]():i)&&f(m.$postprocessors(),"each",[],(o=function(e){var t=o.$$s||this;return null==e&&(e=s),_=e.$process_method()["$[]"](t,_)},o.$$s=a,o.$$arity=1,o)),d(a.timings)&&a.timings.$record("convert"),_},te.$$arity=-1),e.alias(he,"render","convert"),e.def(he,"$write",ne=function(e,t){var n,r=this;return d(r.timings)&&r.timings.$start("write"),d(l(me,"Writer")["$==="](r.converter))?r.converter.$write(e,t):(d(t["$respond_to?"]("write"))?d(e["$nil_or_empty?"]())||(t.$write(e.$chomp()),t.$write(l(me,"LF"))):$("::","File").$write(t,e,p(["mode"],{mode:l(me,"FILE_WRITE_MODE")})),d(d(n=r.backend["$=="]("manpage")?$("::","String")["$==="](t):r.backend["$=="]("manpage"))?r.converter.$class()["$respond_to?"]("write_alternate_pages"):n)&&r.converter.$class().$write_alternate_pages(r.attributes["$[]"]("mannames"),r.attributes["$[]"]("manvolnum"),t)),d(r.timings)&&r.timings.$record("write"),s},ne.$$arity=2),e.def(he,"$content",re=function(){var t=re.$$p,n=this,r=s,i=s,o=s;for(t&&(re.$$p=null),i=0,o=arguments.length,r=new Array(o);i<o;i++)r[i]=arguments[i];return n.attributes.$delete("title"),f(n,e.find_super_dispatcher(n,"content",re,!1),r,t)},re.$$arity=0),e.def(he,"$docinfo",ie=function(e,t){var n,r,i,a=this,u=s,c=s,_=s,h=s,m=s,y=s,g=s,v=s,b=s;return null==e&&(e="head"),null==t&&(t=s),d(o(a.$safe(),$(l(me,"SafeMode"),"SECURE")))&&(e["$=="]("head")||(u="-"+e),t=d(n=t)?n:a.outfilesuffix,c=d((c=a.attributes["$[]"]("docinfo"))["$nil_or_empty?"]())?d(a.attributes["$key?"]("docinfo2"))?["private","shared"]:d(a.attributes["$key?"]("docinfo1"))?["shared"]:d(c)?["private"]:s:f(c.$split(","),"map",[],((r=function(e){return r.$$s,null==e&&(e=s),e.$strip()}).$$s=a,r.$$arity=1,r)),d(c)&&(_=[],h=(n=["docinfo"+u+t,a.attributes["$[]"]("docinfodir"),a.$resolve_docinfo_subs()])[0],m=n[1],y=n[2],d(c["$&"](["shared","shared-"+e])["$empty?"]())||(g=a.$normalize_system_path(h,m),d(v=a.$read_asset(g,p(["normalize"],{normalize:!0})))&&_["$<<"](a.$apply_subs(v,y))),d(d(n=a.attributes["$[]"]("docname")["$nil_or_empty?"]())?n:c["$&"](["private","private-"+e])["$empty?"]())||(g=a.$normalize_system_path(a.attributes["$[]"]("docname")+"-"+h,m),d(b=a.$read_asset(g,p(["normalize"],{normalize:!0})))&&_["$<<"](a.$apply_subs(b,y))))),d(d(n=a.extensions)?a["$docinfo_processors?"](e):n)?(d(n=_)?n:[]).$concat(f(a.docinfo_processor_extensions["$[]"](e),"map",[],(i=function(e){var t=i.$$s||this;return null==e&&(e=s),e.$process_method()["$[]"](t)},i.$$s=a,i.$$arity=1,i)).$compact()).$join(l(me,"LF")):d(_)?_.$join(l(me,"LF")):""},ie.$$arity=-1),e.def(he,"$docinfo_processors?",oe=function(n){var r,i=this,o=s;return null==n&&(n="head"),d(i.docinfo_processor_extensions["$key?"](n))?i.docinfo_processor_extensions["$[]"](n)["$!="](!1):d(d(r=i.extensions)?i.document.$extensions()["$docinfo_processors?"](n):r)?(o=[n,i.document.$extensions().$docinfo_processors(n)],f(i.docinfo_processor_extensions,"[]=",e.to_a(o)),o[t(o.length,1)])["$!"]()["$!"]():(o=[n,!1],f(i.docinfo_processor_extensions,"[]=",e.to_a(o)),o[t(o.length,1)])},oe.$$arity=-1),e.def(he,"$to_s",ae=function(){var e,t=this;return"#<"+t.$class()+"@"+t.$object_id()+" {doctype: "+t.$doctype().$inspect()+", doctitle: "+(d(e=t.header)?t.header.$title():e).$inspect()+", blocks: "+t.blocks.$size()+"}>"},ae.$$arity=0),he.$private(),e.def(he,"$apply_attribute_value_subs",se=function(e){var t,n=this;return d(l(me,"AttributeEntryPassMacroRx")["$=~"](e))?(e=(t=h["~"])===s?s:t["$[]"](2),d((t=h["~"])===s?s:t["$[]"](1))&&(e=n.$apply_subs(e,n.$resolve_pass_subs((t=h["~"])===s?s:t["$[]"](1))))):e=n.$apply_header_subs(e),d(n.max_attribute_value_size)?n.$limit_bytesize(e,n.max_attribute_value_size):e},se.$$arity=1),e.def(he,"$limit_bytesize",$e=function(e,n){if(d(i(e.$bytesize(),n)))for(;!d((e=e.$byteslice(0,n))["$valid_encoding?"]());)n=t(n,1);return e},$e.$$arity=2),e.def(he,"$resolve_docinfo_subs",le=function(){var e=this;return d(e.attributes["$key?"]("docinfosubs"))?e.$resolve_subs(e.attributes["$[]"]("docinfosubs"),"block",s,"docinfo"):["attributes"]},le.$$arity=0),e.def(he,"$create_converter",ue=function(n,r){var i,o,a,u,c=this,h=s,m=s;return o=p(["document","htmlsyntax"],{document:c,htmlsyntax:c.attributes["$[]"]("htmlsyntax")}),d(a=d(i=(h=c.options)["$[]"]("template_dirs"))?i:h["$[]"]("template_dir"))&&(m=["template_dirs",[].concat(e.to_a(a))],f(o,"[]=",e.to_a(m)),m[t(m.length,1)],m=["template_cache",h.$fetch("template_cache",!0)],f(o,"[]=",e.to_a(m)),m[t(m.length,1)],m=["template_engine",h["$[]"]("template_engine")],f(o,"[]=",e.to_a(m)),m[t(m.length,1)],m=["template_engine_options",h["$[]"]("template_engine_options")],f(o,"[]=",e.to_a(m)),m[t(m.length,1)],m=["eruby",h["$[]"]("eruby")],f(o,"[]=",e.to_a(m)),m[t(m.length,1)],m=["safe",c.safe],f(o,"[]=",e.to_a(m)),m[t(m.length,1)],d(r)&&(m=["delegate_backend",r],f(o,"[]=",e.to_a(m)),m[t(m.length,1)])),d(u=h["$[]"]("converter"))?$(l(me,"Converter"),"CustomFactory").$new(_(n,u)).$create(n,o):h.$fetch("converter_factory",l(me,"Converter")).$create(n,o)},ue.$$arity=2),e.def(he,"$clear_playback_attributes",ce=function(e){return e.$delete("attribute_entries")},ce.$$arity=1),e.def(he,"$save_attributes",fe=function(){var n,r,i=this,o=s,a=s,u=s,c=s,_=s,h=s,m=s,y=s,g=s,v=s,b=s,w=s,x=s,k=s,E=s;return d(d(n=(o=i.attributes)["$key?"]("doctitle"))?n:(a=i.$doctitle())["$!"]())||(u=["doctitle",a],f(o,"[]=",e.to_a(u)),u[t(u.length,1)]),i.id=d(n=i.id)?n:o["$[]"]("css-signature"),d(c=d(o.$delete("toc2"))?"left":o["$[]"]("toc"))&&(_=d(d(n=h=o.$fetch("toc-placement","macro"))?h["$!="]("auto"):n)?h:o["$[]"]("toc-position"),d(d(n=c["$empty?"]())?_["$nil_or_empty?"]():n)||(m="left",y="toc2",g=d(_["$nil_or_empty?"]())?d(c["$empty?"]())?m:c:_,u=["toc",""],f(o,"[]=",e.to_a(u)),u[t(u.length,1)],u=["toc-placement","auto"],f(o,"[]=",e.to_a(u)),u[t(u.length,1)],"left"["$==="](v=g)||"<"["$==="](v)||"<"["$==="](v)?(u=["toc-position","left"],f(o,"[]=",e.to_a(u)),u[t(u.length,1)]):"right"["$==="](v)||">"["$==="](v)||">"["$==="](v)?(u=["toc-position","right"],f(o,"[]=",e.to_a(u)),u[t(u.length,1)]):"top"["$==="](v)||"^"["$==="](v)?(u=["toc-position","top"],f(o,"[]=",e.to_a(u)),u[t(u.length,1)]):"bottom"["$==="](v)||"v"["$==="](v)?(u=["toc-position","bottom"],f(o,"[]=",e.to_a(u)),u[t(u.length,1)]):"preamble"["$==="](v)||"macro"["$==="](v)?(u=["toc-position","content"],f(o,"[]=",e.to_a(u)),u[t(u.length,1)],u=["toc-placement",g],f(o,"[]=",e.to_a(u)),u[t(u.length,1)],y=s):(o.$delete("toc-position"),y=s),d(y)&&(d(n=o["$[]"]("toc-class"))||(u=["toc-class",y],f(o,"[]=",e.to_a(u)),u[t(u.length,1)])))),d(d(n=b=o["$[]"]("icons"))?o["$key?"]("icontype")["$!"]():n)&&(""["$==="](v=b)||"font"["$==="](v)||(u=["icons",""],f(o,"[]=",e.to_a(u)),u[t(u.length,1)],b["$=="]("image")||(u=["icontype",b],f(o,"[]=",e.to_a(u)),u[t(u.length,1)]))),d(d(n=i.compat_mode=o["$key?"]("compat-mode"))?o["$key?"]("language"):n)&&(u=["source-language",o["$[]"]("language")],f(o,"[]=",e.to_a(u)),u[t(u.length,1)]),d(i.parent_document)||((w=o["$[]"]("basebackend"))["$=="]("html")?d(d(n=x=o["$[]"]("source-highlighter"))?o["$[]"](x+"-unavailable")["$!"]():n)&&(d(k=i.options["$[]"]("syntax_highlighter_factory"))?i.syntax_highlighter=k.$create(x,i.backend,p(["document"],{document:i})):d(E=i.options["$[]"]("syntax_highlighters"))?i.syntax_highlighter=$(l(me,"SyntaxHighlighter"),"DefaultFactoryProxy").$new(E).$create(x,i.backend,p(["document"],{document:i})):i.syntax_highlighter=l(me,"SyntaxHighlighter").$create(x,i.backend,p(["document"],{document:i}))):w["$=="]("docbook")&&(d(d(n=i["$attribute_locked?"]("toc"))?n:i.attributes_modified["$include?"]("toc"))||(u=["toc",""],f(o,"[]=",e.to_a(u)),u[t(u.length,1)]),d(d(n=i["$attribute_locked?"]("sectnums"))?n:i.attributes_modified["$include?"]("sectnums"))||(u=["sectnums",""],f(o,"[]=",e.to_a(u)),u[t(u.length,1)])),i.outfilesuffix=o["$[]"]("outfilesuffix"),f(l(me,"FLEXIBLE_ATTRIBUTES"),"each",[],(r=function(e){var t,n=r.$$s||this;return null==n.attribute_overrides&&(n.attribute_overrides=s),null==e&&(e=s),d(d(t=n.attribute_overrides["$key?"](e))?n.attribute_overrides["$[]"](e):t)?n.attribute_overrides.$delete(e):s},r.$$s=i,r.$$arity=1,r))),i.header_attributes=o.$merge()},fe.$$arity=0),e.def(he,"$fill_datetime_attributes",de=function(n,r){var i,o,a,l,u=this,c=s,p=s,_=s,h=s,m=s;return c=d($("::","ENV")["$key?"]("SOURCE_DATE_EPOCH"))?p=$("::","Time").$at(u.$Integer($("::","ENV")["$[]"]("SOURCE_DATE_EPOCH"))).$utc():$("::","Time").$now(),d(_=n["$[]"]("localdate"))?d(i=n["$[]"]("localyear"))||(h=["localyear",_.$index("-")["$=="](4)?_.$slice(0,4):s],f(n,"[]=",e.to_a(h)),h[t(h.length,1)]):(h=["localdate",c.$strftime("%F")],f(n,"[]=",e.to_a(h)),_=h[t(h.length,1)],d(i=n["$[]"]("localyear"))||(h=["localyear",c.$year().$to_s()],f(n,"[]=",e.to_a(h)),h[t(h.length,1)])),a=d(i=n["$[]"]("localtime"))?i:(h=["localtime",c.$strftime("%T "+(c.$utc_offset()["$=="](0)?"UTC":"%z"))],f(n,"[]=",e.to_a(h)),h[t(h.length,1)]),d(i=n["$[]"]("localdatetime"))||(h=["localdatetime",_+" "+a],f(n,"[]=",e.to_a(h)),h[t(h.length,1)]),r=d(i=d(o=p)?o:r)?i:c,d(m=n["$[]"]("docdate"))?d(i=n["$[]"]("docyear"))||(h=["docyear",m.$index("-")["$=="](4)?m.$slice(0,4):s],f(n,"[]=",e.to_a(h)),h[t(h.length,1)]):(h=["docdate",r.$strftime("%F")],f(n,"[]=",e.to_a(h)),m=h[t(h.length,1)],d(i=n["$[]"]("docyear"))||(h=["docyear",r.$year().$to_s()],f(n,"[]=",e.to_a(h)),h[t(h.length,1)])),l=d(i=n["$[]"]("doctime"))?i:(h=["doctime",r.$strftime("%T "+(r.$utc_offset()["$=="](0)?"UTC":"%z"))],f(n,"[]=",e.to_a(h)),h[t(h.length,1)]),d(i=n["$[]"]("docdatetime"))||(h=["docdatetime",m+" "+l],f(n,"[]=",e.to_a(h)),h[t(h.length,1)]),s},de.$$arity=2),e.def(he,"$update_backend_attributes",pe=function(n,r){var i,o,a=this,u=s,c=s,p=s,_=s,h=s,m=s,y=s,g=s,v=s,b=s,w=s,x=s,k=s,E=s;return null==r&&(r=s),d(d(i=r)?i:n["$!="](a.backend))?(u=a.backend,c=(p=a.attributes)["$[]"]("basebackend"),_=a.doctype,d(n["$include?"](":"))&&(o=n.$partition(":"),h=null==(i=e.to_ary(o))[0]?s:i[0],null==i[1]||i[1],n=null==i[2]?s:i[2]),d(n["$start_with?"]("xhtml"))?(m=["htmlsyntax","xml"],f(p,"[]=",e.to_a(m)),m[t(m.length,1)],n=n.$slice(1,n.$length())):d(n["$start_with?"]("html"))&&(d(i=p["$[]"]("htmlsyntax"))||(m=["htmlsyntax","html"],f(p,"[]=",e.to_a(m)),m[t(m.length,1)])),n=d(i=l(me,"BACKEND_ALIASES")["$[]"](n))?i:n,d(h)&&(n=(i=[h,n])[0],y=i[1]),d(_)?(d(u)&&(p.$delete("backend-"+u),p.$delete("backend-"+u+"-doctype-"+_)),m=["backend-"+n+"-doctype-"+_,""],f(p,"[]=",e.to_a(m)),m[t(m.length,1)],m=["doctype-"+_,""],f(p,"[]=",e.to_a(m)),m[t(m.length,1)]):d(u)&&p.$delete("backend-"+u),m=["backend-"+n,""],f(p,"[]=",e.to_a(m)),m[t(m.length,1)],a.backend=(m=["backend",n],f(p,"[]=",e.to_a(m)),m[t(m.length,1)]),d($(l(me,"Converter"),"BackendTraits")["$==="](g=a.$create_converter(n,y)))?(v=g.$basebackend(),b=g.$filetype(),d(w=g.$htmlsyntax())&&(m=["htmlsyntax",w],f(p,"[]=",e.to_a(m)),m[t(m.length,1)]),d(r)?d(i=p["$[]"]("outfilesuffix"))||(m=["outfilesuffix",g.$outfilesuffix()],f(p,"[]=",e.to_a(m)),m[t(m.length,1)]):d(a["$attribute_locked?"]("outfilesuffix"))||(m=["outfilesuffix",g.$outfilesuffix()],f(p,"[]=",e.to_a(m)),m[t(m.length,1)])):d(g)?(v=(x=l(me,"Converter").$derive_backend_traits(n))["$[]"]("basebackend"),b=x["$[]"]("filetype"),d(r)?d(i=p["$[]"]("outfilesuffix"))||(m=["outfilesuffix",x["$[]"]("outfilesuffix")],f(p,"[]=",e.to_a(m)),m[t(m.length,1)]):d(a["$attribute_locked?"]("outfilesuffix"))||(m=["outfilesuffix",x["$[]"]("outfilesuffix")],f(p,"[]=",e.to_a(m)),m[t(m.length,1)])):a.$raise($("::","NotImplementedError"),"asciidoctor: FAILED: missing converter for backend '"+n+"'. Processing aborted."),a.converter=g,d(k=p["$[]"]("filetype"))&&p.$delete("filetype-"+k),m=["filetype",b],f(p,"[]=",e.to_a(m)),m[t(m.length,1)],m=["filetype-"+b,""],f(p,"[]=",e.to_a(m)),m[t(m.length,1)],d(E=l(me,"DEFAULT_PAGE_WIDTHS")["$[]"](v))?(m=["pagewidth",E],f(p,"[]=",e.to_a(m)),m[t(m.length,1)]):p.$delete("pagewidth"),d(v["$!="](c))&&(d(_)?(d(c)&&(p.$delete("basebackend-"+c),p.$delete("basebackend-"+c+"-doctype-"+_)),m=["basebackend-"+v+"-doctype-"+_,""],f(p,"[]=",e.to_a(m)),m[t(m.length,1)]):d(c)&&p.$delete("basebackend-"+c),m=["basebackend-"+v,""],f(p,"[]=",e.to_a(m)),m[t(m.length,1)],m=["basebackend",v],f(p,"[]=",e.to_a(m)),m[t(m.length,1)]),n):s},pe.$$arity=-2),e.def(he,"$update_doctype_attributes",_e=function(n){var r,i=this,o=s,a=s,$=s,l=s,u=s;return d(d(r=n)?n["$!="](i.doctype):r)?(a=(r=[i.backend,(o=i.attributes)["$[]"]("basebackend"),i.doctype])[0],$=r[1],l=r[2],d(l)?(o.$delete("doctype-"+l),d(a)&&(o.$delete("backend-"+a+"-doctype-"+l),u=["backend-"+a+"-doctype-"+n,""],f(o,"[]=",e.to_a(u)),u[t(u.length,1)]),d($)&&(o.$delete("basebackend-"+$+"-doctype-"+l),u=["basebackend-"+$+"-doctype-"+n,""],f(o,"[]=",e.to_a(u)),u[t(u.length,1)])):(d(a)&&(u=["backend-"+a+"-doctype-"+n,""],f(o,"[]=",e.to_a(u)),u[t(u.length,1)]),d($)&&(u=["basebackend-"+$+"-doctype-"+n,""],f(o,"[]=",e.to_a(u)),u[t(u.length,1)])),u=["doctype-"+n,""],f(o,"[]=",e.to_a(u)),u[t(u.length,1)],i.doctype=(u=["doctype",n],f(o,"[]=",e.to_a(u)),u[t(u.length,1)])):s},_e.$$arity=1)}(y[0],l(y,"AbstractBlock"),y)}(a[0],a)},Opal.modules["asciidoctor/inline"]=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative),i=(e.breaker,e.slice,e.module),o=e.klass,a=e.hash2,s=e.send,$=e.truthy;return e.add_stubs(["$attr_accessor","$attr_reader","$[]","$convert","$converter","$attr","$==","$apply_reftext_subs","$reftext"]),function(t,l){var u=[i(t,"Asciidoctor")].concat(l);!function(t,r,i){var l,u,c,f,d,p,_,h,m=o(t,r,"Inline");[m].concat(i),m.$$prototype.text=m.$$prototype.type=n,m.$attr_accessor("text"),m.$attr_reader("type"),m.$attr_accessor("target"),e.def(m,"$initialize",l=function(t,r,i,o){var $=l.$$p,u=this;return $&&(l.$$p=null),null==i&&(i=n),null==o&&(o=a([],{})),s(u,e.find_super_dispatcher(u,"initialize",l,!1),[t,r,o],null),u.node_name="inline_"+r,u.text=i,u.id=o["$[]"]("id"),u.type=o["$[]"]("type"),u.target=o["$[]"]("target")},l.$$arity=-3),e.def(m,"$block?",u=function(){return!1},u.$$arity=0),e.def(m,"$inline?",c=function(){return!0},c.$$arity=0),e.def(m,"$convert",f=function(){return this.$converter().$convert(this)},f.$$arity=0),e.alias(m,"render","convert"),e.def(m,"$alt",d=function(){var e;return $(e=this.$attr("alt"))?e:""},d.$$arity=0),e.def(m,"$reftext?",p=function(){var e,t,n=this;return $(e=n.text)?$(t=n.type["$=="]("ref"))?t:n.type["$=="]("bibref"):e},p.$$arity=0),e.def(m,"$reftext",_=function(){var e;return $(e=this.text)?this.$apply_reftext_subs(e):n},_.$$arity=0),e.def(m,"$xreftext",h=function(e){return null==e&&(e=n),this.$reftext()},h.$$arity=-1)}(u[0],r(u,"AbstractNode"),u)}(t[0],t)},Opal.modules["asciidoctor/list"]=function(e){e.top;var t=[],n=e.nil,r=(e.const_get_qualified,e.const_get_relative),i=(e.breaker,e.slice,e.module),o=e.klass,a=e.hash2,s=e.send,$=e.truthy;return e.add_stubs(["$==","$next_list","$callouts","$class","$object_id","$inspect","$size","$items","$attr_accessor","$level","$drop","$nil_or_empty?","$apply_subs","$attr_writer","$empty?","$===","$[]","$outline?","$!","$simple?","$source","$shift","$context","$parent"]),function(t,l){var u=[i(t,"Asciidoctor")].concat(l);!function(t,r,i){var l,u,c,f,d=o(t,r,"List");[d].concat(i),d.$$prototype.context=d.$$prototype.document=d.$$prototype.style=n,e.alias(d,"items","blocks"),e.alias(d,"content","blocks"),e.alias(d,"items?","blocks?"),e.def(d,"$initialize",l=function(t,r,i){var o=l.$$p,$=this,u=n,c=n,f=n;for(o&&(l.$$p=null),c=0,f=arguments.length,u=new Array(f);c<f;c++)u[c]=arguments[c];return null==i&&(i=a([],{})),s($,e.find_super_dispatcher($,"initialize",l,!1),u,o)},l.$$arity=-3),e.def(d,"$outline?",u=function(){var e;return $(e=this.context["$=="]("ulist"))?e:this.context["$=="]("olist")},u.$$arity=0),e.def(d,"$convert",c=function(){var t=c.$$p,r=this,i=n,o=n,a=n,$=n;for(t&&(c.$$p=null),a=0,$=arguments.length,o=new Array($);a<$;a++)o[a]=arguments[a];return r.context["$=="]("colist")?(i=s(r,e.find_super_dispatcher(r,"convert",c,!1),o,t),r.document.$callouts().$next_list(),i):s(r,e.find_super_dispatcher(r,"convert",c,!1),o,t)},c.$$arity=0),e.alias(d,"render","convert"),e.def(d,"$to_s",f=function(){var e=this;return"#<"+e.$class()+"@"+e.$object_id()+" {context: "+e.context.$inspect()+", style: "+e.style.$inspect()+", items: "+e.$items().$size()+"}>"},f.$$arity=0)}(u[0],r(u,"AbstractBlock"),u),function(t,i,a){var l,u,c,f,d,p,_,h=o(t,i,"ListItem"),m=[h].concat(a);h.$$prototype.text=h.$$prototype.subs=h.$$prototype.blocks=n,e.alias(h,"list","parent"),h.$attr_accessor("marker"),e.def(h,"$initialize",l=function(t,i){var o=l.$$p,a=this;return o&&(l.$$p=null),null==i&&(i=n),s(a,e.find_super_dispatcher(a,"initialize",l,!1),[t,"list_item"],null),a.text=i,a.level=t.$level(),a.subs=r(m,"NORMAL_SUBS").$drop(0)},l.$$arity=-2),e.def(h,"$text?",u=function(){return!$(this.text["$nil_or_empty?"]())},u.$$arity=0),e.def(h,"$text",c=function(){var e,t=this;return $(e=t.text)?t.$apply_subs(t.text,t.subs):e},c.$$arity=0),h.$attr_writer("text"),e.def(h,"$simple?",f=function(){var e,t,i=this,o=n;return $(e=i.blocks["$empty?"]())?e:$(t=i.blocks.$size()["$=="](1)?r(m,"List")["$==="](o=i.blocks["$[]"](0)):i.blocks.$size()["$=="](1))?o["$outline?"]():t},f.$$arity=0),e.def(h,"$compound?",d=function(){return this["$simple?"]()["$!"]()},d.$$arity=0),e.def(h,"$fold_first",p=function(){var e=this;return e.text=$(e.text["$nil_or_empty?"]())?e.blocks.$shift().$source():""+e.text+r(m,"LF")+e.blocks.$shift().$source(),n},p.$$arity=0),e.def(h,"$to_s",_=function(){var e,t=this;return"#<"+t.$class()+"@"+t.$object_id()+" {list_context: "+t.$parent().$context().$inspect()+", text: "+t.text.$inspect()+", blocks: "+($(e=t.blocks)?e:[]).$size()+"}>"},_.$$arity=0)}(u[0],r(u,"AbstractBlock"),u)}(t[0],t)},Opal.modules["asciidoctor/parser"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e+t:e["$+"](t)}function r(e,t){return"number"===typeof e&&"number"===typeof t?e<t:e["$<"](t)}function i(e,t){return"number"===typeof e&&"number"===typeof t?e>t:e["$>"](t)}function o(e,t){return"number"===typeof e&&"number"===typeof t?e*t:e["$*"](t)}e.top;var a=[],s=e.nil,$=e.const_get_qualified,l=e.const_get_relative,u=(e.breaker,e.slice,e.module),c=e.klass,f=e.send,d=e.truthy,p=e.hash2,_=e.gvars;return e.add_stubs(["$include","$new","$proc","$start_with?","$match?","$is_delimited_block?","$private_class_method","$parse_document_header","$[]","$has_more_lines?","$next_section","$assign_numeral","$<<","$blocks","$skip_blank_lines","$parse_block_metadata_lines","$attributes","$is_next_line_doctitle?","$finalize_header","$nil_or_empty?","$title=","$-","$sourcemap","$cursor","$parse_section_title","$id=","$include?","$sub_specialchars","$[]=","$sub_attributes","$source_location=","$header","$attribute_locked?","$id","$clear","$delete","$instance_variable_get","$parse_header_metadata","$==","$!","$register","$doctype","$parse_manpage_header","$=~","$downcase","$error","$logger","$message_with_context","$cursor_at_line","$backend","$save","$update","$is_next_line_section?","$initialize_section","$join","$map","$read_lines_until","$lstrip","$split","$title","$restore_save","$discard_save","$context","$empty?","$header?","$!=","$attr?","$attr","$key?","$document","$+","$level","$special","$sectname","$to_i","$<","$>","$warn","$next_block","$blocks?","$style","$context=","$style=","$parent=","$size","$content_model","$shift","$unwrap_standalone_preamble","$source_location","$merge","$fetch","$parse_block_metadata_line","$extensions","$block_macros?","$mark","$read_line","$terminator","$to_s","$masq","$to_sym","$registered_for_block?","$debug?","$debug","$cursor_at_mark","$strict_verbatim_paragraphs","$unshift_line","$markdown_syntax","$keys","$chr","$uniform?","$length","$end_with?","$===","$parse_attributes","$attribute_missing","$tr","$basename","$assign_caption","$registered_for_block_macro?","$config","$process_method","$replace","$parse_callout_list","$callouts","$parse_list","$parse_description_list","$underline_style_section_titles","$is_section_title?","$peek_line","$atx_section_title?","$generate_id","$level=","$read_paragraph_lines","$adjust_indentation!","$map!","$slice","$pop","$build_block","$apply_subs","$chop","$catalog_inline_anchors","$rekey","$index","$strip","$parse_table","$each","$raise","$title?","$update_attributes","$commit_subs","$sub?","$catalog_callouts","$source","$remove_sub","$block_terminates_paragraph","$to_proc","$nil?","$lines","$parse_blocks","$parse_list_item","$items","$scan","$gsub","$count","$advance","$dup","$match","$callout_ids","$next_list","$catalog_inline_anchor","$marker=","$catalog_inline_biblio_anchor","$set_option","$text=","$resolve_ordered_list_marker","$read_lines_for_list_item","$skip_line_comments","$unshift_lines","$fold_first","$text?","$is_sibling_list_item?","$concat","$find","$casecmp","$sectname=","$special=","$numbered=","$numbered","$lineno","$peek_lines","$setext_section_title?","$abs","$cursor_at_prev_line","$process_attribute_entries","$next_line_empty?","$process_authors","$apply_header_subs","$rstrip","$each_with_index","$compact","$squeeze","$to_a","$parse_style_attribute","$process_attribute_entry","$skip_comment_lines","$store_attribute","$sanitize_attribute_name","$set_attribute","$save_to","$delete_attribute","$ord","$int_to_roman","$resolve_list_marker","$parse_colspecs","$create_columns","$has_header_option=","$format","$starts_with_delimiter?","$close_open_cell","$parse_cellspec","$delimiter","$match_delimiter","$pre_match","$post_match","$buffer_has_unclosed_quotes?","$skip_past_delimiter","$buffer","$buffer=","$skip_past_escaped_delimiter","$keep_cell_open","$push_cellspec","$close_cell","$cell_open?","$columns","$assign_column_widths","$partition_header_footer","$upto","$partition","$shorthand_property_syntax","$each_char","$yield_buffered_attribute","$any?","$*","$each_byte","$%"]),function(a,h){var m=[u(a,"Asciidoctor")].concat(h);!function(a,u,h){var m,y,g,v,b,w,x,k,E,O,A,S,C,R,T,I,N,L,D,P,M,z,F,j,B,q,U,H,Y,W,V,K,G,X,Q,J,Z,ee,te,ne,re,ie,oe,ae,se,$e,le=c(a,null,"Parser"),ue=[le].concat(h);le.$include(l(ue,"Logging")),e.const_set(ue[0],"BlockMatchData",l(ue,"Struct").$new("context","masq","tip","terminator")),e.const_set(ue[0],"TAB","\t"),e.const_set(ue[0],"TabIndentRx",/^\t+/),e.const_set(ue[0],"StartOfBlockProc",f(le,"proc",[],(m=function(e){var t,n,r=m.$$s||this;return null==e&&(e=s),d(t=d(n=e["$start_with?"]("["))?l(ue,"BlockAttributeLineRx")["$match?"](e):n)?t:r["$is_delimited_block?"](e)},m.$$s=le,m.$$arity=1,m))),e.const_set(ue[0],"StartOfListProc",f(le,"proc",[],((y=function(e){return y.$$s,null==e&&(e=s),l(ue,"AnyListRx")["$match?"](e)}).$$s=le,y.$$arity=1,y))),e.const_set(ue[0],"StartOfBlockOrListProc",f(le,"proc",[],(g=function(e){var t,n,r,i=g.$$s||this;return null==e&&(e=s),d(t=d(n=i["$is_delimited_block?"](e))?n:d(r=e["$start_with?"]("["))?l(ue,"BlockAttributeLineRx")["$match?"](e):r)?t:l(ue,"AnyListRx")["$match?"](e)},g.$$s=le,g.$$arity=1,g))),e.const_set(ue[0],"NoOp",s),e.const_set(ue[0],"AuthorKeys",["author","authorinitials","firstname","middlename","lastname","email"]),e.const_set(ue[0],"TableCellHorzAlignments",p(["<",">","^"],{"<":"left",">":"right","^":"center"})),e.const_set(ue[0],"TableCellVertAlignments",p(["<",">","^"],{"<":"top",">":"bottom","^":"middle"})),e.const_set(ue[0],"TableCellStyles",p(["d","s","e","m","h","l","a"],{d:"none",s:"strong",e:"emphasis",m:"monospaced",h:"header",l:"literal",a:"asciidoc"})),le.$private_class_method("new"),e.defs(le,"$parse",v=function(t,n,r){var i,o,a=s,$=s;if(null==r&&(r=p([],{})),a=this.$parse_document_header(t,n),d(r["$[]"]("header_only")));else for(;d(t["$has_more_lines?"]());)o=this.$next_section(t,n,a),$=null==(i=e.to_ary(o))[0]?s:i[0],a=null==i[1]?s:i[1],d($)&&(n.$assign_numeral($),n.$blocks()["$<<"]($));return n},v.$$arity=-3),e.defs(le,"$parse_document_header",b=function(n,r){var i,o,a,$=this,u=s,c=s,_=s,h=s,m=s,y=s,g=s,v=s,b=s,w=s,x=s,k=s,E=s;return u=d(n.$skip_blank_lines())?$.$parse_block_metadata_lines(n,r):p([],{}),c=r.$attributes(),d(d(i=a=$["$is_next_line_doctitle?"](n,u,c["$[]"]("leveloffset")))?u["$[]"]("title"):i)?r.$finalize_header(u,!1):(d((_=c["$[]"]("doctitle"))["$nil_or_empty?"]())||(h=[m=_],f(r,"title=",e.to_a(h)),h[t(h.length,1)]),d(a)&&(d(r.$sourcemap())&&(y=n.$cursor()),o=$.$parse_section_title(n,r),i=e.to_ary(o),r["$id="](null==i[0]?s:i[0]),null==i[1]||i[1],g=null==i[2]?s:i[2],null==i[3]||i[3],v=null==i[4]?s:i[4],d(m)?g=s:(h=[g],f(r,"title=",e.to_a(h)),h[t(h.length,1)],d((h=["doctitle",m=r.$sub_specialchars(g)],f(c,"[]=",e.to_a(h)),h[t(h.length,1)])["$include?"](l(ue,"ATTR_REF_HEAD")))&&(h=["doctitle",m=r.$sub_attributes(m,p(["attribute_missing"],{attribute_missing:"skip"}))],f(c,"[]=",e.to_a(h)),h[t(h.length,1)])),d(y)&&(h=[y],f(r.$header(),"source_location=",e.to_a(h)),h[t(h.length,1)]),d(d(i=v)?i:r["$attribute_locked?"]("compat-mode"))||(h=["compat-mode",""],f(c,"[]=",e.to_a(h)),h[t(h.length,1)]),d(b=u["$[]"]("separator"))&&(d(r["$attribute_locked?"]("title-separator"))||(h=["title-separator",b],f(c,"[]=",e.to_a(h)),h[t(h.length,1)])),d(w=u["$[]"]("id"))?(h=[w],f(r,"id=",e.to_a(h)),h[t(h.length,1)]):w=r.$id(),d(x=u["$[]"]("role"))&&(h=["role",x],f(c,"[]=",e.to_a(h)),h[t(h.length,1)]),d(k=u["$[]"]("reftext"))&&(h=["reftext",k],f(c,"[]=",e.to_a(h)),h[t(h.length,1)]),u.$clear(),(E=r.$instance_variable_get("@attributes_modified")).$delete("doctitle"),$.$parse_header_metadata(n,r),d(E["$include?"]("doctitle"))?d(d(i=(_=c["$[]"]("doctitle"))["$nil_or_empty?"]())?i:_["$=="](m))?(h=["doctitle",m],f(c,"[]=",e.to_a(h)),h[t(h.length,1)]):(h=[_],f(r,"title=",e.to_a(h)),h[t(h.length,1)]):d(g["$!"]())&&E["$<<"]("doctitle"),d(w)&&r.$register("refs",[w,r])),r.$doctype()["$=="]("manpage")&&$.$parse_manpage_header(n,r,u),r.$finalize_header(u))},b.$$arity=2),e.defs(le,"$parse_manpage_header",w=function(n,r,i){var o,a,$,u,c=this,h=s,m=s,y=s,g=s,v=s,b=s,w=s,x=s,k=s,E=s,O=s;return d(l(ue,"ManpageTitleVolnumRx")["$=~"]((h=r.$attributes())["$[]"]("doctitle")))?(m=["manvolnum",y=(o=_["~"])===s?s:o["$[]"](2)],f(h,"[]=",e.to_a(m)),m[t(m.length,1)],m=["mantitle",(d((g=(o=_["~"])===s?s:o["$[]"](1))["$include?"](l(ue,"ATTR_REF_HEAD")))?r.$sub_attributes(g):g).$downcase()],f(h,"[]=",e.to_a(m)),m[t(m.length,1)]):(c.$logger().$error(c.$message_with_context("non-conforming manpage title",p(["source_location"],{source_location:n.$cursor_at_line(1)}))),m=["mantitle",d(o=d(a=h["$[]"]("doctitle"))?a:h["$[]"]("docname"))?o:"command"],f(h,"[]=",e.to_a(m)),m[t(m.length,1)],m=["manvolnum",y="1"],f(h,"[]=",e.to_a(m)),m[t(m.length,1)]),d(d(o=v=h["$[]"]("manname"))?h["$[]"]("manpurpose"):o)?(d(o=h["$[]"]("manname-title"))||(m=["manname-title","Name"],f(h,"[]=",e.to_a(m)),m[t(m.length,1)]),m=["mannames",[v]],f(h,"[]=",e.to_a(m)),m[t(m.length,1)],r.$backend()["$=="]("manpage")&&(m=["docname",v],f(h,"[]=",e.to_a(m)),m[t(m.length,1)],m=["outfilesuffix","."+y],f(h,"[]=",e.to_a(m)),m[t(m.length,1)])):(n.$skip_blank_lines(),n.$save(),i.$update(c.$parse_block_metadata_lines(n,r)),d(b=c["$is_next_line_section?"](n,p([],{})))?b["$=="](1)?(w=c.$initialize_section(n,r,p([],{})),x=f(n.$read_lines_until(p(["break_on_blank_lines","skip_line_comments"],{break_on_blank_lines:!0,skip_line_comments:!0})),"map",[],($=function(e){return $.$$s,null==e&&(e=s),e.$lstrip()},$.$$s=c,$.$$arity=1,$)).$join(" "),d(l(ue,"ManpageNamePurposeRx")["$=~"](x))?(d((v=(o=_["~"])===s?s:o["$[]"](1))["$include?"](l(ue,"ATTR_REF_HEAD")))&&(v=r.$sub_attributes(v)),d(v["$include?"](","))?v=(k=f(v.$split(","),"map",[],(u=function(e){return u.$$s,null==e&&(e=s),e.$lstrip()},u.$$s=c,u.$$arity=1,u)))["$[]"](0):k=[v],d((E=(o=_["~"])===s?s:o["$[]"](2))["$include?"](l(ue,"ATTR_REF_HEAD")))&&(E=r.$sub_attributes(E)),d(o=h["$[]"]("manname-title"))||(m=["manname-title",w.$title()],f(h,"[]=",e.to_a(m)),m[t(m.length,1)]),d(w.$id())&&(m=["manname-id",w.$id()],f(h,"[]=",e.to_a(m)),m[t(m.length,1)]),m=["manname",v],f(h,"[]=",e.to_a(m)),m[t(m.length,1)],m=["mannames",k],f(h,"[]=",e.to_a(m)),m[t(m.length,1)],m=["manpurpose",E],f(h,"[]=",e.to_a(m)),m[t(m.length,1)],r.$backend()["$=="]("manpage")&&(m=["docname",v],f(h,"[]=",e.to_a(m)),m[t(m.length,1)],m=["outfilesuffix","."+y],f(h,"[]=",e.to_a(m)),m[t(m.length,1)])):O="non-conforming name section body"):O="name section must be at level 1":O="name section expected",d(O)?(n.$restore_save(),c.$logger().$error(c.$message_with_context(O,p(["source_location"],{source_location:n.$cursor()}))),m=["manname",v=d(o=h["$[]"]("docname"))?o:"command"],f(h,"[]=",e.to_a(m)),m[t(m.length,1)],m=["mannames",[v]],f(h,"[]=",e.to_a(m)),m[t(m.length,1)],r.$backend()["$=="]("manpage")&&(m=["docname",v],f(h,"[]=",e.to_a(m)),m[t(m.length,1)],m=["outfilesuffix","."+y],f(h,"[]=",e.to_a(m)),m[t(m.length,1)])):n.$discard_save()),s},w.$$arity=3),e.defs(le,"$next_section",x=function(o,a,$){var u,c,_,h,m=this,y=s,g=s,v=s,b=s,w=s,x=s,k=s,E=s,O=s,A=s,S=s,C=s,R=s,T=s,I=s,N=s,L=s,D=s,P=s,M=s;for(null==$&&($=p([],{})),y=g=v=!1,d(d(u=(c=a.$context()["$=="]("document"))?a.$blocks()["$empty?"]():a.$context()["$=="]("document"))?d(c=d(_=b=a["$header?"]())?_:$.$delete("invalid-header"))?c:m["$is_next_line_section?"](o,$)["$!"]():u)?(w=(x=a).$doctype()["$=="]("book"),d(d(u=b)?u:d(c=w)?$["$[]"](1)["$!="]("abstract"):c)&&(y=g=l(ue,"Block").$new(a,"preamble",p(["content_model"],{content_model:"compound"})),d(d(u=w)?a["$attr?"]("preface-title"):u)&&(k=[a.$attr("preface-title")],f(y,"title=",e.to_a(k)),k[t(k.length,1)]),a.$blocks()["$<<"](y)),E=a,O=0,d(a.$attributes()["$key?"]("fragment"))?A=-1:d(w)?(A=(u=[1,0])[0],S=u[1]):A=1):(w=(x=a.$document()).$doctype()["$=="]("book"),E=m.$initialize_section(o,a,$),$=d(C=$["$[]"]("title"))?p(["title"],{title:C}):p([],{}),A=n(O=E.$level(),1),O["$=="](0)?v=w:d((u=O["$=="](1))?E.$special():O["$=="](1))&&(d(d(u=d(c=(R=E.$sectname())["$=="]("appendix"))?c:R["$=="]("preface"))?u:R["$=="]("abstract"))||(A=s))),o.$skip_blank_lines();d(o["$has_more_lines?"]());){if(m.$parse_block_metadata_lines(o,x,$),d(T=m["$is_next_line_section?"](o,$)))if(d(x["$attr?"]("leveloffset"))&&(T=n(T,x.$attr("leveloffset").$to_i()),d(r(T,0))&&(T=0)),d(i(T,O)))d(A)?d(d(c=d(_=T["$=="](A))?_:d(h=S)?T["$=="](S):h)?c:r(A,0))||(I=d(S)?"expected levels "+S+" or "+A:"expected level "+A,m.$logger().$warn(m.$message_with_context("section title out of sequence: "+I+", got level "+T,p(["source_location"],{source_location:o.$cursor()})))):m.$logger().$error(m.$message_with_context(R+" sections do not support nested sections",p(["source_location"],{source_location:o.$cursor()}))),_=m.$next_section(o,E,$),N=null==(c=e.to_ary(_))[0]?s:c[0],$=null==c[1]?s:c[1],E.$assign_numeral(N),E.$blocks()["$<<"](N);else{if(!d((c=T["$=="](0))?E["$=="](x):T["$=="](0)))break;d(w)||m.$logger().$error(m.$message_with_context("level 0 sections can only be used when doctype is book",p(["source_location"],{source_location:o.$cursor()}))),_=m.$next_section(o,E,$),N=null==(c=e.to_ary(_))[0]?s:c[0],$=null==c[1]?s:c[1],E.$assign_numeral(N),E.$blocks()["$<<"](N)}else L=o.$cursor(),d(D=m.$next_block(o,d(c=g)?c:E,$,p(["parse_metadata"],{parse_metadata:!1})))&&(d(v)&&(d(E["$blocks?"]()["$!"]())?d(D.$style()["$!="]("partintro"))&&(D.$context()["$=="]("paragraph")?(k=["open"],f(D,"context=",e.to_a(k)),k[t(k.length,1)],k=["partintro"],f(D,"style=",e.to_a(k)),k[t(k.length,1)]):(k=[g=l(ue,"Block").$new(E,"open",p(["content_model"],{content_model:"compound"}))],f(D,"parent=",e.to_a(k)),k[t(k.length,1)],k=["partintro"],f(g,"style=",e.to_a(k)),k[t(k.length,1)],E.$blocks()["$<<"](g))):E.$blocks().$size()["$=="](1)&&(P=E.$blocks()["$[]"](0),d(d(c=g["$!"]())?P.$content_model()["$=="]("compound"):c)?m.$logger().$error(m.$message_with_context("illegal block content outside of partintro block",p(["source_location"],{source_location:L}))):d(P.$content_model()["$!="]("compound"))&&(k=[g=l(ue,"Block").$new(E,"open",p(["content_model"],{content_model:"compound"}))],f(D,"parent=",e.to_a(k)),k[t(k.length,1)],k=["partintro"],f(g,"style=",e.to_a(k)),k[t(k.length,1)],E.$blocks().$shift(),P.$style()["$=="]("partintro")&&(k=["paragraph"],f(P,"context=",e.to_a(k)),k[t(k.length,1)],k=[s],f(P,"style=",e.to_a(k)),k[t(k.length,1)]),g["$<<"](P),E.$blocks()["$<<"](g)))),(d(c=g)?c:E).$blocks()["$<<"](D),$.$clear());if(!d(c=o.$skip_blank_lines()))break}if(d(v))d(d(u=E["$blocks?"]())?E.$blocks()["$[]"](-1).$context()["$=="]("section"):u)||m.$logger().$error(m.$message_with_context("invalid part, must have at least one section (e.g., chapter, appendix, etc.)",p(["source_location"],{source_location:o.$cursor()})));else if(d(y))if(d(y["$blocks?"]()))if(d(d(u=d(c=w)?c:x.$blocks()["$[]"](1))?u:l(ue,"Compliance").$unwrap_standalone_preamble()["$!"]()))d(x.$sourcemap())&&(k=[y.$blocks()["$[]"](0).$source_location()],f(y,"source_location=",e.to_a(k)),k[t(k.length,1)]);else for(x.$blocks().$shift();d(M=y.$blocks().$shift());)x["$<<"](M);else x.$blocks().$shift();return[E["$=="](a)?s:E,$.$merge()]},x.$$arity=-3),e.defs(le,"$next_block",k=function(o,a,$,u){try{var c,h,m,y,g,v,b,w,x=this,k=s,E=s,O=s,A=s,S=s,C=s,R=s,T=s,I=s,N=s,L=s,D=s,P=s,M=s,z=s,F=s,j=s,B=s,q=s,U=s,H=s,Y=s,W=s,V=s,K=s,G=s,X=s,Q=s,J=s,Z=s,ee=s,te=s,ne=s,re=s,ie=s,oe=s,ae=s,se=s,$e=s,le=s,ce=s,fe=s,de=s,pe=s,_e=s,he=s,me=s,ye=s;if(null==_["~"]&&(_["~"]=s),null==$&&($=p([],{})),null==u&&(u=p([],{})),!d(k=o.$skip_blank_lines()))return s;if(d(d(c=E=u["$[]"]("text_only"))?i(k,0):c)&&(u.$delete("text_only"),E=s),O=a.$document(),d(u.$fetch("parse_metadata",!0)))for(;d(x.$parse_block_metadata_line(o,O,$,u));)o.$shift(),d(h=o.$skip_blank_lines())||e.ret(s);if(d(A=O.$extensions())&&(S=(c=[A["$blocks?"](),A["$block_macros?"]()])[0],C=c[1]),o.$mark(),c=[o.$read_line(),O.$attributes(),$["$[]"](1)],R=c[0],T=c[1],I=c[2],N=L=D=P=s,d(M=x["$is_delimited_block?"](R,!0))&&(L=D=M.$context(),P=M.$terminator(),d(I)?I["$=="](L.$to_s())||(d(M.$masq()["$include?"](I))?L=I.$to_sym():d(d(c=M.$masq()["$include?"]("admonition"))?l(ue,"ADMONITION_STYLES")["$include?"](I):c)?L="admonition":d(d(c=S)?A["$registered_for_block?"](I,L):c)?L=I.$to_sym():(d(x.$logger()["$debug?"]())&&x.$logger().$debug(x.$message_with_context("unknown style for "+L+" block: "+I,p(["source_location"],{source_location:o.$cursor_at_mark()}))),I=L.$to_s())):(z=["style",L.$to_s()],f($,"[]=",e.to_a(z)),I=z[t(z.length,1)])),d(M));else for(;d(!0);){if(d(d(h=d(m=I)?l(ue,"Compliance").$strict_verbatim_paragraphs():m)?l(ue,"VERBATIM_STYLES")["$include?"](I):h)){L=I.$to_sym(),o.$unshift_line(R);break}if(d(E))F=R["$start_with?"](" ",l(ue,"TAB"));else if(j=l(ue,"Compliance").$markdown_syntax(),d(R["$start_with?"](" "))){if(F=(h=[!0," "])[0],B=h[1],d(d(h=d(m=j)?f(R.$lstrip(),"start_with?",e.to_a(l(ue,"MARKDOWN_THEMATIC_BREAK_CHARS").$keys())):m)?l(ue,"MarkdownThematicBreakRx")["$match?"](R):h)){N=l(ue,"Block").$new(a,"thematic_break",p(["content_model"],{content_model:"empty"}));break}}else if(d(R["$start_with?"](l(ue,"TAB"))))h=[!0,l(ue,"TAB")],F=h[0],B=h[1];else{if(h=[!1,R.$chr()],F=h[0],B=h[1],q=d(j)?l(ue,"HYBRID_LAYOUT_BREAK_CHARS"):l(ue,"LAYOUT_BREAK_CHARS"),d(d(h=q["$key?"](B))?d(j)?l(ue,"ExtLayoutBreakRx")["$match?"](R):d(m=x["$uniform?"](R,B,U=R.$length()))?i(U,2):m:h)){N=l(ue,"Block").$new(a,q["$[]"](B),p(["content_model"],{content_model:"empty"}));break}if(d(d(h=R["$end_with?"]("]"))?R["$include?"]("::"):h)){if(d(d(h=d(m=B["$=="]("i"))?m:R["$start_with?"]("video:","audio:"))?l(ue,"BlockMediaMacroRx")["$=~"](R):h)){if(H=(h=[((m=_["~"])===s?s:m["$[]"](1)).$to_sym(),(m=_["~"])===s?s:m["$[]"](2),(m=_["~"])===s?s:m["$[]"](3)])[0],Y=h[1],W=h[2],N=l(ue,"Block").$new(a,H,p(["content_model"],{content_model:"empty"})),d(W)&&(K="video"["$==="](V=H)?["poster","width","height"]:"audio"["$==="](V)?[]:["alt","width","height"],N.$parse_attributes(W,K,p(["sub_input","into"],{sub_input:!0,into:$}))),d($["$key?"]("style"))&&$.$delete("style"),d(Y["$include?"](l(ue,"ATTR_REF_HEAD")))){if(d(d(h=d(m=(G=N.$sub_attributes(Y))["$empty?"]())?(d(y=T["$[]"]("attribute-missing"))?y:l(ue,"Compliance").$attribute_missing())["$=="]("drop-line"):m)?N.$sub_attributes(n(Y," "),p(["attribute_missing","drop_line_severity"],{attribute_missing:"drop-line",drop_line_severity:"ignore"}))["$empty?"]():h))return $.$clear(),s;Y=G}H["$=="]("image")&&(O.$register("images",Y),z=["imagesdir",T["$[]"]("imagesdir")],f($,"[]=",e.to_a(z)),z[t(z.length,1)],d(h=$["$[]"]("alt"))||(z=["alt",d(m=I)?m:(z=["default-alt",l(ue,"Helpers").$basename(Y,!0).$tr("_-"," ")],f($,"[]=",e.to_a(z)),z[t(z.length,1)])],f($,"[]=",e.to_a(z)),z[t(z.length,1)]),d((X=$.$delete("scaledwidth"))["$nil_or_empty?"]())||(z=["scaledwidth",d(l(ue,"TrailingDigitsRx")["$match?"](X))?X+"%":X],f($,"[]=",e.to_a(z)),z[t(z.length,1)]),d($["$[]"]("title"))&&(z=[Q=$.$delete("title")],f(N,"title=",e.to_a(z)),z[t(z.length,1)],N.$assign_caption($.$delete("caption"),"figure"))),z=["target",Y],f($,"[]=",e.to_a(z)),z[t(z.length,1)];break}if(d(d(h=(m=B["$=="]("t"))?R["$start_with?"]("toc:"):B["$=="]("t"))?l(ue,"BlockTocMacroRx")["$=~"](R):h)){N=l(ue,"Block").$new(a,"toc",p(["content_model"],{content_model:"empty"})),d((h=_["~"])===s?s:h["$[]"](1))&&N.$parse_attributes((h=_["~"])===s?s:h["$[]"](1),[],p(["into"],{into:$}));break}if(d(d(C)?d(h=d(m=l(ue,"CustomBlockMacroRx")["$=~"](R))?J=A["$registered_for_block_macro?"]((y=_["~"])===s?s:y["$[]"](1)):m)?h:Z=x.$logger()["$debug?"]():d(h=x.$logger()["$debug?"]())?Z=l(ue,"CustomBlockMacroRx")["$=~"](R):h)){if(!d(Z)){if(ee=(h=_["~"])===s?s:h["$[]"](3),d((Y=(h=_["~"])===s?s:h["$[]"](2))["$include?"](l(ue,"ATTR_REF_HEAD")))){if(d(d(h=d(m=(G=a.$sub_attributes(Y))["$empty?"]())?(d(y=T["$[]"]("attribute-missing"))?y:l(ue,"Compliance").$attribute_missing())["$=="]("drop-line"):m)?a.$sub_attributes(n(Y," "),p(["attribute_missing","drop_line_severity"],{attribute_missing:"drop-line",drop_line_severity:"ignore"}))["$empty?"]():h))return $.$clear(),s;Y=G}if((te=J.$config())["$[]"]("content_model")["$=="]("attributes")?d(ee)&&O.$parse_attributes(ee,d(h=d(m=te["$[]"]("positional_attrs"))?m:te["$[]"]("pos_attrs"))?h:[],p(["sub_input","into"],{sub_input:!0,into:$})):(z=["text",d(h=ee)?h:""],f($,"[]=",e.to_a(z)),z[t(z.length,1)]),d(ne=te["$[]"]("default_attrs"))&&f($,"update",[ne],((g=function(e,t){return g.$$s,null==e&&(e=s),null==t&&(t=s),t}).$$s=x,g.$$arity=2,g)),d(N=J.$process_method()["$[]"](a,Y,$))){$.$replace(N.$attributes());break}return $.$clear(),s}x.$logger().$debug(x.$message_with_context("unknown name for block macro: "+((h=_["~"])===s?s:h["$[]"](1)),p(["source_location"],{source_location:o.$cursor_at_mark()})))}}}if(d(d(h=d(m=F["$!"]())?(B=d(y=B)?y:R.$chr())["$=="]("<"):m)?l(ue,"CalloutListRx")["$=~"](R):h)){o.$unshift_line(R),N=x.$parse_callout_list(o,_["~"],a,O.$callouts()),z=["style","arabic"],f($,"[]=",e.to_a(z)),z[t(z.length,1)];break}if(d(l(ue,"UnorderedListRx")["$match?"](R))){o.$unshift_line(R),d(d(h=d(m=I["$!"]())?l(ue,"Section")["$==="](a):m)?a.$sectname()["$=="]("bibliography"):h)&&(z=["style",I="bibliography"],f($,"[]=",e.to_a(z)),z[t(z.length,1)]),N=x.$parse_list(o,"ulist",a,I);break}if(d(l(ue,"OrderedListRx")["$match?"](R))){o.$unshift_line(R),N=x.$parse_list(o,"olist",a,I),d(N.$style())&&(z=["style",N.$style()],f($,"[]=",e.to_a(z)),z[t(z.length,1)]);break}if(d(d(h=d(m=R["$include?"]("::"))?m:R["$include?"](";;"))?l(ue,"DescriptionListRx")["$=~"](R):h)){o.$unshift_line(R),N=x.$parse_description_list(o,_["~"],a);break}if(d(d(h=d(m=I["$=="]("float"))?m:I["$=="]("discrete"))?d(l(ue,"Compliance").$underline_style_section_titles())?x["$is_section_title?"](R,o.$peek_line()):d(m=F["$!"]())?x["$atx_section_title?"](R):m:h)){o.$unshift_line(R),m=x.$parse_section_title(o,O,$["$[]"]("id")),re=null==(h=e.to_ary(m))[0]?s:h[0],ie=null==h[1]?s:h[1],Q=null==h[2]?s:h[2],oe=null==h[3]?s:h[3],d(ie)&&(z=["reftext",ie],f($,"[]=",e.to_a(z)),z[t(z.length,1)]),N=l(ue,"Block").$new(a,"floating_title",p(["content_model"],{content_model:"empty"})),z=[Q],f(N,"title=",e.to_a(z)),z[t(z.length,1)],$.$delete("title"),z=[d(h=re)?h:d(T["$key?"]("sectids"))?l(ue,"Section").$generate_id(N.$title(),O):s],f(N,"id=",e.to_a(z)),z[t(z.length,1)],z=[oe],f(N,"level=",e.to_a(z)),z[t(z.length,1)];break}if(d(d(h=I)?I["$!="]("normal"):h)){if(d(l(ue,"PARAGRAPH_STYLES")["$include?"](I))){L=I.$to_sym(),D="paragraph",o.$unshift_line(R);break}if(d(l(ue,"ADMONITION_STYLES")["$include?"](I))){L="admonition",D="paragraph",o.$unshift_line(R);break}if(d(d(h=S)?A["$registered_for_block?"](I,"paragraph"):h)){L=I.$to_sym(),D="paragraph",o.$unshift_line(R);break}d(x.$logger()["$debug?"]())&&x.$logger().$debug(x.$message_with_context("unknown style for paragraph: "+I,p(["source_location"],{source_location:o.$cursor_at_mark()}))),I=s}if(o.$unshift_line(R),d(d(h=F)?I["$!"]():h))ae=x.$read_paragraph_lines(o,se=k["$=="](0)?u["$[]"]("list_type"):s,p(["skip_line_comments"],{skip_line_comments:E})),x["$adjust_indentation!"](ae),N=d(d(h=E)?h:se["$=="]("dlist"))?l(ue,"Block").$new(a,"paragraph",p(["content_model","source","attributes"],{content_model:"simple",source:ae,attributes:$})):l(ue,"Block").$new(a,"literal",p(["content_model","source","attributes"],{content_model:"verbatim",source:ae,attributes:$}));else{if(ae=x.$read_paragraph_lines(o,(h=k["$=="](0))?u["$[]"]("list_type"):k["$=="](0),p(["skip_line_comments"],{skip_line_comments:!0})),d(E))d(d(h=F)?I["$=="]("normal"):h)&&x["$adjust_indentation!"](ae),N=l(ue,"Block").$new(a,"paragraph",p(["content_model","source","attributes"],{content_model:"simple",source:ae,attributes:$}));else if(d(d(h=d(m=l(ue,"ADMONITION_STYLE_HEADS")["$include?"](B))?R["$include?"](":"):m)?l(ue,"AdmonitionParagraphRx")["$=~"](R):h))z=[0,(h=_["~"])===s?s:h.$post_match()],f(ae,"[]=",e.to_a(z)),z[t(z.length,1)],z=["name",$e=(z=["style",(h=_["~"])===s?s:h["$[]"](1)],f($,"[]=",e.to_a(z)),z[t(z.length,1)]).$downcase()],f($,"[]=",e.to_a(z)),z[t(z.length,1)],z=["textlabel",d(h=$.$delete("caption"))?h:T["$[]"]($e+"-caption")],f($,"[]=",e.to_a(z)),z[t(z.length,1)],N=l(ue,"Block").$new(a,"admonition",p(["content_model","source","attributes"],{content_model:"simple",source:ae,attributes:$}));else if(d(d(h=d(m=j)?B["$=="](">"):m)?R["$start_with?"]("> "):h)){if(f(ae,"map!",[],((v=function(e){return v.$$s,null==e&&(e=s),e["$=="](">")?e.$slice(1,e.$length()):d(e["$start_with?"]("> "))?e.$slice(2,e.$length()):e}).$$s=x,v.$$arity=1,v)),d(ae["$[]"](-1)["$start_with?"]("-- ")))if(le=(le=ae.$pop()).$slice(3,le.$length()),d(ae["$empty?"]()));else for(;d(ae["$[]"](-1)["$empty?"]());)ae.$pop();z=["style","quote"],f($,"[]=",e.to_a(z)),z[t(z.length,1)],N=x.$build_block("quote","compound",!1,a,l(ue,"Reader").$new(ae),$),d(le)&&(m=N.$apply_subs(le).$split(", ",2),ce=null==(h=e.to_ary(m))[0]?s:h[0],fe=null==h[1]?s:h[1],d(ce)&&(z=["attribution",ce],f($,"[]=",e.to_a(z)),z[t(z.length,1)]),d(fe)&&(z=["citetitle",fe],f($,"[]=",e.to_a(z)),z[t(z.length,1)]))}else if(d(d(h=d(m=(y=B["$=="]('"'))?i(ae.$size(),1):B["$=="]('"'))?ae["$[]"](-1)["$start_with?"]("-- "):m)?ae["$[]"](-2)["$end_with?"]('"'):h)){for(z=[0,R.$slice(1,R.$length())],f(ae,"[]=",e.to_a(z)),z[t(z.length,1)],le=(le=ae.$pop()).$slice(3,le.$length());d(ae["$[]"](-1)["$empty?"]());)ae.$pop();ae["$<<"](ae.$pop().$chop()),z=["style","quote"],f($,"[]=",e.to_a(z)),z[t(z.length,1)],N=l(ue,"Block").$new(a,"quote",p(["content_model","source","attributes"],{content_model:"simple",source:ae,attributes:$})),m=N.$apply_subs(le).$split(", ",2),ce=null==(h=e.to_ary(m))[0]?s:h[0],fe=null==h[1]?s:h[1],d(ce)&&(z=["attribution",ce],f($,"[]=",e.to_a(z)),z[t(z.length,1)]),d(fe)&&(z=["citetitle",fe],f($,"[]=",e.to_a(z)),z[t(z.length,1)])}else d(d(h=F)?I["$=="]("normal"):h)&&x["$adjust_indentation!"](ae),N=l(ue,"Block").$new(a,"paragraph",p(["content_model","source","attributes"],{content_model:"simple",source:ae,attributes:$}));x.$catalog_inline_anchors(ae.$join(l(ue,"LF")),N,O,o)}break}if(d(N));else if("listing"["$==="](V=L)||"source"["$==="](V))d(d(c=L["$=="]("source"))?c:d(h=$["$[]"](1)["$!"]())?de=d(m=$["$[]"](2))?m:T["$[]"]("source-language"):h)&&(d(de)?(z=["style","source"],f($,"[]=",e.to_a(z)),z[t(z.length,1)],z=["language",de],f($,"[]=",e.to_a(z)),z[t(z.length,1)],l(ue,"AttributeList").$rekey($,[s,s,"linenums"])):(l(ue,"AttributeList").$rekey($,[s,"language","linenums"]),d($["$key?"]("language"))||d(T["$key?"]("source-language"))&&(z=["language",T["$[]"]("source-language")],f($,"[]=",e.to_a(z)),z[t(z.length,1)])),d($["$key?"]("linenums"))||d(d(c=$["$[]"]("linenums-option"))?c:T["$[]"]("source-linenums-option"))&&(z=["linenums",""],f($,"[]=",e.to_a(z)),z[t(z.length,1)]),d($["$key?"]("indent"))||d(T["$key?"]("source-indent"))&&(z=["indent",T["$[]"]("source-indent")],f($,"[]=",e.to_a(z)),z[t(z.length,1)])),N=x.$build_block("listing","verbatim",P,a,o,$);else if("fenced_code"["$==="](V))z=["style","source"],f($,"[]=",e.to_a(z)),z[t(z.length,1)],d(i(U=R.$length(),3))&&(d(pe=(de=R.$slice(3,U)).$index(","))?d(i(pe,0))?(de=de.$slice(0,pe).$strip(),d(r(pe,t(U,4)))&&(z=["linenums",""],f($,"[]=",e.to_a(z)),z[t(z.length,1)])):d(i(U,4))&&(z=["linenums",""],f($,"[]=",e.to_a(z)),z[t(z.length,1)]):de=de.$lstrip()),d(de["$nil_or_empty?"]())?d(T["$key?"]("source-language"))&&(z=["language",T["$[]"]("source-language")],f($,"[]=",e.to_a(z)),z[t(z.length,1)]):(z=["language",de],f($,"[]=",e.to_a(z)),z[t(z.length,1)]),d($["$key?"]("linenums"))||d(d(c=$["$[]"]("linenums-option"))?c:T["$[]"]("source-linenums-option"))&&(z=["linenums",""],f($,"[]=",e.to_a(z)),z[t(z.length,1)]),d($["$key?"]("indent"))||d(T["$key?"]("source-indent"))&&(z=["indent",T["$[]"]("source-indent")],f($,"[]=",e.to_a(z)),z[t(z.length,1)]),P=P.$slice(0,3),N=x.$build_block("listing","verbatim",P,a,o,$);else if("table"["$==="](V))_e=o.$cursor(),he=l(ue,"Reader").$new(o.$read_lines_until(p(["terminator","skip_line_comments","context","cursor"],{terminator:P,skip_line_comments:!0,context:"table",cursor:"at_mark"})),_e),d(P["$start_with?"]("|","!"))||d(c=$["$[]"]("format"))||(z=["format",d(P["$start_with?"](","))?"csv":"dsv"],f($,"[]=",e.to_a(z)),z[t(z.length,1)]),N=x.$parse_table(he,a,$);else if("sidebar"["$==="](V))N=x.$build_block(L,"compound",P,a,o,$);else if("admonition"["$==="](V))z=["name",$e=I.$downcase()],f($,"[]=",e.to_a(z)),z[t(z.length,1)],z=["textlabel",d(c=$.$delete("caption"))?c:T["$[]"]($e+"-caption")],f($,"[]=",e.to_a(z)),z[t(z.length,1)],N=x.$build_block(L,"compound",P,a,o,$);else if("open"["$==="](V)||"abstract"["$==="](V)||"partintro"["$==="](V))N=x.$build_block("open","compound",P,a,o,$);else if("literal"["$==="](V))N=x.$build_block(L,"verbatim",P,a,o,$);else if("example"["$==="](V))d($["$[]"]("collapsible-option"))&&(z=["caption",""],f($,"[]=",e.to_a(z)),z[t(z.length,1)]),N=x.$build_block(L,"compound",P,a,o,$);else if("quote"["$==="](V)||"verse"["$==="](V))l(ue,"AttributeList").$rekey($,[s,"attribution","citetitle"]),N=x.$build_block(L,L["$=="]("verse")?"verbatim":"compound",P,a,o,$);else if("stem"["$==="](V)||"latexmath"["$==="](V)||"asciimath"["$==="](V))L["$=="]("stem")&&(z=["style",l(ue,"STEM_TYPE_ALIASES")["$[]"](d(c=$["$[]"](2))?c:T["$[]"]("stem"))],f($,"[]=",e.to_a(z)),z[t(z.length,1)]),N=x.$build_block("stem","raw",P,a,o,$);else if("pass"["$==="](V))N=x.$build_block(L,"raw",P,a,o,$);else{if("comment"["$==="](V))return x.$build_block(L,"skip",P,a,o,$),$.$clear(),s;if(d(d(c=S)?J=A["$registered_for_block?"](L,D):c)){if((me=(te=J.$config())["$[]"]("content_model"))["$=="]("skip")||(d((ye=d(c=te["$[]"]("positional_attrs"))?c:te["$[]"]("pos_attrs"))["$nil_or_empty?"]())||l(ue,"AttributeList").$rekey($,n([s],ye)),d(ne=te["$[]"]("default_attrs"))&&f(ne,"each",[],((b=function(n,r){var i;return b.$$s,null==n&&(n=s),null==r&&(r=s),d(i=$["$[]"](n))?i:(z=[n,r],f($,"[]=",e.to_a(z)),z[t(z.length,1)])}).$$s=x,b.$$arity=2,b)),z=["cloaked-context",D],f($,"[]=",e.to_a(z)),z[t(z.length,1)]),!d(N=x.$build_block(L,me,P,a,o,$,p(["extension"],{extension:J}))))return $.$clear(),s}else x.$raise("Unsupported block type "+L+" at "+o.$cursor())}return d(O.$sourcemap())&&(z=[o.$cursor_at_mark()],f(N,"source_location=",e.to_a(z)),z[t(z.length,1)]),d($["$[]"]("title"))&&(z=[Q=$.$delete("title")],f(N,"title=",e.to_a(z)),z[t(z.length,1)],d(l(ue,"CAPTION_ATTRIBUTE_NAMES")["$[]"](N.$context()))&&N.$assign_caption($.$delete("caption"))),z=[$["$[]"]("style")],f(N,"style=",e.to_a(z)),z[t(z.length,1)],d(w=d(c=N.$id())?c:(z=[$["$[]"]("id")],f(N,"id=",e.to_a(z)),z[t(z.length,1)]))&&(d(d(Q)?Q["$include?"](l(ue,"ATTR_REF_HEAD")):N["$title?"]())&&N.$title(),d(O.$register("refs",[w,N]))||x.$logger().$warn(x.$message_with_context("id assigned to block already in use: "+w,p(["source_location"],{source_location:o.$cursor_at_mark()})))),d($["$empty?"]())||N.$update_attributes($),N.$commit_subs(),d(N["$sub?"]("callouts"))&&(d(x.$catalog_callouts(N.$source(),O))||N.$remove_sub("callouts")),N}catch(ge){if(ge===e.returner)return ge.$v;throw ge}},k.$$arity=-3),e.defs(le,"$read_paragraph_lines",E=function(n,r,i){var o=s,a=s;return null==i&&(i=p([],{})),o=["break_on_blank_lines",!0],f(i,"[]=",e.to_a(o)),o[t(o.length,1)],o=["break_on_list_continuation",!0],f(i,"[]=",e.to_a(o)),o[t(o.length,1)],o=["preserve_last_line",!0],f(i,"[]=",e.to_a(o)),o[t(o.length,1)],a=d(r)?d(l(ue,"Compliance").$block_terminates_paragraph())?l(ue,"StartOfBlockOrListProc"):l(ue,"StartOfListProc"):d(l(ue,"Compliance").$block_terminates_paragraph())?l(ue,"StartOfBlockProc"):l(ue,"NoOp"),f(n,"read_lines_until",[i],a.$to_proc())},E.$$arity=-3),e.defs(le,"$is_delimited_block?",O=function(n,o){var a,$,u,c,f=s,p=s,_=s;if(null==o&&(o=s),!d(d(a=i(f=n.$length(),1))?l(ue,"DELIMITED_BLOCK_HEADS")["$[]"](n.$slice(0,2)):a))return s;if(f["$=="](2))p=n,_=2;else if(d(r(f,5))?(p=n,_=f):p=n.$slice(0,_=4),d(d(a=l(ue,"Compliance").$markdown_syntax())?p["$start_with?"]("`"):a)){if(_["$=="](4)){if(d(d(a=p["$=="]("````"))?a:(p=p.$chop())["$!="]("```")))return s;n=p,f=_=3}else if(d(p["$!="]("```")))return s}else if(_["$=="](3))return s;return $=l(ue,"DELIMITED_BLOCKS")["$[]"](p),u=null==(a=e.to_ary($))[0]?s:a[0],c=null==a[1]?s:a[1],d(d(a=u)?d($=f["$=="](_))?$:this["$uniform?"](n.$slice(1,f),l(ue,"DELIMITED_BLOCK_TAILS")["$[]"](p),t(f,1)):a)?!d(o)||l(ue,"BlockMatchData").$new(u,c,p,n):s},O.$$arity=-2),e.defs(le,"$build_block",A=function(e,t,n,r,o,a,$){var u,c=this,f=s,_=s,h=s,m=s,y=s,g=s,v=s,b=s,w=s,x=s;if(null==$&&($=p([],{})),"skip"["$==="](f=t)?(_=(u=[!0,"simple"])[0],h=u[1]):"raw"["$==="](f)?(_=(u=[!1,"simple"])[0],h=u[1]):(_=(u=[!1,t])[0],h=u[1]),d(n["$nil?"]())?(h["$=="]("verbatim")?m=o.$read_lines_until(p(["break_on_blank_lines","break_on_list_continuation"],{break_on_blank_lines:!0,break_on_list_continuation:!0})):(t["$=="]("compound")&&(t="simple"),m=c.$read_paragraph_lines(o,!1,p(["skip_line_comments","skip_processing"],{skip_line_comments:!0,skip_processing:_}))),y=s):d(h["$!="]("compound"))?(m=o.$read_lines_until(p(["terminator","skip_processing","context","cursor"],{terminator:n,skip_processing:_,context:e,cursor:"at_mark"})),y=s):n["$=="](!1)?(m=s,y=o):(m=s,g=o.$cursor(),y=l(ue,"Reader").$new(o.$read_lines_until(p(["terminator","skip_processing","context","cursor"],{terminator:n,skip_processing:_,context:e,cursor:"at_mark"})),g)),"verbatim"["$==="](f=t))v=(d(u=a["$[]"]("tabsize"))?u:r.$document().$attributes()["$[]"]("tabsize")).$to_i(),d(b=a["$[]"]("indent"))?c["$adjust_indentation!"](m,b.$to_i(),v):d(i(v,0))&&c["$adjust_indentation!"](m,-1,v);else if("skip"["$==="](f))return s;if(d(w=$["$[]"]("extension"))){if(a.$delete("style"),!d(x=w.$process_method()["$[]"](r,d(u=y)?u:l(ue,"Reader").$new(m),a.$merge())))return s;a.$replace(x.$attributes()),d((u=x.$content_model()["$=="]("compound"))?(m=x.$lines())["$empty?"]()["$!"]():x.$content_model()["$=="]("compound"))&&(t="compound",y=l(ue,"Reader").$new(m))}else x=l(ue,"Block").$new(r,e,p(["content_model","source","attributes"],{content_model:t,source:m,attributes:a}));return t["$=="]("compound")&&c.$parse_blocks(y,x),x},A.$$arity=-7),e.defs(le,"$parse_blocks",S=function(e,t,n){var r,i,o=s;if(null==n&&(n=s),d(n))for(;d(d(r=d(i=o=this.$next_block(e,t,n.$merge()))?t.$blocks()["$<<"](o):i)?r:e["$has_more_lines?"]()););else for(;d(d(r=d(i=o=this.$next_block(e,t))?t.$blocks()["$<<"](o):i)?r:e["$has_more_lines?"]()););return s},S.$$arity=-3),e.defs(le,"$parse_list",C=function(e,t,n,r){var i,o=s,a=s,$=s;for(null==_["~"]&&(_["~"]=s),o=l(ue,"List").$new(n,t),a=l(ue,"ListRxMap")["$[]"](t);d(d(i=e["$has_more_lines?"]())?a["$=~"](e.$peek_line()):i)&&(d($=this.$parse_list_item(e,o,_["~"],(i=_["~"])===s?s:i["$[]"](1),r))&&o.$items()["$<<"]($),d(i=e.$skip_blank_lines())););return o},C.$$arity=4),e.defs(le,"$catalog_callouts",R=function(e,t){var r,i=s,o=s;return i=!1,o=0,d(e["$include?"]("<"))&&f(e,"scan",[l(ue,"CalloutScanRx")],((r=function(){var e;return r.$$s,d(((e=_["~"])===s?s:e["$[]"](0))["$start_with?"]("\\"))||t.$callouts().$register(((e=_["~"])===s?s:e["$[]"](2))["$=="](".")?(o=n(o,1)).$to_s():(e=_["~"])===s?s:e["$[]"](2)),i=!0}).$$s=this,r.$$arity=0,r)),i},R.$$arity=2),e.defs(le,"$catalog_inline_anchor",T=function(e,t,n,r,i){var o;return null==i&&(i=n.$document()),d(d(o=t)?t["$include?"](l(ue,"ATTR_REF_HEAD")):o)&&(t=i.$sub_attributes(t)),d(i.$register("refs",[e,l(ue,"Inline").$new(n,"anchor",t,p(["type","id"],{type:"ref",id:e}))]))||(d(l(ue,"Reader")["$==="](r))&&(r=r.$cursor()),this.$logger().$warn(this.$message_with_context("id assigned to anchor already in use: "+e,p(["source_location"],{source_location:r})))),s},T.$$arity=-5),e.defs(le,"$catalog_inline_anchors",I=function(e,t,r,o){var a,$;return d(d(a=e["$include?"]("[["))?a:e["$include?"]("or:"))&&f(e,"scan",[l(ue,"InlineAnchorScanRx")],($=function(){var e,a,u,c=$.$$s||this,f=s,h=s,m=s,y=s;if(d(f=(e=_["~"])===s?s:e["$[]"](1))){if(d(d(e=d(a=h=(u=_["~"])===s?s:u["$[]"](2))?h["$include?"](l(ue,"ATTR_REF_HEAD")):a)?(h=r.$sub_attributes(h))["$empty?"]():e))return s}else if(f=(e=_["~"])===s?s:e["$[]"](3),d(h=(e=_["~"])===s?s:e["$[]"](4)))if(d(h["$include?"]("]")))h=h.$gsub("\\]","]"),d(h["$include?"](l(ue,"ATTR_REF_HEAD")))&&(h=r.$sub_attributes(h));else if(d(d(e=h["$include?"](l(ue,"ATTR_REF_HEAD")))?(h=r.$sub_attributes(h))["$empty?"]():e))return s;return d(r.$register("refs",[f,l(ue,"Inline").$new(t,"anchor",h,p(["type","id"],{type:"ref",id:f}))]))?s:(m=o.$cursor_at_mark(),d(i(y=n(((e=_["~"])===s?s:e.$pre_match()).$count(l(ue,"LF")),d(((e=_["~"])===s?s:e["$[]"](0))["$start_with?"](l(ue,"LF")))?1:0),0))&&(m=m.$dup()).$advance(y),c.$logger().$warn(c.$message_with_context("id assigned to anchor already in use: "+f,p(["source_location"],{source_location:m}))))},$.$$s=this,$.$$arity=0,$)),s},I.$$arity=4),e.defs(le,"$catalog_inline_biblio_anchor",N=function(e,t,n,r){var i;return d(n.$document().$register("refs",[e,l(ue,"Inline").$new(n,"anchor",d(i=t)?"["+t+"]":i,p(["type","id"],{type:"bibref",id:e}))]))||this.$logger().$warn(this.$message_with_context("id assigned to bibliography anchor already in use: "+e,p(["source_location"],{source_location:r.$cursor()}))),s},N.$$arity=4),e.defs(le,"$parse_description_list",L=function(n,r,i){var o,a=s,$=s,u=s,c=s,p=s;for(null==_["~"]&&(_["~"]=s),a=l(ue,"List").$new(i,"dlist"),$=l(ue,"DescriptionListSiblingRx")["$[]"](r["$[]"](2)),a.$items()["$<<"](u=this.$parse_list_item(n,a,r,$));d(d(o=n["$has_more_lines?"]())?$["$=~"](n.$peek_line()):o);)c=this.$parse_list_item(n,a,_["~"],$),d(u["$[]"](1))?a.$items()["$<<"](u=c):(u["$[]"](0)["$<<"](c["$[]"](0)["$[]"](0)),p=[1,c["$[]"](1)],f(u,"[]=",e.to_a(p)),p[t(p.length,1)]);return a},L.$$arity=3),e.defs(le,"$parse_callout_list",D=function(r,i,o,a){var $,u,c=this,_=s,h=s,m=s,y=s,g=s,v=s,b=s;for(_=l(ue,"List").$new(o,"colist"),h=1,m=0;d(d($=i)?$:d(u=i=l(ue,"CalloutListRx").$match(r.$peek_line()))?r.$mark():u);)(y=i["$[]"](1))["$=="](".")&&(y=(m=n(m,1)).$to_s()),y["$=="](h.$to_s())||c.$logger().$warn(c.$message_with_context("callout list item index: expected "+h+", got "+y,p(["source_location"],{source_location:r.$cursor_at_mark()}))),d(g=c.$parse_list_item(r,_,i,"<1>"))&&(_.$items()["$<<"](g),d((v=a.$callout_ids(_.$items().$size()))["$empty?"]())?c.$logger().$warn(c.$message_with_context("no callout found for <"+_.$items().$size()+">",p(["source_location"],{source_location:r.$cursor_at_mark()}))):(b=["coids",v],f(g.$attributes(),"[]=",e.to_a(b)),b[t(b.length,1)])),h=n(h,1),i=s;return a.$next_list(),_},D.$$arity=4),e.defs(le,"$parse_list_item",P=function(n,r,i,o,a){var $,u,c,h=this,m=s,y=s,g=s,v=s,b=s,w=s,x=s,k=s,E=s,O=s,A=s,S=s,C=s,R=s,T=s,I=s,N=s,L=s;if(null==a&&(a=s),(m=r.$context())["$=="]("dlist")?(y=!0,g=l(ue,"ListItem").$new(r,v=i["$[]"](1)),d(d($=v["$start_with?"]("[["))?l(ue,"LeadingInlineAnchorRx")["$=~"](v):$)&&h.$catalog_inline_anchor(($=_["~"])===s?s:$["$[]"](1),d($=(u=_["~"])===s?s:u["$[]"](2))?$:((u=_["~"])===s?s:u.$post_match()).$lstrip(),g,n),d(b=i["$[]"](3))&&(w=!0),x=l(ue,"ListItem").$new(r,b),d(r.$document().$sourcemap())&&(k=[n.$cursor()],f(g,"source_location=",e.to_a(k)),k[t(k.length,1)],d(w)?(k=[g.$source_location()],f(x,"source_location=",e.to_a(k)),k[t(k.length,1)]):E=!0)):(w=!0,x=l(ue,"ListItem").$new(r,b=i["$[]"](2)),d(r.$document().$sourcemap())&&(k=[n.$cursor()],f(x,"source_location=",e.to_a(k)),k[t(k.length,1)]),"ulist"["$==="](O=m)?(k=[o],f(x,"marker=",e.to_a(k)),k[t(k.length,1)],d(b["$start_with?"]("["))&&(d(d($=a)?a["$=="]("bibliography"):$)?d(l(ue,"InlineBiblioAnchorRx")["$=~"](b))&&h.$catalog_inline_biblio_anchor(($=_["~"])===s?s:$["$[]"](1),($=_["~"])===s?s:$["$[]"](2),x,n):d(b["$start_with?"]("[["))?d(l(ue,"LeadingInlineAnchorRx")["$=~"](b))&&h.$catalog_inline_anchor(($=_["~"])===s?s:$["$[]"](1),($=_["~"])===s?s:$["$[]"](2),x,n):d(b["$start_with?"]("[ ] ","[x] ","[*] "))&&(r.$set_option("checklist"),k=["checkbox",""],f(x.$attributes(),"[]=",e.to_a(k)),k[t(k.length,1)],d(b["$start_with?"]("[ "))||(k=["checked",""],f(x.$attributes(),"[]=",e.to_a(k)),k[t(k.length,1)]),k=[b.$slice(4,b.$length())],f(x,"text=",e.to_a(k)),k[t(k.length,1)]))):"olist"["$==="](O)?(u=h.$resolve_ordered_list_marker(o,A=r.$items().$size(),!0,n),o=null==($=e.to_ary(u))[0]?s:$[0],S=null==$[1]?s:$[1],k=[o],f(x,"marker=",e.to_a(k)),k[t(k.length,1)],d(($=A["$=="](0))?a["$!"]():A["$=="](0))&&(k=[d($=S)?$:(d(u=l(ue,"ORDERED_LIST_STYLES")["$[]"](t(o.$length(),1)))?u:"arabic").$to_s()],f(r,"style=",e.to_a(k)),k[t(k.length,1)]),d(d($=b["$start_with?"]("[["))?l(ue,"LeadingInlineAnchorRx")["$=~"](b):$)&&h.$catalog_inline_anchor(($=_["~"])===s?s:$["$[]"](1),($=_["~"])===s?s:$["$[]"](2),x,n)):(k=[o],f(x,"marker=",e.to_a(k)),k[t(k.length,1)],d(d($=b["$start_with?"]("[["))?l(ue,"LeadingInlineAnchorRx")["$=~"](b):$)&&h.$catalog_inline_anchor(($=_["~"])===s?s:$["$[]"](1),($=_["~"])===s?s:$["$[]"](2),x,n))),n.$shift(),c=n.$cursor(),C=l(ue,"Reader").$new(h.$read_lines_for_list_item(n,m,o,w),c),d(C["$has_more_lines?"]())){for(d(E)&&(k=[c],f(x,"source_location=",e.to_a(k)),k[t(k.length,1)]),R=C.$skip_line_comments(),d(T=C.$peek_line())&&(d(R["$empty?"]())||C.$unshift_lines(R),d(T["$empty?"]())||(I=!0,d(y)||(w=s))),d(N=h.$next_block(C,x,p([],{}),p(["text_only","list_type"],{text_only:!d(w)||s,list_type:m})))&&x.$blocks()["$<<"](N);d(C["$has_more_lines?"]());)d(N=h.$next_block(C,x,p([],{}),p(["list_type"],{list_type:m})))&&x.$blocks()["$<<"](N);d(d($=d(u=I)?L=x.$blocks()["$[]"](0):u)?L.$context()["$=="]("paragraph"):$)&&x.$fold_first()}return d(y)?[[g],d(d($=x["$text?"]())?$:x["$blocks?"]())?x:s]:x},P.$$arity=-5),e.defs(le,"$read_lines_for_list_item",M=function(n,r,i,o){var a,$,u,c,h,m,y,g,v=this,b=s,w=s,x=s,k=s,E=s,O=s,A=s,S=s,C=s,R=s;for(null==i&&(i=s),null==o&&(o=!0),b=[],w="inactive",x=!1,k=s,g=r["$=="]("dlist");d(n["$has_more_lines?"]())&&(E=n.$read_line(),!d(v["$is_sibling_list_item?"](E,r,i)));)if((O=d(b["$empty?"]())?s:b["$[]"](-1))["$=="](l(ue,"LIST_CONTINUATION"))&&(w["$=="]("inactive")&&(w="active",o=!0,d(x)||(A=[-1,""],f(b,"[]=",e.to_a(A)),A[t(A.length,1)])),E["$=="](l(ue,"LIST_CONTINUATION"))))d(w["$!="]("frozen"))&&(w="frozen",b["$<<"](E)),E=s;else{if(d(S=v["$is_delimited_block?"](E,!0))){if(!w["$=="]("active"))break;b["$<<"](E),b.$concat(n.$read_lines_until(p(["terminator","read_last_line","context"],{terminator:S.$terminator(),read_last_line:!0,context:s}))),w="inactive"}else{if(d(d(a=d($=g)?w["$!="]("active"):$)?l(ue,"BlockAttributeLineRx")["$match?"](E):a))break;if(d((a=w["$=="]("active"))?E["$empty?"]()["$!"]():w["$=="]("active")))d(l(ue,"LiteralParagraphRx")["$match?"](E))?(n.$unshift_line(E),d(g)?b.$concat(f(n,"read_lines_until",[p(["preserve_last_line","break_on_blank_lines","break_on_list_continuation"],{preserve_last_line:!0,break_on_blank_lines:!0,break_on_list_continuation:!0})],(u=function(e){var t=u.$$s||this;return null==e&&(e=s),t["$is_sibling_list_item?"](e,r,i)},u.$$s=v,u.$$arity=1,u))):b.$concat(n.$read_lines_until(p(["preserve_last_line","break_on_blank_lines","break_on_list_continuation"],{preserve_last_line:!0,break_on_blank_lines:!0,break_on_list_continuation:!0}))),w="inactive"):d(d(a=d($=l(ue,"BlockTitleRx")["$match?"](E))?$:l(ue,"BlockAttributeLineRx")["$match?"](E))?a:l(ue,"AttributeEntryRx")["$match?"](E))?b["$<<"](E):(d(C=f(d(x)?["dlist"]:l(ue,"NESTABLE_LIST_CONTEXTS"),"find",[],((c=function(e){return c.$$s,null==e&&(e=s),l(ue,"ListRxMap")["$[]"](e)["$match?"](E)}).$$s=v,c.$$arity=1,c)))&&(x=!0,d((a=C["$=="]("dlist"))?(($=_["~"])===s?s:$["$[]"](3))["$nil_or_empty?"]():C["$=="]("dlist"))&&(o=!1)),b["$<<"](E),w="inactive");else if(d(d(a=O)?O["$empty?"]():a)){if(d(E["$empty?"]())){if(!d(E=d(a=n.$skip_blank_lines())?n.$read_line():a))break;if(d(v["$is_sibling_list_item?"](E,r,i)))break}if(E["$=="](l(ue,"LIST_CONTINUATION")))k=b.$size(),b["$<<"](E);else if(d(o)){if(d(v["$is_sibling_list_item?"](E,r,i)))break;if(d(C=f(l(ue,"NESTABLE_LIST_CONTEXTS"),"find",[],((h=function(e){return h.$$s,null==e&&(e=s),l(ue,"ListRxMap")["$[]"](e)["$=~"](E)}).$$s=v,h.$$arity=1,h))))b["$<<"](E),x=!0,d((a=C["$=="]("dlist"))?(($=_["~"])===s?s:$["$[]"](3))["$nil_or_empty?"]():C["$=="]("dlist"))&&(o=!1);else{if(!d(l(ue,"LiteralParagraphRx")["$match?"](E)))break;n.$unshift_line(E),d(g)?b.$concat(f(n,"read_lines_until",[p(["preserve_last_line","break_on_blank_lines","break_on_list_continuation"],{preserve_last_line:!0,break_on_blank_lines:!0,break_on_list_continuation:!0})],(m=function(e){var t=m.$$s||this;return null==e&&(e=s),t["$is_sibling_list_item?"](e,r,i)},m.$$s=v,m.$$arity=1,m))):b.$concat(n.$read_lines_until(p(["preserve_last_line","break_on_blank_lines","break_on_list_continuation"],{preserve_last_line:!0,break_on_blank_lines:!0,break_on_list_continuation:!0})))}}else d(x)||b.$pop(),b["$<<"](E),o=!0}else d(E["$empty?"]())||(o=!0),d(C=f(d(x)?["dlist"]:l(ue,"NESTABLE_LIST_CONTEXTS"),"find",[],((y=function(e){return y.$$s,null==e&&(e=s),l(ue,"ListRxMap")["$[]"](e)["$=~"](E)}).$$s=v,y.$$arity=1,y)))&&(x=!0,d((a=C["$=="]("dlist"))?(($=_["~"])===s?s:$["$[]"](3))["$nil_or_empty?"]():C["$=="]("dlist"))&&(o=!1)),b["$<<"](E)}E=s}for(d(E)&&n.$unshift_line(E),d(k)&&(A=[k,""],f(b,"[]=",e.to_a(A)),A[t(A.length,1)]);!d(b["$empty?"]());){if(!d((R=b["$[]"](-1))["$empty?"]())){R["$=="](l(ue,"LIST_CONTINUATION"))&&b.$pop();break}b.$pop()}return b},M.$$arity=-3),e.defs(le,"$initialize_section",z=function(n,r,o){var a,$,u,c,_,h,m,y=this,g=s,v=s,b=s,w=s,x=s,k=s,E=s,O=s,A=s,S=s,C=s,R=s;return null==o&&(o=p([],{})),g=r.$document(),u=(v=g.$doctype())["$=="]("book"),d(g.$sourcemap())&&(b=n.$cursor()),w=o["$[]"](1),$=y.$parse_section_title(n,g,o["$[]"]("id")),c=null==(a=e.to_ary($))[0]?s:a[0],_=null==a[1]?s:a[1],x=null==a[2]?s:a[2],k=null==a[3]?s:a[3],h=null==a[4]?s:a[4],d(w)?d(d(a=u)?w["$=="]("abstract"):a)?(E=(a=["chapter",1])[0],k=a[1]):d(d(a=w["$start_with?"]("sect"))?l(ue,"SectionLevelStyleRx")["$match?"](w):a)?E="section":(E=(a=[w,!0])[0],O=a[1],k["$=="](0)&&(k=1),A=E["$=="]("appendix")):d(u)?E=k["$=="](0)?"part":d(i(k,1))?"section":"chapter":d((a=v["$=="]("manpage"))?x.$casecmp("synopsis")["$=="](0):v["$=="]("manpage"))?(E=(a=["synopsis",!0])[0],O=a[1]):E="section",d(_)&&(S=["reftext",_],f(o,"[]=",e.to_a(S)),S[t(S.length,1)]),C=l(ue,"Section").$new(r,k),a=[c,x,E,b],C["$id="](a[0]),C["$title="](a[1]),C["$sectname="](a[2]),C["$source_location="](a[3]),d(O)?(S=[!0],f(C,"special=",e.to_a(S)),S[t(S.length,1)],d(A)?(S=[!0],f(C,"numbered=",e.to_a(S)),S[t(S.length,1)]):g.$attributes()["$[]"]("sectnums")["$=="]("all")&&(S=[!d(d(a=u)?k["$=="](1):a)||"chapter"],f(C,"numbered=",e.to_a(S)),S[t(S.length,1)])):d(d(a=g.$attributes()["$[]"]("sectnums"))?i(k,0):a)?(S=[!d(C.$special())||!!d(a=r.$numbered())||a],f(C,"numbered=",e.to_a(S)),S[t(S.length,1)]):d(d(a=d($=u)?k["$=="](0):$)?g.$attributes()["$[]"]("partnums"):a)&&(S=[!0],f(C,"numbered=",e.to_a(S)),S[t(S.length,1)]),d(m=d(a=C.$id())?a:(S=[d(g.$attributes()["$key?"]("sectids"))?R=l(ue,"Section").$generate_id(C.$title(),g):s],f(C,"id=",e.to_a(S)),S[t(S.length,1)]))&&(d(d(a=R)?a:x["$include?"](l(ue,"ATTR_REF_HEAD"))["$!"]())||C.$title(),d(g.$register("refs",[m,C]))||y.$logger().$warn(y.$message_with_context("id assigned to section already in use: "+m,p(["source_location"],{source_location:n.$cursor_at_line(t(n.$lineno(),d(h)?1:2))})))),C.$update_attributes(o),n.$skip_blank_lines(),C},z.$$arity=-3),e.defs(le,"$is_next_line_section?",F=function(e,t){var n,r,i=s,o=s;return d(d(n=i=t["$[]"](1))?d(r=i["$=="]("discrete"))?r:i["$=="]("float"):n)?s:d(l(ue,"Compliance").$underline_style_section_titles())?(o=e.$peek_lines(2,d(n=i)?i["$=="]("comment"):n),this["$is_section_title?"](d(n=o["$[]"](0))?n:"",o["$[]"](1))):this["$atx_section_title?"](d(n=e.$peek_line())?n:"")},F.$$arity=2),e.defs(le,"$is_next_line_doctitle?",j=function(e,t,r){var i,o=s;return d(r)?d(i=o=this["$is_next_line_section?"](e,t))?n(o,r.$to_i())["$=="](0):i:this["$is_next_line_section?"](e,t)["$=="](0)},j.$$arity=3),e.defs(le,"$is_section_title?",B=function(e,t){var n,r=this;return null==t&&(t=s),d(n=r["$atx_section_title?"](e))?n:d(t["$nil_or_empty?"]())?s:r["$setext_section_title?"](e,t)},B.$$arity=-2),e.defs(le,"$atx_section_title?",q=function(e){var n;return d(d(l(ue,"Compliance").$markdown_syntax())?d(n=e["$start_with?"]("=","#"))?l(ue,"ExtAtxSectionTitleRx")["$=~"](e):n:d(n=e["$start_with?"]("="))?l(ue,"AtxSectionTitleRx")["$=~"](e):n)?t(((n=_["~"])===s?s:n["$[]"](1)).$length(),1):s},q.$$arity=1),e.defs(le,"$setext_section_title?",U=function(e,n){var i,o,a,$,u,c=s;return d(d(i=d(o=d(a=$=l(ue,"SETEXT_SECTION_LEVELS")["$[]"](u=n.$chr()))?this["$uniform?"](n,u,c=n.$length()):a)?l(ue,"SetextSectionTitleRx")["$match?"](e):o)?r(t(e.$length(),c).$abs(),2):i)?$:s},U.$$arity=2),e.defs(le,"$parse_section_title",H=function(e,i,o){var a,$,u,c,f,p=s,h=s,m=s,y=s,g=s,v=s,b=s,w=s;return null==o&&(o=s),p=s,h=e.$read_line(),d(d(l(ue,"Compliance").$markdown_syntax())?d(a=h["$start_with?"]("=","#"))?l(ue,"ExtAtxSectionTitleRx")["$=~"](h):a:d(a=h["$start_with?"]("="))?l(ue,"AtxSectionTitleRx")["$=~"](h):a)?(m=(a=[t((($=_["~"])===s?s:$["$[]"](1)).$length(),1),($=_["~"])===s?s:$["$[]"](2),!0])[0],y=a[1],g=a[2],d(o)||d(d(a=d($=y["$end_with?"]("]]"))?l(ue,"InlineSectionAnchorRx")["$=~"](y):$)?(($=_["~"])===s?s:$["$[]"](1))["$!"]():a)&&(a=[y.$slice(0,t(y.$length(),(($=_["~"])===s?s:$["$[]"](0)).$length())),($=_["~"])===s?s:$["$[]"](2),($=_["~"])===s?s:$["$[]"](3)],y=a[0],o=a[1],p=a[2])):d(d(a=d($=d(u=d(c=d(f=l(ue,"Compliance").$underline_style_section_titles())?v=e.$peek_line(!0):f)?m=l(ue,"SETEXT_SECTION_LEVELS")["$[]"](b=v.$chr()):c)?this["$uniform?"](v,b,w=v.$length()):u)?y=d(u=l(ue,"SetextSectionTitleRx")["$=~"](h))?(c=_["~"])===s?s:c["$[]"](1):u:$)?r(t(h.$length(),w).$abs(),2):a)?(g=!1,d(o)||d(d(a=d($=y["$end_with?"]("]]"))?l(ue,"InlineSectionAnchorRx")["$=~"](y):$)?(($=_["~"])===s?s:$["$[]"](1))["$!"]():a)&&(a=[y.$slice(0,t(y.$length(),(($=_["~"])===s?s:$["$[]"](0)).$length())),($=_["~"])===s?s:$["$[]"](2),($=_["~"])===s?s:$["$[]"](3)],y=a[0],o=a[1],p=a[2]),e.$shift()):this.$raise("Unrecognized section at "+e.$cursor_at_prev_line()),d(i["$attr?"]("leveloffset"))&&(m=n(m,i.$attr("leveloffset").$to_i()),d(r(m,0))&&(m=0)),[o,p,y,m,g]},H.$$arity=-3),e.defs(le,"$parse_header_metadata",Y=function(r,i){var o,a,u,c,_=this,h=s,m=s,y=s,g=s,v=s,b=s,w=s,x=s,k=s,E=s,O=s,A=s,S=s,C=s,R=s,T=s,I=s,N=s;if(null==i&&(i=s),h=d(o=i)?i.$attributes():o,_.$process_attribute_entries(r,i),y=(o=[m=p([],{}),s,s])[0],g=o[1],v=o[2],d(d(o=r["$has_more_lines?"]())?r["$next_line_empty?"]()["$!"]():o)?(d((b=_.$process_authors(r.$read_line()))["$empty?"]())||(d(i)&&(f(b,"each",[],(a=function(n,r){a.$$s;var o=s;return null==n&&(n=s),null==r&&(r=s),d(h["$key?"](n))?s:(o=[n,d($("::","String")["$==="](r))?i.$apply_header_subs(r):r],f(h,"[]=",e.to_a(o)),o[t(o.length,1)])},a.$$s=_,a.$$arity=2,a)),g=h["$[]"]("author"),v=h["$[]"]("authorinitials"),m=h["$[]"]("authors")),y=b),_.$process_attribute_entries(r,i),w=p([],{}),d(d(o=r["$has_more_lines?"]())?r["$next_line_empty?"]()["$!"]():o)&&(x=r.$read_line(),d(k=l(ue,"RevisionInfoLineRx").$match(x))?(d(k["$[]"](1))&&(E=["revnumber",k["$[]"](1).$rstrip()],f(w,"[]=",e.to_a(E)),E[t(E.length,1)]),d((O=k["$[]"](2).$strip())["$empty?"]())||(d(d(o=k["$[]"](1)["$!"]())?O["$start_with?"]("v"):o)?(E=["revnumber",O.$slice(1,O.$length())],f(w,"[]=",e.to_a(E)),E[t(E.length,1)]):(E=["revdate",O],f(w,"[]=",e.to_a(E)),E[t(E.length,1)])),d(k["$[]"](3))&&(E=["revremark",k["$[]"](3).$rstrip()],f(w,"[]=",e.to_a(E)),E[t(E.length,1)])):r.$unshift_line(x)),d(w["$empty?"]())||(d(i)&&f(w,"each",[],((u=function(n,r){return u.$$s,null==n&&(n=s),null==r&&(r=s),d(h["$key?"](n))?s:(E=[n,i.$apply_header_subs(r)],f(h,"[]=",e.to_a(E)),E[t(E.length,1)])}).$$s=_,u.$$arity=2,u)),y.$update(w)),_.$process_attribute_entries(r,i),r.$skip_blank_lines()):b=p([],{}),d(i)){if(d(d(o=h["$key?"]("author"))?(A=h["$[]"]("author"))["$!="](g):o))b=_.$process_authors(A,!0,!1),d(h["$[]"]("authorinitials")["$!="](v))&&b.$delete("authorinitials");else if(d(d(o=h["$key?"]("authors"))?(A=h["$[]"]("authors"))["$!="](m):o))b=_.$process_authors(A,!0);else{for(S=(o=[[],1,"author_1",!1,!1])[0],C=o[1],R=o[2],T=o[3],I=o[4];d(h["$key?"](R));)(N=h["$[]"](R))["$=="](b["$[]"](R))?(S["$<<"](s),I=!0):(S["$<<"](N),T=!0),R="author_"+(C=n(C,1));d(T)?(d(I)&&f(S,"each_with_index",[],(c=function(r,i){var o,a,$=c.$$s||this;return null==r&&(r=s),null==i&&(i=s),d(r)?s:(E=[i,f([b["$[]"]("firstname_"+(a=n(i,1))),b["$[]"]("middlename_"+a),b["$[]"]("lastname_"+a)].$compact(),"map",[],(o=function(e){return o.$$s,null==e&&(e=s),e.$tr(" ","_")},o.$$s=$,o.$$arity=1,o)).$join(" ")],f(S,"[]=",e.to_a(E)),E[t(E.length,1)])},c.$$s=_,c.$$arity=2,c)),b=_.$process_authors(S,!0,!1)):b=p([],{})}d(b["$empty?"]())?d(o=y["$[]"]("authorcount"))||(E=["authorcount",(E=["authorcount",0],f(h,"[]=",e.to_a(E)),E[t(E.length,1)])],f(y,"[]=",e.to_a(E)),E[t(E.length,1)]):(h.$update(b),d(d(o=h["$key?"]("email")["$!"]())?h["$key?"]("email_1"):o)&&(E=["email",h["$[]"]("email_1")],f(h,"[]=",e.to_a(E)),E[t(E.length,1)]))}return y},Y.$$arity=-2),e.defs(le,"$process_authors",W=function(r,i,o){var a,$,u,c=s,_=s;return null==i&&(i=!1),null==o&&(o=!0),c=p([],{}),_=0,f(d(d(a=o)?r["$include?"](";"):a)?r.$split(l(ue,"AuthorDelimiterRx")):[].concat(e.to_a(r)),"each",[],($=function(r){var o,a,u,h,m=$.$$s||this,y=s,g=s,v=s,b=s,w=s,x=s,k=s,E=s;return null==r&&(r=s),d(r["$empty?"]())?s:(y=p([],{}),(_=n(_,1))["$=="](1)?f(l(ue,"AuthorKeys"),"each",[],(o=function(n){var r;return o.$$s,null==n&&(n=s),r=[n.$to_sym(),n],f(y,"[]=",e.to_a(r)),r[t(r.length,1)]},o.$$s=m,o.$$arity=1,o)):f(l(ue,"AuthorKeys"),"each",[],(a=function(n){var r;return a.$$s,null==n&&(n=s),r=[n.$to_sym(),n+"_"+_],f(y,"[]=",e.to_a(r)),r[t(r.length,1)]},a.$$s=m,a.$$arity=1,a)),d(i)?(d(r["$include?"]("<"))&&(g=[y["$[]"]("author"),r.$tr("_"," ")],f(c,"[]=",e.to_a(g)),g[t(g.length,1)],r=r.$gsub(l(ue,"XmlSanitizeRx"),"")),(v=r.$split(s,3)).$size()["$=="](3)&&v["$<<"](v.$pop().$squeeze(" "))):d(b=l(ue,"AuthorInfoLineRx").$match(r))&&(v=b.$to_a()).$shift(),d(v)?(g=[y["$[]"]("firstname"),x=v["$[]"](0).$tr("_"," ")],f(c,"[]=",e.to_a(g)),w=g[t(g.length,1)],g=[y["$[]"]("authorinitials"),x.$chr()],f(c,"[]=",e.to_a(g)),g[t(g.length,1)],d(v["$[]"](1))&&(d(v["$[]"](2))?(g=[y["$[]"]("middlename"),k=v["$[]"](1).$tr("_"," ")],f(c,"[]=",e.to_a(g)),g[t(g.length,1)],g=[y["$[]"]("lastname"),E=v["$[]"](2).$tr("_"," ")],f(c,"[]=",e.to_a(g)),g[t(g.length,1)],w=n(n(n(n(x," "),k)," "),E),g=[y["$[]"]("authorinitials"),""+x.$chr()+k.$chr()+E.$chr()],f(c,"[]=",e.to_a(g)),g[t(g.length,1)]):(g=[y["$[]"]("lastname"),E=v["$[]"](1).$tr("_"," ")],f(c,"[]=",e.to_a(g)),g[t(g.length,1)],w=n(n(x," "),E),g=[y["$[]"]("authorinitials"),""+x.$chr()+E.$chr()],f(c,"[]=",e.to_a(g)),g[t(g.length,1)])),d(u=c["$[]"](y["$[]"]("author")))||(g=[y["$[]"]("author"),w],f(c,"[]=",e.to_a(g)),g[t(g.length,1)]),d(d(u=i)?u:v["$[]"](3)["$!"]())||(g=[y["$[]"]("email"),v["$[]"](3)],f(c,"[]=",e.to_a(g)),g[t(g.length,1)])):(g=[y["$[]"]("author"),(g=[y["$[]"]("firstname"),x=r.$squeeze(" ").$strip()],f(c,"[]=",e.to_a(g)),g[t(g.length,1)])],f(c,"[]=",e.to_a(g)),g[t(g.length,1)],g=[y["$[]"]("authorinitials"),x.$chr()],f(c,"[]=",e.to_a(g)),g[t(g.length,1)]),_["$=="](1)?(g=["authors",c["$[]"](y["$[]"]("author"))],f(c,"[]=",e.to_a(g)),g[t(g.length,1)]):(_["$=="](2)&&f(l(ue,"AuthorKeys"),"each",[],((h=function(n){return h.$$s,null==n&&(n=s),d(c["$key?"](n))?(g=[n+"_1",c["$[]"](n)],f(c,"[]=",e.to_a(g)),g[t(g.length,1)]):s}).$$s=m,h.$$arity=1,h)),g=["authors",c["$[]"]("authors")+", "+c["$[]"](y["$[]"]("author"))],f(c,"[]=",e.to_a(g)),g[t(g.length,1)]))},$.$$s=this,$.$$arity=1,$)),u=["authorcount",_],f(c,"[]=",e.to_a(u)),t(u.length,1),c},W.$$arity=-2),e.defs(le,"$parse_block_metadata_lines",V=function(e,t,n,r){for(null==n&&(n=p([],{})),null==r&&(r=p([],{}));d(this.$parse_block_metadata_line(e,t,n,r))&&(e.$shift(),d(e.$skip_blank_lines())););return n},V.$$arity=-3),e.defs(le,"$parse_block_metadata_line",K=function(n,r,i,o){var a,$,u=this,c=s,h=s,m=s,y=s,g=s,v=s;if(null==_["~"]&&(_["~"]=s),null==o&&(o=p([],{})),d(d(a=c=n.$peek_line())?d(o["$[]"]("text_only"))?c["$start_with?"]("[","/"):h=c["$start_with?"]("[",".","/",":"):a))if(d(c["$start_with?"]("["))){if(d(c["$start_with?"]("[["))){if(d(d(a=c["$end_with?"]("]]"))?l(ue,"BlockAnchorRx")["$=~"](c):a))return m=["id",(a=_["~"])===s?s:a["$[]"](1)],f(i,"[]=",e.to_a(m)),m[t(m.length,1)],d(y=(a=_["~"])===s?s:a["$[]"](2))&&(m=["reftext",d(y["$include?"](l(ue,"ATTR_REF_HEAD")))?r.$sub_attributes(y):y],f(i,"[]=",e.to_a(m)),m[t(m.length,1)]),!0}else if(d(d(a=c["$end_with?"]("]"))?l(ue,"BlockAttributeListRx")["$=~"](c):a))return g=i["$[]"](1),d(r.$parse_attributes((a=_["~"])===s?s:a["$[]"](1),[],p(["sub_input","sub_result","into"],{sub_input:!0,sub_result:!0,into:i}))["$[]"](1))&&(m=[1,d(a=u.$parse_style_attribute(i,n))?a:g],f(i,"[]=",e.to_a(m)),m[t(m.length,1)]),!0}else if(d(d(a=h)?c["$start_with?"]("."):a)){if(d(l(ue,"BlockTitleRx")["$=~"](c)))return m=["title",(a=_["~"])===s?s:a["$[]"](1)],f(i,"[]=",e.to_a(m)),m[t(m.length,1)],!0}else if(d(d(a=h["$!"]())?a:c["$start_with?"]("/"))){if(d(c["$start_with?"]("//"))){if(c["$=="]("//"))return!0;if(d(d(a=h)?u["$uniform?"](c,"/",v=c.$length()):a)){if(!v["$=="](3))return n.$read_lines_until(p(["terminator","skip_first_line","preserve_last_line","skip_processing","context"],{terminator:c,skip_first_line:!0,preserve_last_line:!0,skip_processing:!0,context:"comment"})),!0}else if(!d(c["$start_with?"]("///")))return!0}}else if(d(d(a=d($=h)?c["$start_with?"](":"):$)?l(ue,"AttributeEntryRx")["$=~"](c):a))return u.$process_attribute_entry(n,r,i,_["~"]),!0;return s},K.$$arity=-4),e.defs(le,"$process_attribute_entries",G=function(e,t,n){for(null==n&&(n=s),e.$skip_comment_lines();d(this.$process_attribute_entry(e,t,n));)e.$shift(),e.$skip_comment_lines()},G.$$arity=-3),e.defs(le,"$process_attribute_entry",X=function(e,n,r,i){var o,a,$,u=s,c=s,f=s,p=s;if(null==r&&(r=s),null==i&&(i=s),d(d(o=i)?o:i=d(e["$has_more_lines?"]())?l(ue,"AttributeEntryRx").$match(e.$peek_line()):s)){if(d((u=i["$[]"](2))["$nil_or_empty?"]()))u="";else if(d(u["$end_with?"](l(ue,"LINE_CONTINUATION"),l(ue,"LINE_CONTINUATION_LEGACY"))))for(c=(o=[u.$slice(t(u.$length(),2),2),u.$slice(0,t(u.$length(),2)).$rstrip()])[0],u=o[1];d(d(a=e.$advance())?(f=d($=e.$peek_line())?$:"")["$empty?"]()["$!"]():a)&&(f=f.$lstrip(),d(p=f["$end_with?"](c))&&(f=f.$slice(0,t(f.$length(),2)).$rstrip()),u=""+u+(d(u["$end_with?"](l(ue,"HARD_LINE_BREAK")))?l(ue,"LF"):" ")+f,d(p)););return this.$store_attribute(i["$[]"](1),u,n,r),!0}return s},X.$$arity=-3),e.defs(le,"$store_attribute",Q=function(e,r,i,o){var a,u=s;return null==i&&(i=s),null==o&&(o=s),d(e["$end_with?"]("!"))?(e=e.$chop(),r=s):d(e["$start_with?"]("!"))&&(e=e.$slice(1,e.$length()),r=s),(e=this.$sanitize_attribute_name(e))["$=="]("numbered")?e="sectnums":e["$=="]("hardbreaks")?e="hardbreaks-option":e["$=="]("showtitle")&&this.$store_attribute("notitle",d(r)?s:"",i,o),d(i)?d(r)?(e["$=="]("leveloffset")&&(d(r["$start_with?"]("+"))?r=n(i.$attr("leveloffset",0).$to_i(),r.$slice(1,r.$length()).$to_i()).$to_s():d(r["$start_with?"]("-"))&&(r=t(i.$attr("leveloffset",0).$to_i(),r.$slice(1,r.$length()).$to_i()).$to_s())),d(u=i.$set_attribute(e,r))&&(r=u,d(o)&&$(l(ue,"Document"),"AttributeEntry").$new(e,r).$save_to(o))):d(d(a=i.$delete_attribute(e))?o:a)&&$(l(ue,"Document"),"AttributeEntry").$new(e,r).$save_to(o):d(o)&&$(l(ue,"Document"),"AttributeEntry").$new(e,r).$save_to(o),[e,r]},Q.$$arity=-3),e.defs(le,"$resolve_list_marker",J=function(e,t,n,r,i){var o=this,a=s;return null==n&&(n=0),null==r&&(r=!1),null==i&&(i=s),"ulist"["$==="](a=e)?t:"olist"["$==="](a)?o.$resolve_ordered_list_marker(t,n,r,i)["$[]"](0):"<1>"},J.$$arity=-3),e.defs(le,"$resolve_ordered_list_marker",Z=function(e,t,r,i){var o,a,$,u,c=this,_=s,h=s;return null==t&&(t=0),null==r&&(r=!1),null==i&&(i=s),d(e["$start_with?"]("."))?[e]:($=u=f(l(ue,"ORDERED_LIST_STYLES"),"find",[],((o=function(t){return o.$$s,null==t&&(t=s),l(ue,"OrderedListMarkerRxMap")["$[]"](t)["$match?"](e)}).$$s=c,o.$$arity=1,o)),"arabic"["$==="]($)?(d(r)&&(_=n(t,1),h=e.$to_i()),e="1."):"loweralpha"["$==="]($)?(d(r)&&(_=n("a"["$[]"](0).$ord(),t).$chr(),h=e.$chop()),e="a."):"upperalpha"["$==="]($)?(d(r)&&(_=n("A"["$[]"](0).$ord(),t).$chr(),h=e.$chop()),e="A."):"lowerroman"["$==="]($)?(d(r)&&(_=l(ue,"Helpers").$int_to_roman(n(t,1)).$downcase(),h=e.$chop()),e="i)"):"upperroman"["$==="]($)&&(d(r)&&(_=l(ue,"Helpers").$int_to_roman(n(t,1)),h=e.$chop()),e="I)"),d(d(a=r)?_["$!="](h):a)&&c.$logger().$warn(c.$message_with_context("list item index: expected "+_+", got "+h,p(["source_location"],{source_location:i.$cursor()}))),[e,u])},Z.$$arity=-2),e.defs(le,"$is_sibling_list_item?",ee=function(e,t,n){var r,i;return d($("::","Regexp")["$==="](n))?n["$match?"](e):d(r=l(ue,"ListRxMap")["$[]"](t)["$=~"](e))?n["$=="](this.$resolve_list_marker(t,(i=_["~"])===s?s:i["$[]"](1))):r},ee.$$arity=3),e.defs(le,"$parse_table",te=function(r,o,a){var u,c,p,_,h=this,m=s,y=s,g=s,v=s,b=s,w=s,x=s,k=s,E=s,O=s,A=s,S=s,C=s,R=s,T=s,I=s,N=s,L=s,D=s;for(m=l(ue,"Table").$new(o,a),d(d(u=a["$key?"]("cols"))?(y=h.$parse_colspecs(a["$[]"]("cols")))["$empty?"]()["$!"]():u)&&(m.$create_columns(y),g=!0),v=d(u=r.$skip_blank_lines())?u:0,d(a["$[]"]("header-option"))?(b=[!0],f(m,"has_header_option=",e.to_a(b)),b[t(b.length,1)]):d((u=v["$=="](0))?a["$[]"]("noheader-option")["$!"]():v["$=="](0))&&(b=["implicit"],f(m,"has_header_option=",e.to_a(b)),b[t(b.length,1)],w=!0),k=(u=[(x=$(l(ue,"Table"),"ParserContext").$new(r,m,a)).$format(),-1,s])[0],E=u[1],O=u[2],u=!1;u||d(A=r.$read_line());){for(u=!1,d(d(c=S=i(E=n(E,1),0))?A["$empty?"]():c)?(A=s,d(O)&&(O=n(O,1))):k["$=="]("psv")&&(d(x["$starts_with_delimiter?"](A))?(A=A.$slice(1,A.$length()),x.$close_open_cell(),d(O)&&(O=s)):(p=h.$parse_cellspec(A,"start",x.$delimiter()),C=null==(c=e.to_ary(p))[0]?s:c[0],A=null==c[1]?s:c[1],d(C)?(x.$close_open_cell(C),d(O)&&(O=s)):d(d(c=O)?O["$=="](E):c)&&(b=[w=O=s],f(m,"has_header_option=",e.to_a(b)),b[t(b.length,1)]))),d(S)||(r.$mark(),d(w)&&(d(d(c=r["$has_more_lines?"]())?r.$peek_line()["$empty?"]():c)?O=1:(b=[w=s],f(m,"has_header_option=",e.to_a(b)),b[t(b.length,1)]))),c=!1;c||d(!0);){if(c=!1,!d(d(p=A)?R=x.$match_delimiter(A):p)){b=[""+x.$buffer()+A+l(ue,"LF")],f(x,"buffer=",e.to_a(b)),b[t(b.length,1)],"csv"["$==="](N=k)?d(x["$buffer_has_unclosed_quotes?"]())?(d(d(p=O)?E["$=="](0):p)&&(b=[w=O=s],f(m,"has_header_option=",e.to_a(b)),b[t(b.length,1)]),x.$keep_cell_open()):x.$close_cell(!0):"dsv"["$==="](N)?x.$close_cell(!0):x.$keep_cell_open();break}if(T=(p=[R.$pre_match(),R.$post_match()])[0],I=p[1],"csv"["$==="](N=k)){if(d(x["$buffer_has_unclosed_quotes?"](T))){if(x.$skip_past_delimiter(T),d((A=I)["$empty?"]()))break;c=!0;continue}b=[""+x.$buffer()+T],f(x,"buffer=",e.to_a(b)),b[t(b.length,1)]}else if("dsv"["$==="](N)){if(d(T["$end_with?"]("\\"))){if(x.$skip_past_escaped_delimiter(T),d((A=I)["$empty?"]())){b=[""+x.$buffer()+l(ue,"LF")],f(x,"buffer=",e.to_a(b)),b[t(b.length,1)],x.$keep_cell_open();break}c=!0;continue}b=[""+x.$buffer()+T],f(x,"buffer=",e.to_a(b)),b[t(b.length,1)]}else{if(d(T["$end_with?"]("\\"))){if(x.$skip_past_escaped_delimiter(T),d((A=I)["$empty?"]())){b=[""+x.$buffer()+l(ue,"LF")],f(x,"buffer=",e.to_a(b)),b[t(b.length,1)],x.$keep_cell_open();break}c=!0;continue}_=h.$parse_cellspec(T),C=null==(p=e.to_ary(_))[0]?s:p[0],L=null==p[1]?s:p[1],x.$push_cellspec(C),b=[""+x.$buffer()+L],f(x,"buffer=",e.to_a(b)),b[t(b.length,1)]}d((A=I)["$empty?"]())&&(A=s),x.$close_cell()}if(d(x["$cell_open?"]()))d(r["$has_more_lines?"]())||x.$close_cell(!0);else if(!d(c=r.$skip_blank_lines()))break}return d(d(u=(D=m.$attributes(),d(c=D["$[]"]("colcount"))?c:(b=["colcount",m.$columns().$size()],f(D,"[]=",e.to_a(b)),b[t(b.length,1)]))["$=="](0))?u:g)||m.$assign_column_widths(),d(w)&&(b=[!0],f(m,"has_header_option=",e.to_a(b)),b[t(b.length,1)]),m.$partition_header_footer(a),m},te.$$arity=3),e.defs(le,"$parse_colspecs",ne=function(n){var r,i,o=s;return d(n["$include?"](" "))&&(n=n.$delete(" ")),n["$=="](n.$to_i().$to_s())?f($("::","Array"),"new",[n.$to_i()],((r=function(){return r.$$s,p(["width"],{width:1})}).$$s=this,r.$$arity=0,r)):(o=[],f(d(n["$include?"](","))?n.$split(",",-1):n.$split(";",-1),"each",[],(i=function(n){var r,a,$,u=i.$$s||this,c=s,_=s,h=s,m=s,y=s,g=s;return null==n&&(n=s),d(n["$empty?"]())?o["$<<"](p(["width"],{width:1})):d(c=l(ue,"ColumnSpecRx").$match(n))?(_=p([],{}),d(c["$[]"](2))&&(a=c["$[]"](2).$split("."),h=null==(r=e.to_ary(a))[0]?s:r[0],m=null==r[1]?s:r[1],d(d(r=h["$nil_or_empty?"]()["$!"]())?l(ue,"TableCellHorzAlignments")["$key?"](h):r)&&(y=["halign",l(ue,"TableCellHorzAlignments")["$[]"](h)],f(_,"[]=",e.to_a(y)),y[t(y.length,1)]),d(d(r=m["$nil_or_empty?"]()["$!"]())?l(ue,"TableCellVertAlignments")["$key?"](m):r)&&(y=["valign",l(ue,"TableCellVertAlignments")["$[]"](m)],f(_,"[]=",e.to_a(y)),y[t(y.length,1)])),d(g=c["$[]"](3))?(y=["width",g["$=="]("~")?-1:g.$to_i()],f(_,"[]=",e.to_a(y)),y[t(y.length,1)]):(y=["width",1],f(_,"[]=",e.to_a(y)),y[t(y.length,1)]),d(d(r=c["$[]"](4))?l(ue,"TableCellStyles")["$key?"](c["$[]"](4)):r)&&(y=["style",l(ue,"TableCellStyles")["$[]"](c["$[]"](4))],f(_,"[]=",e.to_a(y)),y[t(y.length,1)]),d(c["$[]"](1))?f(1,"upto",[c["$[]"](1).$to_i()],(($=function(){return $.$$s,o["$<<"](_.$merge())}).$$s=u,$.$$arity=0,$)):o["$<<"](_)):s},i.$$s=this,i.$$arity=1,i)),o)},ne.$$arity=1),e.defs(le,"$parse_cellspec",re=function(n,r,i){var o,a,$,u=s,c=s,_=s,h=s,m=s,y=s,g=s;if(null==r&&(r="end"),null==i&&(i=s),u=(o=[s,""])[0],c=o[1],r["$=="]("start")){if(!d(n["$include?"](i)))return[s,n];if(a=n.$partition(i),_=null==(o=e.to_ary(a))[0]?s:o[0],null==o[1]||o[1],c=null==o[2]?s:o[2],!d(u=l(ue,"CellSpecStartRx").$match(_)))return[s,n];if(d(u["$[]"](0)["$empty?"]()))return[p([],{}),c]}else{if(!d(u=l(ue,"CellSpecEndRx").$match(n)))return[p([],{}),n];if(d(u["$[]"](0).$lstrip()["$empty?"]()))return[p([],{}),n.$rstrip()];c=u.$pre_match()}return $=p([],{}),d(u["$[]"](1))&&(a=u["$[]"](1).$split("."),o=e.to_ary(a),h=null==o[0]?s:o[0],m=null==o[1]?s:o[1],h=d(h["$nil_or_empty?"]())?1:h.$to_i(),m=d(m["$nil_or_empty?"]())?1:m.$to_i(),y=u["$[]"](2),"+"["$==="](y)?(h["$=="](1)||(g=["colspan",h],f($,"[]=",e.to_a(g)),g[t(g.length,1)]),m["$=="](1)||(g=["rowspan",m],f($,"[]=",e.to_a(g)),g[t(g.length,1)])):"*"["$==="](y)&&(h["$=="](1)||(g=["repeatcol",h],f($,"[]=",e.to_a(g)),g[t(g.length,1)]))),d(u["$[]"](3))&&(a=u["$[]"](3).$split("."),o=e.to_ary(a),h=null==o[0]?s:o[0],m=null==o[1]?s:o[1],d(d(o=h["$nil_or_empty?"]()["$!"]())?l(ue,"TableCellHorzAlignments")["$key?"](h):o)&&(g=["halign",l(ue,"TableCellHorzAlignments")["$[]"](h)],f($,"[]=",e.to_a(g)),g[t(g.length,1)]),d(d(o=m["$nil_or_empty?"]()["$!"]())?l(ue,"TableCellVertAlignments")["$key?"](m):o)&&(g=["valign",l(ue,"TableCellVertAlignments")["$[]"](m)],f($,"[]=",e.to_a(g)),g[t(g.length,1)])),d(d(o=u["$[]"](4))?l(ue,"TableCellStyles")["$key?"](u["$[]"](4)):o)&&(g=["style",l(ue,"TableCellStyles")["$[]"](u["$[]"](4))],f($,"[]=",e.to_a(g)),g[t(g.length,1)]),[$,c]},re.$$arity=-2),e.defs(le,"$parse_style_attribute",ie=function(r,i){var o,a,$,u,c=this,_=s,h=s,m=s,y=s,g=s,v=s,b=s;return null==i&&(i=s),d(d(o=d(a=_=r["$[]"](1))?_["$include?"](" ")["$!"]():a)?l(ue,"Compliance").$shorthand_property_syntax():o)?(h=s,m="",y=p([],{}),f(_,"each_char",[],($=function(e){var t=$.$$s||this,r=s;return null==e&&(e=s),"."["$==="](r=e)?(t.$yield_buffered_attribute(y,h,m,i),m="",h="role"):"#"["$==="](r)?(t.$yield_buffered_attribute(y,h,m,i),m="",h="id"):"%"["$==="](r)?(t.$yield_buffered_attribute(y,h,m,i),m="",h="option"):m=n(m,e)},$.$$s=c,$.$$arity=1,$)),d(h)?(c.$yield_buffered_attribute(y,h,m,i),d(g=y["$[]"]("style"))&&(v=["style",g],f(r,"[]=",e.to_a(v)),v[t(v.length,1)]),d(y["$key?"]("id"))&&(v=["id",y["$[]"]("id")],f(r,"[]=",e.to_a(v)),v[t(v.length,1)]),d(y["$key?"]("role"))&&(v=["role",d((b=r["$[]"]("role"))["$nil_or_empty?"]())?y["$[]"]("role").$join(" "):b+" "+y["$[]"]("role").$join(" ")],f(r,"[]=",e.to_a(v)),v[t(v.length,1)]),d(y["$key?"]("option"))&&f(y["$[]"]("option"),"each",[],((u=function(n){return u.$$s,null==n&&(n=s),v=[n+"-option",""],f(r,"[]=",e.to_a(v)),v[t(v.length,1)]}).$$s=c,u.$$arity=1,u)),g):(v=["style",_],f(r,"[]=",e.to_a(v)),v[t(v.length,1)])):(v=["style",_],f(r,"[]=",e.to_a(v)),v[t(v.length,1)])},ie.$$arity=-2),e.defs(le,"$yield_buffered_attribute",oe=function(n,r,i,o){var a,$=this,l=s;return d(r)?d(i["$empty?"]())?d(o)?$.$logger().$warn($.$message_with_context("invalid empty "+r+" detected in style attribute",p(["source_location"],{source_location:o.$cursor_at_prev_line()}))):$.$logger().$warn("invalid empty "+r+" detected in style attribute"):r["$=="]("id")?(d(n["$key?"]("id"))&&(d(o)?$.$logger().$warn($.$message_with_context("multiple ids detected in style attribute",p(["source_location"],{source_location:o.$cursor_at_prev_line()}))):$.$logger().$warn("multiple ids detected in style attribute")),l=[r,i],f(n,"[]=",e.to_a(l)),l[t(l.length,1)]):(d(a=n["$[]"](r))?a:(l=[r,[]],f(n,"[]=",e.to_a(l)),l[t(l.length,1)]))["$<<"](i):d(i["$empty?"]())||(l=["style",i],f(n,"[]=",e.to_a(l)),l[t(l.length,1)]),s},oe.$$arity=4),e.defs(le,"$adjust_indentation!",ae=function(a,$,u){var c,p,_,h,m,y,g,v=this,b=s,w=s,x=s;return null==$&&($=0),null==u&&(u=0),d(a["$empty?"]())||(d(d(c=i(u,0))?f(a,"any?",[],((p=function(e){return p.$$s,null==e&&(e=s),e["$include?"](l(ue,"TAB"))}).$$s=v,p.$$arity=1,p)):c)&&(b=o(" ",u),function(){var r=e.new_brk();try{f(a,"map!",[],(_=function(r){var i,a,$,c=_.$$s||this,p=s,h=s,m=s,y=s,g=s;return null==r&&(r=s),d(d(i=r["$empty?"]())?i:(p=r.$index(l(ue,"TAB")))["$nil?"]())||p["$=="](0)&&(h=0,function(){var t=e.new_brk();try{f(r,"each_byte",[],((a=function(r){return a.$$s,null==r&&(r=s),r["$=="](9)||e.brk(s,t),h=n(h,1)}).$$s=c,a.$$brk=t,a.$$arity=1,a))}catch(i){if(i===t)return i.$v;throw i}}(),r=""+o(b,h)+r.$slice(h,r.$length()),!d(r["$include?"](l(ue,"TAB"))))?r:(m=0,y=0,g="",f(r,"each_char",[],(($=function(e){$.$$s;var r=s,i=s;return null==e&&(e=s),e["$=="](l(ue,"TAB"))?(r=n(y,m))["$%"](u)["$=="](0)?(m=n(m,t(u,1)),g=n(g,b)):((i=t(u,r["$%"](u)))["$=="](1)||(m=n(m,t(i,1))),g=n(g,o(" ",i))):g=n(g,e),y=n(y,1)}).$$s=c,$.$$arity=1,$)),g)},_.$$s=v,_.$$brk=r,_.$$arity=1,_))}catch(i){if(i===r)return i.$v;throw i}}()),d(r($,0))||(w=s,function(){var n=e.new_brk();try{f(a,"each",[],((h=function(i){h.$$s;var o,a=s;return null==i&&(i=s),d(i["$empty?"]())?s:((a=t(i.$length(),i.$lstrip().$length()))["$=="](0)&&(w=s,e.brk(s,n)),d(d(o=w)?r(w,a):o)?s:w=a)}).$$s=v,h.$$brk=n,h.$$arity=1,h))}catch(i){if(i===n)return i.$v;throw i}}(),$["$=="](0)?d(w)&&f(a,"map!",[],((m=function(e){return m.$$s,null==e&&(e=s),d(e["$empty?"]())?e:e.$slice(w,e.$length())}).$$s=v,m.$$arity=1,m)):(x=o(" ",$),d(w)?f(a,"map!",[],((y=function(e){return y.$$s,null==e&&(e=s),d(e["$empty?"]())?e:n(x,e.$slice(w,e.$length()))}).$$s=v,y.$$arity=1,y)):f(a,"map!",[],((g=function(e){return g.$$s,null==e&&(e=s),d(e["$empty?"]())?e:n(x,e)}).$$s=v,g.$$arity=1,g))))),s},ae.$$arity=-2),e.defs(le,"$uniform?",se=function(e,t,n){return e.$count(t)["$=="](n)},se.$$arity=3),e.defs(le,"$sanitize_attribute_name",$e=function(e){return e.$gsub(l(ue,"InvalidAttributeNameCharsRx"),"").$downcase()},$e.$$arity=1)}(m[0],0,m)}(a[0],a)},Opal.modules["asciidoctor/path_resolver"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e+t:e["$+"](t)}e.top;var n=[],r=e.nil,i=e.const_get_qualified,o=e.const_get_relative,a=(e.breaker,e.slice,e.module),s=e.klass,$=e.truthy,l=e.hash2,u=e.send,c=e.gvars;return e.add_stubs(["$include","$attr_accessor","$root?","$posixify","$expand_path","$pwd","$start_with?","$==","$match?","$absolute_path?","$+","$length","$descends_from?","$slice","$to_s","$relative_path_from","$new","$include?","$tr","$partition_path","$each","$pop","$<<","$join_path","$[]","$web_root?","$unc?","$index","$split","$delete","$[]=","$-","$join","$raise","$!","$fetch","$warn","$logger","$empty?","$nil_or_empty?","$chomp","$!=","$>","$size","$extract_uri_prefix","$end_with?","$gsub","$private","$=~"]),function(n,f){var d=[a(n,"Asciidoctor")].concat(f);!function(n,a,f){var d,p,_,h,m,y,g,v,b,w,x,k,E,O,A=s(n,null,"PathResolver"),S=[A].concat(f);A.$$prototype.file_separator=A.$$prototype._partition_path_web=A.$$prototype._partition_path_sys=A.$$prototype.working_dir=r,A.$include(o(S,"Logging")),e.const_set(S[0],"DOT","."),e.const_set(S[0],"DOT_DOT",".."),e.const_set(S[0],"DOT_SLASH","./"),e.const_set(S[0],"SLASH","/"),e.const_set(S[0],"BACKSLASH","\\"),e.const_set(S[0],"DOUBLE_SLASH","//"),e.const_set(S[0],"WindowsRootRx",/^(?:[a-zA-Z]:)?[\\\/]/),A.$attr_accessor("file_separator"),A.$attr_accessor("working_dir"),e.def(A,"$initialize",d=function(e,t){var n,o,a=this;return null==e&&(e=r),null==t&&(t=r),a.file_separator=$(n=$(o=e)?o:i(i("::","File"),"ALT_SEPARATOR"))?n:i(i("::","File"),"SEPARATOR"),a.working_dir=$(t)?$(a["$root?"](t))?a.$posixify(t):i("::","File").$expand_path(t):i("::","Dir").$pwd(),a._partition_path_sys=l([],{}),a._partition_path_web=l([],{})},d.$$arity=-1),e.def(A,"$absolute_path?",p=function(e){var t;return $(t=e["$start_with?"](o(S,"SLASH")))?t:this.file_separator["$=="](o(S,"BACKSLASH"))?o(S,"WindowsRootRx")["$match?"](e):this.file_separator["$=="](o(S,"BACKSLASH"))},p.$$arity=1),$(o(S,"RUBY_ENGINE")["$=="]("opal")?i("::","JAVASCRIPT_IO_MODULE")["$=="]("xmlhttprequest"):o(S,"RUBY_ENGINE")["$=="]("opal"))?e.def(A,"$root?",_=function(e){var t;return $(t=this["$absolute_path?"](e))?t:e["$start_with?"]("file://","http://","https://")},_.$$arity=1):e.alias(A,"root?","absolute_path?"),e.def(A,"$unc?",h=function(e){return e["$start_with?"](o(S,"DOUBLE_SLASH"))},h.$$arity=1),e.def(A,"$web_root?",m=function(e){return e["$start_with?"](o(S,"SLASH"))},m.$$arity=1),e.def(A,"$descends_from?",y=function(e,n){var r;return n["$=="](e)?0:n["$=="](o(S,"SLASH"))?$(r=e["$start_with?"](o(S,"SLASH")))?1:r:$(r=e["$start_with?"](t(n,o(S,"SLASH"))))?t(n.$length(),1):r},y.$$arity=2),e.def(A,"$relative_path",g=function(t,n){var i=r;if(!$(this["$root?"](t)))return t;if($(i=this["$descends_from?"](t,n)))return t.$slice(i,t.$length());try{return o(S,"Pathname").$new(t).$relative_path_from(o(S,"Pathname").$new(n)).$to_s()}catch(a){if(!e.rescue(a,[o(S,"StandardError")]))throw a;try{return t}finally{e.pop_exception()}}},g.$$arity=2),e.def(A,"$posixify",v=function(e){return $(e)?$(this.file_separator["$=="](o(S,"BACKSLASH"))?e["$include?"](o(S,"BACKSLASH")):this.file_separator["$=="](o(S,"BACKSLASH")))?e.$tr(o(S,"BACKSLASH"),o(S,"SLASH")):e:""},v.$$arity=1),e.alias(A,"posixfy","posixify"),e.def(A,"$expand_path",b=function(t){var n,i,a,s,l,c=this,f=r;return i=c.$partition_path(t),s=null==(n=e.to_ary(i))[0]?r:n[0],l=null==n[1]?r:n[1],$(t["$include?"](o(S,"DOT_DOT")))?(f=[],u(s,"each",[],((a=function(e){return a.$$s,null==e&&(e=r),e["$=="](o(S,"DOT_DOT"))?f.$pop():f["$<<"](e)}).$$s=c,a.$$arity=1,a)),c.$join_path(f,l)):c.$join_path(s,l)},b.$$arity=1),e.def(A,"$partition_path",w=function(n,i){var a,s,l,c,f=this,d=r,p=r,_=r,h=r;return null==i&&(i=r),$(a=(d=$(i)?f._partition_path_web:f._partition_path_sys)["$[]"](n))?a:(p=f.$posixify(n),$(i)?$(f["$web_root?"](p))?_=o(S,"SLASH"):$(p["$start_with?"](o(S,"DOT_SLASH")))&&(_=o(S,"DOT_SLASH")):$(f["$root?"](p))?_=$(f["$unc?"](p))?o(S,"DOUBLE_SLASH"):$(p["$start_with?"](o(S,"SLASH")))?o(S,"SLASH"):p.$slice(0,t(p.$index(o(S,"SLASH")),1)):$(p["$start_with?"](o(S,"DOT_SLASH")))&&(_=o(S,"DOT_SLASH")),(h=($(_)?p.$slice(_.$length(),p.$length()):p).$split(o(S,"SLASH"))).$delete(o(S,"DOT")),s=[n,[h,_]],u(d,"[]=",e.to_a(s)),s[(l=s.length,c=1,"number"===typeof l&&"number"===typeof c?l-c:l["$-"](c))])},w.$$arity=-2),e.def(A,"$join_path",x=function(e,t){return null==t&&(t=r),$(t)?""+t+e.$join(o(S,"SLASH")):e.$join(o(S,"SLASH"))},x.$$arity=-2),e.def(A,"$system_path",k=function(n,a,s,c){var f,d,p,_,h=this,m=r,y=r,g=r,v=r,b=r,w=r,x=r,k=r,E=r,O=r;if(null==a&&(a=r),null==s&&(s=r),null==c&&(c=l([],{})),$(s)&&($(h["$root?"](s))||h.$raise(i("::","SecurityError"),"Jail is not an absolute path: "+s),s=h.$posixify(s)),$(n)){if($(h["$root?"](n))){if(m=h.$expand_path(n),$($(f=s)?h["$descends_from?"](m,s)["$!"]():f)){if($(c.$fetch("recover",!0)))return h.$logger().$warn(($(f=c["$[]"]("target_name"))?f:"path")+" is outside of jail; recovering automatically"),d=h.$partition_path(m),y=null==(f=e.to_ary(d))[0]?r:f[0],d=h.$partition_path(s),f=e.to_ary(d),g=null==f[0]?r:f[0],v=null==f[1]?r:f[1],h.$join_path(t(g,y),v);h.$raise(i("::","SecurityError"),($(f=c["$[]"]("target_name"))?f:"path")+" "+n+" is outside of jail: "+s+" (disallowed in safe mode)")}return m}d=h.$partition_path(n),y=null==(f=e.to_ary(d))[0]?r:f[0]}else y=[];if($(y["$empty?"]())){if($(a["$nil_or_empty?"]()))return $(f=s)?f:h.working_dir;if($(h["$root?"](a))){if(!$(s))return h.$expand_path(a);a=h.$posixify(a)}else d=h.$partition_path(a),y=null==(f=e.to_ary(d))[0]?r:f[0],a=$(f=s)?f:h.working_dir}else $(a["$nil_or_empty?"]())?a=$(f=s)?f:h.working_dir:$(h["$root?"](a))?$(s)&&(a=h.$posixify(a)):a=($(f=s)?f:h.working_dir).$chomp("/")+"/"+a;return $($(f=$(d=s)?b=h["$descends_from?"](a,s)["$!"]():d)?h.file_separator["$=="](o(S,"BACKSLASH")):f)?(d=h.$partition_path(a),w=null==(f=e.to_ary(d))[0]?r:f[0],x=null==f[1]?r:f[1],d=h.$partition_path(s),f=e.to_ary(d),g=null==f[0]?r:f[0],v=null==f[1]?r:f[1],$(x["$!="](v))&&($(c.$fetch("recover",!0))?(h.$logger().$warn("start path for "+($(f=c["$[]"]("target_name"))?f:"path")+" is outside of jail root; recovering automatically"),w=g,b=!1):h.$raise(i("::","SecurityError"),"start path for "+($(f=c["$[]"]("target_name"))?f:"path")+" "+a+" refers to location outside jail root: "+s+" (disallowed in safe mode)"))):(d=h.$partition_path(a),w=null==(f=e.to_ary(d))[0]?r:f[0],v=null==f[1]?r:f[1]),$((k=t(w,y))["$include?"](o(S,"DOT_DOT")))&&(E=(f=[k,[]])[0],k=f[1],$(s)?($(g)||(d=h.$partition_path(s),f=e.to_ary(d),g=null==f[0]?r:f[0]),O=!1,u(E,"each",[],(p=function(e){var t,a,l,u=p.$$s||this;return null==e&&(e=r),e["$=="](o(S,"DOT_DOT"))?$((a=k.$size(),l=g.$size(),"number"===typeof a&&"number"===typeof l?a>l:a["$>"](l)))?k.$pop():$(c.$fetch("recover",!0))?$(O)?r:(u.$logger().$warn(($(t=c["$[]"]("target_name"))?t:"path")+" has illegal reference to ancestor of jail; recovering automatically"),O=!0):u.$raise(i("::","SecurityError"),($(t=c["$[]"]("target_name"))?t:"path")+" "+n+" refers to location outside jail: "+s+" (disallowed in safe mode)"):k["$<<"](e)},p.$$s=h,p.$$arity=1,p))):u(E,"each",[],((_=function(e){return _.$$s,null==e&&(e=r),e["$=="](o(S,"DOT_DOT"))?k.$pop():k["$<<"](e)}).$$s=h,_.$$arity=1,_))),$(b)?(m=h.$join_path(k,v),$(h["$descends_from?"](m,s))?m:$(c.$fetch("recover",!0))?(h.$logger().$warn(($(f=c["$[]"]("target_name"))?f:"path")+" is outside of jail; recovering automatically"),$(g)||(d=h.$partition_path(s),f=e.to_ary(d),g=null==f[0]?r:f[0]),h.$join_path(t(g,y),v)):h.$raise(i("::","SecurityError"),($(f=c["$[]"]("target_name"))?f:"path")+" "+n+" is outside of jail: "+s+" (disallowed in safe mode)")):h.$join_path(k,v)},k.$$arity=-2),e.def(A,"$web_path",E=function(t,n){var i,a,s,l,c=this,f=r,d=r,p=r,_=r;return null==n&&(n=r),t=c.$posixify(t),n=c.$posixify(n),$($(i=n["$nil_or_empty?"]())?i:c["$web_root?"](t))||(a=c.$extract_uri_prefix(""+n+($(n["$end_with?"](o(S,"SLASH")))?"":o(S,"SLASH"))+t),t=null==(i=e.to_ary(a))[0]?r:i[0],f=null==i[1]?r:i[1]),a=c.$partition_path(t,!0),l=null==(i=e.to_ary(a))[0]?r:i[0],d=null==i[1]?r:i[1],p=[],u(l,"each",[],((s=function(e){var t;return s.$$s,null==e&&(e=r),e["$=="](o(S,"DOT_DOT"))?$(p["$empty?"]())?$($(t=d)?d["$!="](o(S,"DOT_SLASH")):t)?r:p["$<<"](e):p["$[]"](-1)["$=="](o(S,"DOT_DOT"))?p["$<<"](e):p.$pop():p["$<<"](e)}).$$s=c,s.$$arity=1,s)),$((_=c.$join_path(p,d))["$include?"](" "))&&(_=_.$gsub(" ","%20")),$(f)?""+f+_:_},E.$$arity=-2),A.$private(),e.def(A,"$extract_uri_prefix",O=function(e){var t;return $($(t=e["$include?"](":"))?o(S,"UriSniffRx")["$=~"](e):t)?[e.$slice(((t=c["~"])===r?r:t["$[]"](0)).$length(),e.$length()),(t=c["~"])===r?r:t["$[]"](0)]:e},O.$$arity=1)}(d[0],0,d)}(n[0],n)},Opal.modules["asciidoctor/reader"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e+t:e["$+"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e>t:e["$>"](t)}function r(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}function i(e,t){return"number"===typeof e&&"number"===typeof t?e>=t:e["$>="](t)}e.top;var o=[],a=e.nil,s=e.const_get_qualified,$=e.const_get_relative,l=(e.breaker,e.slice,e.module),u=e.klass,c=e.hash2,f=e.truthy,d=e.send,p=e.gvars,_=e.hash;return e.add_stubs(["$include","$attr_reader","$+","$attr_accessor","$!","$===","$split","$file","$dir","$dirname","$path","$basename","$lineno","$reverse","$prepare_lines","$empty?","$nil_or_empty?","$peek_line","$>","$slice","$[]","$length","$process_line","$times","$shift","$read_line","$<<","$-","$unshift_all","$has_more_lines?","$join","$read_lines","$unshift","$start_with?","$==","$*","$read_lines_until","$size","$clear","$cursor","$[]=","$!=","$fetch","$cursor_at_mark","$warn","$logger","$message_with_context","$pop","$push","$respond_to?","$reverse_each","$new","$tap","$each","$instance_variables","$instance_variable_get","$drop","$instance_variable_set","$class","$object_id","$inspect","$private","$prepare_source_array","$prepare_source_string","$chomp","$valid_encoding?","$to_s","$raise","$to_i","$attributes","$catalog","$pop_include","$parse","$path=","$dup","$end_with?","$keys","$rindex","$rootname","$key?","$attr","$reverse!","$>=","$nil?","$extensions?","$include_processors?","$extensions","$include_processors","$map","$skip_front_matter!","$adjust_indentation!","$include?","$=~","$preprocess_conditional_directive","$preprocess_include_directive","$downcase","$error","$none?","$any?","$all?","$strip","$send","$resolve_expr_val","$replace_next_line","$rstrip","$sub_attributes","$attribute_missing","$info","$parse_attributes","$find","$handles?","$instance","$process_method","$safe","$resolve_include_path","$method","$split_delimited_value","$partition","$<","$to_a","$uniq","$sort","$call","$each_line","$infinite?","$push_include","$delete","$first","$values","$value?","$create_include_cursor","$delete_at","$read","$uriish?","$attr?","$require_library","$normalize_system_path","$file?","$relative_path","$path_resolver","$base_dir","$to_f"]),function(o,h){var m=[l(o,"Asciidoctor")].concat(h);!function(i,o,l){var p,_,h,m,y,g,v,b,w,x,k,E,O,A,S,C,R,T,I,N,L,D,P,M,z,F,j,B,q,U,H,Y,W,V,K,G,X,Q,J=u(i,null,"Reader"),Z=[J].concat(l);J.$$prototype.file=J.$$prototype.lines=J.$$prototype.look_ahead=J.$$prototype.unescape_next_line=J.$$prototype.lineno=J.$$prototype.process_lines=J.$$prototype.dir=J.$$prototype.path=J.$$prototype.mark=J.$$prototype.source_lines=J.$$prototype.saved=a,J.$include($(Z,"Logging")),function(n,r,i){var o,s,$,l=u(n,null,"Cursor");[l].concat(i),l.$$prototype.lineno=l.$$prototype.path=a,l.$attr_reader("file","dir","path","lineno"),e.def(l,"$initialize",o=function(e,t,n,r){var i,o=this;return null==t&&(t=a),null==n&&(n=a),null==r&&(r=1),i=[e,t,n,r],o.file=i[0],o.dir=i[1],o.path=i[2],o.lineno=i[3],i},o.$$arity=-2),e.def(l,"$advance",s=function(e){return this.lineno=t(this.lineno,e)},s.$$arity=1),e.def(l,"$line_info",$=function(){return this.path+": line "+this.lineno},$.$$arity=0),e.alias(l,"to_s","line_info")}(Z[0],0,Z),J.$attr_reader("file"),J.$attr_reader("dir"),J.$attr_reader("path"),J.$attr_reader("lineno"),J.$attr_reader("source_lines"),J.$attr_accessor("process_lines"),J.$attr_accessor("unterminated"),e.def(J,"$initialize",p=function(t,n,r){var i,o,$=this;return null==t&&(t=a),null==n&&(n=a),null==r&&(r=c([],{})),f(n["$!"]())?($.file=a,$.dir=".",$.path="<stdin>",$.lineno=1):f(s("::","String")["$==="](n))?($.file=n,o=s("::","File").$split($.file),i=e.to_ary(o),$.dir=null==i[0]?a:i[0],$.path=null==i[1]?a:i[1],$.lineno=1):(f($.file=n.$file())?($.dir=f(i=n.$dir())?i:s("::","File").$dirname($.file),$.path=f(i=n.$path())?i:s("::","File").$basename($.file)):($.dir=f(i=n.$dir())?i:".",$.path=f(i=n.$path())?i:"<stdin>"),$.lineno=f(i=n.$lineno())?i:1),$.lines=($.source_lines=$.$prepare_lines(t,r)).$reverse(),$.mark=a,$.look_ahead=0,$.process_lines=!0,$.unescape_next_line=!1,$.unterminated=a,$.saved=a},p.$$arity=-1),e.def(J,"$has_more_lines?",_=function(){return!f(this.lines["$empty?"]())||(this.look_ahead=0,!1)},_.$$arity=0),e.def(J,"$empty?",h=function(){return!!f(this.lines["$empty?"]())&&(this.look_ahead=0,!0)},h.$$arity=0),e.alias(J,"eof?","empty?"),e.def(J,"$next_line_empty?",m=function(){return this.$peek_line()["$nil_or_empty?"]()},m.$$arity=0),e.def(J,"$peek_line",y=function(e){var t,r=this,i=a;return null==e&&(e=!1),f(f(t=e)?t:n(r.look_ahead,0))?f(r.unescape_next_line)?(i=r.lines["$[]"](-1)).$slice(1,i.$length()):r.lines["$[]"](-1):f(r.lines["$empty?"]())?(r.look_ahead=0,a):f(t=r.$process_line(r.lines["$[]"](-1)))?t:r.$peek_line()},y.$$arity=-1),e.def(J,"$peek_lines",g=function(t,n){var i,o,s,l=this,u=a;return null==t&&(t=a),null==n&&(n=!1),s=l.look_ahead,u=[],function(){var s=e.new_brk();try{d(f(i=t)?i:$(Z,"MAX_INT"),"times",[],(o=function(){var t,i=o.$$s||this;if(null==i.lineno&&(i.lineno=a),f(t=f(n)?i.$shift():i.$read_line()))return u["$<<"](t);f(n)&&(i.lineno=r(i.lineno,1)),e.brk(a,s)},o.$$s=l,o.$$brk=s,o.$$arity=0,o))}catch(c){if(c===s)return c.$v;throw c}}(),f(u["$empty?"]())||(l.$unshift_all(u),f(n)&&(l.look_ahead=s)),u},g.$$arity=-1),e.def(J,"$read_line",v=function(){var e,t=this;return f(f(e=n(t.look_ahead,0))?e:t["$has_more_lines?"]())?t.$shift():a},v.$$arity=0),e.def(J,"$read_lines",b=function(){var e=a;for(e=[];f(this["$has_more_lines?"]());)e["$<<"](this.$shift());return e},b.$$arity=0),e.alias(J,"readlines","read_lines"),e.def(J,"$read",w=function(){return this.$read_lines().$join($(Z,"LF"))},w.$$arity=0),e.def(J,"$advance",x=function(){return!!f(this.$shift())},x.$$arity=0),e.def(J,"$unshift_line",k=function(e){return this.$unshift(e),a},k.$$arity=1),e.alias(J,"restore_line","unshift_line"),e.def(J,"$unshift_lines",E=function(e){return this.$unshift_all(e)},E.$$arity=1),e.alias(J,"restore_lines","unshift_lines"),e.def(J,"$replace_next_line",O=function(e){return this.$shift(),this.$unshift(e),!0},O.$$arity=1),e.alias(J,"replace_line","replace_next_line"),e.def(J,"$skip_blank_lines",A=function(){var e=this,n=a,r=a;if(f(e["$empty?"]()))return a;for(n=0;f(r=e.$peek_line());){if(!f(r["$empty?"]()))return n;e.$shift(),n=t(n,1)}},A.$$arity=0),e.def(J,"$skip_comment_lines",S=function(){var e,t,r,i=this,o=a,s=a;if(f(i["$empty?"]()))return a;for(;f(f(e=o=i.$peek_line())?o["$empty?"]()["$!"]():e)&&f(o["$start_with?"]("//"));)if(f(o["$start_with?"]("///"))){if(!f(f(e=n(s=o.$length(),3))?o["$=="]((t="/",r=s,"number"===typeof t&&"number"===typeof r?t*r:t["$*"](r))):e))break;i.$read_lines_until(c(["terminator","skip_first_line","read_last_line","skip_processing","context"],{terminator:o,skip_first_line:!0,read_last_line:!0,skip_processing:!0,context:"comment"}))}else i.$shift();return a},S.$$arity=0),e.def(J,"$skip_line_comments",C=function(){var e,t=this,n=a,r=a;if(f(t["$empty?"]()))return[];for(n=[];f(f(e=r=t.$peek_line())?r["$empty?"]()["$!"]():e)&&f(r["$start_with?"]("//"));)n["$<<"](t.$shift());return n},C.$$arity=0),e.def(J,"$terminate",R=function(){var e=this;return e.lineno=t(e.lineno,e.lines.$size()),e.lines.$clear(),e.look_ahead=0,a},R.$$arity=0),e.def(J,"$read_lines_until",T=function(t){var n,i,o,s,l,u,p,_=T.$$p,h=_||a,m=this,y=a,g=a,v=a,b=a,w=a,x=a,k=a,E=a,O=a,A=a,S=a;for(_&&(T.$$p=null),null==t&&(t=c([],{})),y=[],f(f(n=m.process_lines)?t["$[]"]("skip_processing"):n)&&(m.process_lines=!1,g=!0),f(v=t["$[]"]("terminator"))?(b=f(n=t["$[]"]("cursor"))?n:m.$cursor(),w=!1,x=!1):(w=t["$[]"]("break_on_blank_lines"),x=t["$[]"]("break_on_list_continuation")),p=t["$[]"]("skip_line_comments"),k=E=a,f(t["$[]"]("skip_first_line"))&&m.$shift();f(O=m.$read_line());){if(f(f(v)?O["$=="](v):f(i=f(o=f(s=w)?O["$empty?"]():s)?o:f(s=f(l=f(u=x)?k:u)?O["$=="]($(Z,"LIST_CONTINUATION")):l)?(A=["preserve_last_line",!0],d(t,"[]=",e.to_a(A)),A[r(A.length,1)]):s)?i:(o=h!==a)?e.yield1(h,O):h!==a)){f(t["$[]"]("read_last_line"))&&y["$<<"](O),f(t["$[]"]("preserve_last_line"))&&(m.$unshift(O),E=!0);break}f(f(i=f(o=p)?O["$start_with?"]("//"):o)?O["$start_with?"]("///")["$!"]():i)||(y["$<<"](O),k=!0)}return f(g)&&(m.process_lines=!0,f(f(n=E)?v["$!"]():n)&&(m.look_ahead=r(m.look_ahead,1))),f(f(n=f(i=v)?v["$!="](O):i)?S=t.$fetch("context",v):n)&&(b["$=="]("at_mark")&&(b=m.$cursor_at_mark()),m.$logger().$warn(m.$message_with_context("unterminated "+S+" block",c(["source_location"],{source_location:b}))),m.unterminated=!0),y},T.$$arity=-1),e.def(J,"$shift",I=function(){var e=this;return e.lineno=t(e.lineno,1),e.look_ahead["$=="](0)||(e.look_ahead=r(e.look_ahead,1)),e.lines.$pop()},I.$$arity=0),e.def(J,"$unshift",N=function(e){var n=this;return n.lineno=r(n.lineno,1),n.look_ahead=t(n.look_ahead,1),n.lines.$push(e),a},N.$$arity=1),s("::","RUBY_ENGINE")["$=="]("jruby")?e.def(J,"$unshift_all",L=function(n){var i,o=this;return o.lineno=r(o.lineno,n.$size()),o.look_ahead=t(o.look_ahead,n.$size()),f(n["$respond_to?"]("reverse"))?d(o.lines,"push",e.to_a(n.$reverse())):d(n,"reverse_each",[],(i=function(e){var t=i.$$s||this;return null==t.lines&&(t.lines=a),null==e&&(e=a),t.lines.$push(e)},i.$$s=o,i.$$arity=1,i)),a},L.$$arity=1):e.def(J,"$unshift_all",D=function(n){var i=this;return i.lineno=r(i.lineno,n.$size()),i.look_ahead=t(i.look_ahead,n.$size()),d(i.lines,"push",e.to_a(n.$reverse())),a},D.$$arity=1),e.def(J,"$cursor",P=function(){var e=this;return $(Z,"Cursor").$new(e.file,e.dir,e.path,e.lineno)},P.$$arity=0),e.def(J,"$cursor_at_line",M=function(e){var t=this;return $(Z,"Cursor").$new(t.file,t.dir,t.path,e)},M.$$arity=1),e.def(J,"$cursor_at_mark",z=function(){var t=this;return f(t.mark)?d($(Z,"Cursor"),"new",e.to_a(t.mark)):t.$cursor()},z.$$arity=0),e.def(J,"$cursor_before_mark",F=function(){var t,n,i=this,o=a,s=a,l=a,u=a;return f(i.mark)?(n=i.mark,o=null==(t=e.to_ary(n))[0]?a:t[0],s=null==t[1]?a:t[1],l=null==t[2]?a:t[2],u=null==t[3]?a:t[3],$(Z,"Cursor").$new(o,s,l,r(u,1))):$(Z,"Cursor").$new(i.file,i.dir,i.path,r(i.lineno,1))},F.$$arity=0),e.def(J,"$cursor_at_prev_line",j=function(){var e=this;return $(Z,"Cursor").$new(e.file,e.dir,e.path,r(e.lineno,1))},j.$$arity=0),e.def(J,"$mark",B=function(){var e=this;return e.mark=[e.file,e.dir,e.path,e.lineno]},B.$$arity=0),e.def(J,"$line_info",q=function(){return this.path+": line "+this.lineno},q.$$arity=0),e.def(J,"$lines",U=function(){return this.lines.$reverse()},U.$$arity=0),e.def(J,"$string",H=function(){return this.lines.$reverse().$join($(Z,"LF"))},H.$$arity=0),e.def(J,"$source",Y=function(){return this.source_lines.$join($(Z,"LF"))},Y.$$arity=0),e.def(J,"$save",W=function(){var t;return this.saved=d(c([],{}),"tap",[],(t=function(n){var i,o=t.$$s||this;return null==n&&(n=a),d(o.$instance_variables(),"each",[],(i=function(t){var o,$=i.$$s||this,l=a,u=a;return null==t&&(t=a),f(f(o=t["$=="]("@saved"))?o:t["$=="]("@source_lines"))?a:(l=[t,f(s("::","Array")["$==="](u=$.$instance_variable_get(t)))?u.$drop(0):u],d(n,"[]=",e.to_a(l)),l[r(l.length,1)])},i.$$s=o,i.$$arity=1,i))},t.$$s=this,t.$$arity=1,t)),a},W.$$arity=0),e.def(J,"$restore_save",V=function(){var e,t=this;return f(t.saved)?(d(t.saved,"each",[],(e=function(t,n){var r=e.$$s||this;return null==t&&(t=a),null==n&&(n=a),r.$instance_variable_set(t,n)},e.$$s=t,e.$$arity=2,e)),t.saved=a):a},V.$$arity=0),e.def(J,"$discard_save",K=function(){return this.saved=a},K.$$arity=0),e.def(J,"$to_s",G=function(){var e=this;return"#<"+e.$class()+"@"+e.$object_id()+" {path: "+e.path.$inspect()+", line: "+e.lineno+"}>"},G.$$arity=0),J.$private(),e.def(J,"$prepare_lines",X=function(t,n){var r=a;null==n&&(n=c([],{}));try{return f(r=n["$[]"]("normalize"))?f(s("::","Array")["$==="](t))?$(Z,"Helpers").$prepare_source_array(t,r["$!="]("chomp")):$(Z,"Helpers").$prepare_source_string(t,r["$!="]("chomp")):f(s("::","Array")["$==="](t))?t.$drop(0):f(t)?t.$chomp().$split($(Z,"LF"),-1):[]}catch(i){if(!e.rescue(i,[$(Z,"StandardError")]))throw i;try{return f((f(s("::","Array")["$==="](t))?t.$join():t.$to_s())["$valid_encoding?"]())?this.$raise():this.$raise(s("::","ArgumentError"),"source is either binary or contains invalid Unicode data")}finally{e.pop_exception()}}},X.$$arity=-2),e.def(J,"$process_line",Q=function(e){var n=this;return f(n.process_lines)&&(n.look_ahead=t(n.look_ahead,1)),e},Q.$$arity=1)}(m[0],0,m),function(o,l,h){var m,y,g,v,b,w,x,k,E,O,A,S,C,R,T,I,N,L,D,P,M=u(o,l,"PreprocessorReader"),z=[M].concat(h);M.$$prototype.include_stack=M.$$prototype.lines=M.$$prototype.file=M.$$prototype.dir=M.$$prototype.path=M.$$prototype.lineno=M.$$prototype.maxdepth=M.$$prototype.process_lines=M.$$prototype.includes=M.$$prototype.document=M.$$prototype.unescape_next_line=M.$$prototype.include_processor_extensions=M.$$prototype.look_ahead=M.$$prototype.skipping=M.$$prototype.conditional_stack=a,M.$attr_reader("include_stack"),e.def(M,"$initialize",m=function(t,r,i,o){var s,$,l=m.$$p,u=this;return l&&(m.$$p=null),null==r&&(r=a),null==i&&(i=a),null==o&&(o=c([],{})),u.document=t,d(u,e.find_super_dispatcher(u,"initialize",m,!1),[r,i,o],null),f(n($=(f(s=t.$attributes()["$[]"]("max-include-depth"))?s:64).$to_i(),0))?u.maxdepth=c(["abs","curr","rel"],{abs:$,curr:$,rel:$}):u.maxdepth=a,u.include_stack=[],u.includes=t.$catalog()["$[]"]("includes"),u.skipping=!1,u.conditional_stack=[],u.include_processor_extensions=a},m.$$arity=-2),e.def(M,"$has_more_lines?",y=function(){return!!f(this.$peek_line())},y.$$arity=0),e.def(M,"$empty?",g=function(){return!f(this.$peek_line())},g.$$arity=0),e.alias(M,"eof?","empty?"),e.def(M,"$peek_line",v=function(t){var n=v.$$p,r=this,i=a,o=a,s=a,$=a;for(n&&(v.$$p=null),s=0,$=arguments.length,o=new Array($);s<$;s++)o[s]=arguments[s];return null==t&&(t=!1),f(i=d(r,e.find_super_dispatcher(r,"peek_line",v,!1),o,n))?i:f(r.include_stack["$empty?"]())?a:(r.$pop_include(),r.$peek_line(t))},v.$$arity=-1),e.def(M,"$push_include",b=function(i,o,l,u,p){var _,h=this,m=a,y=a,g=a,v=a,b=a,w=a;return null==o&&(o=a),null==l&&(l=a),null==u&&(u=1),null==p&&(p=c([],{})),h.include_stack["$<<"]([h.lines,h.file,h.dir,h.path,h.lineno,h.maxdepth,h.process_lines]),f(h.file=o)?(f(s("::","String")["$==="](o))?h.dir=s("::","File").$dirname(o):f($(z,"RUBY_ENGINE_OPAL"))?h.dir=s("::","URI").$parse(s("::","File").$dirname(o=o.$to_s())):(m=[(y=s("::","File").$dirname(o.$path()))["$=="]("/")?"":y],d(h.dir=o.$dup(),"path=",e.to_a(m)),m[r(m.length,1)],o=o.$to_s()),h.path=l=f(_=l)?_:s("::","File").$basename(o),f(h.process_lines=d(o,"end_with?",e.to_a($(z,"ASCIIDOC_EXTENSIONS").$keys())))&&(m=[l.$slice(0,l.$rindex(".")),!f(p["$[]"]("partial-option"))||a],d(h.includes,"[]=",e.to_a(m)),m[r(m.length,1)])):(h.dir=".",h.process_lines=!0,f(h.path=l)?(m=[$(z,"Helpers").$rootname(l),!f(p["$[]"]("partial-option"))||a],d(h.includes,"[]=",e.to_a(m)),m[r(m.length,1)]):h.path="<stdin>"),h.lineno=u,f(f(_=h.maxdepth)?p["$key?"]("depth"):_)&&(f(n(g=p["$[]"]("depth").$to_i(),0))?(f(n(v=t(h.include_stack.$size(),g),b=h.maxdepth["$[]"]("abs")))&&(v=g=b),h.maxdepth=c(["abs","curr","rel"],{abs:b,curr:v,rel:g})):h.maxdepth=c(["abs","curr","rel"],{abs:h.maxdepth["$[]"]("abs"),curr:h.include_stack.$size(),rel:0})),f((h.lines=h.$prepare_lines(i,c(["normalize","condense","indent"],{normalize:f(_=h.process_lines)?_:"chomp",condense:!1,indent:p["$[]"]("indent")})))["$empty?"]())?h.$pop_include():(f(p["$key?"]("leveloffset"))?(h.lines=t(t([f(w=h.document.$attr("leveloffset"))?":leveloffset: "+w:":leveloffset!:",""],h.lines.$reverse()),["",":leveloffset: "+p["$[]"]("leveloffset")]),h.lineno=r(h.lineno,2)):h.lines["$reverse!"](),h.look_ahead=0),h},b.$$arity=-2),e.def(M,"$include_depth",w=function(){return this.include_stack.$size()},w.$$arity=0),e.def(M,"$exceeds_max_depth?",x=function(){var e,t,n=this;return f(e=f(t=n.maxdepth)?i(n.include_stack.$size(),n.maxdepth["$[]"]("curr")):t)?n.maxdepth["$[]"]("rel"):e},x.$$arity=0),e.alias(M,"exceeded_max_depth?","exceeds_max_depth?"),e.def(M,"$shift",k=function(){var t=k.$$p,n=this,r=a,i=a,o=a,s=a;for(t&&(k.$$p=null),o=0,s=arguments.length,i=new Array(s);o<s;o++)i[o]=arguments[o];return f(n.unescape_next_line)?(n.unescape_next_line=!1,(r=d(n,e.find_super_dispatcher(n,"shift",k,!1),i,t)).$slice(1,r.$length())):d(n,e.find_super_dispatcher(n,"shift",k,!1),i,t)},k.$$arity=0),e.def(M,"$include_processors?",E=function(){var e,t=this;return f(t.include_processor_extensions["$nil?"]())?f(f(e=t.document["$extensions?"]())?t.document.$extensions()["$include_processors?"]():e)?(t.include_processor_extensions=t.document.$extensions().$include_processors())["$!"]()["$!"]():t.include_processor_extensions=!1:t.include_processor_extensions["$!="](!1)},E.$$arity=0),e.def(M,"$create_include_cursor",O=function(e,t,n){var r=a;return f(s("::","String")["$==="](e))?r=s("::","File").$dirname(e):f($(z,"RUBY_ENGINE_OPAL"))?r=s("::","File").$dirname(e=e.$to_s()):(r=(r=s("::","File").$dirname(e.$path()))["$=="]("")?"/":r,e=e.$to_s()),$(z,"Cursor").$new(e,r,t,n)},O.$$arity=3),e.def(M,"$to_s",A=function(){var e,t=this;return"#<"+t.$class()+"@"+t.$object_id()+" {path: "+t.path.$inspect()+", line: "+t.lineno+", include depth: "+t.include_stack.$size()+", include stack: ["+d(t.include_stack,"map",[],(e=function(t){return e.$$s,null==t&&(t=a),t.$to_s()},e.$$s=t,e.$$arity=1,e)).$join(", ")+"]}>"},A.$$arity=0),M.$private(),e.def(M,"$prepare_lines",S=function(t,n){var i,o,s=S.$$p,l=this,u=a,p=a,_=a,h=a,m=a,y=a,g=a;for(s&&(S.$$p=null),y=0,g=arguments.length,m=new Array(g);y<g;y++)m[y]=arguments[y];if(null==n&&(n=c([],{})),u=d(l,e.find_super_dispatcher(l,"prepare_lines",S,!1),m,s),f(f(i=f(o=l.document)?l.document.$attributes()["$[]"]("skip-front-matter"):o)?p=l["$skip_front_matter!"](u):i)&&(_=["front-matter",p.$join($(z,"LF"))],d(l.document.$attributes(),"[]=",e.to_a(_)),_[r(_.length,1)]),f(n.$fetch("condense",!0)))for(;f(f(o=h=u["$[]"](-1))?h["$empty?"]():o);)u.$pop();return f(n["$[]"]("indent"))&&$(z,"Parser")["$adjust_indentation!"](u,n["$[]"]("indent").$to_i(),l.document.$attr("tabsize").$to_i()),u},S.$$arity=-2),e.def(M,"$process_line",C=function(e){var n,r,i=this;return f(i.process_lines)?f(e["$empty?"]())?(i.look_ahead=t(i.look_ahead,1),e):f(f(n=f(r=e["$end_with?"]("]"))?e["$start_with?"]("[")["$!"]():r)?e["$include?"]("::"):n)?f(f(n=e["$include?"]("if"))?$(z,"ConditionalDirectiveRx")["$=~"](e):n)?((n=p["~"])===a?a:n["$[]"](1))["$=="]("\\")?(i.unescape_next_line=!0,i.look_ahead=t(i.look_ahead,1),e.$slice(1,e.$length())):f(i.$preprocess_conditional_directive((n=p["~"])===a?a:n["$[]"](2),(n=p["~"])===a?a:n["$[]"](3),(n=p["~"])===a?a:n["$[]"](4),(n=p["~"])===a?a:n["$[]"](5)))?(i.$shift(),a):(i.look_ahead=t(i.look_ahead,1),e):f(i.skipping)?(i.$shift(),a):f(f(n=e["$start_with?"]("inc","\\inc"))?$(z,"IncludeDirectiveRx")["$=~"](e):n)?((n=p["~"])===a?a:n["$[]"](1))["$=="]("\\")?(i.unescape_next_line=!0,i.look_ahead=t(i.look_ahead,1),e.$slice(1,e.$length())):f(i.$preprocess_include_directive((n=p["~"])===a?a:n["$[]"](2),(n=p["~"])===a?a:n["$[]"](3)))?a:(i.look_ahead=t(i.look_ahead,1),e):(i.look_ahead=t(i.look_ahead,1),e):f(i.skipping)?(i.$shift(),a):(i.look_ahead=t(i.look_ahead,1),e):e},C.$$arity=1),e.def(M,"$preprocess_conditional_directive",R=function(t,n,i,o){var s,l,u,_,h,m,y=this,g=a,v=a,b=a,w=a,x=a,k=a;if(f(m=n["$empty?"]())||(n=n.$downcase()),t["$=="]("endif"))return f(o)?y.$logger().$error(y.$message_with_context("malformed preprocessor directive - text not permitted: endif::"+n+"["+o+"]",c(["source_location"],{source_location:y.$cursor()}))):f(y.conditional_stack["$empty?"]())?y.$logger().$error(y.$message_with_context("unmatched preprocessor directive: endif::"+n+"[]",c(["source_location"],{source_location:y.$cursor()}))):f(f(s=m)?s:n["$=="]((g=y.conditional_stack["$[]"](-1))["$[]"]("target")))?(y.conditional_stack.$pop(),y.skipping=!f(y.conditional_stack["$empty?"]())&&y.conditional_stack["$[]"](-1)["$[]"]("skipping")):y.$logger().$error(y.$message_with_context("mismatched preprocessor directive: endif::"+n+"[], expected endif::"+g["$[]"]("target")+"[]",c(["source_location"],{source_location:y.$cursor()}))),!0;if(f(y.skipping))v=!1;else if("ifdef"["$==="](b=t)){if(f(m))return y.$logger().$error(y.$message_with_context("malformed preprocessor directive - missing target: ifdef::["+o+"]",c(["source_location"],{source_location:y.$cursor()}))),!0;v=","["$==="](b=i)?d(n.$split(",",-1),"none?",[],(l=function(e){var t=l.$$s||this;return null==t.document&&(t.document=a),null==e&&(e=a),t.document.$attributes()["$key?"](e)},l.$$s=y,l.$$arity=1,l)):"+"["$==="](b)?d(n.$split("+",-1),"any?",[],(u=function(e){var t=u.$$s||this;return null==t.document&&(t.document=a),null==e&&(e=a),t.document.$attributes()["$key?"](e)["$!"]()},u.$$s=y,u.$$arity=1,u)):y.document.$attributes()["$key?"](n)["$!"]()}else if("ifndef"["$==="](b)){if(f(m))return y.$logger().$error(y.$message_with_context("malformed preprocessor directive - missing target: ifndef::["+o+"]",c(["source_location"],{source_location:y.$cursor()}))),!0;v=","["$==="](b=i)?d(n.$split(",",-1),"any?",[],(_=function(e){var t=_.$$s||this;return null==t.document&&(t.document=a),null==e&&(e=a),t.document.$attributes()["$key?"](e)},_.$$s=y,_.$$arity=1,_)):"+"["$==="](b)?d(n.$split("+",-1),"all?",[],(h=function(e){var t=h.$$s||this;return null==t.document&&(t.document=a),null==e&&(e=a),t.document.$attributes()["$key?"](e)},h.$$s=y,h.$$arity=1,h)):y.document.$attributes()["$key?"](n)}else if("ifeval"["$==="](b)){if(!f(m))return y.$logger().$error(y.$message_with_context("malformed preprocessor directive - target not permitted: ifeval::"+n+"["+o+"]",c(["source_location"],{source_location:y.$cursor()}))),!0;if(!f(f(s=o)?$(z,"EvalExpressionRx")["$=~"](o.$strip()):s))return y.$logger().$error(y.$message_with_context("malformed preprocessor directive - "+(f(o)?"invalid expression":"missing expression")+": ifeval::["+o+"]",c(["source_location"],{source_location:y.$cursor()}))),!0;w=(s=p["~"])===a?a:s["$[]"](1),x=(s=p["~"])===a?a:s["$[]"](2),k=(s=p["~"])===a?a:s["$[]"](3),v=function(){try{return!f(y.$resolve_expr_val(w).$send(x,y.$resolve_expr_val(k)))}catch(t){if(!e.rescue(t,[$(z,"StandardError")]))throw t;try{return!0}finally{e.pop_exception()}}}()}return f(f(s=t["$=="]("ifeval"))?s:o["$!"]())?(f(v)&&(y.skipping=!0),y.conditional_stack["$<<"](c(["target","skip","skipping"],{target:n,skip:v,skipping:y.skipping}))):f(f(s=y.skipping)?s:v)||(y.$replace_next_line(o.$rstrip()),y.$unshift(""),f(o["$start_with?"]("include::"))&&(y.look_ahead=r(y.look_ahead,1))),!0},R.$$arity=4),e.def(M,"$preprocess_include_directive",T=function(o,l){var u,h,m,y,g,v,b,w,x,k,E,O=this,A=a,S=a,C=a,R=a,T=a,I=a,N=a,L=a,D=a,P=a,M=a,F=a,j=a,B=a,q=a,U=a,H=a,Y=a,W=a,V=a,K=a,G=a,X=a,Q=a,J=a,Z=a,ee=a,te=a;if(A=O.document,f(f(u=(S=o)["$include?"]($(z,"ATTR_REF_HEAD")))?(S=A.$sub_attributes(o,c(["attribute_missing"],{attribute_missing:(C=f(h=A.$attributes()["$[]"]("attribute-missing"))?h:$(z,"Compliance").$attribute_missing())["$=="]("warn")?"drop-line":C})))["$empty?"]():u))return f((u=C["$=="]("drop-line"))?A.$sub_attributes(t(o," "),c(["attribute_missing","drop_line_severity"],{attribute_missing:"drop-line",drop_line_severity:"ignore"}))["$empty?"]():C["$=="]("drop-line"))?(d(O.$logger(),"info",[],(m=function(){var e=m.$$s||this;return e.$message_with_context("include dropped due to missing attribute: include::"+o+"["+l+"]",c(["source_location"],{source_location:e.$cursor()}))},m.$$s=O,m.$$arity=0,m)),O.$shift(),!0):f(A.$parse_attributes(l,[],c(["sub_input"],{sub_input:!0}))["$[]"]("optional-option"))?(d(O.$logger(),"info",[],(y=function(){var e=y.$$s||this;return e.$message_with_context("optional include dropped "+(f(C["$=="]("warn")?A.$sub_attributes(t(o," "),c(["attribute_missing","drop_line_severity"],{attribute_missing:"drop-line",drop_line_severity:"ignore"}))["$empty?"]():C["$=="]("warn"))?"due to missing attribute":"because resolved target is blank")+": include::"+o+"["+l+"]",c(["source_location"],{source_location:e.$cursor()}))},y.$$s=O,y.$$arity=0,y)),O.$shift(),!0):(O.$logger().$warn(O.$message_with_context("include dropped "+(f((u=C["$=="]("warn"))?A.$sub_attributes(t(o," "),c(["attribute_missing","drop_line_severity"],{attribute_missing:"drop-line",drop_line_severity:"ignore"}))["$empty?"]():C["$=="]("warn"))?"due to missing attribute":"because resolved target is blank")+": include::"+o+"["+l+"]",c(["source_location"],{source_location:O.$cursor()}))),O.$replace_next_line("Unresolved directive in "+O.path+" - include::"+o+"["+l+"]"));if(f(f(u=O["$include_processors?"]())?R=d(O.include_processor_extensions,"find",[],((g=function(e){return g.$$s,null==e&&(e=a),e.$instance()["$handles?"](S)}).$$s=O,g.$$arity=1,g)):u))return O.$shift(),R.$process_method()["$[]"](A,O,S,A.$parse_attributes(l,[],c(["sub_input"],{sub_input:!0}))),!0;if(f(i(A.$safe(),s($(z,"SafeMode"),"SECURE"))))return O.$replace_next_line("link:"+S+"[]");if(f(O.maxdepth)){if(f(i(O.include_stack.$size(),O.maxdepth["$[]"]("curr"))))return O.$logger().$error(O.$message_with_context("maximum include depth of "+O.maxdepth["$[]"]("rel")+" exceeded",c(["source_location"],{source_location:O.$cursor()}))),a;if(T=A.$parse_attributes(l,[],c(["sub_input"],{sub_input:!0})),h=O.$resolve_include_path(S,l,T),u=e.to_ary(h),I=null==u[0]?a:u[0],N=null==u[1]?a:u[1],L=null==u[2]?a:u[2],"file"["$==="](D=N))P=s("::","File").$method("open"),M=$(z,"FILE_READ_MODE");else{if(!"uri"["$==="](D))return I;P=s("::","OpenURI").$method("open_uri"),M=$(z,"URI_READ_MODE")}if(f($(z,"RUBY_ENGINE_OPAL"))||f(f(u=F=T["$[]"]("encoding"))?function(){try{return s("::","Encoding").$find(F)}catch(t){if(!e.rescue(t,[$(z,"StandardError")]))throw t;try{return a}finally{e.pop_exception()}}}():u)&&(j=[1,F],d(B=M.$split(":"),"[]=",e.to_a(j)),j[r(j.length,1)],M=B.$join(":")),q=U=a,f(l)&&(f(T["$key?"]("lines"))?(q=[],d(O.$split_delimited_value(T["$[]"]("lines")),"each",[],((v=function(n){v.$$s;var r,i,o=a,$=a;return null==n&&(n=a),f(n["$include?"](".."))?(i=n.$partition(".."),r=e.to_ary(i),o=null==r[0]?a:r[0],null==r[1]||r[1],$=null==r[2]?a:r[2],q=t(q,function(){return f(f(r=$["$empty?"]())?r:(t=$=$.$to_i(),n=0,"number"===typeof t&&"number"===typeof n?t<n:t["$<"](n)))?[o.$to_i(),s(s("::","Float"),"INFINITY")]:e.Range.$new(o.$to_i(),$,!1).$to_a();var t,n}())):q["$<<"](n.$to_i())}).$$s=O,v.$$arity=1,v)),q=f(q["$empty?"]())?a:q.$sort().$uniq()):f(T["$key?"]("tag"))?f(f(u=(H=T["$[]"]("tag"))["$empty?"]())?u:H["$=="]("!"))||(U=f(H["$start_with?"]("!"))?_(H.$slice(1,H.$length()),!1):_(H,!0)):f(T["$key?"]("tags"))&&(U=c([],{}),d(O.$split_delimited_value(T["$[]"]("tags")),"each",[],((b=function(t){var n;return b.$$s,null==t&&(t=a),f(f(n=t["$empty?"]())?n:t["$=="]("!"))?a:f(t["$start_with?"]("!"))?(j=[t.$slice(1,t.$length()),!1],d(U,"[]=",e.to_a(j)),j[r(j.length,1)]):(j=[t,!0],d(U,"[]=",e.to_a(j)),j[r(j.length,1)])}).$$s=O,b.$$arity=1,b)),f(U["$empty?"]())&&(U=a))),f(q)){Y=(u=[[],a,0])[0],W=u[1],V=u[2];try{!function(){var n=e.new_brk();try{d(P,"call",[I,M],(w=function(n){var r,i=w.$$s||this,o=a;return null==n&&(n=a),o=a,function(){var $=e.new_brk();try{return d(n,"each_line",[],(r=function(n){r.$$s;var i,l,u=a;return null==n&&(n=a),V=t(V,1),f(f(i=o)?i:f(l=s("::","Float")["$==="](u=q["$[]"](0)))?o=u["$infinite?"]():l)?(W=f(i=W)?i:V,Y["$<<"](n)):(u["$=="](V)&&(W=f(i=W)?i:V,Y["$<<"](n),q.$shift()),f(q["$empty?"]())?void e.brk(a,$):a)},r.$$s=i,r.$$brk=$,r.$$arity=1,r))}catch(l){if(l===$)return l.$v;throw l}}()},w.$$s=O,w.$$brk=n,w.$$arity=1,w))}catch(r){if(r===n)return r.$v;throw r}}()}catch(ne){if(!e.rescue(ne,[$(z,"StandardError")]))throw ne;try{return O.$logger().$error(O.$message_with_context("include "+N+" not readable: "+I,c(["source_location"],{source_location:O.$cursor()}))),O.$replace_next_line("Unresolved directive in "+O.path+" - include::"+S+"["+l+"]")}finally{e.pop_exception()}}O.$shift(),f(W)&&(j=["partial-option",""],d(T,"[]=",e.to_a(j)),j[r(j.length,1)],O.$push_include(Y,I,L,W,T))}else if(f(U)){u=[[],a,0,[],s("::","Set").$new(),a],Y=u[0],W=u[1],V=u[2],K=u[3],G=u[4],X=u[5],f(U["$key?"]("**"))?(Q=J=U.$delete("**"),f(U["$key?"]("*"))?Z=U.$delete("*"):f(f(u=Q["$!"]())?U.$values().$first()["$=="](!1):u)&&(Z=!0)):f(U["$key?"]("*"))?U.$keys().$first()["$=="]("*")?Q=J=(Z=U.$delete("*"))["$!"]():(Q=J=!1,Z=U.$delete("*")):Q=J=U["$value?"](!0)["$!"]();try{d(P,"call",[I,M],(x=function(n){var r,i,o,s,l=x.$$s||this;return null==n&&(n=a),o=(r=["::","[]"])[0],s=r[1],d(n,"each_line",[],(i=function(n){var r,l,u,_=i.$$s||this,h=a,m=a,y=a;return null==n&&(n=a),V=t(V,1),f(f(r=f(l=n["$include?"](o))?n["$include?"](s):l)?$(z,"TagDirectiveRx")["$=~"](n):r)?(h=(r=p["~"])===a?a:r["$[]"](2),f((r=p["~"])===a?a:r["$[]"](1))?h["$=="](X)?(K.$pop(),l=f(K["$empty?"]())?[a,J]:K["$[]"](-1),r=e.to_ary(l),X=null==r[0]?a:r[0],Q=null==r[1]?a:r[1],l):f(U["$key?"](h))?(m=_.$create_include_cursor(I,S,V),f(y=d(K,"rindex",[],((u=function(e){return u.$$s,null==e&&(e=a),e["$=="](h)}).$$s=_,u.$$arity=1,u.$$has_trailing_comma_in_args=!0,u)))?(y["$=="](0)?K.$shift():K.$delete_at(y),_.$logger().$warn(_.$message_with_context("mismatched end tag (expected '"+X+"' but found '"+h+"') at line "+V+" of include "+N+": "+I,c(["source_location","include_location"],{source_location:_.$cursor(),include_location:m})))):_.$logger().$warn(_.$message_with_context("unexpected end tag '"+h+"' at line "+V+" of include "+N+": "+I,c(["source_location","include_location"],{source_location:_.$cursor(),include_location:m})))):a:f(U["$key?"](h))?(G["$<<"](h),K["$<<"]([X=h,Q=U["$[]"](h),V])):f(Z["$nil?"]()["$!"]())?(Q=!f(f(r=X)?Q["$!"]():r)&&Z,K["$<<"]([X=h,Q,V])):a):f(Q)?(W=f(r=W)?r:V,Y["$<<"](n)):a},i.$$s=l,i.$$arity=1,i))},x.$$s=O,x.$$arity=1,x))}catch(ne){if(!e.rescue(ne,[$(z,"StandardError")]))throw ne;try{return O.$logger().$error(O.$message_with_context("include "+N+" not readable: "+I,c(["source_location"],{source_location:O.$cursor()}))),O.$replace_next_line("Unresolved directive in "+O.path+" - include::"+S+"["+l+"]")}finally{e.pop_exception()}}f(K["$empty?"]())||d(K,"each",[],(k=function(e,t,n){var r=k.$$s||this;return null==e&&(e=a),null==t&&(t=a),null==n&&(n=a),r.$logger().$warn(r.$message_with_context("detected unclosed tag '"+e+"' starting at line "+n+" of include "+N+": "+I,c(["source_location","include_location"],{source_location:r.$cursor(),include_location:r.$create_include_cursor(I,S,n)})))},k.$$s=O,k.$$arity=3,k)),f((ee=r(U.$keys(),G.$to_a()))["$empty?"]())||O.$logger().$warn(O.$message_with_context("tag"+(f(n(ee.$size(),1))?"s":"")+" '"+ee.$join(", ")+"' not found in include "+N+": "+I,c(["source_location"],{source_location:O.$cursor()}))),O.$shift(),f(W)&&(f(f(u=f(h=J)?Z["$!="](!1):h)?U["$empty?"]():u)||(j=["partial-option",""],d(T,"[]=",e.to_a(j)),j[r(j.length,1)]),O.$push_include(Y,I,L,W,T))}else try{te=d(P,"call",[I,M],((E=function(e){return E.$$s,null==e&&(e=a),e.$read()}).$$s=O,E.$$arity=1,E)),O.$shift(),O.$push_include(te,I,L,1,T)}catch(ne){if(!e.rescue(ne,[$(z,"StandardError")]))throw ne;try{return O.$logger().$error(O.$message_with_context("include "+N+" not readable: "+I,c(["source_location"],{source_location:O.$cursor()}))),O.$replace_next_line("Unresolved directive in "+O.path+" - include::"+S+"["+l+"]")}finally{e.pop_exception()}}return!0}return a},T.$$arity=2),e.def(M,"$resolve_include_path",I=function(e,t,n){var r,i,o,l=this,u=a,p=a,_=a;return u=l.document,f(f(r=$(z,"Helpers")["$uriish?"](e))?r:f(s("::","String")["$==="](l.dir))?a:e=l.dir+"/"+e)?f(u["$attr?"]("allow-uri-read"))?(f(u["$attr?"]("cache-uri"))?f((i=s("::","OpenURI","skip_raise"))&&(r=s(i,"Cache","skip_raise"))?"constant":a)||$(z,"Helpers").$require_library("open-uri/cached","open-uri-cached"):f($(z,"RUBY_ENGINE_OPAL")["$!"]())&&s("::","OpenURI"),[s("::","URI").$parse(e),"uri",e]):l.$replace_next_line("link:"+e+"["+t+"]"):(p=u.$normalize_system_path(e,l.dir,a,c(["target_name"],{target_name:"include file"})),f(s("::","File")["$file?"](p))?(_=u.$path_resolver().$relative_path(p,u.$base_dir()),[p,"file",_]):f(n["$[]"]("optional-option"))?(d(l.$logger(),"info",[],(o=function(){var e=o.$$s||this;return e.$message_with_context("optional include dropped because include file not found: "+p,c(["source_location"],{source_location:e.$cursor()}))},o.$$s=l,o.$$arity=0,o)),l.$shift(),!0):(l.$logger().$error(l.$message_with_context("include file not found: "+p,c(["source_location"],{source_location:l.$cursor()}))),l.$replace_next_line("Unresolved directive in "+l.path+" - include::"+e+"["+t+"]")))},I.$$arity=3),e.def(M,"$pop_include",N=function(){var t,n,r=this;return f(r.include_stack["$empty?"]())||(n=r.include_stack.$pop(),t=e.to_ary(n),r.lines=null==t[0]?a:t[0],r.file=null==t[1]?a:t[1],r.dir=null==t[2]?a:t[2],r.path=null==t[3]?a:t[3],r.lineno=null==t[4]?a:t[4],r.maxdepth=null==t[5]?a:t[5],r.process_lines=null==t[6]?a:t[6],r.look_ahead=0),a},N.$$arity=0),e.def(M,"$split_delimited_value",L=function(e){return f(e["$include?"](","))?e.$split(","):e.$split(";")},L.$$arity=1),e.def(M,"$skip_front_matter!",D=function(n,r){var i,o=this,s=a,$=a;if(null==r&&(r=!0),s=a,n["$[]"](0)["$=="]("---")){for($=n.$drop(0),n.$shift(),s=[],f(r)&&(o.lineno=t(o.lineno,1));f(f(i=n["$empty?"]()["$!"]())?n["$[]"](0)["$!="]("---"):i);)s["$<<"](n.$shift()),f(r)&&(o.lineno=t(o.lineno,1));f(n["$empty?"]())?(d(n,"unshift",e.to_a($)),f(r)&&(o.lineno=0),s=a):(n.$shift(),f(r)&&(o.lineno=t(o.lineno,1)))}return s},D.$$arity=-2),e.def(M,"$resolve_expr_val",P=function(e){var t,n,i=a;return f(f(t=f(n=e["$start_with?"]('"'))?e["$end_with?"]('"'):n)?t:f(n=e["$start_with?"]("'"))?e["$end_with?"]("'"):n)?(i=!0,e=e.$slice(1,r(e.$length(),1))):i=!1,f(e["$include?"]($(z,"ATTR_REF_HEAD")))&&(e=this.document.$sub_attributes(e,c(["attribute_missing"],{attribute_missing:"drop"}))),f(i)?e:f(e["$empty?"]())?a:!!e["$=="]("true")||!e["$=="]("false")&&(f(e.$rstrip()["$empty?"]())?" ":f(e["$include?"]("."))?e.$to_f():e.$to_i())},P.$$arity=1)}(m[0],$(m,"Reader"),m)}(o[0],o)},Opal.modules["asciidoctor/section"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e+t:e["$+"](t)}e.top;var n=[],r=e.nil,i=(e.const_get_qualified,e.const_get_relative),o=(e.breaker,e.slice,e.module),a=e.klass,s=e.hash2,$=e.send,l=e.truthy;return e.add_stubs(["$attr_accessor","$attr_reader","$===","$+","$level","$special","$generate_id","$title","$==","$>","$sectnum","$reftext","$!","$empty?","$sub_placeholder","$sub_quotes","$compat_mode","$[]","$attributes","$context","$assign_numeral","$class","$object_id","$inspect","$size","$length","$chr","$[]=","$-","$gsub","$downcase","$delete","$tr_s","$end_with?","$chop","$start_with?","$slice","$key?","$catalog","$unique_id_start_index"]),function(n,u){var c=[o(n,"Asciidoctor")].concat(u);!function(n,o,u){var c,f,d,p,_,h,m,y=a(n,o,"Section"),g=[y].concat(u);y.$$prototype.document=y.$$prototype.level=y.$$prototype.parent=y.$$prototype.numeral=y.$$prototype.numbered=y.$$prototype.sectname=y.$$prototype.title=y.$$prototype.blocks=r,y.$attr_accessor("index"),y.$attr_accessor("sectname"),y.$attr_accessor("special"),y.$attr_accessor("numbered"),y.$attr_reader("caption"),e.def(y,"$initialize",c=function(n,o,a,u){var f,d,p=c.$$p,_=this;return p&&(c.$$p=null),null==n&&(n=r),null==o&&(o=r),null==a&&(a=!1),null==u&&(u=s([],{})),$(_,e.find_super_dispatcher(_,"initialize",c,!1),[n,"section",u],null),l(i(g,"Section")["$==="](n))?(f=[l(d=o)?d:t(n.$level(),1),n.$special()],_.level=f[0],_.special=f[1]):(f=[l(d=o)?d:1,!1],_.level=f[0],_.special=f[1]),_.numbered=a,_.index=0},c.$$arity=-1),e.alias(y,"name","title"),e.def(y,"$generate_id",f=function(){return i(g,"Section").$generate_id(this.$title(),this.document)},f.$$arity=0),e.def(y,"$sectnum",d=function(e,t){var n,o,a,s=this;return null==e&&(e="."),null==t&&(t=r),t=l(n=t)?n:t["$=="](!1)?"":e,l(l((o=s.level,a=1,n="number"===typeof o&&"number"===typeof a?o>a:o["$>"](a)))?i(g,"Section")["$==="](s.parent):n)?""+s.parent.$sectnum(e,e)+s.numeral+t:""+s.numeral+t},d.$$arity=-1),e.def(y,"$xreftext",p=function(e){var t,n=this,i=r,o=r,a=r,s=r,$=r;return null==e&&(e=r),l(l(t=i=n.$reftext())?i["$empty?"]()["$!"]():t)?i:l(e)?l(n.numbered)?"full"["$==="](o=e)?(s=l(l(t=(a=n.sectname)["$=="]("chapter"))?t:a["$=="]("appendix"))?n.$sub_placeholder(n.$sub_quotes("_%s_"),n.$title()):n.$sub_placeholder(n.$sub_quotes(l(n.document.$compat_mode())?"``%s''":'"`%s`"'),n.$title()),l($=n.document.$attributes()["$[]"](a+"-refsig"))?$+" "+n.$sectnum(".",",")+" "+s:n.$sectnum(".",",")+" "+s):"short"["$==="](o)?l($=n.document.$attributes()["$[]"](n.sectname+"-refsig"))?$+" "+n.$sectnum(".",""):n.$sectnum(".",""):l(l(t=(a=n.sectname)["$=="]("chapter"))?t:a["$=="]("appendix"))?n.$sub_placeholder(n.$sub_quotes("_%s_"),n.$title()):n.$title():l(l(t=(a=n.sectname)["$=="]("chapter"))?t:a["$=="]("appendix"))?n.$sub_placeholder(n.$sub_quotes("_%s_"),n.$title()):n.$title():n.$title()},p.$$arity=-1),e.def(y,"$<<",_=function(t){var n=_.$$p,i=this,o=r,a=r,s=r;for(n&&(_.$$p=null),a=0,s=arguments.length,o=new Array(s);a<s;a++)o[a]=arguments[a];return t.$context()["$=="]("section")&&i.$assign_numeral(t),$(i,e.find_super_dispatcher(i,"<<",_,!1),o,n)},_.$$arity=1),e.def(y,"$to_s",h=function(){var t=h.$$p,n=this,i=r,o=r,a=r,s=r;for(t&&(h.$$p=null),a=0,s=arguments.length,o=new Array(s);a<s;a++)o[a]=arguments[a];return l(n.title)?(i=l(n.numbered)?n.$sectnum()+" "+n.title:n.title,"#<"+n.$class()+"@"+n.$object_id()+" {level: "+n.level+", title: "+i.$inspect()+", blocks: "+n.blocks.$size()+"}>"):$(n,e.find_super_dispatcher(n,"to_s",h,!1),o,t)},h.$$arity=0),e.defs(y,"$generate_id",m=function(n,o){var a,s,u,c,f=r,d=r,p=r,_=r,h=r,m=r,y=r,v=r,b=r,w=r;if(f=o.$attributes(),d=l(a=f["$[]"]("idprefix"))?a:"_",l(p=f["$[]"]("idseparator"))?l(l(a=p.$length()["$=="](1))?a:l(s=(_=p["$empty?"]())["$!"]())?(h=["idseparator",p.$chr()],$(f,"[]=",e.to_a(h)),p=h[(u=h.length,c=1,"number"===typeof u&&"number"===typeof c?u-c:u["$-"](c))]):s)&&(m=l(l(a=p["$=="]("-"))?a:p["$=="]("."))?" .-":" "+p+".-"):(p=(a=["_"," _.-"])[0],m=a[1]),y=""+d+n.$downcase().$gsub(i(g,"InvalidSectionIdCharsRx"),""),l(_)?y=y.$delete(" "):(y=y.$tr_s(m,p),l(y["$end_with?"](p))&&(y=y.$chop()),l(l(a=d["$empty?"]())?y["$start_with?"](p):a)&&(y=y.$slice(1,y.$length()))),l(o.$catalog()["$[]"]("refs")["$key?"](y))){for(v=o.$catalog()["$[]"]("refs"),b=i(g,"Compliance").$unique_id_start_index();l(v["$[]"](w=""+y+p+b));)b=t(b,1);return w}return y},m.$$arity=2)}(c[0],i(c,"AbstractBlock"),c)}(n[0],n)},Opal.modules["asciidoctor/stylesheets"]=function(e){e.top;var t=[],n=e.nil,r=e.const_get_qualified,i=e.const_get_relative,o=(e.breaker,e.slice,e.module),a=e.klass,s=e.truthy,$=e.hash2;return e.add_stubs(["$join","$new","$rstrip","$read","$primary_stylesheet_data","$write","$primary_stylesheet_name","$stylesheet_basename","$for","$read_stylesheet","$coderay_stylesheet_data","$coderay_stylesheet_name","$pygments_stylesheet_data","$pygments_stylesheet_name"]),function(t,l){var u=[o(t,"Asciidoctor")].concat(l);!function(t,o,l){var u,c,f,d,p,_,h,m,y,g,v,b,w,x=a(t,null,"Stylesheets"),k=[x].concat(l);x.$$prototype.primary_stylesheet_data=n,e.const_set(k[0],"DEFAULT_STYLESHEET_NAME","asciidoctor.css"),e.const_set(k[0],"STYLESHEETS_DIR",r("::","File").$join(i(k,"DATA_DIR"),"stylesheets")),x.__instance__=x.$new(),e.defs(x,"$instance",u=function(){var e=this;return null==e.__instance__&&(e.__instance__=n),e.__instance__},u.$$arity=0),e.def(x,"$primary_stylesheet_name",c=function(){return i(k,"DEFAULT_STYLESHEET_NAME")},c.$$arity=0),e.def(x,"$primary_stylesheet_data",f=function(){var e;return this.primary_stylesheet_data=s(e=this.primary_stylesheet_data)?e:r("::","File").$read(r("::","File").$join(i(k,"STYLESHEETS_DIR"),"asciidoctor-default.css"),$(["mode"],{mode:i(k,"FILE_READ_MODE")})).$rstrip()},f.$$arity=0),e.def(x,"$embed_primary_stylesheet",d=function(){return"<style>\n"+this.$primary_stylesheet_data()+"\n</style>"},d.$$arity=0),e.def(x,"$write_primary_stylesheet",p=function(e){return null==e&&(e="."),r("::","File").$write(r("::","File").$join(e,this.$primary_stylesheet_name()),this.$primary_stylesheet_data(),$(["mode"],{mode:i(k,"FILE_WRITE_MODE")}))},p.$$arity=-1),e.def(x,"$coderay_stylesheet_name",_=function(){return i(k,"SyntaxHighlighter").$for("coderay").$stylesheet_basename()},_.$$arity=0),e.def(x,"$coderay_stylesheet_data",h=function(){return i(k,"SyntaxHighlighter").$for("coderay").$read_stylesheet()},h.$$arity=0),e.def(x,"$embed_coderay_stylesheet",m=function(){return"<style>\n"+this.$coderay_stylesheet_data()+"\n</style>"},m.$$arity=0),e.def(x,"$write_coderay_stylesheet",y=function(e){return null==e&&(e="."),r("::","File").$write(r("::","File").$join(e,this.$coderay_stylesheet_name()),this.$coderay_stylesheet_data(),$(["mode"],{mode:i(k,"FILE_WRITE_MODE")}))},y.$$arity=-1),e.def(x,"$pygments_stylesheet_name",g=function(e){return null==e&&(e=n),i(k,"SyntaxHighlighter").$for("pygments").$stylesheet_basename(e)},g.$$arity=-1),e.def(x,"$pygments_stylesheet_data",v=function(e){return null==e&&(e=n),i(k,"SyntaxHighlighter").$for("pygments").$read_stylesheet(e)},v.$$arity=-1),e.def(x,"$embed_pygments_stylesheet",b=function(e){return null==e&&(e=n),"<style>\n"+this.$pygments_stylesheet_data(e)+"\n</style>"},b.$$arity=-1),e.def(x,"$write_pygments_stylesheet",w=function(e,t){return null==e&&(e="."),null==t&&(t=n),r("::","File").$write(r("::","File").$join(e,this.$pygments_stylesheet_name(t)),this.$pygments_stylesheet_data(t),$(["mode"],{mode:i(k,"FILE_WRITE_MODE")}))},w.$$arity=-1)}(u[0],0,u)}(t[0],t)},Opal.modules["asciidoctor/table"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e>t:e["$>"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e<t:e["$<"](t)}function r(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}function i(e,t){return"number"===typeof e&&"number"===typeof t?e*t:e["$*"](t)}function o(e,t){return"number"===typeof e&&"number"===typeof t?e/t:e["$/"](t)}function a(e,t){return"number"===typeof e&&"number"===typeof t?e+t:e["$+"](t)}e.top;var s=[],$=e.nil,l=e.const_get_qualified,u=e.const_get_relative,c=(e.breaker,e.slice,e.module),f=e.klass,d=e.hash2,p=e.send,_=e.truthy,h=e.gvars;return e.add_stubs(["$attr_accessor","$attr_reader","$new","$[]","$>","$to_i","$<","$==","$[]=","$-","$attributes","$truncate","$*","$/","$to_f","$empty?","$body","$each","$<<","$size","$+","$assign_column_widths","$warn","$logger","$update_attributes","$assign_width","$round","$map","$shift","$reinitialize","$head=","$nil?","$unshift","$pop","$foot=","$parent","$sourcemap","$dup","$header_row?","$table","$style","$merge","$delete","$===","$start_with?","$rstrip","$slice","$length","$advance","$lstrip","$strip","$split","$include?","$readlines","$catalog_inline_anchor","$=~","$apply_subs","$attr_writer","$convert","$text","$!=","$file","$lineno","$include","$to_set","$mark","$key?","$nested?","$document","$error","$message_with_context","$cursor_at_prev_line","$nil_or_empty?","$escape","$columns","$match","$chop","$end_with?","$gsub","$!","$push_cellspec","$cell_open?","$close_cell","$take_cellspec","$squeeze","$upto","$times","$cursor_before_mark","$rowspan","$activate_rowspan","$colspan","$end_of_row?","$close_row","$private","$rows","$effective_column_visits"]),function(s,m){var y=[c(s,"Asciidoctor")].concat(m);!function(s,l,c){var h,m,y,g,v,b=f(s,l,"Table"),w=[b].concat(c);b.$$prototype.attributes=b.$$prototype.document=b.$$prototype.has_header_option=b.$$prototype.rows=b.$$prototype.columns=$,e.const_set(w[0],"DEFAULT_PRECISION",4),function(t,n,r){var i,o,a,s=f(t,null,"Rows");[s].concat(r),s.$$prototype.head=s.$$prototype.body=s.$$prototype.foot=$,s.$attr_accessor("head","foot","body"),e.def(s,"$initialize",i=function(e,t,n){var r=this;return null==e&&(e=[]),null==t&&(t=[]),null==n&&(n=[]),r.head=e,r.foot=t,r.body=n},i.$$arity=-1),e.alias(s,"[]","send"),e.def(s,"$by_section",o=function(){var e=this;return[["head",e.head],["body",e.body],["foot",e.foot]]},o.$$arity=0),e.def(s,"$to_h",a=function(){var e=this;return d(["head","body","foot"],{head:e.head,body:e.body,foot:e.foot})},a.$$arity=0)}(w[0],0,w),b.$attr_accessor("columns"),b.$attr_accessor("rows"),b.$attr_accessor("has_header_option"),b.$attr_reader("caption"),e.def(b,"$initialize",h=function(a,s){var l,c,f=h.$$p,d=this,m=$,y=$,g=$,v=$;return f&&(h.$$p=null),p(d,e.find_super_dispatcher(d,"initialize",h,!1),[a,"table"],null),d.rows=u(w,"Rows").$new(),d.columns=[],d.has_header_option=!1,_(m=s["$[]"]("width"))?_(_(l=t(y=m.$to_i(),100))?l:n(y,1))&&(_((l=y["$=="](0))?_(c=m["$=="]("0"))?c:m["$=="]("0%"):y["$=="](0))||(y=100)):y=100,g=["tablepcwidth",y],p(d.attributes,"[]=",e.to_a(g)),g[r(g.length,1)],_(d.document.$attributes()["$[]"]("pagewidth"))&&(g=["tableabswidth",(v=i(o(y,100),d.document.$attributes()["$[]"]("pagewidth").$to_f()).$truncate(u(w,"DEFAULT_PRECISION")))["$=="](v.$to_i())?v.$to_i():v],p(d.attributes,"[]=",e.to_a(g)),g[r(g.length,1)]),_(s["$[]"]("rotate-option"))?(g=["orientation","landscape"],p(d.attributes,"[]=",e.to_a(g)),g[r(g.length,1)]):$},h.$$arity=2),e.def(b,"$header_row?",m=function(){var e,t;return _(_(e=t=this.has_header_option)?this.rows.$body()["$empty?"]():e)?t:$},m.$$arity=0),e.def(b,"$create_columns",y=function(i){var o,s,l,c=this,f=$,d=$,h=$,m=$;return f=[],d=$,h=0,p(i,"each",[],(o=function(e){var t,r,i=o.$$s||this;return null==e&&(e=$),r=e["$[]"]("width"),f["$<<"](u(w,"Column").$new(i,f.$size(),e)),_(n(r,0))?(d=_(t=d)?t:[])["$<<"](f["$[]"](-1)):h=a(h,r)},o.$$s=c,o.$$arity=1,o)),_(t(l=(c.columns=f).$size(),0))&&(m=["colcount",l],p(c.attributes,"[]=",e.to_a(m)),m[r(m.length,1)],_(_(s=t(h,0))?s:d)||(h=$),c.$assign_column_widths(h,d)),$},y.$$arity=1),e.def(b,"$assign_column_widths",g=function(e,n){var i,s,l,c,f=this,h=$,m=$,y=$,g=$;return null==e&&(e=$),null==n&&(n=$),c=u(w,"DEFAULT_PRECISION"),h=m=0,_(e)?(_(n)&&(_(t(e,100))?(y=0,f.$logger().$warn("total column width must not exceed 100% when using autowidth columns; got "+e+"%")):((y=o(r(100,e),n.$size()).$truncate(c)).$to_i()["$=="](y)&&(y=y.$to_i()),e=100),g=d(["width","autowidth-option"],{width:y,"autowidth-option":""}),p(n,"each",[],((i=function(e){return i.$$s,null==e&&(e=$),e.$update_attributes(g)}).$$s=f,i.$$arity=1,i))),p(f.columns,"each",[],((s=function(t){return s.$$s,null==t&&(t=$),h=a(h,m=t.$assign_width($,e,c))}).$$s=f,s.$$arity=1,s))):((m=o(100,f.columns.$size()).$truncate(c)).$to_i()["$=="](m)&&(m=m.$to_i()),p(f.columns,"each",[],((l=function(e){return l.$$s,null==e&&(e=$),h=a(h,e.$assign_width(m,$,c))}).$$s=f,l.$$arity=1,l))),h["$=="](100)||f.columns["$[]"](-1).$assign_width(a(r(100,h),m).$round(c),$,c),$},g.$$arity=-1),e.def(b,"$partition_header_footer",v=function(n){var i,o,a,s=this,l=$,u=$,c=$;return u=["rowcount",(c=s.rows.$body()).$size()],p(s.attributes,"[]=",e.to_a(u)),l=u[r(u.length,1)],_(t(l,0))&&(_(s.has_header_option)?(u=[[p(c.$shift(),"map",[],(i=function(e){return i.$$s,null==e&&(e=$),e.$reinitialize(!0)},i.$$s=s,i.$$arity=1,i))]],p(s.rows,"head=",e.to_a(u)),u[r(u.length,1)],l=r(l,1)):_(s.has_header_option["$nil?"]())&&(s.has_header_option=!1,c.$unshift(p(c.$shift(),"map",[],((o=function(e){return o.$$s,null==e&&(e=$),e.$reinitialize(!1)}).$$s=s,o.$$arity=1,o))))),_(_(a=t(l,0))?n["$[]"]("footer-option"):a)&&(u=[[c.$pop()]],p(s.rows,"foot=",e.to_a(u)),u[r(u.length,1)]),$},v.$$arity=1)}(y[0],u(y,"AbstractBlock"),y),function(t,n,s){var l,u,c,h,m=f(t,n,"Column");[m].concat(s),m.$$prototype.attributes=$,m.$attr_accessor("style"),e.def(m,"$initialize",l=function(t,n,i){var o=l.$$p,s=this,u=$;return o&&(l.$$p=null),null==i&&(i=d([],{})),p(s,e.find_super_dispatcher(s,"initialize",l,!1),[t,"table_column"],null),s.style=i["$[]"]("style"),u=["colnumber",a(n,1)],p(i,"[]=",e.to_a(u)),u[r(u.length,1)],_(i["$[]"]("width"))||(u=["width",1],p(i,"[]=",e.to_a(u)),u[r(u.length,1)]),_(i["$[]"]("halign"))||(u=["halign","left"],p(i,"[]=",e.to_a(u)),u[r(u.length,1)]),_(i["$[]"]("valign"))||(u=["valign","top"],p(i,"[]=",e.to_a(u)),u[r(u.length,1)]),s.$update_attributes(i)},l.$$arity=-3),e.alias(m,"table","parent"),e.def(m,"$assign_width",u=function(t,n,a){var s=this,l=$,u=$;return _(n)&&(t=o(i(s.attributes["$[]"]("width").$to_f(),100),n).$truncate(a)).$to_i()["$=="](t)&&(t=t.$to_i()),_(s.$parent().$attributes()["$[]"]("tableabswidth"))&&(l=["colabswidth",(u=i(o(t,100),s.$parent().$attributes()["$[]"]("tableabswidth")).$truncate(a))["$=="](u.$to_i())?u.$to_i():u],p(s.attributes,"[]=",e.to_a(l)),l[r(l.length,1)]),l=["colpcwidth",t],p(s.attributes,"[]=",e.to_a(l)),l[r(l.length,1)]},u.$$arity=3),e.def(m,"$block?",c=function(){return!1},c.$$arity=0),e.def(m,"$inline?",h=function(){return!1},h.$$arity=0)}(u(y,"Table"),u(y,"AbstractNode"),y),function(t,o,s){var c,m,y,g,v,b,w,x,k,E,O=f(t,o,"Cell"),A=[O].concat(s);O.$$prototype.document=O.$$prototype.reinitialize_args=O.$$prototype.attributes=O.$$prototype.cursor=O.$$prototype.text=O.$$prototype.subs=O.$$prototype.style=O.$$prototype.inner_document=O.$$prototype.source_location=O.$$prototype.colspan=O.$$prototype.rowspan=$,e.const_set(A[0],"DOUBLE_LF",i(u(A,"LF"),2)),O.$attr_accessor("colspan"),O.$attr_accessor("rowspan"),e.alias(O,"column","parent"),O.$attr_reader("inner_document"),e.def(O,"$initialize",c=function(t,i,o,s){var l,f,h,m=c.$$p,y=this,g=$,v=$,b=$,w=$,x=$,k=$,E=$,O=$,S=$,C=$,R=$,T=$,I=$;if(m&&(c.$$p=null),null==o&&(o=d([],{})),null==s&&(s=d([],{})),p(y,e.find_super_dispatcher(y,"initialize",c,!1),[t,"table_cell"],null),y.cursor=y.reinitialize_args=$,_(y.document.$sourcemap())&&(y.source_location=s["$[]"]("cursor").$dup()),_(t)&&(_(g=t.$table()["$header_row?"]())?_((l=g["$=="]("implicit"))?v=_(f=t.$style())?f:_(h=o)?o["$[]"]("style"):h:g["$=="]("implicit"))&&(_(_(l=v["$=="]("asciidoc"))?l:v["$=="]("literal"))&&(y.reinitialize_args=[t,i,_(l=o)?o.$merge():l,s]),v=$):v=t.$style(),y.$update_attributes(t.$attributes())),_(o))if(_(o["$empty?"]())?y.colspan=y.rowspan=$:(l=[o.$delete("colspan"),o.$delete("rowspan")],y.colspan=l[0],y.rowspan=l[1],_(g)||(v=_(l=o["$[]"]("style"))?l:v),y.$update_attributes(o)),"asciidoc"["$==="](b=v))if(w=!0,x=s["$[]"]("cursor"),_((i=i.$rstrip())["$start_with?"](u(A,"LF")))){for(k=1;_((i=i.$slice(1,i.$length()))["$start_with?"](u(A,"LF")));)k=a(k,1);x.$advance(k)}else i=i.$lstrip();else if("literal"["$==="](b))for(E=!0,i=i.$rstrip();_(i["$start_with?"](u(A,"LF")));)i=i.$slice(1,i.$length());else O=!0,i=_(i)?i.$strip():"";else y.colspan=y.rowspan=$,v["$=="]("asciidoc")&&(w=!0,x=s["$[]"]("cursor"));return _(w)?(S=y.document.$attributes().$delete("doctitle"),C=i.$split(u(A,"LF"),-1),_(C["$empty?"]())||_((R=C["$[]"](0))["$include?"]("::"))&&(T=u(A,"PreprocessorReader").$new(y.document,[R]).$readlines(),_((l=R["$=="](T["$[]"](0)))?n(T.$size(),2):R["$=="](T["$[]"](0)))||(C.$shift(),_(T["$empty?"]())||p(C,"unshift",e.to_a(T)))),y.inner_document=u(A,"Document").$new(C,d(["standalone","parent","cursor"],{standalone:!1,parent:y.document,cursor:x})),_(S["$nil?"]())||(I=["doctitle",S],p(y.document.$attributes(),"[]=",e.to_a(I)),I[r(I.length,1)]),y.subs=$):_(E)?(y.content_model="verbatim",y.subs=u(A,"BASIC_SUBS")):(_(O)&&(_(g)?y.cursor=s["$[]"]("cursor"):y.$catalog_inline_anchor(i,s["$[]"]("cursor"))),y.content_model="simple",y.subs=u(A,"NORMAL_SUBS")),y.text=i,y.style=v},c.$$arity=-3),e.def(O,"$reinitialize",m=function(t){var n=this;if(_(t))n.reinitialize_args=$;else{if(_(n.reinitialize_args))return p(l(u(A,"Table"),"Cell"),"new",e.to_a(n.reinitialize_args));n.style=n.attributes["$[]"]("style")}return _(n.cursor)&&n.$catalog_inline_anchor(),n},m.$$arity=1),e.def(O,"$catalog_inline_anchor",y=function(e,t){var n,r=this;return null==e&&(e=r.text),null==t&&(t=$),_(t)||(t=(n=[r.cursor,$])[0],r.cursor=n[1]),_(_(n=e["$start_with?"]("[["))?u(A,"LeadingInlineAnchorRx")["$=~"](e):n)?u(A,"Parser").$catalog_inline_anchor((n=h["~"])===$?$:n["$[]"](1),(n=h["~"])===$?$:n["$[]"](2),r,t,r.document):$},y.$$arity=-1),e.def(O,"$text",g=function(){var e=this;return e.$apply_subs(e.text,e.subs)},g.$$arity=0),O.$attr_writer("text"),e.def(O,"$content",v=function(){var e,t,n=this,r=$,i=$;return(r=n.style)["$=="]("asciidoc")?n.inner_document.$convert():_(n.text["$include?"](u(A,"DOUBLE_LF")))?p(n.$text().$split(u(A,"BlankLineRx")),"map",[],(e=function(t){var n,i=e.$$s||this;return null==t&&(t=$),_(_(n=r)?r["$!="]("header"):n)?u(A,"Inline").$new(i.$parent(),"quoted",t,d(["type"],{type:r})).$convert():t},e.$$s=n,e.$$arity=1,e)):_((i=n.$text())["$empty?"]())?[]:_(_(t=r)?r["$!="]("header"):t)?[u(A,"Inline").$new(n.$parent(),"quoted",i,d(["type"],{type:r})).$convert()]:[i]},v.$$arity=0),e.def(O,"$lines",b=function(){return this.text.$split(u(A,"LF"))},b.$$arity=0),e.def(O,"$source",w=function(){return this.text},w.$$arity=0),e.def(O,"$file",x=function(){var e;return _(e=this.source_location)?this.source_location.$file():e},x.$$arity=0),e.def(O,"$lineno",k=function(){var e;return _(e=this.source_location)?this.source_location.$lineno():e},k.$$arity=0),e.def(O,"$to_s",E=function(){var t,n=E.$$p,r=this,i=$,o=$,a=$;for(n&&(E.$$p=null),o=0,a=arguments.length,i=new Array(a);o<a;o++)i[o]=arguments[o];return p(r,e.find_super_dispatcher(r,"to_s",E,!1),i,n)+" - [text: "+r.text+", colspan: "+(_(t=r.colspan)?t:1)+", rowspan: "+(_(t=r.rowspan)?t:1)+", attributes: "+r.attributes+"]"},E.$$arity=0)}(u(y,"Table"),u(y,"AbstractBlock"),y),function(n,i,o){var s,c,h,m,y,g,v,b,w,x,k,E,O,A,S,C,R,T,I,N=f(n,null,"ParserContext"),L=[N].concat(o);N.$$prototype.delimiter=N.$$prototype.delimiter_rx=N.$$prototype.buffer=N.$$prototype.cellspecs=N.$$prototype.cell_open=N.$$prototype.format=N.$$prototype.start_cursor_data=N.$$prototype.reader=N.$$prototype.table=N.$$prototype.current_row=N.$$prototype.colcount=N.$$prototype.column_visits=N.$$prototype.active_rowspans=N.$$prototype.linenum=$,N.$include(u(L,"Logging")),e.const_set(L[0],"FORMATS",["psv","csv","dsv","tsv"].$to_set()),e.const_set(L[0],"DELIMITERS",d(["psv","csv","dsv","tsv","!sv"],{psv:["|",/\|/],csv:[",",/,/],dsv:[":",/:/],tsv:["\t",/\t/],"!sv":["!",/!/]})),N.$attr_accessor("table"),N.$attr_accessor("format"),N.$attr_reader("colcount"),N.$attr_accessor("buffer"),N.$attr_reader("delimiter"),N.$attr_reader("delimiter_re"),e.def(N,"$initialize",s=function(t,n,r){var i,o,a=this,s=$,c=$;return null==r&&(r=d([],{})),a.start_cursor_data=(a.reader=t).$mark(),a.table=n,_(r["$key?"]("format"))?_(u(L,"FORMATS")["$include?"](s=r["$[]"]("format")))?s["$=="]("tsv")?a.format="csv":_((i=(a.format=s)["$=="]("psv"))?n.$document()["$nested?"]():(a.format=s)["$=="]("psv"))&&(s="!sv"):(a.$logger().$error(a.$message_with_context("illegal table format: "+s,d(["source_location"],{source_location:t.$cursor_at_prev_line()}))),i=["psv",_(n.$document()["$nested?"]())?"!sv":"psv"],a.format=i[0],s=i[1]):(i=["psv",_(n.$document()["$nested?"]())?"!sv":"psv"],a.format=i[0],s=i[1]),_(r["$key?"]("separator"))?_((c=r["$[]"]("separator"))["$nil_or_empty?"]())?(o=u(L,"DELIMITERS")["$[]"](s),i=e.to_ary(o),a.delimiter=null==i[0]?$:i[0],a.delimiter_rx=null==i[1]?$:i[1]):c["$=="]("\\t")?(o=u(L,"DELIMITERS")["$[]"]("tsv"),i=e.to_ary(o),a.delimiter=null==i[0]?$:i[0],a.delimiter_rx=null==i[1]?$:i[1]):(i=[c,new RegExp(l("::","Regexp").$escape(c))],a.delimiter=i[0],a.delimiter_rx=i[1]):(o=u(L,"DELIMITERS")["$[]"](s),i=e.to_ary(o),a.delimiter=null==i[0]?$:i[0],a.delimiter_rx=null==i[1]?$:i[1]),a.colcount=_(n.$columns()["$empty?"]())?-1:n.$columns().$size(),a.buffer="",a.cellspecs=[],a.cell_open=!1,a.active_rowspans=[0],a.column_visits=0,a.current_row=[],a.linenum=-1},s.$$arity=-3),e.def(N,"$starts_with_delimiter?",c=function(e){return e["$start_with?"](this.delimiter)},c.$$arity=1),e.def(N,"$match_delimiter",h=function(e){return this.delimiter_rx.$match(e)},h.$$arity=1),e.def(N,"$skip_past_delimiter",m=function(e){var t=this;return t.buffer=""+t.buffer+e+t.delimiter,$},m.$$arity=1),e.def(N,"$skip_past_escaped_delimiter",y=function(e){var t=this;return t.buffer=""+t.buffer+e.$chop()+t.delimiter,$},y.$$arity=1),e.def(N,"$buffer_has_unclosed_quotes?",g=function(e,t){var n,r,i=this,o=$,s=$,l=$;return null==e&&(e=$),null==t&&(t='"'),!!(o=_(e)?a(i.buffer,e).$strip():i.buffer.$strip())["$=="](t)||!!_(o["$start_with?"](t))&&(s=a(t,t),_(_(n=_(r=l=o["$end_with?"](t))?o["$end_with?"](s):r)?n:o["$start_with?"](s))?_(n=(o=o.$gsub(s,""))["$start_with?"](t))?o["$end_with?"](t)["$!"]():n:l["$!"]())},g.$$arity=-1),e.def(N,"$take_cellspec",v=function(){return this.cellspecs.$shift()},v.$$arity=0),e.def(N,"$push_cellspec",b=function(e){var t;return null==e&&(e=d([],{})),this.cellspecs["$<<"](_(t=e)?t:d([],{})),$},b.$$arity=-1),e.def(N,"$keep_cell_open",w=function(){return this.cell_open=!0,$},w.$$arity=0),e.def(N,"$mark_cell_closed",x=function(){return this.cell_open=!1,$},x.$$arity=0),e.def(N,"$cell_open?",k=function(){return this.cell_open},k.$$arity=0),e.def(N,"$cell_closed?",E=function(){return this.cell_open["$!"]()},E.$$arity=0),e.def(N,"$close_open_cell",O=function(e){var t=this;return null==e&&(e=d([],{})),t.$push_cellspec(e),_(t["$cell_open?"]())&&t.$close_cell(!0),t.$advance(),$},O.$$arity=-1),e.def(N,"$close_cell",A=function(n){try{var i,o,s=this,c=$,f=$,h=$,m=$;return null==n&&(n=!1),s.format["$=="]("psv")?(c=s.buffer,s.buffer="",_(f=s.$take_cellspec())?h=_(i=f.$delete("repeatcol"))?i:1:(s.$logger().$error(s.$message_with_context("table missing leading separator; recovering automatically",d(["source_location"],{source_location:p(l(u(L,"Reader"),"Cursor"),"new",e.to_a(s.start_cursor_data))}))),f=d([],{}),h=1)):(c=s.buffer.$strip(),s.buffer="",f=$,h=1,_(_(i=s.format["$=="]("csv")?c["$empty?"]()["$!"]():s.format["$=="]("csv"))?c["$include?"](m='"'):i)&&(_(_(i=c["$start_with?"](m))?c["$end_with?"](m):i)?_(c=c.$slice(1,r(c.$length(),2)))?c=c.$strip().$squeeze(m):(s.$logger().$error(s.$message_with_context("unclosed quote in CSV data; setting cell to empty",d(["source_location"],{source_location:s.reader.$cursor_at_prev_line()}))),c=""):c=c.$squeeze(m))),p(1,"upto",[h],(o=function(i){var s,m,y,g,v=o.$$s||this,b=$,w=$,x=$,k=$;return null==v.colcount&&(v.colcount=$),null==v.table&&(v.table=$),null==v.current_row&&(v.current_row=$),null==v.reader&&(v.reader=$),null==v.column_visits&&(v.column_visits=$),null==v.linenum&&(v.linenum=$),null==i&&(i=$),v.colcount["$=="](-1)?(v.table.$columns()["$<<"](b=l(u(L,"Table"),"Column").$new(v.table,r(a(v.table.$columns().$size(),i),1))),_(_(s=_(m=f)?f["$key?"]("colspan"):m)?t(w=r(f["$[]"]("colspan").$to_i(),1),0):s)&&(x=v.table.$columns().$size(),p(w,"times",[],(y=function(e){var t=y.$$s||this;return null==t.table&&(t.table=$),null==e&&(e=$),t.table.$columns()["$<<"](l(u(L,"Table"),"Column").$new(t.table,a(x,e)))},y.$$s=v,y.$$arity=1,y)))):_(b=v.table.$columns()["$[]"](v.current_row.$size()))||(v.$logger().$error(v.$message_with_context("dropping cell because it exceeds specified number of columns",d(["source_location"],{source_location:v.reader.$cursor_before_mark()}))),e.ret($)),k=l(u(L,"Table"),"Cell").$new(b,c,f,d(["cursor"],{cursor:v.reader.$cursor_before_mark()})),v.reader.$mark(),_(_(s=k.$rowspan()["$!"]())?s:k.$rowspan()["$=="](1))||v.$activate_rowspan(k.$rowspan(),_(s=k.$colspan())?s:1),v.column_visits=a(v.column_visits,_(s=k.$colspan())?s:1),v.current_row["$<<"](k),_(_(s=v["$end_of_row?"]())?_(m=_(g=v.colcount["$!="](-1))?g:t(v.linenum,0))?m:_(g=n)?i["$=="](h):g:s)?v.$close_row():$},o.$$s=s,o.$$arity=1,o)),s.cell_open=!1,$}catch(y){if(y===e.returner)return y.$v;throw y}},A.$$arity=-1),N.$private(),e.def(N,"$close_row",S=function(){var t=this,n=$;return t.table.$rows().$body()["$<<"](t.current_row),t.colcount["$=="](-1)&&(t.colcount=t.column_visits),t.column_visits=0,t.current_row=[],t.active_rowspans.$shift(),_(t.active_rowspans["$[]"](0))||(n=[0,0],p(t.active_rowspans,"[]=",e.to_a(n)),n[r(n.length,1)]),$},S.$$arity=0),e.def(N,"$activate_rowspan",C=function(t,n){var i;return p(1,"upto",[r(t,1)],(i=function(t){var o,s,l=i.$$s||this;return null==l.active_rowspans&&(l.active_rowspans=$),null==t&&(t=$),s=[t,a(_(o=l.active_rowspans["$[]"](t))?o:0,n)],p(l.active_rowspans,"[]=",e.to_a(s)),s[r(s.length,1)]},i.$$s=this,i.$$arity=1,i)),$},C.$$arity=2),e.def(N,"$end_of_row?",R=function(){var e,t=this;return _(e=t.colcount["$=="](-1))?e:t.$effective_column_visits()["$=="](t.colcount)},R.$$arity=0),e.def(N,"$effective_column_visits",T=function(){return a(this.column_visits,this.active_rowspans["$[]"](0))},T.$$arity=0),e.def(N,"$advance",I=function(){return this.linenum=a(this.linenum,1)},I.$$arity=0)}(u(y,"Table"),0,y)}(s[0],s)},Opal.modules["asciidoctor/writer"]=function(e){e.top;var t=[],n=e.nil,r=e.const_get_qualified,i=e.const_get_relative,o=(e.breaker,e.slice,e.module),a=e.truthy,s=e.hash2;return e.add_stubs(["$respond_to?","$write","$+","$chomp","$include"]),function(t,$){var l=[o(t,"Asciidoctor")].concat($);!function(t,$){var l,u=o(t,"Writer"),c=[u].concat($);e.def(u,"$write",l=function(e,t){var o,$;return a(t["$respond_to?"]("write"))?t.$write((o=e.$chomp(),$=i(c,"LF"),"number"===typeof o&&"number"===typeof $?o+$:o["$+"]($))):r("::","File").$write(t,e,s(["mode"],{mode:i(c,"FILE_WRITE_MODE")})),n},l.$$arity=2)}(l[0],l),function(t,r){var a,s=o(t,"VoidWriter"),$=[s].concat(r);s.$include(i($,"Writer")),e.def(s,"$write",a=function(e,t){return n},a.$$arity=2)}(l[0],l)}(t[0],t)},Opal.modules["asciidoctor/load"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}e.top;var n=[],r=e.nil,i=e.const_get_qualified,o=e.const_get_relative,a=(e.breaker,e.slice,e.module),s=e.hash2,$=e.truthy,l=e.send;return e.add_stubs(["$merge","$[]","$start","$key?","$!=","$logger","$new","$logger=","$-","$!","$===","$dup","$tap","$each","$partition","$[]=","$split","$gsub","$+","$respond_to?","$keys","$raise","$join","$ancestors","$class","$==","$at","$to_i","$mtime","$absolute_path","$path","$dirname","$basename","$extname","$read","$rewind","$drop","$record","$parse","$exception","$message","$set_backtrace","$backtrace","$stack_trace","$stack_trace=","$open","$load"]),function(n,u){var c=a(n,"Asciidoctor"),f=[c].concat(u);!function(n,a){var u,c,f=[n].concat(a);e.def(n,"$load",u=function(n,a){var u,c,d,p,_,h,m=this,y=r,g=r,v=r,b=r,w=r,x=r,k=r,E=r,O=r,A=r;null==a&&(a=s([],{}));try{if(a=a.$merge(),$(y=a["$[]"]("timings"))&&y.$start("read"),$($(u=a["$key?"]("logger"))?(g=a["$[]"]("logger"))["$!="](o(f,"LoggerManager").$logger()):u)&&(v=[$(u=g)?u:o(f,"NullLogger").$new()],l(o(f,"LoggerManager"),"logger=",e.to_a(v)),v[t(v.length,1)]),$((b=a["$[]"]("attributes"))["$!"]())?b=s([],{}):$(i("::","Hash")["$==="](b))?b=b.$merge():$($(u=(d=i("::","Java","skip_raise"))&&(c=i(d,"JavaUtil","skip_raise"))&&i(c,"Map","skip_raise")?"constant":r)?i(i(i("::","Java"),"JavaUtil"),"Map")["$==="](b):u)?b=b.$dup():$(i("::","Array")["$==="](b))?b=l(s([],{}),"tap",[],(p=function(n){var i,o=p.$$s||this;return null==n&&(n=r),l(b,"each",[],((i=function(o){var a,s,$,u;return i.$$s,null==o&&(o=r),s=o.$partition("="),$=null==(a=e.to_ary(s))[0]?r:a[0],null==a[1]||a[1],u=null==a[2]?r:a[2],v=[$,u],l(n,"[]=",e.to_a(v)),v[t(v.length,1)]}).$$s=o,i.$$arity=1,i))},p.$$s=m,p.$$arity=1,p)):$(i("::","String")["$==="](b))?b=l(s([],{}),"tap",[],(_=function(n){var i,a,s,$=_.$$s||this;return null==n&&(n=r),l(b.$gsub(o(f,"SpaceDelimiterRx"),(a="\\1",s=o(f,"NULL"),"number"===typeof a&&"number"===typeof s?a+s:a["$+"](s))).$gsub(o(f,"EscapedSpaceRx"),"\\1").$split(o(f,"NULL")),"each",[],((i=function(o){var a,s,$,u;return i.$$s,null==o&&(o=r),s=o.$partition("="),$=null==(a=e.to_ary(s))[0]?r:a[0],null==a[1]||a[1],u=null==a[2]?r:a[2],v=[$,u],l(n,"[]=",e.to_a(v)),v[t(v.length,1)]}).$$s=$,i.$$arity=1,i))},_.$$s=m,_.$$arity=1,_)):$($(u=b["$respond_to?"]("keys"))?b["$respond_to?"]("[]"):u)?b=l(s([],{}),"tap",[],(h=function(n){var i,o=h.$$s||this;return null==n&&(n=r),l(b.$keys(),"each",[],((i=function(o){return i.$$s,null==o&&(o=r),v=[o,b["$[]"](o)],l(n,"[]=",e.to_a(v)),v[t(v.length,1)]}).$$s=o,i.$$arity=1,i))},h.$$s=m,h.$$arity=1,h)):m.$raise(i("::","ArgumentError"),"illegal type for attributes option: "+b.$class().$ancestors().$join(" < ")),$(i("::","File")["$==="](n)))v=["input_mtime",o(f,"RUBY_ENGINE")["$=="]("jruby")?i("::","Time").$at(n.$mtime().$to_i()):n.$mtime()],l(a,"[]=",e.to_a(v)),v[t(v.length,1)],v=["docfile",w=i("::","File").$absolute_path(n.$path())],l(b,"[]=",e.to_a(v)),v[t(v.length,1)],v=["docdir",i("::","File").$dirname(w)],l(b,"[]=",e.to_a(v)),v[t(v.length,1)],v=["docname",o(f,"Helpers").$basename(w,(v=["docfilesuffix",o(f,"Helpers").$extname(w)],l(b,"[]=",e.to_a(v)),v[t(v.length,1)]))],l(b,"[]=",e.to_a(v)),v[t(v.length,1)],x=n.$read();else if($(n["$respond_to?"]("read"))){try{n.$rewind()}catch(S){if(!e.rescue(S,[o(f,"StandardError")]))throw S;e.pop_exception()}x=n.$read()}else $(i("::","String")["$==="](n))?x=n:$(i("::","Array")["$==="](n))?x=n.$drop(0):$(n)&&m.$raise(i("::","ArgumentError"),"unsupported input type: "+n.$class());return $(y)&&(y.$record("read"),y.$start("parse")),v=["attributes",b],l(a,"[]=",e.to_a(v)),v[t(v.length,1)],k=a["$[]"]("parse")["$=="](!1)?o(f,"Document").$new(x,a):o(f,"Document").$new(x,a).$parse(),$(y)&&y.$record("parse"),k}catch(S){if(!e.rescue(S,[o(f,"StandardError")]))throw S;E=S;try{try{O="asciidoctor: FAILED: "+($(u=b["$[]"]("docfile"))?u:"<stdin>")+": Failed to load AsciiDoc document",$(E["$respond_to?"]("exception"))?(A=E.$exception(O+" - "+E.$message())).$set_backtrace(E.$backtrace()):(A=E.$class().$new(O,E),v=[E.$stack_trace()],l(A,"stack_trace=",e.to_a(v)),v[t(v.length,1)])}catch(S){if(!e.rescue(S,[o(f,"StandardError")]))throw S;try{A=E}finally{e.pop_exception()}}return m.$raise(A)}finally{e.pop_exception()}}},u.$$arity=-2),e.def(n,"$load_file",c=function(e,t){var n;return null==t&&(t=s([],{})),l(i("::","File"),"open",[e,o(f,"FILE_READ_MODE")],(n=function(e){var i=n.$$s||this;return null==e&&(e=r),i.$load(e,t)},n.$$s=this,n.$$arity=1,n))},c.$$arity=-2)}(e.get_singleton_class(c),f)}(n[0],n)},Opal.modules["asciidoctor/convert"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e>=t:e["$>="](t)}e.top;var r=[],i=e.nil,o=e.const_get_qualified,a=e.const_get_relative,s=(e.breaker,e.slice,e.module),$=e.hash2,l=e.truthy,u=e.send;return e.add_stubs(["$delete","$merge","$===","$absolute_path","$path","$load","$respond_to?","$[]=","$-","$key?","$fetch","$[]","$dirname","$expand_path","$join","$attributes","$outfilesuffix","$==","$raise","$pwd","$>=","$safe","$normalize_system_path","$mkdir_p","$directory?","$!","$convert","$write","$<","$attr?","$basebackend?","$attr","$uriish?","$include?","$syntax_highlighter","$write_stylesheet?","$write_primary_stylesheet","$instance","$to_s","$!=","$read_asset","$file?","$write_stylesheet","$open"]),function(r,c){var f=s(r,"Asciidoctor"),d=[f].concat(c);!function(r,s){var c,f,d=[r].concat(s);e.def(r,"$convert",c=function(r,s){var c,f,p,_,h,m,y,g,v,b,w=this,x=i,k=i,E=i,O=i,A=i,S=i,C=i,R=i,T=i,I=i,N=i,L=i,D=i,P=i,M=i,z=i,F=i,j=i,B=i,q=i,U=i,H=i;if(null==s&&(s=$([],{})),(s=s.$merge()).$delete("parse"),m=s.$delete("to_dir"),y=s.$delete("mkdirs"),g=x=s.$delete("to_file"),(!0)["$==="](g)||i["$==="](g))l(k=m)||l(o("::","File")["$==="](r))&&(E=o("::","File").$absolute_path(r.$path())),x=i;else if((!1)["$==="](g))x=i;else{if("/dev/null"["$==="](g))return w.$load(r,s);l(O=x["$respond_to?"]("write"))||(A=["to_file",k=x],u(s,"[]=",e.to_a(A)),A[t(A.length,1)])}return l(s["$key?"]("standalone"))||(l(l(c=E)?c:k)?(A=["standalone",s.$fetch("header_footer",!0)],u(s,"[]=",e.to_a(A)),A[t(A.length,1)]):l(s["$key?"]("header_footer"))&&(A=["standalone",s["$[]"]("header_footer")],u(s,"[]=",e.to_a(A)),A[t(A.length,1)])),l(E)?(A=["to_dir",S=o("::","File").$dirname(E)],u(s,"[]=",e.to_a(A)),A[t(A.length,1)]):l(k)&&(l(m)?l(x)?(A=["to_dir",o("::","File").$dirname(o("::","File").$expand_path(x,m))],u(s,"[]=",e.to_a(A)),A[t(A.length,1)]):(A=["to_dir",o("::","File").$expand_path(m)],u(s,"[]=",e.to_a(A)),A[t(A.length,1)]):l(x)&&(A=["to_dir",o("::","File").$dirname(o("::","File").$expand_path(x))],u(s,"[]=",e.to_a(A)),A[t(A.length,1)])),C=w.$load(r,s),l(E)?(R=o("::","File").$join(S,""+C.$attributes()["$[]"]("docname")+C.$outfilesuffix()))["$=="](E)&&w.$raise(o("::","IOError"),"input file and output file cannot be the same: "+R):l(k)?(T=l(s["$key?"]("base_dir"))?o("::","File").$expand_path(s["$[]"]("base_dir")):o("::","Dir").$pwd(),I=l(n(C.$safe(),o(a(d,"SafeMode"),"SAFE")))?T:i,l(m)?(S=C.$normalize_system_path(m,T,I,$(["target_name","recover"],{target_name:"to_dir",recover:!1})),l(x)?(R=C.$normalize_system_path(x,S,i,$(["target_name","recover"],{target_name:"to_dir",recover:!1})),S=o("::","File").$dirname(R)):R=o("::","File").$join(S,""+C.$attributes()["$[]"]("docname")+C.$outfilesuffix())):l(x)&&(R=C.$normalize_system_path(x,T,I,$(["target_name","recover"],{target_name:"to_dir",recover:!1})),S=o("::","File").$dirname(R)),l(l(c=o("::","File")["$==="](r))?R["$=="](o("::","File").$absolute_path(r.$path())):c)&&w.$raise(o("::","IOError"),"input file and output file cannot be the same: "+R),l(y)?a(d,"Helpers").$mkdir_p(S):l(o("::","File")["$directory?"](S))||w.$raise(o("::","IOError"),"target directory does not exist: "+m+" (hint: set :mkdirs option)")):(R=x,S=i),N=l(l(c=R)?O["$!"]():c)?C.$convert($(["outfile","outdir"],{outfile:R,outdir:S})):C.$convert(),l(R)?(C.$write(N,R),l(l(c=l(f=l(p=l(_=l(h=O["$!"]())?(v=C.$safe(),b=o(a(d,"SafeMode"),"SECURE"),"number"===typeof v&&"number"===typeof b?v<b:v["$<"](b)):h)?C["$attr?"]("linkcss"):_)?C["$attr?"]("copycss"):p)?C["$basebackend?"]("html"):f)?(l(f=L=C.$attr("stylesdir"))?a(d,"Helpers")["$uriish?"](L):f)["$!"]():c)&&(l(D=C.$attr("stylesheet"))&&(l(a(d,"DEFAULT_STYLESHEET_KEYS")["$include?"](D))?P=!0:l(a(d,"Helpers")["$uriish?"](D)["$!"]())&&(M=!0)),z=l(c=F=C.$syntax_highlighter())?F["$write_stylesheet?"](C):c,l(l(c=l(f=P)?f:M)?c:z)&&(j=C.$normalize_system_path(L,S,l(n(C.$safe(),o(a(d,"SafeMode"),"SAFE")))?S:i),l(y)?a(d,"Helpers").$mkdir_p(j):l(o("::","File")["$directory?"](j))||w.$raise(o("::","IOError"),"target stylesheet directory does not exist: "+j+" (hint: set :mkdirs option)"),l(P)?a(d,"Stylesheets").$instance().$write_primary_stylesheet(j):l(M)&&(B=l(l(c=(B=C.$attr("copycss"))["$=="](""))?c:B["$=="](!0))?C.$normalize_system_path(D):C.$normalize_system_path(B.$to_s()),q=C.$normalize_system_path(D,j,l(n(C.$safe(),o(a(d,"SafeMode"),"SAFE")))?S:i),l(l(c=B["$!="](q))?U=C.$read_asset(B,$(["warn_on_failure","label"],{warn_on_failure:o("::","File")["$file?"](q)["$!"](),label:"stylesheet"})):c)&&(l(l(c=(H=o("::","File").$dirname(q))["$!="](j))?o("::","File")["$directory?"](H)["$!"]():c)&&(l(y)?a(d,"Helpers").$mkdir_p(H):w.$raise(o("::","IOError"),"target stylesheet directory does not exist: "+H+" (hint: set :mkdirs option)")),o("::","File").$write(q,U,$(["mode"],{mode:a(d,"FILE_WRITE_MODE")})))),l(z)&&F.$write_stylesheet(C,j))),C):N},c.$$arity=-2),e.def(r,"$convert_file",f=function(e,t){var n;return null==t&&(t=$([],{})),u(o("::","File"),"open",[e,a(d,"FILE_READ_MODE")],(n=function(e){var r=n.$$s||this;return null==e&&(e=i),r.$convert(e,t)},n.$$s=this,n.$$arity=1,n))},f.$$arity=-2),e.alias(r,"render","convert"),e.alias(r,"render_file","convert_file")}(e.get_singleton_class(f),d)}(r[0],r)},Opal.modules["asciidoctor/syntax_highlighter/highlightjs"]=function(e){e.top;var t=[],n=e.nil,r=e.const_get_qualified,i=e.const_get_relative,o=(e.breaker,e.slice,e.module),a=e.klass,s=e.send,$=e.hash2,l=e.truthy;return e.add_stubs(["$register_for","$merge","$proc","$[]=","$-","$attr","$[]","$==","$attr?","$join","$map","$split","$lstrip"]),function(t,u){var c=[o(t,"Asciidoctor")].concat(u);!function(t,r,o){var u,c,f,d,p=a(t,r,"HighlightJsAdapter"),_=[p].concat(o);p.$register_for("highlightjs","highlight.js"),e.def(p,"$initialize",u=function(t){var r=u.$$p,i=this,o=n,a=n,$=n;for(r&&(u.$$p=null),a=0,$=arguments.length,o=new Array($);a<$;a++)o[a]=arguments[a];return e.slice.call(arguments,0,arguments.length),s(i,e.find_super_dispatcher(i,"initialize",u,!1),o,r),i.name=i.pre_class="highlightjs"},u.$$arity=-1),e.def(p,"$format",c=function(t,r,i){var o,a=c.$$p,u=this;return a&&(c.$$p=null),s(u,e.find_super_dispatcher(u,"format",c,!1),[t,r,i.$merge($(["transform"],{transform:s(u,"proc",[],(o=function(t,i){var a,$,u,c;return o.$$s,null==t&&(t=n),null==i&&(i=n),$=["class","language-"+(l(a=r)?a:"none")+" hljs"],s(i,"[]=",e.to_a($)),$[(u=$.length,c=1,"number"===typeof u&&"number"===typeof c?u-c:u["$-"](c))]},o.$$s=u,o.$$arity=2,o))}))],null)},c.$$arity=3),e.def(p,"$docinfo?",f=function(e){return!0},f.$$arity=1),e.def(p,"$docinfo",d=function(e,t,r){var o,a,$=this;return a=t.$attr("highlightjsdir",r["$[]"]("cdn_base_url")+"/highlight.js/"+i(_,"HIGHLIGHT_JS_VERSION")),e["$=="]("head")?'<link rel="stylesheet" href="'+a+"/styles/"+t.$attr("highlightjs-theme","github")+'.min.css"'+r["$[]"]("self_closing_tag_slash")+">":'<script src="'+a+'/highlight.min.js"><\/script>\n'+(l(t["$attr?"]("highlightjs-languages"))?s(t.$attr("highlightjs-languages").$split(","),"map",[],(o=function(e){return o.$$s,null==e&&(e=n),'<script src="'+a+"/languages/"+e.$lstrip()+'.min.js"><\/script>\n'},o.$$s=$,o.$$arity=1,o)).$join():"")+"<script>\nif (!hljs.initHighlighting.called) {\n hljs.initHighlighting.called = true\n ;[].slice.call(document.querySelectorAll('pre.highlight > code')).forEach(function (el) { hljs.highlightBlock(el) })\n}\n<\/script>"},d.$$arity=3)}(i(c,"SyntaxHighlighter"),r(i(c,"SyntaxHighlighter"),"Base"),c)}(t[0],t)},Opal.modules["asciidoctor/syntax_highlighter"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}var n=e.top,r=[],i=e.nil,o=e.const_get_qualified,a=e.const_get_relative,s=(e.breaker,e.slice,e.module),$=e.hash2,l=e.send,u=e.truthy,c=e.klass;return e.add_stubs(["$attr_reader","$raise","$class","$extend","$private_class_method","$register","$map","$to_s","$each","$[]=","$registry","$-","$[]","$for","$===","$new","$name","$private","$include","$==","$delete","$join","$content"]),function(n,r){var f=[s(n,"Asciidoctor")].concat(r);!function(n,r){var f,d,p,_,h,m,y,g,v,b=s(n,"SyntaxHighlighter"),w=[b].concat(r);b.$attr_reader("name"),e.def(b,"$initialize",f=function(e,t,n){return null==t&&(t="html5"),null==n&&(n=$([],{})),this.name=this.pre_class=e},f.$$arity=-2),e.def(b,"$docinfo?",d=function(e){return i},d.$$arity=1),e.def(b,"$docinfo",p=function(e,t,n){return this.$raise(o("::","NotImplementedError"),a(w,"SyntaxHighlighter")+" subclass "+this.$class()+" must implement the #docinfo method since #docinfo? returns true")},p.$$arity=3),e.def(b,"$highlight?",_=function(){return i},_.$$arity=0),e.def(b,"$highlight",h=function(e,t,n,r){return this.$raise(o("::","NotImplementedError"),a(w,"SyntaxHighlighter")+" subclass "+this.$class()+" must implement the #highlight method since #highlight? returns true")},h.$$arity=4),e.def(b,"$format",m=function(e,t,n){return this.$raise(o("::","NotImplementedError"),a(w,"SyntaxHighlighter")+" subclass "+this.$class()+" must implement the #format method")},m.$$arity=3),e.def(b,"$write_stylesheet?",y=function(e){return i},y.$$arity=1),e.def(b,"$write_stylesheet",g=function(e,t){return this.$raise(o("::","NotImplementedError"),a(w,"SyntaxHighlighter")+" subclass "+this.$class()+" must implement the #write_stylesheet method since #write_stylesheet? returns true")},g.$$arity=2),e.defs(b,"$included",v=function(e){return e.$extend(a(w,"Config"))},v.$$arity=1),b.$private_class_method("included"),function(t,n){var r,o=s(t,"Config"),$=[o].concat(n);e.def(o,"$register_for",r=function(t){var n,r,o=this;return n=e.slice.call(arguments,0,arguments.length),l(a($,"SyntaxHighlighter"),"register",[o].concat(e.to_a(l(n,"map",[],((r=function(e){return r.$$s,null==e&&(e=i),e.$to_s()}).$$s=o,r.$$arity=1,r)))))},r.$$arity=-1)}(w[0],w),function(n,r){var c,f,d,p,_=s(n,"Factory"),h=[_].concat(r);e.def(_,"$register",c=function(n,r){var o,a,s=this;return o=e.slice.call(arguments,1,arguments.length),l(o,"each",[],(a=function(r){var o,s=a.$$s||this;return null==r&&(r=i),o=[r,n],l(s.$registry(),"[]=",e.to_a(o)),o[t(o.length,1)]},a.$$s=s,a.$$arity=1,a))},c.$$arity=-2),e.def(_,"$for",f=function(e){return this.$registry()["$[]"](e)},f.$$arity=1),e.def(_,"$create",d=function(e,t,n){var r=i;return null==t&&(t="html5"),null==n&&(n=$([],{})),u(r=this.$for(e))?(u(o("::","Class")["$==="](r))&&(r=r.$new(e,t,n)),u(r.$name())||this.$raise(o("::","NameError"),r.$class()+" must specify a value for `name'"),r):i},d.$$arity=-2),_.$private(),e.def(_,"$registry",p=function(){return this.$raise(o("::","NotImplementedError"),a(h,"Factory")+" subclass "+this.$class()+" must implement the #registry method")},p.$$arity=0)}(w[0],w),function(t,n,r){var o,s=c(t,null,"CustomFactory"),l=[s].concat(r);s.$include(a(l,"Factory")),e.def(s,"$initialize",o=function(e){var t;return null==e&&(e=i),this.registry=u(t=e)?t:$([],{})},o.$$arity=-1),s.$private(),s.$attr_reader("registry")}(w[0],0,w),function(t,n){var r,o=s(t,"DefaultFactory"),l=[o].concat(n);o.$include(a(l,"Factory")),e.class_variable_set(l[0],"@@registry",$([],{})),o.$private(),e.def(o,"$registry",r=function(){var e;return null==(e=l[0].$$cvars["@@registry"])?i:e},r.$$arity=0),a(l,"RUBY_ENGINE")["$=="]("opal")}(w[0],w),function(e,t,n){var r=c(e,t,"DefaultFactoryProxy"),i=[r].concat(n);r.$include(a(i,"DefaultFactory")),a(i,"RUBY_ENGINE")["$=="]("opal")}(w[0],a(w,"CustomFactory"),w),function(n,r,o){var s,f=c(n,null,"Base"),d=[f].concat(o);f.$$prototype.pre_class=i,f.$include(a(d,"SyntaxHighlighter")),e.def(f,"$format",s=function(n,r,o){var a,s,c,f=this,d=i,p=i,_=i,h=i;return c=u(o["$[]"]("nowrap"))?f.pre_class+" highlight nowrap":f.pre_class+" highlight",u(d=o["$[]"]("transform"))?(d["$[]"](p=$(["class"],{class:c}),_=u(r)?$(["data-lang"],{"data-lang":r}):$([],{})),u(r=_.$delete("data-lang"))&&(h=["data-lang",r],l(_,"[]=",e.to_a(h)),h[t(h.length,1)]),"<pre"+l(p,"map",[],(a=function(e,t){return a.$$s,null==e&&(e=i),null==t&&(t=i)," "+e+'="'+t+'"'},a.$$s=f,a.$$arity=2,a)).$join()+"><code"+l(_,"map",[],(s=function(e,t){return s.$$s,null==e&&(e=i),null==t&&(t=i)," "+e+'="'+t+'"'},s.$$s=f,s.$$arity=2,s)).$join()+">"+n.$content()+"</code></pre>"):'<pre class="'+c+'"><code'+(u(r)?' data-lang="'+r+'"':"")+">"+n.$content()+"</code></pre>"},s.$$arity=3)}(w[0],0,w),b.$extend(a(w,"DefaultFactory"))}(f[0],f)}(r[0],r),n.$require("asciidoctor/syntax_highlighter.rb/../syntax_highlighter/highlightjs"),a(r,"RUBY_ENGINE")["$=="]("opal"),i},Opal.modules["asciidoctor/timings"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e+t:e["$+"](t)}function r(e,t){return"number"===typeof e&&"number"===typeof t?e>t:e["$>"](t)}e.top;var i=[],o=e.nil,a=e.const_get_qualified,s=e.const_get_relative,$=(e.breaker,e.slice,e.module),l=e.klass,u=e.hash2,c=e.send,f=e.truthy,d=e.gvars;return e.add_stubs(["$now","$[]=","$-","$delete","$reduce","$+","$[]","$>","$time","$puts","$sprintf","$to_f","$read_parse","$convert","$read_parse_convert","$private","$const_defined?","$==","$clock_gettime"]),function(i,p){var _=[$(i,"Asciidoctor")].concat(p);!function(i,$,p){var _,h,m,y,g,v,b,w,x,k,E,O,A,S,C,R,T,I,N,L=l(i,null,"Timings"),D=[L].concat(p);L.$$prototype.timers=L.$$prototype.log=o,e.def(L,"$initialize",_=function(){return this.log=u([],{}),this.timers=u([],{})},_.$$arity=0),e.def(L,"$start",h=function(n){var r;return r=[n,this.$now()],c(this.timers,"[]=",e.to_a(r)),r[t(r.length,1)]},h.$$arity=1),e.def(L,"$record",m=function(n){var r,i=this;return r=[n,t(i.$now(),i.timers.$delete(n))],c(i.log,"[]=",e.to_a(r)),r[t(r.length,1)]},m.$$arity=1),e.def(L,"$time",y=function(t){var i,a,s=this,$=o;return i=e.slice.call(arguments,0,arguments.length),$=c(i,"reduce",[0],(a=function(e,t){var r,i=a.$$s||this;return null==i.log&&(i.log=o),null==e&&(e=o),null==t&&(t=o),n(e,f(r=i.log["$[]"](t))?r:0)},a.$$s=s,a.$$arity=2,a)),f(r($,0))?$:o},y.$$arity=-1),e.def(L,"$read",g=function(){return this.$time("read")},g.$$arity=0),e.def(L,"$parse",v=function(){return this.$time("parse")},v.$$arity=0),e.def(L,"$read_parse",b=function(){return this.$time("read","parse")},b.$$arity=0),e.def(L,"$convert",w=function(){return this.$time("convert")},w.$$arity=0),e.def(L,"$read_parse_convert",x=function(){return this.$time("read","parse","convert")},x.$$arity=0),e.def(L,"$write",k=function(){return this.$time("write")},k.$$arity=0),e.def(L,"$total",E=function(){return this.$time("read","parse","convert","write")},E.$$arity=0),e.def(L,"$print_report",O=function(e,t){var n=this;return null==d.stdout&&(d.stdout=o),null==e&&(e=d.stdout),null==t&&(t=o),f(t)&&e.$puts("Input file: "+t),e.$puts(" Time to read and parse source: "+n.$sprintf("%05.5f",n.$read_parse().$to_f())),e.$puts(" Time to convert document: "+n.$sprintf("%05.5f",n.$convert().$to_f())),e.$puts(" Total time (read, parse and convert): "+n.$sprintf("%05.5f",n.$read_parse_convert().$to_f()))},O.$$arity=-1),L.$private(),f(f(A=a("::","Process")["$const_defined?"]("CLOCK_MONOTONIC",!1))?((S=a("::","Process","skip_raise"))&&(C=S,C)&&(R=C)&&((T=R.$clock_gettime)&&!T.$$stub||R["$respond_to_missing?"]("clock_gettime"))?"method":o)["$=="]("method"):A)?(e.const_set(D[0],"CLOCK_ID",a(a("::","Process"),"CLOCK_MONOTONIC")),e.def(L,"$now",I=function(){return a("::","Process").$clock_gettime(s(D,"CLOCK_ID"))},I.$$arity=0)):e.def(L,"$now",N=function(){return a("::","Time").$now()},N.$$arity=0)}(_[0],0,_)}(i[0],i)},Opal.modules["asciidoctor/converter/composite"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}e.top;var n=[],r=e.nil,i=e.const_get_qualified,o=e.const_get_relative,a=(e.breaker,e.slice,e.module),s=e.klass,$=e.hash2,l=e.send,u=e.truthy;return e.add_stubs(["$attr_reader","$each","$respond_to?","$composed","$init_backend_traits","$backend_traits","$new","$find_converter","$[]=","$-","$convert","$converter_for","$node_name","$[]","$handles?","$raise"]),function(n,c){var f=[a(n,"Asciidoctor")].concat(c);!function(n,o,a){var c,f,d,p,_=s(n,o,"CompositeConverter");[_].concat(a),_.$$prototype.converter_cache=_.$$prototype.converters=r,_.$attr_reader("converters"),e.def(_,"$initialize",c=function(n,o,a){var s,c,f,d,p,_,h=this;if(s=e.slice.call(arguments,1,arguments.length),null==(c=e.extract_kwargs(s)))c=$([],{});else if(!c.$$is_hash)throw e.ArgumentError.$new("expected kwargs");return f=s,null==(d=c.$$smap.backend_traits_source)&&(d=r),h.backend=n,l(h.converters=f,"each",[],(p=function(e){var t=p.$$s||this;return null==e&&(e=r),u(e["$respond_to?"]("composed"))?e.$composed(t):r},p.$$s=h,p.$$arity=1,p)),u(d)&&h.$init_backend_traits(d.$backend_traits()),h.converter_cache=l(i("::","Hash"),"new",[],(_=function(n,i){var o,a=_.$$s||this;return null==n&&(n=r),null==i&&(i=r),o=[i,a.$find_converter(i)],l(n,"[]=",e.to_a(o)),o[t(o.length,1)]},_.$$s=h,_.$$arity=2,_))},c.$$arity=-2),e.def(_,"$convert",f=function(e,t,n){var i;return null==t&&(t=r),null==n&&(n=r),this.$converter_for(t=u(i=t)?i:e.$node_name()).$convert(e,t,n)},f.$$arity=-2),e.def(_,"$converter_for",d=function(e){return this.converter_cache["$[]"](e)},d.$$arity=1),e.def(_,"$find_converter",p=function(t){try{var n,i=this;return l(i.converters,"each",[],((n=function(i){if(n.$$s,null==i&&(i=r),!u(i["$handles?"](t)))return r;e.ret(i)}).$$s=i,n.$$arity=1,n)),i.$raise("Could not find a converter to handle transform: "+t)}catch(o){if(o===e.returner)return o.$v;throw o}},p.$$arity=1)}(o(f,"Converter"),i(o(f,"Converter"),"Base"),f)}(n[0],n)},Opal.modules["asciidoctor/converter/html5"]=function(e){function t(e,t){return"number"===typeof e&&"number"===typeof t?e-t:e["$-"](t)}function n(e,t){return"number"===typeof e&&"number"===typeof t?e>t:e["$>"](t)}function r(e,t){return"number"===typeof e&&"number"===typeof t?e+t:e["$+"](t)}function i(e,t){return"number"===typeof e&&"number"===typeof t?e<=t:e["$<="](t)}function o(e,t){return"number"===typeof e&&"number"===typeof t?e<t:e["$<"](t)}e.top;var a=[],s=e.nil,$=e.const_get_qualified,l=e.const_get_relative,u=(e.breaker,e.slice,e.module),c=e.klass,f=e.send,d=e.hash2,p=e.truthy,_=e.gvars;return e.add_stubs(["$register_for","$default=","$-","$==","$[]","$init_backend_traits","$node_name","$===","$convert_inline_quoted","$convert_paragraph","$convert_inline_anchor","$convert_section","$convert_listing","$convert_literal","$convert_ulist","$convert_olist","$convert_dlist","$convert_admonition","$convert_colist","$convert_embedded","$convert_example","$convert_floating_title","$convert_image","$convert_inline_break","$convert_inline_button","$convert_inline_callout","$convert_inline_footnote","$convert_inline_image","$convert_inline_indexterm","$convert_inline_kbd","$convert_inline_menu","$convert_open","$convert_page_break","$convert_preamble","$convert_quote","$convert_sidebar","$convert_stem","$convert_table","$convert_thematic_break","$convert_verse","$convert_video","$convert_document","$convert_toc","$convert_pass","$convert_audio","$empty?","$attr","$attr?","$<<","$include?","$sub_replacements","$gsub","$extname","$slice","$length","$doctitle","$normalize_web_path","$primary_stylesheet_data","$instance","$read_contents","$syntax_highlighter","$size","$docinfo","$id","$sections?","$doctype","$role?","$role","$join","$noheader","$convert","$converter","$generate_manname_section","$header?","$notitle","$title","$header","$each","$authors","$>","$name","$email","$sub_macros","$+","$downcase","$concat","$content","$footnotes?","$!","$footnotes","$index","$text","$nofooter","$docinfo?","$[]=","$delete_at","$inspect","$!=","$to_i","$attributes","$document","$sections","$level","$caption","$captioned_title","$numbered","$<=","$<","$sectname","$sectnum","$convert_outline","$title?","$icon_uri","$compact","$media_uri","$option?","$append_boolean_attribute","$style","$items","$blocks?","$text?","$chomp","$safe","$read_svg_contents","$alt","$image_uri","$encode_attribute_value","$append_link_constraint_attrs","$highlight?","$to_sym","$format","$*","$count","$start_with?","$end_with?","$list_marker_keyword","$parent","$warn","$logger","$context","$error","$new","$columns","$to_h","$rows","$colspan","$rowspan","$unshift","$shift","$pop","$split","$nil_or_empty?","$type","$catalog","$get_root_document","$xreftext","$target","$reftext","$chop","$sub","$match","$private","$upcase","$nested?","$parent_document","$to_s","$handles?","$send"]),function(a,h){var m=[u(a,"Asciidoctor")].concat(h);!function(a,u,h){var m,y,g,v,b,w,x,k,E,O,A,S,C,R,T,I,N,L,D,P,M,z,F,j,B,q,U,H,Y,W,V,K,G,X,Q,J,Z,ee,te,ne,re,ie,oe,ae,se,$e,le,ue,ce=c(a,u,"Html5Converter"),fe=[ce].concat(h);ce.$$prototype.void_element_slash=ce.$$prototype.xml_mode=ce.$$prototype.refs=ce.$$prototype.resolving_xref=s,ce.$register_for("html5"),ue=[["",""]],f(e.const_set(fe[0],"QUOTE_TAGS",d(["monospaced","emphasis","strong","double","single","mark","superscript","subscript","asciimath","latexmath"],{monospaced:["<code>","</code>",!0],emphasis:["<em>","</em>",!0],strong:["<strong>","</strong>",!0],double:["“","”"],single:["‘","’"],mark:["<mark>","</mark>",!0],superscript:["<sup>","</sup>",!0],subscript:["<sub>","</sub>",!0],asciimath:["\\$","\\$"],latexmath:["\\(","\\)"]})),"default=",e.to_a(ue)),t(ue.length,1),e.const_set(fe[0],"DropAnchorRx",/<(?:a\b[^>]*|\/a)>/),e.const_set(fe[0],"StemBreakRx",/ *\\\n(?:\\?\n)*|\n\n+/),l(fe,"RUBY_ENGINE")["$=="]("opal")&&(e.const_set(fe[0],"SvgPreambleRx",new RegExp("^"+l(fe,"CC_ALL")+"*?(?=<svg[\\s>])")),e.const_set(fe[0],"SvgStartTagRx",/^<svg(?:\s[^>]*)?>/)),e.const_set(fe[0],"DimensionAttributeRx",new RegExp("\\s(?:width|height|style)=([\"'])"+l(fe,"CC_ANY")+"*?\\1")),e.def(ce,"$initialize",m=function(e,t){var n=this,r=s;return null==t&&(t=d([],{})),n.backend=e,t["$[]"]("htmlsyntax")["$=="]("xml")?(r="xml",n.xml_mode=!0,n.void_element_slash="/"):(r="html",n.xml_mode=s,n.void_element_slash=""),n.$init_backend_traits(d(["basebackend","filetype","htmlsyntax","outfilesuffix","supports_templates"],{basebackend:"html",filetype:"html",htmlsyntax:r,outfilesuffix:".html",supports_templates:!0}))},m.$$arity=-2),e.def(ce,"$convert",y=function(t,n,r){var i=y.$$p,o=this,a=s,$=s,l=s,u=s;for(i&&(y.$$p=null),l=0,u=arguments.length,$=new Array(u);l<u;l++)$[l]=arguments[l];return null==n&&(n=t.$node_name()),null==r&&(r=s),"inline_quoted"["$==="](a=n)?o.$convert_inline_quoted(t):"paragraph"["$==="](a)?o.$convert_paragraph(t):"inline_anchor"["$==="](a)?o.$convert_inline_anchor(t):"section"["$==="](a)?o.$convert_section(t):"listing"["$==="](a)?o.$convert_listing(t):"literal"["$==="](a)?o.$convert_literal(t):"ulist"["$==="](a)?o.$convert_ulist(t):"olist"["$==="](a)?o.$convert_olist(t):"dlist"["$==="](a)?o.$convert_dlist(t):"admonition"["$==="](a)?o.$convert_admonition(t):"colist"["$==="](a)?o.$convert_colist(t):"embedded"["$==="](a)?o.$convert_embedded(t):"example"["$==="](a)?o.$convert_example(t):"floating_title"["$==="](a)?o.$convert_floating_title(t):"image"["$==="](a)?o.$convert_image(t):"inline_break"["$==="](a)?o.$convert_inline_break(t):"inline_button"["$==="](a)?o.$convert_inline_button(t):"inline_callout"["$==="](a)?o.$convert_inline_callout(t):"inline_footnote"["$==="](a)?o.$convert_inline_footnote(t):"inline_image"["$==="](a)?o.$convert_inline_image(t):"inline_indexterm"["$==="](a)?o.$convert_inline_indexterm(t):"inline_kbd"["$==="](a)?o.$convert_inline_kbd(t):"inline_menu"["$==="](a)?o.$convert_inline_menu(t):"open"["$==="](a)?o.$convert_open(t):"page_break"["$==="](a)?o.$convert_page_break(t):"preamble"["$==="](a)?o.$convert_preamble(t):"quote"["$==="](a)?o.$convert_quote(t):"sidebar"["$==="](a)?o.$convert_sidebar(t):"stem"["$==="](a)?o.$convert_stem(t):"table"["$==="](a)?o.$convert_table(t):"thematic_break"["$==="](a)?o.$convert_thematic_break(t):"verse"["$==="](a)?o.$convert_verse(t):"video"["$==="](a)?o.$convert_video(t):"document"["$==="](a)?o.$convert_document(t):"toc"["$==="](a)?o.$convert_toc(t):"pass"["$==="](a)?o.$convert_pass(t):"audio"["$==="](a)?o.$convert_audio(t):f(o,e.find_super_dispatcher(o,"convert",y,!1),$,i)},y.$$arity=-2),e.def(ce,"$convert_document",g=function(i){var o,a,$,u,c,_,h,m,y,g,v,b,w,x=this,k=s,E=s,O=s,A=s,S=s,C=s,R=s,T=s,I=s,N=s,L=s,D=s,P=s,M=s,z=s,F=s,j=s;return _="<br"+(h=x.void_element_slash)+">",p((k=i.$attr("asset-uri-scheme","https"))["$empty?"]())||(k+=":"),m=k+"//cdnjs.cloudflare.com/ajax/libs",y=i["$attr?"]("linkcss"),g=p(i["$attr?"]("max-width"))?' style="max-width: '+i.$attr("max-width")+';"':"",E=["<!DOCTYPE html>"],v=p(i["$attr?"]("nolang"))?"":' lang="'+i.$attr("lang","en")+'"',E["$<<"]("<html"+(p(x.xml_mode)?' xmlns="http://www.w3.org/1999/xhtml"':"")+v+">"),E["$<<"]('<head>\n<meta charset="'+i.$attr("encoding","UTF-8")+'"'+h+'>\n<meta http-equiv="X-UA-Compatible" content="IE=edge"'+h+'>\n<meta name="viewport" content="width=device-width, initial-scale=1.0"'+h+'>\n<meta name="generator" content="Asciidoctor '+i.$attr("asciidoctor-version")+'"'+h+">"),p(i["$attr?"]("app-name"))&&E["$<<"]('<meta name="application-name" content="'+i.$attr("app-name")+'"'+h+">"),p(i["$attr?"]("description"))&&E["$<<"]('<meta name="description" content="'+i.$attr("description")+'"'+h+">"),p(i["$attr?"]("keywords"))&&E["$<<"]('<meta name="keywords" content="'+i.$attr("keywords")+'"'+h+">"),p(i["$attr?"]("authors"))&&E["$<<"]('<meta name="author" content="'+(p((O=i.$sub_replacements(i.$attr("authors")))["$include?"]("<"))?O.$gsub(l(fe,"XmlSanitizeRx"),""):O)+'"'+h+">"),p(i["$attr?"]("copyright"))&&E["$<<"]('<meta name="copyright" content="'+i.$attr("copyright")+'"'+h+">"),p(i["$attr?"]("favicon"))&&(p((A=i.$attr("favicon"))["$empty?"]())?(A="favicon.ico",S="image/x-icon"):S=p(C=l(fe,"Helpers").$extname(A,s))?C["$=="](".ico")?"image/x-icon":"image/"+C.$slice(1,C.$length()):"image/x-icon",E["$<<"]('<link rel="icon" type="'+S+'" href="'+A+'"'+h+">")),E["$<<"]("<title>"+i.$doctitle(d(["sanitize","use_fallback"],{sanitize:!0,use_fallback:!0}))+""),p(l(fe,"DEFAULT_STYLESHEET_KEYS")["$include?"](i.$attr("stylesheet")))?(p(R=i.$attr("webfonts"))&&E["$<<"]('"),p(y)?E["$<<"]('"):E["$<<"]("")):p(i["$attr?"]("stylesheet"))&&(p(y)?E["$<<"]('"):E["$<<"]("")),p(i["$attr?"]("icons","font"))&&(p(i["$attr?"]("iconfont-remote"))?E["$<<"]('"):(T=i.$attr("iconfont-name","font-awesome")+".css",E["$<<"]('"))),p(I=i.$syntax_highlighter())&&E["$<<"](N=E.$size()),p((L=i.$docinfo())["$empty?"]())||E["$<<"](L),E["$<<"](""),b=p(i.$id())?' id="'+i.$id()+'"':"",D=p(p(o=p(a=p($=w=i["$sections?"]())?i["$attr?"]("toc-class"):$)?i["$attr?"]("toc"):a)?i["$attr?"]("toc-placement","auto"):o)?[i.$doctype(),i.$attr("toc-class"),"toc-"+i.$attr("toc-position","header")]:[i.$doctype()],p(i["$role?"]())&&D["$<<"](i.$role()),E["$<<"]("'),p((L=i.$docinfo("header"))["$empty?"]())||E["$<<"](L),p(i.$noheader())||(E["$<<"]('")),E["$<<"]('
    \n"+i.$content()+"\n
    "),p(p(o=i["$footnotes?"]())?i["$attr?"]("nofootnotes")["$!"]():o)&&(E["$<<"]('
    \n"),f(i.$footnotes(),"each",[],((c=function(e){return c.$$s,null==e&&(e=s),E["$<<"]('
    \n'+e.$index()+". "+e.$text()+"\n
    ")}).$$s=x,c.$$arity=1,c)),E["$<<"]("
    ")),p(i.$nofooter())||(E["$<<"]('")),p(I)&&(p(I["$docinfo?"]("head"))?(z=[N,I.$docinfo("head",i,d(["cdn_base_url","linkcss","self_closing_tag_slash"],{cdn_base_url:m,linkcss:y,self_closing_tag_slash:h}))],f(E,"[]=",e.to_a(z)),z[t(z.length,1)]):E.$delete_at(N),p(I["$docinfo?"]("footer"))&&E["$<<"](I.$docinfo("footer",i,d(["cdn_base_url","linkcss","self_closing_tag_slash"],{cdn_base_url:m,linkcss:y,self_closing_tag_slash:h})))),p(i["$attr?"]("stem"))&&(F=i.$attr("eqnums","none"),p(F["$empty?"]())&&(F="AMS"),j=' equationNumbers: { autoNumber: "'+F+'" } ',E["$<<"]('\\n\" + ((function() {if ($truthy(doc['$attr?'](\"highlightjs-languages\"))) {\n return $send(doc.$attr(\"highlightjs-languages\").$split(\",\"), 'map', [], ($$6 = function(lang){var self = $$6.$$s || this;\n\n \n \n if (lang == null) {\n lang = nil;\n };\n return \"\" + \"\\n\";}, $$6.$$s = self, $$6.$$arity = 1, $$6)).$join()\n } else {\n return \"\"\n }; return nil; })()) + \"\"\n };\n }, $HighlightJsAdapter_docinfo$5.$$arity = 3), nil) && 'docinfo';\n })($$($nesting, 'SyntaxHighlighter'), $$$($$($nesting, 'SyntaxHighlighter'), 'Base'), $nesting)\n })($nesting[0], $nesting)\n};\n\n/* Generated by Opal 0.11.99.dev */\nOpal.modules[\"asciidoctor/syntax_highlighter\"] = function(Opal) {\n function $rb_minus(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs - rhs : lhs['$-'](rhs);\n }\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice, $module = Opal.module, $hash2 = Opal.hash2, $send = Opal.send, $truthy = Opal.truthy, $klass = Opal.klass;\n\n Opal.add_stubs(['$attr_reader', '$raise', '$class', '$extend', '$private_class_method', '$register', '$map', '$to_s', '$each', '$[]=', '$registry', '$-', '$[]', '$for', '$===', '$new', '$name', '$private', '$include', '$==', '$delete', '$join', '$content']);\n \n (function($base, $parent_nesting) {\n var self = $module($base, 'Asciidoctor');\n\n var $nesting = [self].concat($parent_nesting);\n\n (function($base, $parent_nesting) {\n var self = $module($base, 'SyntaxHighlighter');\n\n var $nesting = [self].concat($parent_nesting), $SyntaxHighlighter_initialize$1, $SyntaxHighlighter_docinfo$ques$2, $SyntaxHighlighter_docinfo$3, $SyntaxHighlighter_highlight$ques$4, $SyntaxHighlighter_highlight$5, $SyntaxHighlighter_format$6, $SyntaxHighlighter_write_stylesheet$ques$7, $SyntaxHighlighter_write_stylesheet$8, $SyntaxHighlighter_included$9;\n\n \n self.$attr_reader(\"name\");\n \n Opal.def(self, '$initialize', $SyntaxHighlighter_initialize$1 = function $$initialize(name, backend, opts) {\n var self = this;\n\n \n \n if (backend == null) {\n backend = \"html5\";\n };\n \n if (opts == null) {\n opts = $hash2([], {});\n };\n return (self.name = (self.pre_class = name));\n }, $SyntaxHighlighter_initialize$1.$$arity = -2);\n \n Opal.def(self, '$docinfo?', $SyntaxHighlighter_docinfo$ques$2 = function(location) {\n var self = this;\n\n return nil\n }, $SyntaxHighlighter_docinfo$ques$2.$$arity = 1);\n \n Opal.def(self, '$docinfo', $SyntaxHighlighter_docinfo$3 = function $$docinfo(location, doc, opts) {\n var self = this;\n\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + ($$($nesting, 'SyntaxHighlighter')) + \" subclass \" + (self.$class()) + \" must implement the #\" + (\"docinfo\") + \" method since #docinfo? returns true\")\n }, $SyntaxHighlighter_docinfo$3.$$arity = 3);\n \n Opal.def(self, '$highlight?', $SyntaxHighlighter_highlight$ques$4 = function() {\n var self = this;\n\n return nil\n }, $SyntaxHighlighter_highlight$ques$4.$$arity = 0);\n \n Opal.def(self, '$highlight', $SyntaxHighlighter_highlight$5 = function $$highlight(node, source, lang, opts) {\n var self = this;\n\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + ($$($nesting, 'SyntaxHighlighter')) + \" subclass \" + (self.$class()) + \" must implement the #\" + (\"highlight\") + \" method since #highlight? returns true\")\n }, $SyntaxHighlighter_highlight$5.$$arity = 4);\n \n Opal.def(self, '$format', $SyntaxHighlighter_format$6 = function $$format(node, lang, opts) {\n var self = this;\n\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + ($$($nesting, 'SyntaxHighlighter')) + \" subclass \" + (self.$class()) + \" must implement the #\" + (\"format\") + \" method\")\n }, $SyntaxHighlighter_format$6.$$arity = 3);\n \n Opal.def(self, '$write_stylesheet?', $SyntaxHighlighter_write_stylesheet$ques$7 = function(doc) {\n var self = this;\n\n return nil\n }, $SyntaxHighlighter_write_stylesheet$ques$7.$$arity = 1);\n \n Opal.def(self, '$write_stylesheet', $SyntaxHighlighter_write_stylesheet$8 = function $$write_stylesheet(doc, to_dir) {\n var self = this;\n\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + ($$($nesting, 'SyntaxHighlighter')) + \" subclass \" + (self.$class()) + \" must implement the #\" + (\"write_stylesheet\") + \" method since #write_stylesheet? returns true\")\n }, $SyntaxHighlighter_write_stylesheet$8.$$arity = 2);\n Opal.defs(self, '$included', $SyntaxHighlighter_included$9 = function $$included(into) {\n var self = this;\n\n return into.$extend($$($nesting, 'Config'))\n }, $SyntaxHighlighter_included$9.$$arity = 1);\n self.$private_class_method(\"included\");\n (function($base, $parent_nesting) {\n var self = $module($base, 'Config');\n\n var $nesting = [self].concat($parent_nesting), $Config_register_for$10;\n\n \n Opal.def(self, '$register_for', $Config_register_for$10 = function $$register_for($a) {\n var $post_args, names, $$11, self = this;\n\n \n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n names = $post_args;;\n return $send($$($nesting, 'SyntaxHighlighter'), 'register', [self].concat(Opal.to_a($send(names, 'map', [], ($$11 = function(name){var self = $$11.$$s || this;\n\n \n \n if (name == null) {\n name = nil;\n };\n return name.$to_s();}, $$11.$$s = self, $$11.$$arity = 1, $$11)))));\n }, $Config_register_for$10.$$arity = -1)\n })($nesting[0], $nesting);\n (function($base, $parent_nesting) {\n var self = $module($base, 'Factory');\n\n var $nesting = [self].concat($parent_nesting), $Factory_register$12, $Factory_for$14, $Factory_create$15, $Factory_registry$16;\n\n \n \n Opal.def(self, '$register', $Factory_register$12 = function $$register(syntax_highlighter, $a) {\n var $post_args, names, $$13, self = this;\n\n \n \n $post_args = Opal.slice.call(arguments, 1, arguments.length);\n \n names = $post_args;;\n return $send(names, 'each', [], ($$13 = function(name){var self = $$13.$$s || this, $writer = nil;\n\n \n \n if (name == null) {\n name = nil;\n };\n $writer = [name, syntax_highlighter];\n $send(self.$registry(), '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];}, $$13.$$s = self, $$13.$$arity = 1, $$13));\n }, $Factory_register$12.$$arity = -2);\n \n Opal.def(self, '$for', $Factory_for$14 = function(name) {\n var self = this;\n\n return self.$registry()['$[]'](name)\n }, $Factory_for$14.$$arity = 1);\n \n Opal.def(self, '$create', $Factory_create$15 = function $$create(name, backend, opts) {\n var self = this, syntax_hl = nil;\n\n \n \n if (backend == null) {\n backend = \"html5\";\n };\n \n if (opts == null) {\n opts = $hash2([], {});\n };\n if ($truthy((syntax_hl = self.$for(name)))) {\n \n if ($truthy($$$('::', 'Class')['$==='](syntax_hl))) {\n syntax_hl = syntax_hl.$new(name, backend, opts)};\n if ($truthy(syntax_hl.$name())) {\n } else {\n self.$raise($$$('::', 'NameError'), \"\" + (syntax_hl.$class()) + \" must specify a value for `name'\")\n };\n return syntax_hl;\n } else {\n return nil\n };\n }, $Factory_create$15.$$arity = -2);\n self.$private();\n \n Opal.def(self, '$registry', $Factory_registry$16 = function $$registry() {\n var self = this;\n\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + ($$($nesting, 'Factory')) + \" subclass \" + (self.$class()) + \" must implement the #\" + (\"registry\") + \" method\")\n }, $Factory_registry$16.$$arity = 0);\n })($nesting[0], $nesting);\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'CustomFactory');\n\n var $nesting = [self].concat($parent_nesting), $CustomFactory_initialize$17;\n\n \n self.$include($$($nesting, 'Factory'));\n \n Opal.def(self, '$initialize', $CustomFactory_initialize$17 = function $$initialize(seed_registry) {\n var $a, self = this;\n\n \n \n if (seed_registry == null) {\n seed_registry = nil;\n };\n return (self.registry = ($truthy($a = seed_registry) ? $a : $hash2([], {})));\n }, $CustomFactory_initialize$17.$$arity = -1);\n self.$private();\n return self.$attr_reader(\"registry\");\n })($nesting[0], null, $nesting);\n (function($base, $parent_nesting) {\n var self = $module($base, 'DefaultFactory');\n\n var $nesting = [self].concat($parent_nesting), $DefaultFactory_registry$18;\n\n \n self.$include($$($nesting, 'Factory'));\n (Opal.class_variable_set($nesting[0], '@@registry', $hash2([], {})));\n self.$private();\n \n Opal.def(self, '$registry', $DefaultFactory_registry$18 = function $$registry() {\n var $a, self = this;\n\n return (($a = $nesting[0].$$cvars['@@registry']) == null ? nil : $a)\n }, $DefaultFactory_registry$18.$$arity = 0);\n if ($$($nesting, 'RUBY_ENGINE')['$=='](\"opal\")) {\n } else {\n nil\n };\n })($nesting[0], $nesting);\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'DefaultFactoryProxy');\n\n var $nesting = [self].concat($parent_nesting);\n\n \n self.$include($$($nesting, 'DefaultFactory'));\n if ($$($nesting, 'RUBY_ENGINE')['$=='](\"opal\")) {\n return nil\n } else {\n return nil\n };\n })($nesting[0], $$($nesting, 'CustomFactory'), $nesting);\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Base');\n\n var $nesting = [self].concat($parent_nesting), $Base_format$19;\n\n self.$$prototype.pre_class = nil;\n \n self.$include($$($nesting, 'SyntaxHighlighter'));\n return (Opal.def(self, '$format', $Base_format$19 = function $$format(node, lang, opts) {\n var $$20, $$21, self = this, class_attr_val = nil, transform = nil, pre = nil, code = nil, $writer = nil;\n\n \n class_attr_val = (function() {if ($truthy(opts['$[]'](\"nowrap\"))) {\n return \"\" + (self.pre_class) + \" highlight nowrap\"\n } else {\n return \"\" + (self.pre_class) + \" highlight\"\n }; return nil; })();\n if ($truthy((transform = opts['$[]'](\"transform\")))) {\n \n transform['$[]']((pre = $hash2([\"class\"], {\"class\": class_attr_val})), (code = (function() {if ($truthy(lang)) {\n return $hash2([\"data-lang\"], {\"data-lang\": lang})\n } else {\n return $hash2([], {})\n }; return nil; })()));\n if ($truthy((lang = code.$delete(\"data-lang\")))) {\n \n $writer = [\"data-lang\", lang];\n $send(code, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];};\n return \"\" + \"\" + (node.$content()) + \"\";\n } else {\n return \"\" + \"
    \" + (node.$content()) + \"
    \"\n };\n }, $Base_format$19.$$arity = 3), nil) && 'format';\n })($nesting[0], null, $nesting);\n self.$extend($$($nesting, 'DefaultFactory'));\n })($nesting[0], $nesting)\n })($nesting[0], $nesting);\n self.$require(\"asciidoctor/syntax_highlighter.rb\"+ '/../' + \"syntax_highlighter/highlightjs\");\n if ($$($nesting, 'RUBY_ENGINE')['$=='](\"opal\")) {\n return nil\n } else {\n return nil\n };\n};\n\n/* Generated by Opal 0.11.99.dev */\nOpal.modules[\"asciidoctor/timings\"] = function(Opal) {\n function $rb_minus(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs - rhs : lhs['$-'](rhs);\n }\n function $rb_plus(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs + rhs : lhs['$+'](rhs);\n }\n function $rb_gt(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs > rhs : lhs['$>'](rhs);\n }\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice, $module = Opal.module, $klass = Opal.klass, $hash2 = Opal.hash2, $send = Opal.send, $truthy = Opal.truthy, $gvars = Opal.gvars;\n\n Opal.add_stubs(['$now', '$[]=', '$-', '$delete', '$reduce', '$+', '$[]', '$>', '$time', '$puts', '$sprintf', '$to_f', '$read_parse', '$convert', '$read_parse_convert', '$private', '$const_defined?', '$==', '$clock_gettime']);\n return (function($base, $parent_nesting) {\n var self = $module($base, 'Asciidoctor');\n\n var $nesting = [self].concat($parent_nesting);\n\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Timings');\n\n var $nesting = [self].concat($parent_nesting), $Timings_initialize$1, $Timings_start$2, $Timings_record$3, $Timings_time$4, $Timings_read$6, $Timings_parse$7, $Timings_read_parse$8, $Timings_convert$9, $Timings_read_parse_convert$10, $Timings_write$11, $Timings_total$12, $Timings_print_report$13, $a, $b, $c, $d, $e, $Timings_now$14, $Timings_now$15;\n\n self.$$prototype.timers = self.$$prototype.log = nil;\n \n \n Opal.def(self, '$initialize', $Timings_initialize$1 = function $$initialize() {\n var self = this;\n\n \n self.log = $hash2([], {});\n return (self.timers = $hash2([], {}));\n }, $Timings_initialize$1.$$arity = 0);\n \n Opal.def(self, '$start', $Timings_start$2 = function $$start(key) {\n var self = this, $writer = nil;\n\n \n $writer = [key, self.$now()];\n $send(self.timers, '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];\n }, $Timings_start$2.$$arity = 1);\n \n Opal.def(self, '$record', $Timings_record$3 = function $$record(key) {\n var self = this, $writer = nil;\n\n \n $writer = [key, $rb_minus(self.$now(), self.timers.$delete(key))];\n $send(self.log, '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];\n }, $Timings_record$3.$$arity = 1);\n \n Opal.def(self, '$time', $Timings_time$4 = function $$time($a) {\n var $post_args, keys, $$5, self = this, time = nil;\n\n \n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n keys = $post_args;;\n time = $send(keys, 'reduce', [0], ($$5 = function(sum, key){var self = $$5.$$s || this, $b;\n if (self.log == null) self.log = nil;\n\n \n \n if (sum == null) {\n sum = nil;\n };\n \n if (key == null) {\n key = nil;\n };\n return $rb_plus(sum, ($truthy($b = self.log['$[]'](key)) ? $b : 0));}, $$5.$$s = self, $$5.$$arity = 2, $$5));\n if ($truthy($rb_gt(time, 0))) {\n return time\n } else {\n return nil\n };\n }, $Timings_time$4.$$arity = -1);\n \n Opal.def(self, '$read', $Timings_read$6 = function $$read() {\n var self = this;\n\n return self.$time(\"read\")\n }, $Timings_read$6.$$arity = 0);\n \n Opal.def(self, '$parse', $Timings_parse$7 = function $$parse() {\n var self = this;\n\n return self.$time(\"parse\")\n }, $Timings_parse$7.$$arity = 0);\n \n Opal.def(self, '$read_parse', $Timings_read_parse$8 = function $$read_parse() {\n var self = this;\n\n return self.$time(\"read\", \"parse\")\n }, $Timings_read_parse$8.$$arity = 0);\n \n Opal.def(self, '$convert', $Timings_convert$9 = function $$convert() {\n var self = this;\n\n return self.$time(\"convert\")\n }, $Timings_convert$9.$$arity = 0);\n \n Opal.def(self, '$read_parse_convert', $Timings_read_parse_convert$10 = function $$read_parse_convert() {\n var self = this;\n\n return self.$time(\"read\", \"parse\", \"convert\")\n }, $Timings_read_parse_convert$10.$$arity = 0);\n \n Opal.def(self, '$write', $Timings_write$11 = function $$write() {\n var self = this;\n\n return self.$time(\"write\")\n }, $Timings_write$11.$$arity = 0);\n \n Opal.def(self, '$total', $Timings_total$12 = function $$total() {\n var self = this;\n\n return self.$time(\"read\", \"parse\", \"convert\", \"write\")\n }, $Timings_total$12.$$arity = 0);\n \n Opal.def(self, '$print_report', $Timings_print_report$13 = function $$print_report(to, subject) {\n var self = this;\n if ($gvars.stdout == null) $gvars.stdout = nil;\n\n \n \n if (to == null) {\n to = $gvars.stdout;\n };\n \n if (subject == null) {\n subject = nil;\n };\n if ($truthy(subject)) {\n to.$puts(\"\" + \"Input file: \" + (subject))};\n to.$puts(\"\" + \" Time to read and parse source: \" + (self.$sprintf(\"%05.5f\", self.$read_parse().$to_f())));\n to.$puts(\"\" + \" Time to convert document: \" + (self.$sprintf(\"%05.5f\", self.$convert().$to_f())));\n return to.$puts(\"\" + \" Total time (read, parse and convert): \" + (self.$sprintf(\"%05.5f\", self.$read_parse_convert().$to_f())));\n }, $Timings_print_report$13.$$arity = -1);\n self.$private();\n if ($truthy(($truthy($a = $$$('::', 'Process')['$const_defined?'](\"CLOCK_MONOTONIC\", false)) ? ((($b = $$$('::', 'Process', 'skip_raise')) && ($c = $b, $c) && ($d = $c) && ((($e = $d.$clock_gettime) && !$e.$$stub) || $d['$respond_to_missing?']('clock_gettime'))) ? 'method' : nil)['$=='](\"method\") : $a))) {\n \n Opal.const_set($nesting[0], 'CLOCK_ID', $$$($$$('::', 'Process'), 'CLOCK_MONOTONIC'));\n return (Opal.def(self, '$now', $Timings_now$14 = function $$now() {\n var self = this;\n\n return $$$('::', 'Process').$clock_gettime($$($nesting, 'CLOCK_ID'))\n }, $Timings_now$14.$$arity = 0), nil) && 'now';\n } else {\n return (Opal.def(self, '$now', $Timings_now$15 = function $$now() {\n var self = this;\n\n return $$$('::', 'Time').$now()\n }, $Timings_now$15.$$arity = 0), nil) && 'now'\n };\n })($nesting[0], null, $nesting)\n })($nesting[0], $nesting)\n};\n\n/* Generated by Opal 0.11.99.dev */\nOpal.modules[\"asciidoctor/converter/composite\"] = function(Opal) {\n function $rb_minus(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs - rhs : lhs['$-'](rhs);\n }\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice, $module = Opal.module, $klass = Opal.klass, $hash2 = Opal.hash2, $send = Opal.send, $truthy = Opal.truthy;\n\n Opal.add_stubs(['$attr_reader', '$each', '$respond_to?', '$composed', '$init_backend_traits', '$backend_traits', '$new', '$find_converter', '$[]=', '$-', '$convert', '$converter_for', '$node_name', '$[]', '$handles?', '$raise']);\n return (function($base, $parent_nesting) {\n var self = $module($base, 'Asciidoctor');\n\n var $nesting = [self].concat($parent_nesting);\n\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'CompositeConverter');\n\n var $nesting = [self].concat($parent_nesting), $CompositeConverter_initialize$1, $CompositeConverter_convert$4, $CompositeConverter_converter_for$5, $CompositeConverter_find_converter$6;\n\n self.$$prototype.converter_cache = self.$$prototype.converters = nil;\n \n self.$attr_reader(\"converters\");\n \n Opal.def(self, '$initialize', $CompositeConverter_initialize$1 = function $$initialize(backend, $a, $b) {\n var $post_args, $kwargs, converters, backend_traits_source, $$2, $$3, self = this;\n\n \n \n $post_args = Opal.slice.call(arguments, 1, arguments.length);\n \n $kwargs = Opal.extract_kwargs($post_args);\n \n if ($kwargs == null) {\n $kwargs = $hash2([], {});\n } else if (!$kwargs.$$is_hash) {\n throw Opal.ArgumentError.$new('expected kwargs');\n };\n \n converters = $post_args;;\n \n backend_traits_source = $kwargs.$$smap[\"backend_traits_source\"];\n if (backend_traits_source == null) {\n backend_traits_source = nil\n };\n self.backend = backend;\n $send((self.converters = converters), 'each', [], ($$2 = function(converter){var self = $$2.$$s || this;\n\n \n \n if (converter == null) {\n converter = nil;\n };\n if ($truthy(converter['$respond_to?'](\"composed\"))) {\n return converter.$composed(self)\n } else {\n return nil\n };}, $$2.$$s = self, $$2.$$arity = 1, $$2));\n if ($truthy(backend_traits_source)) {\n self.$init_backend_traits(backend_traits_source.$backend_traits())};\n return (self.converter_cache = $send($$$('::', 'Hash'), 'new', [], ($$3 = function(hash, key){var self = $$3.$$s || this, $writer = nil;\n\n \n \n if (hash == null) {\n hash = nil;\n };\n \n if (key == null) {\n key = nil;\n };\n $writer = [key, self.$find_converter(key)];\n $send(hash, '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];}, $$3.$$s = self, $$3.$$arity = 2, $$3)));\n }, $CompositeConverter_initialize$1.$$arity = -2);\n \n Opal.def(self, '$convert', $CompositeConverter_convert$4 = function $$convert(node, transform, opts) {\n var $a, self = this;\n\n \n \n if (transform == null) {\n transform = nil;\n };\n \n if (opts == null) {\n opts = nil;\n };\n return self.$converter_for((transform = ($truthy($a = transform) ? $a : node.$node_name()))).$convert(node, transform, opts);\n }, $CompositeConverter_convert$4.$$arity = -2);\n \n Opal.def(self, '$converter_for', $CompositeConverter_converter_for$5 = function $$converter_for(transform) {\n var self = this;\n\n return self.converter_cache['$[]'](transform)\n }, $CompositeConverter_converter_for$5.$$arity = 1);\n return (Opal.def(self, '$find_converter', $CompositeConverter_find_converter$6 = function $$find_converter(transform) {try {\n\n var $$7, self = this;\n\n \n $send(self.converters, 'each', [], ($$7 = function(candidate){var self = $$7.$$s || this;\n\n \n \n if (candidate == null) {\n candidate = nil;\n };\n if ($truthy(candidate['$handles?'](transform))) {\n Opal.ret(candidate)\n } else {\n return nil\n };}, $$7.$$s = self, $$7.$$arity = 1, $$7));\n return self.$raise(\"\" + \"Could not find a converter to handle transform: \" + (transform));\n } catch ($returner) { if ($returner === Opal.returner) { return $returner.$v } throw $returner; }\n }, $CompositeConverter_find_converter$6.$$arity = 1), nil) && 'find_converter';\n })($$($nesting, 'Converter'), $$$($$($nesting, 'Converter'), 'Base'), $nesting)\n })($nesting[0], $nesting)\n};\n\n/* Generated by Opal 0.11.99.dev */\nOpal.modules[\"asciidoctor/converter/html5\"] = function(Opal) {\n function $rb_minus(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs - rhs : lhs['$-'](rhs);\n }\n function $rb_gt(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs > rhs : lhs['$>'](rhs);\n }\n function $rb_plus(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs + rhs : lhs['$+'](rhs);\n }\n function $rb_le(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs <= rhs : lhs['$<='](rhs);\n }\n function $rb_lt(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs < rhs : lhs['$<'](rhs);\n }\n function $rb_times(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs * rhs : lhs['$*'](rhs);\n }\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice, $module = Opal.module, $klass = Opal.klass, $send = Opal.send, $hash2 = Opal.hash2, $truthy = Opal.truthy, $gvars = Opal.gvars;\n\n Opal.add_stubs(['$register_for', '$default=', '$-', '$==', '$[]', '$init_backend_traits', '$node_name', '$===', '$convert_inline_quoted', '$convert_paragraph', '$convert_inline_anchor', '$convert_section', '$convert_listing', '$convert_literal', '$convert_ulist', '$convert_olist', '$convert_dlist', '$convert_admonition', '$convert_colist', '$convert_embedded', '$convert_example', '$convert_floating_title', '$convert_image', '$convert_inline_break', '$convert_inline_button', '$convert_inline_callout', '$convert_inline_footnote', '$convert_inline_image', '$convert_inline_indexterm', '$convert_inline_kbd', '$convert_inline_menu', '$convert_open', '$convert_page_break', '$convert_preamble', '$convert_quote', '$convert_sidebar', '$convert_stem', '$convert_table', '$convert_thematic_break', '$convert_verse', '$convert_video', '$convert_document', '$convert_toc', '$convert_pass', '$convert_audio', '$empty?', '$attr', '$attr?', '$<<', '$include?', '$sub_replacements', '$gsub', '$extname', '$slice', '$length', '$doctitle', '$normalize_web_path', '$primary_stylesheet_data', '$instance', '$read_contents', '$syntax_highlighter', '$size', '$docinfo', '$id', '$sections?', '$doctype', '$role?', '$role', '$join', '$noheader', '$convert', '$converter', '$generate_manname_section', '$header?', '$notitle', '$title', '$header', '$each', '$authors', '$>', '$name', '$email', '$sub_macros', '$+', '$downcase', '$concat', '$content', '$footnotes?', '$!', '$footnotes', '$index', '$text', '$nofooter', '$docinfo?', '$[]=', '$delete_at', '$inspect', '$!=', '$to_i', '$attributes', '$document', '$sections', '$level', '$caption', '$captioned_title', '$numbered', '$<=', '$<', '$sectname', '$sectnum', '$convert_outline', '$title?', '$icon_uri', '$compact', '$media_uri', '$option?', '$append_boolean_attribute', '$style', '$items', '$blocks?', '$text?', '$chomp', '$safe', '$read_svg_contents', '$alt', '$image_uri', '$encode_attribute_value', '$append_link_constraint_attrs', '$highlight?', '$to_sym', '$format', '$*', '$count', '$start_with?', '$end_with?', '$list_marker_keyword', '$parent', '$warn', '$logger', '$context', '$error', '$new', '$columns', '$to_h', '$rows', '$colspan', '$rowspan', '$unshift', '$shift', '$pop', '$split', '$nil_or_empty?', '$type', '$catalog', '$get_root_document', '$xreftext', '$target', '$reftext', '$chop', '$sub', '$match', '$private', '$upcase', '$nested?', '$parent_document', '$to_s', '$handles?', '$send']);\n return (function($base, $parent_nesting) {\n var self = $module($base, 'Asciidoctor');\n\n var $nesting = [self].concat($parent_nesting);\n\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Html5Converter');\n\n var $nesting = [self].concat($parent_nesting), $Html5Converter_initialize$1, $Html5Converter_convert$2, $Html5Converter_convert_document$3, $Html5Converter_convert_embedded$6, $Html5Converter_convert_outline$8, $Html5Converter_convert_section$10, $Html5Converter_convert_admonition$11, $Html5Converter_convert_audio$12, $Html5Converter_convert_colist$13, $Html5Converter_convert_dlist$16, $Html5Converter_convert_example$23, $Html5Converter_convert_floating_title$24, $Html5Converter_convert_image$25, $Html5Converter_convert_listing$26, $Html5Converter_convert_literal$27, $Html5Converter_convert_stem$28, $Html5Converter_convert_olist$30, $Html5Converter_convert_open$32, $Html5Converter_convert_page_break$33, $Html5Converter_convert_paragraph$34, $Html5Converter_convert_preamble$35, $Html5Converter_convert_quote$36, $Html5Converter_convert_thematic_break$37, $Html5Converter_convert_sidebar$38, $Html5Converter_convert_table$39, $Html5Converter_convert_toc$44, $Html5Converter_convert_ulist$45, $Html5Converter_convert_verse$47, $Html5Converter_convert_video$48, $Html5Converter_convert_inline_anchor$49, $Html5Converter_convert_inline_break$50, $Html5Converter_convert_inline_button$51, $Html5Converter_convert_inline_callout$52, $Html5Converter_convert_inline_footnote$53, $Html5Converter_convert_inline_image$54, $Html5Converter_convert_inline_indexterm$56, $Html5Converter_convert_inline_kbd$57, $Html5Converter_convert_inline_menu$58, $Html5Converter_convert_inline_quoted$59, $Html5Converter_read_svg_contents$60, $Html5Converter_append_boolean_attribute$62, $Html5Converter_append_link_constraint_attrs$63, $Html5Converter_encode_attribute_value$64, $Html5Converter_generate_manname_section$65, $Html5Converter_get_root_document$66, $Html5Converter_method_missing$67, $Html5Converter_respond_to_missing$ques$68, $writer = nil;\n\n self.$$prototype.void_element_slash = self.$$prototype.xml_mode = self.$$prototype.refs = self.$$prototype.resolving_xref = nil;\n \n self.$register_for(\"html5\");\n \n $writer = [[\"\", \"\"]];\n $send(Opal.const_set($nesting[0], 'QUOTE_TAGS', $hash2([\"monospaced\", \"emphasis\", \"strong\", \"double\", \"single\", \"mark\", \"superscript\", \"subscript\", \"asciimath\", \"latexmath\"], {\"monospaced\": [\"\", \"\", true], \"emphasis\": [\"\", \"\", true], \"strong\": [\"\", \"\", true], \"double\": [\"“\", \"”\"], \"single\": [\"‘\", \"’\"], \"mark\": [\"\", \"\", true], \"superscript\": [\"\", \"\", true], \"subscript\": [\"\", \"\", true], \"asciimath\": [\"\\\\$\", \"\\\\$\"], \"latexmath\": [\"\\\\(\", \"\\\\)\"]})), 'default=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;\n Opal.const_set($nesting[0], 'DropAnchorRx', /<(?:a\\b[^>]*|\\/a)>/);\n Opal.const_set($nesting[0], 'StemBreakRx', / *\\\\\\n(?:\\\\?\\n)*|\\n\\n+/);\n if ($$($nesting, 'RUBY_ENGINE')['$=='](\"opal\")) {\n \n Opal.const_set($nesting[0], 'SvgPreambleRx', new RegExp(\"\" + \"^\" + ($$($nesting, 'CC_ALL')) + \"*?(?=])\"));\n Opal.const_set($nesting[0], 'SvgStartTagRx', /^]*)?>/);\n } else {\n nil\n };\n Opal.const_set($nesting[0], 'DimensionAttributeRx', new RegExp(\"\" + \"\\\\s(?:width|height|style)=([\\\"'])\" + ($$($nesting, 'CC_ANY')) + \"*?\\\\1\"));\n \n Opal.def(self, '$initialize', $Html5Converter_initialize$1 = function $$initialize(backend, opts) {\n var self = this, syntax = nil;\n\n \n \n if (opts == null) {\n opts = $hash2([], {});\n };\n self.backend = backend;\n if (opts['$[]'](\"htmlsyntax\")['$=='](\"xml\")) {\n \n syntax = \"xml\";\n self.xml_mode = true;\n self.void_element_slash = \"/\";\n } else {\n \n syntax = \"html\";\n self.xml_mode = nil;\n self.void_element_slash = \"\";\n };\n return self.$init_backend_traits($hash2([\"basebackend\", \"filetype\", \"htmlsyntax\", \"outfilesuffix\", \"supports_templates\"], {\"basebackend\": \"html\", \"filetype\": \"html\", \"htmlsyntax\": syntax, \"outfilesuffix\": \".html\", \"supports_templates\": true}));\n }, $Html5Converter_initialize$1.$$arity = -2);\n \n Opal.def(self, '$convert', $Html5Converter_convert$2 = function $$convert(node, transform, opts) {\n var $iter = $Html5Converter_convert$2.$$p, $yield = $iter || nil, self = this, $case = nil, $zuper = nil, $zuper_i = nil, $zuper_ii = nil;\n\n if ($iter) $Html5Converter_convert$2.$$p = null;\n // Prepare super implicit arguments\n for($zuper_i = 0, $zuper_ii = arguments.length, $zuper = new Array($zuper_ii); $zuper_i < $zuper_ii; $zuper_i++) {\n $zuper[$zuper_i] = arguments[$zuper_i];\n }\n \n \n if (transform == null) {\n transform = node.$node_name();\n };\n \n if (opts == null) {\n opts = nil;\n };\n return (function() {$case = transform;\n if (\"inline_quoted\"['$===']($case)) {return self.$convert_inline_quoted(node)}\n else if (\"paragraph\"['$===']($case)) {return self.$convert_paragraph(node)}\n else if (\"inline_anchor\"['$===']($case)) {return self.$convert_inline_anchor(node)}\n else if (\"section\"['$===']($case)) {return self.$convert_section(node)}\n else if (\"listing\"['$===']($case)) {return self.$convert_listing(node)}\n else if (\"literal\"['$===']($case)) {return self.$convert_literal(node)}\n else if (\"ulist\"['$===']($case)) {return self.$convert_ulist(node)}\n else if (\"olist\"['$===']($case)) {return self.$convert_olist(node)}\n else if (\"dlist\"['$===']($case)) {return self.$convert_dlist(node)}\n else if (\"admonition\"['$===']($case)) {return self.$convert_admonition(node)}\n else if (\"colist\"['$===']($case)) {return self.$convert_colist(node)}\n else if (\"embedded\"['$===']($case)) {return self.$convert_embedded(node)}\n else if (\"example\"['$===']($case)) {return self.$convert_example(node)}\n else if (\"floating_title\"['$===']($case)) {return self.$convert_floating_title(node)}\n else if (\"image\"['$===']($case)) {return self.$convert_image(node)}\n else if (\"inline_break\"['$===']($case)) {return self.$convert_inline_break(node)}\n else if (\"inline_button\"['$===']($case)) {return self.$convert_inline_button(node)}\n else if (\"inline_callout\"['$===']($case)) {return self.$convert_inline_callout(node)}\n else if (\"inline_footnote\"['$===']($case)) {return self.$convert_inline_footnote(node)}\n else if (\"inline_image\"['$===']($case)) {return self.$convert_inline_image(node)}\n else if (\"inline_indexterm\"['$===']($case)) {return self.$convert_inline_indexterm(node)}\n else if (\"inline_kbd\"['$===']($case)) {return self.$convert_inline_kbd(node)}\n else if (\"inline_menu\"['$===']($case)) {return self.$convert_inline_menu(node)}\n else if (\"open\"['$===']($case)) {return self.$convert_open(node)}\n else if (\"page_break\"['$===']($case)) {return self.$convert_page_break(node)}\n else if (\"preamble\"['$===']($case)) {return self.$convert_preamble(node)}\n else if (\"quote\"['$===']($case)) {return self.$convert_quote(node)}\n else if (\"sidebar\"['$===']($case)) {return self.$convert_sidebar(node)}\n else if (\"stem\"['$===']($case)) {return self.$convert_stem(node)}\n else if (\"table\"['$===']($case)) {return self.$convert_table(node)}\n else if (\"thematic_break\"['$===']($case)) {return self.$convert_thematic_break(node)}\n else if (\"verse\"['$===']($case)) {return self.$convert_verse(node)}\n else if (\"video\"['$===']($case)) {return self.$convert_video(node)}\n else if (\"document\"['$===']($case)) {return self.$convert_document(node)}\n else if (\"toc\"['$===']($case)) {return self.$convert_toc(node)}\n else if (\"pass\"['$===']($case)) {return self.$convert_pass(node)}\n else if (\"audio\"['$===']($case)) {return self.$convert_audio(node)}\n else {return $send(self, Opal.find_super_dispatcher(self, 'convert', $Html5Converter_convert$2, false), $zuper, $iter)}})();\n }, $Html5Converter_convert$2.$$arity = -2);\n \n Opal.def(self, '$convert_document', $Html5Converter_convert_document$3 = function $$convert_document(node) {\n var $a, $b, $c, $$4, $$5, self = this, br = nil, slash = nil, asset_uri_scheme = nil, cdn_base_url = nil, linkcss = nil, max_width_attr = nil, result = nil, lang_attribute = nil, authors = nil, icon_href = nil, icon_type = nil, icon_ext = nil, webfonts = nil, iconfont_stylesheet = nil, syntax_hl = nil, syntax_hl_docinfo_head_idx = nil, docinfo_content = nil, id_attr = nil, sectioned = nil, classes = nil, details = nil, idx = nil, $writer = nil, eqnums_val = nil, eqnums_opt = nil;\n\n \n br = \"\" + \"\";\n if ($truthy((asset_uri_scheme = node.$attr(\"asset-uri-scheme\", \"https\"))['$empty?']())) {\n } else {\n asset_uri_scheme = \"\" + (asset_uri_scheme) + \":\"\n };\n cdn_base_url = \"\" + (asset_uri_scheme) + \"//cdnjs.cloudflare.com/ajax/libs\";\n linkcss = node['$attr?'](\"linkcss\");\n max_width_attr = (function() {if ($truthy(node['$attr?'](\"max-width\"))) {\n return \"\" + \" style=\\\"max-width: \" + (node.$attr(\"max-width\")) + \";\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n result = [\"\"];\n lang_attribute = (function() {if ($truthy(node['$attr?'](\"nolang\"))) {\n return \"\"\n } else {\n return \"\" + \" lang=\\\"\" + (node.$attr(\"lang\", \"en\")) + \"\\\"\"\n }; return nil; })();\n result['$<<'](\"\" + \"\");\n result['$<<'](\"\" + \"\\n\" + \"\\n\" + \"\\n\" + \"\\n\" + \"\");\n if ($truthy(node['$attr?'](\"app-name\"))) {\n result['$<<'](\"\" + \"\")};\n if ($truthy(node['$attr?'](\"description\"))) {\n result['$<<'](\"\" + \"\")};\n if ($truthy(node['$attr?'](\"keywords\"))) {\n result['$<<'](\"\" + \"\")};\n if ($truthy(node['$attr?'](\"authors\"))) {\n result['$<<'](\"\" + \"\")};\n if ($truthy(node['$attr?'](\"copyright\"))) {\n result['$<<'](\"\" + \"\")};\n if ($truthy(node['$attr?'](\"favicon\"))) {\n \n if ($truthy((icon_href = node.$attr(\"favicon\"))['$empty?']())) {\n \n icon_href = \"favicon.ico\";\n icon_type = \"image/x-icon\";\n } else if ($truthy((icon_ext = $$($nesting, 'Helpers').$extname(icon_href, nil)))) {\n icon_type = (function() {if (icon_ext['$=='](\".ico\")) {\n return \"image/x-icon\"\n } else {\n return \"\" + \"image/\" + (icon_ext.$slice(1, icon_ext.$length()))\n }; return nil; })()\n } else {\n icon_type = \"image/x-icon\"\n };\n result['$<<'](\"\" + \"\");};\n result['$<<'](\"\" + \"\" + (node.$doctitle($hash2([\"sanitize\", \"use_fallback\"], {\"sanitize\": true, \"use_fallback\": true}))) + \"\");\n if ($truthy($$($nesting, 'DEFAULT_STYLESHEET_KEYS')['$include?'](node.$attr(\"stylesheet\")))) {\n \n if ($truthy((webfonts = node.$attr(\"webfonts\")))) {\n result['$<<'](\"\" + \"\")};\n if ($truthy(linkcss)) {\n result['$<<'](\"\" + \"\")\n } else {\n result['$<<'](\"\" + \"\")\n };\n } else if ($truthy(node['$attr?'](\"stylesheet\"))) {\n if ($truthy(linkcss)) {\n result['$<<'](\"\" + \"\")\n } else {\n result['$<<'](\"\" + \"\")\n }};\n if ($truthy(node['$attr?'](\"icons\", \"font\"))) {\n if ($truthy(node['$attr?'](\"iconfont-remote\"))) {\n result['$<<'](\"\" + \"\")\n } else {\n \n iconfont_stylesheet = \"\" + (node.$attr(\"iconfont-name\", \"font-awesome\")) + \".css\";\n result['$<<'](\"\" + \"\");\n }};\n if ($truthy((syntax_hl = node.$syntax_highlighter()))) {\n result['$<<']((syntax_hl_docinfo_head_idx = result.$size()))};\n if ($truthy((docinfo_content = node.$docinfo())['$empty?']())) {\n } else {\n result['$<<'](docinfo_content)\n };\n result['$<<'](\"\");\n id_attr = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n if ($truthy(($truthy($a = ($truthy($b = ($truthy($c = (sectioned = node['$sections?']())) ? node['$attr?'](\"toc-class\") : $c)) ? node['$attr?'](\"toc\") : $b)) ? node['$attr?'](\"toc-placement\", \"auto\") : $a))) {\n classes = [node.$doctype(), node.$attr(\"toc-class\"), \"\" + \"toc-\" + (node.$attr(\"toc-position\", \"header\"))]\n } else {\n classes = [node.$doctype()]\n };\n if ($truthy(node['$role?']())) {\n classes['$<<'](node.$role())};\n result['$<<'](\"\" + \"\");\n if ($truthy((docinfo_content = node.$docinfo(\"header\"))['$empty?']())) {\n } else {\n result['$<<'](docinfo_content)\n };\n if ($truthy(node.$noheader())) {\n } else {\n \n result['$<<'](\"\" + \"
    \");\n if (node.$doctype()['$=='](\"manpage\")) {\n \n result['$<<'](\"\" + \"

    \" + (node.$doctitle()) + \" Manual Page

    \");\n if ($truthy(($truthy($a = ($truthy($b = sectioned) ? node['$attr?'](\"toc\") : $b)) ? node['$attr?'](\"toc-placement\", \"auto\") : $a))) {\n result['$<<'](\"\" + \"
    \\n\" + \"
    \" + (node.$attr(\"toc-title\")) + \"
    \\n\" + (node.$converter().$convert(node, \"outline\")) + \"\\n\" + \"
    \")};\n if ($truthy(node['$attr?'](\"manpurpose\"))) {\n result['$<<'](self.$generate_manname_section(node))};\n } else {\n \n if ($truthy(node['$header?']())) {\n \n if ($truthy(node.$notitle())) {\n } else {\n result['$<<'](\"\" + \"

    \" + (node.$header().$title()) + \"

    \")\n };\n details = [];\n idx = 1;\n $send(node.$authors(), 'each', [], ($$4 = function(author){var self = $$4.$$s || this;\n\n \n \n if (author == null) {\n author = nil;\n };\n details['$<<'](\"\" + \"\" + (node.$sub_replacements(author.$name())) + \"\" + (br));\n if ($truthy(author.$email())) {\n details['$<<'](\"\" + \"\" + (node.$sub_macros(author.$email())) + \"\" + (br))};\n return (idx = $rb_plus(idx, 1));}, $$4.$$s = self, $$4.$$arity = 1, $$4));\n if ($truthy(node['$attr?'](\"revnumber\"))) {\n details['$<<'](\"\" + \"\" + (($truthy($a = node.$attr(\"version-label\")) ? $a : \"\").$downcase()) + \" \" + (node.$attr(\"revnumber\")) + ((function() {if ($truthy(node['$attr?'](\"revdate\"))) {\n return \",\"\n } else {\n return \"\"\n }; return nil; })()) + \"\")};\n if ($truthy(node['$attr?'](\"revdate\"))) {\n details['$<<'](\"\" + \"\" + (node.$attr(\"revdate\")) + \"\")};\n if ($truthy(node['$attr?'](\"revremark\"))) {\n details['$<<'](\"\" + (br) + \"\" + (node.$attr(\"revremark\")) + \"\")};\n if ($truthy(details['$empty?']())) {\n } else {\n \n result['$<<'](\"
    \");\n result.$concat(details);\n result['$<<'](\"
    \");\n };};\n if ($truthy(($truthy($a = ($truthy($b = sectioned) ? node['$attr?'](\"toc\") : $b)) ? node['$attr?'](\"toc-placement\", \"auto\") : $a))) {\n result['$<<'](\"\" + \"
    \\n\" + \"
    \" + (node.$attr(\"toc-title\")) + \"
    \\n\" + (node.$converter().$convert(node, \"outline\")) + \"\\n\" + \"
    \")};\n };\n result['$<<'](\"
    \");\n };\n result['$<<'](\"\" + \"
    \\n\" + (node.$content()) + \"\\n\" + \"
    \");\n if ($truthy(($truthy($a = node['$footnotes?']()) ? node['$attr?'](\"nofootnotes\")['$!']() : $a))) {\n \n result['$<<'](\"\" + \"
    \\n\" + \"\");\n $send(node.$footnotes(), 'each', [], ($$5 = function(footnote){var self = $$5.$$s || this;\n\n \n \n if (footnote == null) {\n footnote = nil;\n };\n return result['$<<'](\"\" + \"
    \\n\" + \"\" + (footnote.$index()) + \". \" + (footnote.$text()) + \"\\n\" + \"
    \");}, $$5.$$s = self, $$5.$$arity = 1, $$5));\n result['$<<'](\"
    \");};\n if ($truthy(node.$nofooter())) {\n } else {\n \n result['$<<'](\"\" + \"
    \");\n result['$<<'](\"
    \");\n if ($truthy(node['$attr?'](\"revnumber\"))) {\n result['$<<'](\"\" + (node.$attr(\"version-label\")) + \" \" + (node.$attr(\"revnumber\")) + (br))};\n if ($truthy(($truthy($a = node['$attr?'](\"last-update-label\")) ? node['$attr?'](\"reproducible\")['$!']() : $a))) {\n result['$<<'](\"\" + (node.$attr(\"last-update-label\")) + \" \" + (node.$attr(\"docdatetime\")))};\n result['$<<'](\"
    \");\n result['$<<'](\"
    \");\n };\n if ($truthy(syntax_hl)) {\n \n if ($truthy(syntax_hl['$docinfo?'](\"head\"))) {\n \n $writer = [syntax_hl_docinfo_head_idx, syntax_hl.$docinfo(\"head\", node, $hash2([\"cdn_base_url\", \"linkcss\", \"self_closing_tag_slash\"], {\"cdn_base_url\": cdn_base_url, \"linkcss\": linkcss, \"self_closing_tag_slash\": slash}))];\n $send(result, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];\n } else {\n result.$delete_at(syntax_hl_docinfo_head_idx)\n };\n if ($truthy(syntax_hl['$docinfo?'](\"footer\"))) {\n result['$<<'](syntax_hl.$docinfo(\"footer\", node, $hash2([\"cdn_base_url\", \"linkcss\", \"self_closing_tag_slash\"], {\"cdn_base_url\": cdn_base_url, \"linkcss\": linkcss, \"self_closing_tag_slash\": slash})))};};\n if ($truthy(node['$attr?'](\"stem\"))) {\n \n eqnums_val = node.$attr(\"eqnums\", \"none\");\n if ($truthy(eqnums_val['$empty?']())) {\n eqnums_val = \"AMS\"};\n eqnums_opt = \"\" + \" equationNumbers: { autoNumber: \\\"\" + (eqnums_val) + \"\\\" } \";\n result['$<<'](\"\" + \"\\n\" + \"\");};\n if ($truthy((docinfo_content = node.$docinfo(\"footer\"))['$empty?']())) {\n } else {\n result['$<<'](docinfo_content)\n };\n result['$<<'](\"\");\n result['$<<'](\"\");\n return result.$join($$($nesting, 'LF'));\n }, $Html5Converter_convert_document$3.$$arity = 1);\n \n Opal.def(self, '$convert_embedded', $Html5Converter_convert_embedded$6 = function $$convert_embedded(node) {\n var $a, $b, $c, $$7, self = this, result = nil, id_attr = nil, toc_p = nil;\n\n \n result = [];\n if (node.$doctype()['$=='](\"manpage\")) {\n \n if ($truthy(node.$notitle())) {\n } else {\n \n id_attr = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n result['$<<'](\"\" + \"\" + (node.$doctitle()) + \" Manual Page\");\n };\n if ($truthy(node['$attr?'](\"manpurpose\"))) {\n result['$<<'](self.$generate_manname_section(node))};\n } else if ($truthy(($truthy($a = node['$header?']()) ? node.$notitle()['$!']() : $a))) {\n \n id_attr = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n result['$<<'](\"\" + \"\" + (node.$header().$title()) + \"\");};\n if ($truthy(($truthy($a = ($truthy($b = ($truthy($c = node['$sections?']()) ? node['$attr?'](\"toc\") : $c)) ? (toc_p = node.$attr(\"toc-placement\"))['$!='](\"macro\") : $b)) ? toc_p['$!='](\"preamble\") : $a))) {\n result['$<<'](\"\" + \"
    \\n\" + \"
    \" + (node.$attr(\"toc-title\")) + \"
    \\n\" + (node.$converter().$convert(node, \"outline\")) + \"\\n\" + \"
    \")};\n result['$<<'](node.$content());\n if ($truthy(($truthy($a = node['$footnotes?']()) ? node['$attr?'](\"nofootnotes\")['$!']() : $a))) {\n \n result['$<<'](\"\" + \"
    \\n\" + \"\");\n $send(node.$footnotes(), 'each', [], ($$7 = function(footnote){var self = $$7.$$s || this;\n\n \n \n if (footnote == null) {\n footnote = nil;\n };\n return result['$<<'](\"\" + \"
    \\n\" + \"\" + (footnote.$index()) + \". \" + (footnote.$text()) + \"\\n\" + \"
    \");}, $$7.$$s = self, $$7.$$arity = 1, $$7));\n result['$<<'](\"
    \");};\n return result.$join($$($nesting, 'LF'));\n }, $Html5Converter_convert_embedded$6.$$arity = 1);\n \n Opal.def(self, '$convert_outline', $Html5Converter_convert_outline$8 = function $$convert_outline(node, opts) {\n var $a, $b, $$9, self = this, sectnumlevels = nil, toclevels = nil, sections = nil, result = nil;\n\n \n \n if (opts == null) {\n opts = $hash2([], {});\n };\n if ($truthy(node['$sections?']())) {\n } else {\n return nil\n };\n sectnumlevels = ($truthy($a = opts['$[]'](\"sectnumlevels\")) ? $a : ($truthy($b = node.$document().$attributes()['$[]'](\"sectnumlevels\")) ? $b : 3).$to_i());\n toclevels = ($truthy($a = opts['$[]'](\"toclevels\")) ? $a : ($truthy($b = node.$document().$attributes()['$[]'](\"toclevels\")) ? $b : 2).$to_i());\n sections = node.$sections();\n result = [\"\" + \"
      \"];\n $send(sections, 'each', [], ($$9 = function(section){var self = $$9.$$s || this, $c, slevel = nil, stitle = nil, $case = nil, signifier = nil, child_toc_level = nil;\n\n \n \n if (section == null) {\n section = nil;\n };\n slevel = section.$level();\n if ($truthy(section.$caption())) {\n stitle = section.$captioned_title()\n } else if ($truthy(($truthy($c = section.$numbered()) ? $rb_le(slevel, sectnumlevels) : $c))) {\n if ($truthy(($truthy($c = $rb_lt(slevel, 2)) ? node.$document().$doctype()['$=='](\"book\") : $c))) {\n $case = section.$sectname();\n if (\"chapter\"['$===']($case)) {stitle = \"\" + ((function() {if ($truthy((signifier = node.$document().$attributes()['$[]'](\"chapter-signifier\")))) {\n return \"\" + (signifier) + \" \"\n } else {\n return \"\"\n }; return nil; })()) + (section.$sectnum()) + \" \" + (section.$title())}\n else if (\"part\"['$===']($case)) {stitle = \"\" + ((function() {if ($truthy((signifier = node.$document().$attributes()['$[]'](\"part-signifier\")))) {\n return \"\" + (signifier) + \" \"\n } else {\n return \"\"\n }; return nil; })()) + (section.$sectnum(nil, \":\")) + \" \" + (section.$title())}\n else {stitle = \"\" + (section.$sectnum()) + \" \" + (section.$title())}\n } else {\n stitle = \"\" + (section.$sectnum()) + \" \" + (section.$title())\n }\n } else {\n stitle = section.$title()\n };\n if ($truthy(stitle['$include?'](\"\" + (stitle) + \"\");\n result['$<<'](child_toc_level);\n return result['$<<'](\"\");\n } else {\n return result['$<<'](\"\" + \"
    • \" + (stitle) + \"
    • \")\n };}, $$9.$$s = self, $$9.$$arity = 1, $$9));\n result['$<<'](\"
    \");\n return result.$join($$($nesting, 'LF'));\n }, $Html5Converter_convert_outline$8.$$arity = -2);\n \n Opal.def(self, '$convert_section', $Html5Converter_convert_section$10 = function $$convert_section(node) {\n var $a, $b, self = this, doc_attrs = nil, level = nil, title = nil, $case = nil, signifier = nil, id_attr = nil, id = nil, role = nil;\n\n \n doc_attrs = node.$document().$attributes();\n level = node.$level();\n if ($truthy(node.$caption())) {\n title = node.$captioned_title()\n } else if ($truthy(($truthy($a = node.$numbered()) ? $rb_le(level, ($truthy($b = doc_attrs['$[]'](\"sectnumlevels\")) ? $b : 3).$to_i()) : $a))) {\n if ($truthy(($truthy($a = $rb_lt(level, 2)) ? node.$document().$doctype()['$=='](\"book\") : $a))) {\n $case = node.$sectname();\n if (\"chapter\"['$===']($case)) {title = \"\" + ((function() {if ($truthy((signifier = doc_attrs['$[]'](\"chapter-signifier\")))) {\n return \"\" + (signifier) + \" \"\n } else {\n return \"\"\n }; return nil; })()) + (node.$sectnum()) + \" \" + (node.$title())}\n else if (\"part\"['$===']($case)) {title = \"\" + ((function() {if ($truthy((signifier = doc_attrs['$[]'](\"part-signifier\")))) {\n return \"\" + (signifier) + \" \"\n } else {\n return \"\"\n }; return nil; })()) + (node.$sectnum(nil, \":\")) + \" \" + (node.$title())}\n else {title = \"\" + (node.$sectnum()) + \" \" + (node.$title())}\n } else {\n title = \"\" + (node.$sectnum()) + \" \" + (node.$title())\n }\n } else {\n title = node.$title()\n };\n if ($truthy(node.$id())) {\n \n id_attr = \"\" + \" id=\\\"\" + ((id = node.$id())) + \"\\\"\";\n if ($truthy(doc_attrs['$[]'](\"sectlinks\"))) {\n title = \"\" + \"\" + (title) + \"\"};\n if ($truthy(doc_attrs['$[]'](\"sectanchors\"))) {\n if (doc_attrs['$[]'](\"sectanchors\")['$=='](\"after\")) {\n title = \"\" + (title) + \"\"\n } else {\n title = \"\" + \"\" + (title)\n }};\n } else {\n id_attr = \"\"\n };\n if (level['$=='](0)) {\n return \"\" + \"\" + (title) + \"\\n\" + (node.$content())\n } else {\n return \"\" + \"
    \\n\" + \"\" + (title) + \"\\n\" + ((function() {if (level['$=='](1)) {\n return \"\" + \"
    \\n\" + (node.$content()) + \"\\n\" + \"
    \"\n } else {\n return node.$content()\n }; return nil; })()) + \"\\n\" + \"
    \"\n };\n }, $Html5Converter_convert_section$10.$$arity = 1);\n \n Opal.def(self, '$convert_admonition', $Html5Converter_convert_admonition$11 = function $$convert_admonition(node) {\n var $a, self = this, id_attr = nil, name = nil, title_element = nil, label = nil, role = nil;\n\n \n id_attr = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n name = node.$attr(\"name\");\n title_element = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"
    \" + (node.$title()) + \"
    \\n\"\n } else {\n return \"\"\n }; return nil; })();\n if ($truthy(node.$document()['$attr?'](\"icons\"))) {\n if ($truthy(($truthy($a = node.$document()['$attr?'](\"icons\", \"font\")) ? node['$attr?'](\"icon\")['$!']() : $a))) {\n label = \"\" + \"\"\n } else {\n label = \"\" + \"\\\"\"\"\n }\n } else {\n label = \"\" + \"
    \" + (node.$attr(\"textlabel\")) + \"
    \"\n };\n return \"\" + \"\\n\" + \"\\n\" + \"\\n\" + \"\\n\" + \"\\n\" + \"\\n\" + \"
    \\n\" + (label) + \"\\n\" + \"\\n\" + (title_element) + (node.$content()) + \"\\n\" + \"
    \\n\" + \"\";\n }, $Html5Converter_convert_admonition$11.$$arity = 1);\n \n Opal.def(self, '$convert_audio', $Html5Converter_convert_audio$12 = function $$convert_audio(node) {\n var $a, self = this, xml = nil, id_attribute = nil, classes = nil, class_attribute = nil, title_element = nil, start_t = nil, end_t = nil, time_anchor = nil;\n\n \n xml = self.xml_mode;\n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n classes = [\"audioblock\", node.$role()].$compact();\n class_attribute = \"\" + \" class=\\\"\" + (classes.$join(\" \")) + \"\\\"\";\n title_element = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"
    \" + (node.$title()) + \"
    \\n\"\n } else {\n return \"\"\n }; return nil; })();\n start_t = node.$attr(\"start\");\n end_t = node.$attr(\"end\");\n time_anchor = (function() {if ($truthy(($truthy($a = start_t) ? $a : end_t))) {\n return \"\" + \"#t=\" + (($truthy($a = start_t) ? $a : \"\")) + ((function() {if ($truthy(end_t)) {\n return \"\" + \",\" + (end_t)\n } else {\n return \"\"\n }; return nil; })())\n } else {\n return \"\"\n }; return nil; })();\n return \"\" + \"\\n\" + (title_element) + \"
    \\n\" + \"\\n\" + \"
    \\n\" + \"\";\n }, $Html5Converter_convert_audio$12.$$arity = 1);\n \n Opal.def(self, '$convert_colist', $Html5Converter_convert_colist$13 = function $$convert_colist(node) {\n var $a, $$14, $$15, self = this, result = nil, id_attribute = nil, classes = nil, class_attribute = nil, font_icons = nil, num = nil;\n\n \n result = [];\n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n classes = [\"colist\", node.$style(), node.$role()].$compact();\n class_attribute = \"\" + \" class=\\\"\" + (classes.$join(\" \")) + \"\\\"\";\n result['$<<'](\"\" + \"\");\n if ($truthy(node['$title?']())) {\n result['$<<'](\"\" + \"
    \" + (node.$title()) + \"
    \")};\n if ($truthy(node.$document()['$attr?'](\"icons\"))) {\n \n result['$<<'](\"\");\n $a = [node.$document()['$attr?'](\"icons\", \"font\"), 0], (font_icons = $a[0]), (num = $a[1]), $a;\n $send(node.$items(), 'each', [], ($$14 = function(item){var self = $$14.$$s || this, num_label = nil;\n if (self.void_element_slash == null) self.void_element_slash = nil;\n\n \n \n if (item == null) {\n item = nil;\n };\n num = $rb_plus(num, 1);\n if ($truthy(font_icons)) {\n num_label = \"\" + \"\" + (num) + \"\"\n } else {\n num_label = \"\" + \"\\\"\"\"\n };\n return result['$<<'](\"\" + \"\\n\" + \"\\n\" + \"\\n\" + \"\");}, $$14.$$s = self, $$14.$$arity = 1, $$14));\n result['$<<'](\"
    \" + (num_label) + \"\" + (item.$text()) + ((function() {if ($truthy(item['$blocks?']())) {\n return $rb_plus($$($nesting, 'LF'), item.$content())\n } else {\n return \"\"\n }; return nil; })()) + \"
    \");\n } else {\n \n result['$<<'](\"
      \");\n $send(node.$items(), 'each', [], ($$15 = function(item){var self = $$15.$$s || this;\n\n \n \n if (item == null) {\n item = nil;\n };\n return result['$<<'](\"\" + \"
    1. \\n\" + \"

      \" + (item.$text()) + \"

      \" + ((function() {if ($truthy(item['$blocks?']())) {\n return $rb_plus($$($nesting, 'LF'), item.$content())\n } else {\n return \"\"\n }; return nil; })()) + \"\\n\" + \"
    2. \");}, $$15.$$s = self, $$15.$$arity = 1, $$15));\n result['$<<'](\"
    \");\n };\n result['$<<'](\"\");\n return result.$join($$($nesting, 'LF'));\n }, $Html5Converter_convert_colist$13.$$arity = 1);\n \n Opal.def(self, '$convert_dlist', $Html5Converter_convert_dlist$16 = function $$convert_dlist(node) {\n var $$17, $a, $$19, $$21, self = this, result = nil, id_attribute = nil, $case = nil, classes = nil, class_attribute = nil, slash = nil, col_style_attribute = nil, dt_style_attribute = nil;\n\n \n result = [];\n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n $case = node.$style();\n if (\"qanda\"['$===']($case)) {classes = [\"qlist\", \"qanda\", node.$role()]}\n else if (\"horizontal\"['$===']($case)) {classes = [\"hdlist\", node.$role()]}\n else {classes = [\"dlist\", node.$style(), node.$role()]};\n class_attribute = \"\" + \" class=\\\"\" + (classes.$compact().$join(\" \")) + \"\\\"\";\n result['$<<'](\"\" + \"\");\n if ($truthy(node['$title?']())) {\n result['$<<'](\"\" + \"
    \" + (node.$title()) + \"
    \")};\n $case = node.$style();\n if (\"qanda\"['$===']($case)) {\n result['$<<'](\"
      \");\n $send(node.$items(), 'each', [], ($$17 = function(terms, dd){var self = $$17.$$s || this, $$18;\n\n \n \n if (terms == null) {\n terms = nil;\n };\n \n if (dd == null) {\n dd = nil;\n };\n result['$<<'](\"
    1. \");\n $send(terms, 'each', [], ($$18 = function(dt){var self = $$18.$$s || this;\n\n \n \n if (dt == null) {\n dt = nil;\n };\n return result['$<<'](\"\" + \"

      \" + (dt.$text()) + \"

      \");}, $$18.$$s = self, $$18.$$arity = 1, $$18));\n if ($truthy(dd)) {\n \n if ($truthy(dd['$text?']())) {\n result['$<<'](\"\" + \"

      \" + (dd.$text()) + \"

      \")};\n if ($truthy(dd['$blocks?']())) {\n result['$<<'](dd.$content())};};\n return result['$<<'](\"
    2. \");}, $$17.$$s = self, $$17.$$arity = 2, $$17));\n result['$<<'](\"
    \");}\n else if (\"horizontal\"['$===']($case)) {\n slash = self.void_element_slash;\n result['$<<'](\"\");\n if ($truthy(($truthy($a = node['$attr?'](\"labelwidth\")) ? $a : node['$attr?'](\"itemwidth\")))) {\n \n result['$<<'](\"\");\n col_style_attribute = (function() {if ($truthy(node['$attr?'](\"labelwidth\"))) {\n return \"\" + \" style=\\\"width: \" + (node.$attr(\"labelwidth\").$chomp(\"%\")) + \"%;\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n result['$<<'](\"\" + \"\");\n col_style_attribute = (function() {if ($truthy(node['$attr?'](\"itemwidth\"))) {\n return \"\" + \" style=\\\"width: \" + (node.$attr(\"itemwidth\").$chomp(\"%\")) + \"%;\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n result['$<<'](\"\" + \"\");\n result['$<<'](\"\");};\n $send(node.$items(), 'each', [], ($$19 = function(terms, dd){var self = $$19.$$s || this, $$20, first_term = nil;\n\n \n \n if (terms == null) {\n terms = nil;\n };\n \n if (dd == null) {\n dd = nil;\n };\n result['$<<'](\"\");\n result['$<<'](\"\" + \"\");\n result['$<<'](\"\");\n return result['$<<'](\"\");}, $$19.$$s = self, $$19.$$arity = 2, $$19));\n result['$<<'](\"
    \");\n first_term = true;\n $send(terms, 'each', [], ($$20 = function(dt){var self = $$20.$$s || this;\n\n \n \n if (dt == null) {\n dt = nil;\n };\n if ($truthy(first_term)) {\n } else {\n result['$<<'](\"\" + \"\")\n };\n result['$<<'](dt.$text());\n return (first_term = nil);}, $$20.$$s = self, $$20.$$arity = 1, $$20));\n result['$<<'](\"\");\n if ($truthy(dd)) {\n \n if ($truthy(dd['$text?']())) {\n result['$<<'](\"\" + \"

    \" + (dd.$text()) + \"

    \")};\n if ($truthy(dd['$blocks?']())) {\n result['$<<'](dd.$content())};};\n result['$<<'](\"
    \");}\n else {\n result['$<<'](\"
    \");\n dt_style_attribute = (function() {if ($truthy(node.$style())) {\n return \"\"\n } else {\n return \" class=\\\"hdlist1\\\"\"\n }; return nil; })();\n $send(node.$items(), 'each', [], ($$21 = function(terms, dd){var self = $$21.$$s || this, $$22;\n\n \n \n if (terms == null) {\n terms = nil;\n };\n \n if (dd == null) {\n dd = nil;\n };\n $send(terms, 'each', [], ($$22 = function(dt){var self = $$22.$$s || this;\n\n \n \n if (dt == null) {\n dt = nil;\n };\n return result['$<<'](\"\" + \"\" + (dt.$text()) + \"\");}, $$22.$$s = self, $$22.$$arity = 1, $$22));\n if ($truthy(dd)) {\n } else {\n return nil;\n };\n result['$<<'](\"
    \");\n if ($truthy(dd['$text?']())) {\n result['$<<'](\"\" + \"

    \" + (dd.$text()) + \"

    \")};\n if ($truthy(dd['$blocks?']())) {\n result['$<<'](dd.$content())};\n return result['$<<'](\"
    \");}, $$21.$$s = self, $$21.$$arity = 2, $$21));\n result['$<<'](\"
    \");};\n result['$<<'](\"\");\n return result.$join($$($nesting, 'LF'));\n }, $Html5Converter_convert_dlist$16.$$arity = 1);\n \n Opal.def(self, '$convert_example', $Html5Converter_convert_example$23 = function $$convert_example(node) {\n var self = this, id_attribute = nil, class_attribute = nil, summary_element = nil, title_element = nil, role = nil;\n\n \n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n if ($truthy(node['$option?'](\"collapsible\"))) {\n \n class_attribute = (function() {if ($truthy(node.$role())) {\n return \"\" + \" class=\\\"\" + (node.$role()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n summary_element = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"\" + (node.$title()) + \"\"\n } else {\n return \"Details\"\n }; return nil; })();\n return \"\" + \"\\n\" + (summary_element) + \"\\n\" + \"
    \\n\" + (node.$content()) + \"\\n\" + \"
    \\n\" + \"\";\n } else {\n \n title_element = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"
    \" + (node.$captioned_title()) + \"
    \\n\"\n } else {\n return \"\"\n }; return nil; })();\n return \"\" + \"\\n\" + (title_element) + \"
    \\n\" + (node.$content()) + \"\\n\" + \"
    \\n\" + \"\";\n };\n }, $Html5Converter_convert_example$23.$$arity = 1);\n \n Opal.def(self, '$convert_floating_title', $Html5Converter_convert_floating_title$24 = function $$convert_floating_title(node) {\n var self = this, tag_name = nil, id_attribute = nil, classes = nil;\n\n \n tag_name = \"\" + \"h\" + ($rb_plus(node.$level(), 1));\n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n classes = [node.$style(), node.$role()].$compact();\n return \"\" + \"<\" + (tag_name) + (id_attribute) + \" class=\\\"\" + (classes.$join(\" \")) + \"\\\">\" + (node.$title()) + \"\";\n }, $Html5Converter_convert_floating_title$24.$$arity = 1);\n \n Opal.def(self, '$convert_image', $Html5Converter_convert_image$25 = function $$convert_image(node) {\n var $a, $b, $c, self = this, target = nil, width_attr = nil, height_attr = nil, svg = nil, obj = nil, img = nil, fallback = nil, id_attr = nil, classes = nil, class_attr = nil, title_el = nil;\n\n \n target = node.$attr(\"target\");\n width_attr = (function() {if ($truthy(node['$attr?'](\"width\"))) {\n return \"\" + \" width=\\\"\" + (node.$attr(\"width\")) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n height_attr = (function() {if ($truthy(node['$attr?'](\"height\"))) {\n return \"\" + \" height=\\\"\" + (node.$attr(\"height\")) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n if ($truthy(($truthy($a = ($truthy($b = ($truthy($c = node['$attr?'](\"format\", \"svg\")) ? $c : target['$include?'](\".svg\"))) ? $rb_lt(node.$document().$safe(), $$$($$($nesting, 'SafeMode'), 'SECURE')) : $b)) ? ($truthy($b = (svg = node['$option?'](\"inline\"))) ? $b : (obj = node['$option?'](\"interactive\"))) : $a))) {\n if ($truthy(svg)) {\n img = ($truthy($a = self.$read_svg_contents(node, target)) ? $a : \"\" + \"\" + (node.$alt()) + \"\")\n } else if ($truthy(obj)) {\n \n fallback = (function() {if ($truthy(node['$attr?'](\"fallback\"))) {\n return \"\" + \"\\\"\"\"\n } else {\n return \"\" + \"\" + (node.$alt()) + \"\"\n }; return nil; })();\n img = \"\" + \"\" + (fallback) + \"\";}};\n img = ($truthy($a = img) ? $a : \"\" + \"\\\"\"\");\n if ($truthy(node['$attr?'](\"link\"))) {\n img = \"\" + \"\" + (img) + \"\"};\n id_attr = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n classes = [\"imageblock\"];\n if ($truthy(node['$attr?'](\"float\"))) {\n classes['$<<'](node.$attr(\"float\"))};\n if ($truthy(node['$attr?'](\"align\"))) {\n classes['$<<'](\"\" + \"text-\" + (node.$attr(\"align\")))};\n if ($truthy(node.$role())) {\n classes['$<<'](node.$role())};\n class_attr = \"\" + \" class=\\\"\" + (classes.$join(\" \")) + \"\\\"\";\n title_el = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"\\n
    \" + (node.$captioned_title()) + \"
    \"\n } else {\n return \"\"\n }; return nil; })();\n return \"\" + \"\\n\" + \"
    \\n\" + (img) + \"\\n\" + \"
    \" + (title_el) + \"\\n\" + \"\";\n }, $Html5Converter_convert_image$25.$$arity = 1);\n \n Opal.def(self, '$convert_listing', $Html5Converter_convert_listing$26 = function $$convert_listing(node) {\n var $a, self = this, nowrap = nil, lang = nil, syntax_hl = nil, opts = nil, doc_attrs = nil, $writer = nil, pre_open = nil, pre_close = nil, id_attribute = nil, title_element = nil, role = nil;\n\n \n nowrap = ($truthy($a = node['$option?'](\"nowrap\")) ? $a : node.$document()['$attr?'](\"prewrap\")['$!']());\n if (node.$style()['$=='](\"source\")) {\n \n lang = node.$attr(\"language\");\n if ($truthy((syntax_hl = node.$document().$syntax_highlighter()))) {\n \n opts = (function() {if ($truthy(syntax_hl['$highlight?']())) {\n return $hash2([\"css_mode\", \"style\"], {\"css_mode\": ($truthy($a = (doc_attrs = node.$document().$attributes())['$[]'](\"\" + (syntax_hl.$name()) + \"-css\")) ? $a : \"class\").$to_sym(), \"style\": doc_attrs['$[]'](\"\" + (syntax_hl.$name()) + \"-style\")})\n } else {\n return $hash2([], {})\n }; return nil; })();\n \n $writer = [\"nowrap\", nowrap];\n $send(opts, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;\n } else {\n \n pre_open = \"\" + \"
    \";\n            pre_close = \"
    \";\n };\n } else {\n \n pre_open = \"\" + \"\";\n pre_close = \"\";\n };\n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n title_element = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"
    \" + (node.$captioned_title()) + \"
    \\n\"\n } else {\n return \"\"\n }; return nil; })();\n return \"\" + \"\\n\" + (title_element) + \"
    \\n\" + ((function() {if ($truthy(syntax_hl)) {\n \n return syntax_hl.$format(node, lang, opts);\n } else {\n return $rb_plus($rb_plus(pre_open, ($truthy($a = node.$content()) ? $a : \"\")), pre_close)\n }; return nil; })()) + \"\\n\" + \"
    \\n\" + \"\";\n }, $Html5Converter_convert_listing$26.$$arity = 1);\n \n Opal.def(self, '$convert_literal', $Html5Converter_convert_literal$27 = function $$convert_literal(node) {\n var $a, self = this, id_attribute = nil, title_element = nil, nowrap = nil, role = nil;\n\n \n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n title_element = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"
    \" + (node.$title()) + \"
    \\n\"\n } else {\n return \"\"\n }; return nil; })();\n nowrap = ($truthy($a = node.$document()['$attr?'](\"prewrap\")['$!']()) ? $a : node['$option?'](\"nowrap\"));\n return \"\" + \"\\n\" + (title_element) + \"
    \\n\" + \"\" + (node.$content()) + \"\\n\" + \"
    \\n\" + \"\";\n }, $Html5Converter_convert_literal$27.$$arity = 1);\n \n Opal.def(self, '$convert_stem', $Html5Converter_convert_stem$28 = function $$convert_stem(node) {\n var $a, $b, $$29, self = this, id_attribute = nil, title_element = nil, style = nil, open = nil, close = nil, equation = nil, br = nil, role = nil;\n\n \n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n title_element = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"
    \" + (node.$title()) + \"
    \\n\"\n } else {\n return \"\"\n }; return nil; })();\n $b = $$($nesting, 'BLOCK_MATH_DELIMITERS')['$[]']((style = node.$style().$to_sym())), $a = Opal.to_ary($b), (open = ($a[0] == null ? nil : $a[0])), (close = ($a[1] == null ? nil : $a[1])), $b;\n if ($truthy((equation = node.$content()))) {\n \n if ($truthy((($a = style['$=='](\"asciimath\")) ? equation['$include?']($$($nesting, 'LF')) : style['$=='](\"asciimath\")))) {\n \n br = \"\" + ($$($nesting, 'LF')) + \"\";\n equation = $send(equation, 'gsub', [$$($nesting, 'StemBreakRx')], ($$29 = function(){var self = $$29.$$s || this, $c;\n\n return \"\" + (close) + ($rb_times(br, $rb_minus((($c = $gvars['~']) === nil ? nil : $c['$[]'](0)).$count($$($nesting, 'LF')), 1))) + ($$($nesting, 'LF')) + (open)}, $$29.$$s = self, $$29.$$arity = 0, $$29));};\n if ($truthy(($truthy($a = equation['$start_with?'](open)) ? equation['$end_with?'](close) : $a))) {\n } else {\n equation = \"\" + (open) + (equation) + (close)\n };\n } else {\n equation = \"\"\n };\n return \"\" + \"\\n\" + (title_element) + \"
    \\n\" + (equation) + \"\\n\" + \"
    \\n\" + \"\";\n }, $Html5Converter_convert_stem$28.$$arity = 1);\n \n Opal.def(self, '$convert_olist', $Html5Converter_convert_olist$30 = function $$convert_olist(node) {\n var $$31, self = this, result = nil, id_attribute = nil, classes = nil, class_attribute = nil, type_attribute = nil, keyword = nil, start_attribute = nil, reversed_attribute = nil;\n\n \n result = [];\n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n classes = [\"olist\", node.$style(), node.$role()].$compact();\n class_attribute = \"\" + \" class=\\\"\" + (classes.$join(\" \")) + \"\\\"\";\n result['$<<'](\"\" + \"\");\n if ($truthy(node['$title?']())) {\n result['$<<'](\"\" + \"
    \" + (node.$title()) + \"
    \")};\n type_attribute = (function() {if ($truthy((keyword = node.$list_marker_keyword()))) {\n return \"\" + \" type=\\\"\" + (keyword) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n start_attribute = (function() {if ($truthy(node['$attr?'](\"start\"))) {\n return \"\" + \" start=\\\"\" + (node.$attr(\"start\")) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n reversed_attribute = (function() {if ($truthy(node['$option?'](\"reversed\"))) {\n \n return self.$append_boolean_attribute(\"reversed\", self.xml_mode);\n } else {\n return \"\"\n }; return nil; })();\n result['$<<'](\"\" + \"
      \");\n $send(node.$items(), 'each', [], ($$31 = function(item){var self = $$31.$$s || this;\n\n \n \n if (item == null) {\n item = nil;\n };\n if ($truthy(item.$id())) {\n result['$<<'](\"\" + \"
    1. \")\n } else if ($truthy(item.$role())) {\n result['$<<'](\"\" + \"
    2. \")\n } else {\n result['$<<'](\"
    3. \")\n };\n result['$<<'](\"\" + \"

      \" + (item.$text()) + \"

      \");\n if ($truthy(item['$blocks?']())) {\n result['$<<'](item.$content())};\n return result['$<<'](\"
    4. \");}, $$31.$$s = self, $$31.$$arity = 1, $$31));\n result['$<<'](\"
    \");\n result['$<<'](\"\");\n return result.$join($$($nesting, 'LF'));\n }, $Html5Converter_convert_olist$30.$$arity = 1);\n \n Opal.def(self, '$convert_open', $Html5Converter_convert_open$32 = function $$convert_open(node) {\n var $a, $b, $c, self = this, style = nil, id_attr = nil, title_el = nil, role = nil;\n\n if ((style = node.$style())['$=='](\"abstract\")) {\n if ($truthy((($a = node.$parent()['$=='](node.$document())) ? node.$document().$doctype()['$=='](\"book\") : node.$parent()['$=='](node.$document())))) {\n \n self.$logger().$warn(\"abstract block cannot be used in a document without a title when doctype is book. Excluding block content.\");\n return \"\";\n } else {\n \n id_attr = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n title_el = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"
    \" + (node.$title()) + \"
    \\n\"\n } else {\n return \"\"\n }; return nil; })();\n return \"\" + \"\\n\" + (title_el) + \"
    \\n\" + (node.$content()) + \"\\n\" + \"
    \\n\" + \"\";\n }\n } else if ($truthy((($a = style['$=='](\"partintro\")) ? ($truthy($b = ($truthy($c = $rb_gt(node.$level(), 0)) ? $c : node.$parent().$context()['$!='](\"section\"))) ? $b : node.$document().$doctype()['$!='](\"book\")) : style['$=='](\"partintro\")))) {\n \n self.$logger().$error(\"partintro block can only be used when doctype is book and must be a child of a book part. Excluding block content.\");\n return \"\";\n } else {\n \n id_attr = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n title_el = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"
    \" + (node.$title()) + \"
    \\n\"\n } else {\n return \"\"\n }; return nil; })();\n return \"\" + \"\"\n }, $Html5Converter_convert_page_break$33.$$arity = 1);\n \n Opal.def(self, '$convert_paragraph', $Html5Converter_convert_paragraph$34 = function $$convert_paragraph(node) {\n var self = this, attributes = nil;\n\n \n if ($truthy(node.$role())) {\n attributes = \"\" + ((function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })()) + \" class=\\\"paragraph \" + (node.$role()) + \"\\\"\"\n } else if ($truthy(node.$id())) {\n attributes = \"\" + \" id=\\\"\" + (node.$id()) + \"\\\" class=\\\"paragraph\\\"\"\n } else {\n attributes = \" class=\\\"paragraph\\\"\"\n };\n if ($truthy(node['$title?']())) {\n return \"\" + \"\\n\" + \"
    \" + (node.$title()) + \"
    \\n\" + \"

    \" + (node.$content()) + \"

    \\n\" + \"\"\n } else {\n return \"\" + \"\\n\" + \"

    \" + (node.$content()) + \"

    \\n\" + \"\"\n };\n }, $Html5Converter_convert_paragraph$34.$$arity = 1);\n Opal.alias(self, \"convert_pass\", \"content_only\");\n \n Opal.def(self, '$convert_preamble', $Html5Converter_convert_preamble$35 = function $$convert_preamble(node) {\n var $a, $b, self = this, doc = nil, toc = nil;\n\n \n if ($truthy(($truthy($a = ($truthy($b = (doc = node.$document())['$attr?'](\"toc-placement\", \"preamble\")) ? doc['$sections?']() : $b)) ? doc['$attr?'](\"toc\") : $a))) {\n toc = \"\" + \"\\n\" + \"
    \\n\" + \"
    \" + (doc.$attr(\"toc-title\")) + \"
    \\n\" + (doc.$converter().$convert(doc, \"outline\")) + \"\\n\" + \"
    \"\n } else {\n toc = \"\"\n };\n return \"\" + \"
    \\n\" + \"
    \\n\" + (node.$content()) + \"\\n\" + \"
    \" + (toc) + \"\\n\" + \"
    \";\n }, $Html5Converter_convert_preamble$35.$$arity = 1);\n \n Opal.def(self, '$convert_quote', $Html5Converter_convert_quote$36 = function $$convert_quote(node) {\n var $a, self = this, id_attribute = nil, classes = nil, class_attribute = nil, title_element = nil, attribution = nil, citetitle = nil, cite_element = nil, attribution_text = nil, attribution_element = nil;\n\n \n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n classes = [\"quoteblock\", node.$role()].$compact();\n class_attribute = \"\" + \" class=\\\"\" + (classes.$join(\" \")) + \"\\\"\";\n title_element = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"\\n
    \" + (node.$title()) + \"
    \"\n } else {\n return \"\"\n }; return nil; })();\n attribution = (function() {if ($truthy(node['$attr?'](\"attribution\"))) {\n \n return node.$attr(\"attribution\");\n } else {\n return nil\n }; return nil; })();\n citetitle = (function() {if ($truthy(node['$attr?'](\"citetitle\"))) {\n \n return node.$attr(\"citetitle\");\n } else {\n return nil\n }; return nil; })();\n if ($truthy(($truthy($a = attribution) ? $a : citetitle))) {\n \n cite_element = (function() {if ($truthy(citetitle)) {\n return \"\" + \"\" + (citetitle) + \"\"\n } else {\n return \"\"\n }; return nil; })();\n attribution_text = (function() {if ($truthy(attribution)) {\n return \"\" + \"— \" + (attribution) + ((function() {if ($truthy(citetitle)) {\n return \"\" + \"\\n\"\n } else {\n return \"\"\n }; return nil; })())\n } else {\n return \"\"\n }; return nil; })();\n attribution_element = \"\" + \"\\n
    \\n\" + (attribution_text) + (cite_element) + \"\\n
    \";\n } else {\n attribution_element = \"\"\n };\n return \"\" + \"\" + (title_element) + \"\\n\" + \"
    \\n\" + (node.$content()) + \"\\n\" + \"
    \" + (attribution_element) + \"\\n\" + \"\";\n }, $Html5Converter_convert_quote$36.$$arity = 1);\n \n Opal.def(self, '$convert_thematic_break', $Html5Converter_convert_thematic_break$37 = function $$convert_thematic_break(node) {\n var self = this;\n\n return \"\" + \"\"\n }, $Html5Converter_convert_thematic_break$37.$$arity = 1);\n \n Opal.def(self, '$convert_sidebar', $Html5Converter_convert_sidebar$38 = function $$convert_sidebar(node) {\n var self = this, id_attribute = nil, title_element = nil, role = nil;\n\n \n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n title_element = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"
    \" + (node.$title()) + \"
    \\n\"\n } else {\n return \"\"\n }; return nil; })();\n return \"\" + \"\\n\" + \"
    \\n\" + (title_element) + (node.$content()) + \"\\n\" + \"
    \\n\" + \"\";\n }, $Html5Converter_convert_sidebar$38.$$arity = 1);\n \n Opal.def(self, '$convert_table', $Html5Converter_convert_table$39 = function $$convert_table(node) {\n var $a, $$40, $$41, self = this, result = nil, id_attribute = nil, frame = nil, classes = nil, stripes = nil, styles = nil, autowidth = nil, tablewidth = nil, role = nil, class_attribute = nil, style_attribute = nil, slash = nil;\n\n \n result = [];\n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n if ((frame = node.$attr(\"frame\", \"all\", \"table-frame\"))['$=='](\"topbot\")) {\n frame = \"ends\"};\n classes = [\"tableblock\", \"\" + \"frame-\" + (frame), \"\" + \"grid-\" + (node.$attr(\"grid\", \"all\", \"table-grid\"))];\n if ($truthy((stripes = node.$attr(\"stripes\", nil, \"table-stripes\")))) {\n classes['$<<'](\"\" + \"stripes-\" + (stripes))};\n styles = [];\n if ($truthy(($truthy($a = (autowidth = node['$option?'](\"autowidth\"))) ? node['$attr?'](\"width\")['$!']() : $a))) {\n classes['$<<'](\"fit-content\")\n } else if ((tablewidth = node.$attr(\"tablepcwidth\"))['$=='](100)) {\n classes['$<<'](\"stretch\")\n } else {\n styles['$<<'](\"\" + \"width: \" + (tablewidth) + \"%;\")\n };\n if ($truthy(node['$attr?'](\"float\"))) {\n classes['$<<'](node.$attr(\"float\"))};\n if ($truthy((role = node.$role()))) {\n classes['$<<'](role)};\n class_attribute = \"\" + \" class=\\\"\" + (classes.$join(\" \")) + \"\\\"\";\n style_attribute = (function() {if ($truthy(styles['$empty?']())) {\n return \"\"\n } else {\n return \"\" + \" style=\\\"\" + (styles.$join(\" \")) + \"\\\"\"\n }; return nil; })();\n result['$<<'](\"\" + \"\");\n if ($truthy(node['$title?']())) {\n result['$<<'](\"\" + \"\" + (node.$captioned_title()) + \"\")};\n if ($truthy($rb_gt(node.$attr(\"rowcount\"), 0))) {\n \n slash = self.void_element_slash;\n result['$<<'](\"\");\n if ($truthy(autowidth)) {\n result = $rb_plus(result, $$($nesting, 'Array').$new(node.$columns().$size(), \"\" + \"\"))\n } else {\n $send(node.$columns(), 'each', [], ($$40 = function(col){var self = $$40.$$s || this;\n\n \n \n if (col == null) {\n col = nil;\n };\n return result['$<<']((function() {if ($truthy(col['$option?'](\"autowidth\"))) {\n return \"\" + \"\"\n } else {\n return \"\" + \"\"\n }; return nil; })());}, $$40.$$s = self, $$40.$$arity = 1, $$40))\n };\n result['$<<'](\"\");\n $send(node.$rows().$to_h(), 'each', [], ($$41 = function(tsec, rows){var self = $$41.$$s || this, $$42;\n\n \n \n if (tsec == null) {\n tsec = nil;\n };\n \n if (rows == null) {\n rows = nil;\n };\n if ($truthy(rows['$empty?']())) {\n return nil;};\n result['$<<'](\"\" + \"\");\n $send(rows, 'each', [], ($$42 = function(row){var self = $$42.$$s || this, $$43;\n\n \n \n if (row == null) {\n row = nil;\n };\n result['$<<'](\"\");\n $send(row, 'each', [], ($$43 = function(cell){var self = $$43.$$s || this, $b, cell_content = nil, $case = nil, cell_tag_name = nil, cell_class_attribute = nil, cell_colspan_attribute = nil, cell_rowspan_attribute = nil, cell_style_attribute = nil;\n\n \n \n if (cell == null) {\n cell = nil;\n };\n if (tsec['$=='](\"head\")) {\n cell_content = cell.$text()\n } else {\n $case = cell.$style();\n if (\"asciidoc\"['$===']($case)) {cell_content = \"\" + \"
    \" + (cell.$content()) + \"
    \"}\n else if (\"literal\"['$===']($case)) {cell_content = \"\" + \"
    \" + (cell.$text()) + \"
    \"}\n else {cell_content = (function() {if ($truthy((cell_content = cell.$content())['$empty?']())) {\n return \"\"\n } else {\n return \"\" + \"

    \" + (cell_content.$join(\"\" + \"

    \\n\" + \"

    \")) + \"

    \"\n }; return nil; })()}\n };\n cell_tag_name = (function() {if ($truthy(($truthy($b = tsec['$=='](\"head\")) ? $b : cell.$style()['$=='](\"header\")))) {\n return \"th\"\n } else {\n return \"td\"\n }; return nil; })();\n cell_class_attribute = \"\" + \" class=\\\"tableblock halign-\" + (cell.$attr(\"halign\")) + \" valign-\" + (cell.$attr(\"valign\")) + \"\\\"\";\n cell_colspan_attribute = (function() {if ($truthy(cell.$colspan())) {\n return \"\" + \" colspan=\\\"\" + (cell.$colspan()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n cell_rowspan_attribute = (function() {if ($truthy(cell.$rowspan())) {\n return \"\" + \" rowspan=\\\"\" + (cell.$rowspan()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n cell_style_attribute = (function() {if ($truthy(node.$document()['$attr?'](\"cellbgcolor\"))) {\n return \"\" + \" style=\\\"background-color: \" + (node.$document().$attr(\"cellbgcolor\")) + \";\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n return result['$<<'](\"\" + \"<\" + (cell_tag_name) + (cell_class_attribute) + (cell_colspan_attribute) + (cell_rowspan_attribute) + (cell_style_attribute) + \">\" + (cell_content) + \"\");}, $$43.$$s = self, $$43.$$arity = 1, $$43));\n return result['$<<'](\"\");}, $$42.$$s = self, $$42.$$arity = 1, $$42));\n return result['$<<'](\"\" + \"
    \");}, $$41.$$s = self, $$41.$$arity = 2, $$41));};\n result['$<<'](\"\");\n return result.$join($$($nesting, 'LF'));\n }, $Html5Converter_convert_table$39.$$arity = 1);\n \n Opal.def(self, '$convert_toc', $Html5Converter_convert_toc$44 = function $$convert_toc(node) {\n var $a, $b, self = this, doc = nil, id_attr = nil, title_id_attr = nil, title = nil, levels = nil, role = nil;\n\n \n if ($truthy(($truthy($a = ($truthy($b = (doc = node.$document())['$attr?'](\"toc-placement\", \"macro\")) ? doc['$sections?']() : $b)) ? doc['$attr?'](\"toc\") : $a))) {\n } else {\n return \"\"\n };\n if ($truthy(node.$id())) {\n \n id_attr = \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\";\n title_id_attr = \"\" + \" id=\\\"\" + (node.$id()) + \"title\\\"\";\n } else {\n \n id_attr = \" id=\\\"toc\\\"\";\n title_id_attr = \" id=\\\"toctitle\\\"\";\n };\n title = (function() {if ($truthy(node['$title?']())) {\n return node.$title()\n } else {\n \n return doc.$attr(\"toc-title\");\n }; return nil; })();\n levels = (function() {if ($truthy(node['$attr?'](\"levels\"))) {\n return node.$attr(\"levels\").$to_i()\n } else {\n return nil\n }; return nil; })();\n role = (function() {if ($truthy(node['$role?']())) {\n return node.$role()\n } else {\n \n return doc.$attr(\"toc-class\", \"toc\");\n }; return nil; })();\n return \"\" + \"\\n\" + \"\" + (title) + \"\\n\" + (doc.$converter().$convert(doc, \"outline\", $hash2([\"toclevels\"], {\"toclevels\": levels}))) + \"\\n\" + \"\";\n }, $Html5Converter_convert_toc$44.$$arity = 1);\n \n Opal.def(self, '$convert_ulist', $Html5Converter_convert_ulist$45 = function $$convert_ulist(node) {\n var $$46, self = this, result = nil, id_attribute = nil, div_classes = nil, marker_checked = nil, marker_unchecked = nil, checklist = nil, ul_class_attribute = nil;\n\n \n result = [];\n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n div_classes = [\"ulist\", node.$style(), node.$role()].$compact();\n marker_checked = (marker_unchecked = \"\");\n if ($truthy((checklist = node['$option?'](\"checklist\")))) {\n \n div_classes.$unshift(div_classes.$shift(), \"checklist\");\n ul_class_attribute = \" class=\\\"checklist\\\"\";\n if ($truthy(node['$option?'](\"interactive\"))) {\n if ($truthy(self.xml_mode)) {\n \n marker_checked = \" \";\n marker_unchecked = \" \";\n } else {\n \n marker_checked = \" \";\n marker_unchecked = \" \";\n }\n } else if ($truthy(node.$document()['$attr?'](\"icons\", \"font\"))) {\n \n marker_checked = \" \";\n marker_unchecked = \" \";\n } else {\n \n marker_checked = \"✓ \";\n marker_unchecked = \"❏ \";\n };\n } else {\n ul_class_attribute = (function() {if ($truthy(node.$style())) {\n return \"\" + \" class=\\\"\" + (node.$style()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })()\n };\n result['$<<'](\"\" + \"\");\n if ($truthy(node['$title?']())) {\n result['$<<'](\"\" + \"
    \" + (node.$title()) + \"
    \")};\n result['$<<'](\"\" + \"\");\n $send(node.$items(), 'each', [], ($$46 = function(item){var self = $$46.$$s || this, $a;\n\n \n \n if (item == null) {\n item = nil;\n };\n if ($truthy(item.$id())) {\n result['$<<'](\"\" + \"
  • \")\n } else if ($truthy(item.$role())) {\n result['$<<'](\"\" + \"
  • \")\n } else {\n result['$<<'](\"
  • \")\n };\n if ($truthy(($truthy($a = checklist) ? item['$attr?'](\"checkbox\") : $a))) {\n result['$<<'](\"\" + \"

    \" + ((function() {if ($truthy(item['$attr?'](\"checked\"))) {\n return marker_checked\n } else {\n return marker_unchecked\n }; return nil; })()) + (item.$text()) + \"

    \")\n } else {\n result['$<<'](\"\" + \"

    \" + (item.$text()) + \"

    \")\n };\n if ($truthy(item['$blocks?']())) {\n result['$<<'](item.$content())};\n return result['$<<'](\"
  • \");}, $$46.$$s = self, $$46.$$arity = 1, $$46));\n result['$<<'](\"\");\n result['$<<'](\"\");\n return result.$join($$($nesting, 'LF'));\n }, $Html5Converter_convert_ulist$45.$$arity = 1);\n \n Opal.def(self, '$convert_verse', $Html5Converter_convert_verse$47 = function $$convert_verse(node) {\n var $a, self = this, id_attribute = nil, classes = nil, class_attribute = nil, title_element = nil, attribution = nil, citetitle = nil, cite_element = nil, attribution_text = nil, attribution_element = nil;\n\n \n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n classes = [\"verseblock\", node.$role()].$compact();\n class_attribute = \"\" + \" class=\\\"\" + (classes.$join(\" \")) + \"\\\"\";\n title_element = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"\\n
    \" + (node.$title()) + \"
    \"\n } else {\n return \"\"\n }; return nil; })();\n attribution = (function() {if ($truthy(node['$attr?'](\"attribution\"))) {\n \n return node.$attr(\"attribution\");\n } else {\n return nil\n }; return nil; })();\n citetitle = (function() {if ($truthy(node['$attr?'](\"citetitle\"))) {\n \n return node.$attr(\"citetitle\");\n } else {\n return nil\n }; return nil; })();\n if ($truthy(($truthy($a = attribution) ? $a : citetitle))) {\n \n cite_element = (function() {if ($truthy(citetitle)) {\n return \"\" + \"\" + (citetitle) + \"\"\n } else {\n return \"\"\n }; return nil; })();\n attribution_text = (function() {if ($truthy(attribution)) {\n return \"\" + \"— \" + (attribution) + ((function() {if ($truthy(citetitle)) {\n return \"\" + \"\\n\"\n } else {\n return \"\"\n }; return nil; })())\n } else {\n return \"\"\n }; return nil; })();\n attribution_element = \"\" + \"\\n
    \\n\" + (attribution_text) + (cite_element) + \"\\n
    \";\n } else {\n attribution_element = \"\"\n };\n return \"\" + \"\" + (title_element) + \"\\n\" + \"
    \" + (node.$content()) + \"
    \" + (attribution_element) + \"\\n\" + \"\";\n }, $Html5Converter_convert_verse$47.$$arity = 1);\n \n Opal.def(self, '$convert_video', $Html5Converter_convert_video$48 = function $$convert_video(node) {\n var $a, $b, self = this, xml = nil, id_attribute = nil, classes = nil, class_attribute = nil, title_element = nil, width_attribute = nil, height_attribute = nil, $case = nil, asset_uri_scheme = nil, start_anchor = nil, delimiter = nil, autoplay_param = nil, loop_param = nil, muted_param = nil, rel_param_val = nil, start_param = nil, end_param = nil, has_loop_param = nil, mute_param = nil, controls_param = nil, fs_param = nil, fs_attribute = nil, modest_param = nil, theme_param = nil, hl_param = nil, target = nil, list = nil, list_param = nil, playlist = nil, poster_attribute = nil, val = nil, preload_attribute = nil, start_t = nil, end_t = nil, time_anchor = nil;\n\n \n xml = self.xml_mode;\n id_attribute = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n classes = [\"videoblock\"];\n if ($truthy(node['$attr?'](\"float\"))) {\n classes['$<<'](node.$attr(\"float\"))};\n if ($truthy(node['$attr?'](\"align\"))) {\n classes['$<<'](\"\" + \"text-\" + (node.$attr(\"align\")))};\n if ($truthy(node.$role())) {\n classes['$<<'](node.$role())};\n class_attribute = \"\" + \" class=\\\"\" + (classes.$join(\" \")) + \"\\\"\";\n title_element = (function() {if ($truthy(node['$title?']())) {\n return \"\" + \"\\n
    \" + (node.$title()) + \"
    \"\n } else {\n return \"\"\n }; return nil; })();\n width_attribute = (function() {if ($truthy(node['$attr?'](\"width\"))) {\n return \"\" + \" width=\\\"\" + (node.$attr(\"width\")) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n height_attribute = (function() {if ($truthy(node['$attr?'](\"height\"))) {\n return \"\" + \" height=\\\"\" + (node.$attr(\"height\")) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n return (function() {$case = node.$attr(\"poster\");\n if (\"vimeo\"['$===']($case)) {\n if ($truthy((asset_uri_scheme = node.$document().$attr(\"asset-uri-scheme\", \"https\"))['$empty?']())) {\n } else {\n asset_uri_scheme = \"\" + (asset_uri_scheme) + \":\"\n };\n start_anchor = (function() {if ($truthy(node['$attr?'](\"start\"))) {\n return \"\" + \"#at=\" + (node.$attr(\"start\"))\n } else {\n return \"\"\n }; return nil; })();\n delimiter = [\"?\"];\n autoplay_param = (function() {if ($truthy(node['$option?'](\"autoplay\"))) {\n return \"\" + (($truthy($a = delimiter.$pop()) ? $a : \"&\")) + \"autoplay=1\"\n } else {\n return \"\"\n }; return nil; })();\n loop_param = (function() {if ($truthy(node['$option?'](\"loop\"))) {\n return \"\" + (($truthy($a = delimiter.$pop()) ? $a : \"&\")) + \"loop=1\"\n } else {\n return \"\"\n }; return nil; })();\n muted_param = (function() {if ($truthy(node['$option?'](\"muted\"))) {\n return \"\" + (($truthy($a = delimiter.$pop()) ? $a : \"&\")) + \"muted=1\"\n } else {\n return \"\"\n }; return nil; })();\n return \"\" + \"\" + (title_element) + \"\\n\" + \"
    \\n\" + \"\\n\" + \"
    \\n\" + \"\";}\n else if (\"youtube\"['$===']($case)) {\n if ($truthy((asset_uri_scheme = node.$document().$attr(\"asset-uri-scheme\", \"https\"))['$empty?']())) {\n } else {\n asset_uri_scheme = \"\" + (asset_uri_scheme) + \":\"\n };\n rel_param_val = (function() {if ($truthy(node['$option?'](\"related\"))) {\n return 1\n } else {\n return 0\n }; return nil; })();\n start_param = (function() {if ($truthy(node['$attr?'](\"start\"))) {\n return \"\" + \"&start=\" + (node.$attr(\"start\"))\n } else {\n return \"\"\n }; return nil; })();\n end_param = (function() {if ($truthy(node['$attr?'](\"end\"))) {\n return \"\" + \"&end=\" + (node.$attr(\"end\"))\n } else {\n return \"\"\n }; return nil; })();\n autoplay_param = (function() {if ($truthy(node['$option?'](\"autoplay\"))) {\n return \"&autoplay=1\"\n } else {\n return \"\"\n }; return nil; })();\n loop_param = (function() {if ($truthy((has_loop_param = node['$option?'](\"loop\")))) {\n return \"&loop=1\"\n } else {\n return \"\"\n }; return nil; })();\n mute_param = (function() {if ($truthy(node['$option?'](\"muted\"))) {\n return \"&mute=1\"\n } else {\n return \"\"\n }; return nil; })();\n controls_param = (function() {if ($truthy(node['$option?'](\"nocontrols\"))) {\n return \"&controls=0\"\n } else {\n return \"\"\n }; return nil; })();\n if ($truthy(node['$option?'](\"nofullscreen\"))) {\n \n fs_param = \"&fs=0\";\n fs_attribute = \"\";\n } else {\n \n fs_param = \"\";\n fs_attribute = self.$append_boolean_attribute(\"allowfullscreen\", xml);\n };\n modest_param = (function() {if ($truthy(node['$option?'](\"modest\"))) {\n return \"&modestbranding=1\"\n } else {\n return \"\"\n }; return nil; })();\n theme_param = (function() {if ($truthy(node['$attr?'](\"theme\"))) {\n return \"\" + \"&theme=\" + (node.$attr(\"theme\"))\n } else {\n return \"\"\n }; return nil; })();\n hl_param = (function() {if ($truthy(node['$attr?'](\"lang\"))) {\n return \"\" + \"&hl=\" + (node.$attr(\"lang\"))\n } else {\n return \"\"\n }; return nil; })();\n $b = node.$attr(\"target\").$split(\"/\", 2), $a = Opal.to_ary($b), (target = ($a[0] == null ? nil : $a[0])), (list = ($a[1] == null ? nil : $a[1])), $b;\n if ($truthy((list = ($truthy($a = list) ? $a : node.$attr(\"list\"))))) {\n list_param = \"\" + \"&list=\" + (list)\n } else {\n \n $b = target.$split(\",\", 2), $a = Opal.to_ary($b), (target = ($a[0] == null ? nil : $a[0])), (playlist = ($a[1] == null ? nil : $a[1])), $b;\n if ($truthy((playlist = ($truthy($a = playlist) ? $a : node.$attr(\"playlist\"))))) {\n list_param = \"\" + \"&playlist=\" + (playlist)\n } else {\n list_param = (function() {if ($truthy(has_loop_param)) {\n return \"\" + \"&playlist=\" + (target)\n } else {\n return \"\"\n }; return nil; })()\n };\n };\n return \"\" + \"\" + (title_element) + \"\\n\" + \"
    \\n\" + \"\\n\" + \"
    \\n\" + \"\";}\n else {\n poster_attribute = (function() {if ($truthy((val = node.$attr(\"poster\"))['$nil_or_empty?']())) {\n return \"\"\n } else {\n return \"\" + \" poster=\\\"\" + (node.$media_uri(val)) + \"\\\"\"\n }; return nil; })();\n preload_attribute = (function() {if ($truthy((val = node.$attr(\"preload\"))['$nil_or_empty?']())) {\n return \"\"\n } else {\n return \"\" + \" preload=\\\"\" + (val) + \"\\\"\"\n }; return nil; })();\n start_t = node.$attr(\"start\");\n end_t = node.$attr(\"end\");\n time_anchor = (function() {if ($truthy(($truthy($a = start_t) ? $a : end_t))) {\n return \"\" + \"#t=\" + (($truthy($a = start_t) ? $a : \"\")) + ((function() {if ($truthy(end_t)) {\n return \"\" + \",\" + (end_t)\n } else {\n return \"\"\n }; return nil; })())\n } else {\n return \"\"\n }; return nil; })();\n return \"\" + \"\" + (title_element) + \"\\n\" + \"
    \\n\" + \"\\n\" + \"
    \\n\" + \"\";}})();\n }, $Html5Converter_convert_video$48.$$arity = 1);\n \n Opal.def(self, '$convert_inline_anchor', $Html5Converter_convert_inline_anchor$49 = function $$convert_inline_anchor(node) {\n var $a, $b, self = this, $case = nil, path = nil, attrs = nil, text = nil, ref = nil, refid = nil, top = nil, outer = nil;\n\n return (function() {$case = node.$type();\n if (\"xref\"['$===']($case)) {\n if ($truthy((path = node.$attributes()['$[]'](\"path\")))) {\n \n attrs = self.$append_link_constraint_attrs(node, (function() {if ($truthy(node.$role())) {\n return [\"\" + \" class=\\\"\" + (node.$role()) + \"\\\"\"]\n } else {\n return []\n }; return nil; })()).$join();\n text = ($truthy($a = node.$text()) ? $a : path);\n } else {\n \n attrs = (function() {if ($truthy(node.$role())) {\n return \"\" + \" class=\\\"\" + (node.$role()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n if ($truthy((text = node.$text()))) {\n } else if ($truthy($$($nesting, 'AbstractNode')['$===']((ref = ($truthy($a = (self.refs = ($truthy($b = self.refs) ? $b : node.$document().$catalog()['$[]'](\"refs\")))['$[]']((refid = node.$attributes()['$[]'](\"refid\")))) ? $a : (function() {if ($truthy(refid['$nil_or_empty?']())) {\n \n return (top = self.$get_root_document(node));\n } else {\n return nil\n }; return nil; })()))))) {\n if ($truthy(($truthy($a = (self.resolving_xref = ($truthy($b = self.resolving_xref) ? $b : (outer = true)))) ? outer : $a))) {\n \n if ($truthy((text = ref.$xreftext(node.$attr(\"xrefstyle\", nil, true))))) {\n if ($truthy(text['$include?'](\"\" + (text) + \"\";}\n else if (\"ref\"['$===']($case)) {return \"\" + \"\"}\n else if (\"link\"['$===']($case)) {\n attrs = (function() {if ($truthy(node.$id())) {\n return [\"\" + \" id=\\\"\" + (node.$id()) + \"\\\"\"]\n } else {\n return []\n }; return nil; })();\n if ($truthy(node.$role())) {\n attrs['$<<'](\"\" + \" class=\\\"\" + (node.$role()) + \"\\\"\")};\n if ($truthy(node['$attr?'](\"title\"))) {\n attrs['$<<'](\"\" + \" title=\\\"\" + (node.$attr(\"title\")) + \"\\\"\")};\n return \"\" + \"\" + (node.$text()) + \"\";}\n else if (\"bibref\"['$===']($case)) {return \"\" + \"[\" + (($truthy($a = node.$reftext()) ? $a : node.$id())) + \"]\"}\n else {\n self.$logger().$warn(\"\" + \"unknown anchor type: \" + (node.$type().$inspect()));\n return nil;}})()\n }, $Html5Converter_convert_inline_anchor$49.$$arity = 1);\n \n Opal.def(self, '$convert_inline_break', $Html5Converter_convert_inline_break$50 = function $$convert_inline_break(node) {\n var self = this;\n\n return \"\" + (node.$text()) + \"\"\n }, $Html5Converter_convert_inline_break$50.$$arity = 1);\n \n Opal.def(self, '$convert_inline_button', $Html5Converter_convert_inline_button$51 = function $$convert_inline_button(node) {\n var self = this;\n\n return \"\" + \"\" + (node.$text()) + \"\"\n }, $Html5Converter_convert_inline_button$51.$$arity = 1);\n \n Opal.def(self, '$convert_inline_callout', $Html5Converter_convert_inline_callout$52 = function $$convert_inline_callout(node) {\n var self = this, src = nil, guard = nil;\n\n if ($truthy(node.$document()['$attr?'](\"icons\", \"font\"))) {\n return \"\" + \"(\" + (node.$text()) + \")\"\n } else if ($truthy(node.$document()['$attr?'](\"icons\"))) {\n \n src = node.$icon_uri(\"\" + \"callouts/\" + (node.$text()));\n return \"\" + \"\\\"\"\";\n } else if ($truthy($$$('::', 'Array')['$===']((guard = node.$attributes()['$[]'](\"guard\"))))) {\n return \"\" + \"<!--(\" + (node.$text()) + \")-->\"\n } else {\n return \"\" + (guard) + \"(\" + (node.$text()) + \")\"\n }\n }, $Html5Converter_convert_inline_callout$52.$$arity = 1);\n \n Opal.def(self, '$convert_inline_footnote', $Html5Converter_convert_inline_footnote$53 = function $$convert_inline_footnote(node) {\n var self = this, index = nil, id_attr = nil;\n\n if ($truthy((index = node.$attr(\"index\")))) {\n if (node.$type()['$=='](\"xref\")) {\n return \"\" + \"[\" + (index) + \"]\"\n } else {\n \n id_attr = (function() {if ($truthy(node.$id())) {\n return \"\" + \" id=\\\"_footnote_\" + (node.$id()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n return \"\" + \"[\" + (index) + \"]\";\n }\n } else if (node.$type()['$=='](\"xref\")) {\n return \"\" + \"[\" + (node.$text()) + \"]\"\n } else {\n return nil\n }\n }, $Html5Converter_convert_inline_footnote$53.$$arity = 1);\n \n Opal.def(self, '$convert_inline_image', $Html5Converter_convert_inline_image$54 = function $$convert_inline_image(node) {\n var $a, $b, $$55, $c, $d, self = this, type = nil, class_attr_val = nil, title_attr = nil, img = nil, target = nil, attrs = nil, svg = nil, obj = nil, fallback = nil, role = nil;\n\n \n if ($truthy((($a = (type = ($truthy($b = node.$type()) ? $b : \"image\"))['$=='](\"icon\")) ? node.$document()['$attr?'](\"icons\", \"font\") : (type = ($truthy($b = node.$type()) ? $b : \"image\"))['$=='](\"icon\")))) {\n \n class_attr_val = \"\" + \"fa fa-\" + (node.$target());\n $send($hash2([\"size\", \"rotate\", \"flip\"], {\"size\": \"fa-\", \"rotate\": \"fa-rotate-\", \"flip\": \"fa-flip-\"}), 'each', [], ($$55 = function(key, prefix){var self = $$55.$$s || this;\n\n \n \n if (key == null) {\n key = nil;\n };\n \n if (prefix == null) {\n prefix = nil;\n };\n if ($truthy(node['$attr?'](key))) {\n return (class_attr_val = \"\" + (class_attr_val) + \" \" + (prefix) + (node.$attr(key)))\n } else {\n return nil\n };}, $$55.$$s = self, $$55.$$arity = 2, $$55));\n title_attr = (function() {if ($truthy(node['$attr?'](\"title\"))) {\n return \"\" + \" title=\\\"\" + (node.$attr(\"title\")) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n img = \"\" + \"\";\n } else if ($truthy((($a = type['$=='](\"icon\")) ? node.$document()['$attr?'](\"icons\")['$!']() : type['$=='](\"icon\")))) {\n img = \"\" + \"[\" + (node.$alt()) + \"]\"\n } else {\n \n target = node.$target();\n attrs = [];\n if ($truthy(node['$attr?'](\"width\"))) {\n attrs['$<<'](\"\" + \" width=\\\"\" + (node.$attr(\"width\")) + \"\\\"\")};\n if ($truthy(node['$attr?'](\"height\"))) {\n attrs['$<<'](\"\" + \" height=\\\"\" + (node.$attr(\"height\")) + \"\\\"\")};\n if ($truthy(node['$attr?'](\"title\"))) {\n attrs['$<<'](\"\" + \" title=\\\"\" + (node.$attr(\"title\")) + \"\\\"\")};\n attrs = (function() {if ($truthy(attrs['$empty?']())) {\n return \"\"\n } else {\n return attrs.$join()\n }; return nil; })();\n if ($truthy(($truthy($a = ($truthy($b = ($truthy($c = type['$!='](\"icon\")) ? ($truthy($d = node['$attr?'](\"format\", \"svg\")) ? $d : target['$include?'](\".svg\")) : $c)) ? $rb_lt(node.$document().$safe(), $$$($$($nesting, 'SafeMode'), 'SECURE')) : $b)) ? ($truthy($b = (svg = node['$option?'](\"inline\"))) ? $b : (obj = node['$option?'](\"interactive\"))) : $a))) {\n if ($truthy(svg)) {\n img = ($truthy($a = self.$read_svg_contents(node, target)) ? $a : \"\" + \"\" + (node.$alt()) + \"\")\n } else if ($truthy(obj)) {\n \n fallback = (function() {if ($truthy(node['$attr?'](\"fallback\"))) {\n return \"\" + \"\\\"\"\"\n } else {\n return \"\" + \"\" + (node.$alt()) + \"\"\n }; return nil; })();\n img = \"\" + \"\" + (fallback) + \"\";}};\n img = ($truthy($a = img) ? $a : \"\" + \"\\\"\"\");\n };\n if ($truthy(node['$attr?'](\"link\"))) {\n img = \"\" + \"\" + (img) + \"\"};\n if ($truthy((role = node.$role()))) {\n if ($truthy(node['$attr?'](\"float\"))) {\n class_attr_val = \"\" + (type) + \" \" + (node.$attr(\"float\")) + \" \" + (role)\n } else {\n class_attr_val = \"\" + (type) + \" \" + (role)\n }\n } else if ($truthy(node['$attr?'](\"float\"))) {\n class_attr_val = \"\" + (type) + \" \" + (node.$attr(\"float\"))\n } else {\n class_attr_val = type\n };\n return \"\" + \"\" + (img) + \"\";\n }, $Html5Converter_convert_inline_image$54.$$arity = 1);\n \n Opal.def(self, '$convert_inline_indexterm', $Html5Converter_convert_inline_indexterm$56 = function $$convert_inline_indexterm(node) {\n var self = this;\n\n if (node.$type()['$=='](\"visible\")) {\n return node.$text()\n } else {\n return \"\"\n }\n }, $Html5Converter_convert_inline_indexterm$56.$$arity = 1);\n \n Opal.def(self, '$convert_inline_kbd', $Html5Converter_convert_inline_kbd$57 = function $$convert_inline_kbd(node) {\n var self = this, keys = nil;\n\n if ((keys = node.$attr(\"keys\")).$size()['$=='](1)) {\n return \"\" + \"\" + (keys['$[]'](0)) + \"\"\n } else {\n return \"\" + \"\" + (keys.$join(\"+\")) + \"\"\n }\n }, $Html5Converter_convert_inline_kbd$57.$$arity = 1);\n \n Opal.def(self, '$convert_inline_menu', $Html5Converter_convert_inline_menu$58 = function $$convert_inline_menu(node) {\n var self = this, caret = nil, submenu_joiner = nil, menu = nil, submenus = nil, menuitem = nil;\n\n \n caret = (function() {if ($truthy(node.$document()['$attr?'](\"icons\", \"font\"))) {\n return \"  \"\n } else {\n return \"  \"\n }; return nil; })();\n submenu_joiner = \"\" + \"
    \" + (caret) + \"\";\n menu = node.$attr(\"menu\");\n if ($truthy((submenus = node.$attr(\"submenus\"))['$empty?']())) {\n if ($truthy((menuitem = node.$attr(\"menuitem\")))) {\n return \"\" + \"\" + (menu) + \"\" + (caret) + \"\" + (menuitem) + \"\"\n } else {\n return \"\" + \"\" + (menu) + \"\"\n }\n } else {\n return \"\" + \"\" + (menu) + \"\" + (caret) + \"\" + (submenus.$join(submenu_joiner)) + \"\" + (caret) + \"\" + (node.$attr(\"menuitem\")) + \"\"\n };\n }, $Html5Converter_convert_inline_menu$58.$$arity = 1);\n \n Opal.def(self, '$convert_inline_quoted', $Html5Converter_convert_inline_quoted$59 = function $$convert_inline_quoted(node) {\n var $a, $b, self = this, open = nil, close = nil, tag = nil, class_attr = nil;\n\n \n $b = $$($nesting, 'QUOTE_TAGS')['$[]'](node.$type()), $a = Opal.to_ary($b), (open = ($a[0] == null ? nil : $a[0])), (close = ($a[1] == null ? nil : $a[1])), (tag = ($a[2] == null ? nil : $a[2])), $b;\n if ($truthy(node.$id())) {\n \n class_attr = (function() {if ($truthy(node.$role())) {\n return \"\" + \" class=\\\"\" + (node.$role()) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n if ($truthy(tag)) {\n return \"\" + (open.$chop()) + \" id=\\\"\" + (node.$id()) + \"\\\"\" + (class_attr) + \">\" + (node.$text()) + (close)\n } else {\n return \"\" + \"\" + (open) + (node.$text()) + (close) + \"\"\n };\n } else if ($truthy(node.$role())) {\n if ($truthy(tag)) {\n return \"\" + (open.$chop()) + \" class=\\\"\" + (node.$role()) + \"\\\">\" + (node.$text()) + (close)\n } else {\n return \"\" + \"\" + (open) + (node.$text()) + (close) + \"\"\n }\n } else {\n return \"\" + (open) + (node.$text()) + (close)\n };\n }, $Html5Converter_convert_inline_quoted$59.$$arity = 1);\n \n Opal.def(self, '$read_svg_contents', $Html5Converter_read_svg_contents$60 = function $$read_svg_contents(node, target) {\n var $$61, self = this, svg = nil, old_start_tag = nil, new_start_tag = nil, start_tag_match = nil;\n\n \n if ($truthy((svg = node.$read_contents(target, $hash2([\"start\", \"normalize\", \"label\", \"warn_if_empty\"], {\"start\": node.$document().$attr(\"imagesdir\"), \"normalize\": true, \"label\": \"SVG\", \"warn_if_empty\": true}))))) {\n \n if ($truthy(svg['$empty?']())) {\n return nil};\n if ($truthy(svg['$start_with?'](\"\");}, $$61.$$s = self, $$61.$$arity = 1, $$61));\n if ($truthy(new_start_tag)) {\n svg = \"\" + (new_start_tag) + (svg['$[]'](Opal.Range.$new(old_start_tag.$length(), -1, false)))};};\n return svg;\n }, $Html5Converter_read_svg_contents$60.$$arity = 2);\n self.$private();\n \n Opal.def(self, '$append_boolean_attribute', $Html5Converter_append_boolean_attribute$62 = function $$append_boolean_attribute(name, xml) {\n var self = this;\n\n if ($truthy(xml)) {\n return \"\" + \" \" + (name) + \"=\\\"\" + (name) + \"\\\"\"\n } else {\n return \"\" + \" \" + (name)\n }\n }, $Html5Converter_append_boolean_attribute$62.$$arity = 2);\n \n Opal.def(self, '$append_link_constraint_attrs', $Html5Converter_append_link_constraint_attrs$63 = function $$append_link_constraint_attrs(node, attrs) {\n var $a, self = this, rel = nil, window = nil;\n\n \n \n if (attrs == null) {\n attrs = [];\n };\n if ($truthy(node['$option?'](\"nofollow\"))) {\n rel = \"nofollow\"};\n if ($truthy((window = node.$attributes()['$[]'](\"window\")))) {\n \n attrs['$<<'](\"\" + \" target=\\\"\" + (window) + \"\\\"\");\n if ($truthy(($truthy($a = window['$=='](\"_blank\")) ? $a : node['$option?'](\"noopener\")))) {\n attrs['$<<']((function() {if ($truthy(rel)) {\n return \"\" + \" rel=\\\"\" + (rel) + \" noopener\\\"\"\n } else {\n return \" rel=\\\"noopener\\\"\"\n }; return nil; })())};\n } else if ($truthy(rel)) {\n attrs['$<<'](\"\" + \" rel=\\\"\" + (rel) + \"\\\"\")};\n return attrs;\n }, $Html5Converter_append_link_constraint_attrs$63.$$arity = -2);\n \n Opal.def(self, '$encode_attribute_value', $Html5Converter_encode_attribute_value$64 = function $$encode_attribute_value(val) {\n var self = this;\n\n if ($truthy(val['$include?'](\"\\\"\"))) {\n \n return val.$gsub(\"\\\"\", \""\");\n } else {\n return val\n }\n }, $Html5Converter_encode_attribute_value$64.$$arity = 1);\n \n Opal.def(self, '$generate_manname_section', $Html5Converter_generate_manname_section$65 = function $$generate_manname_section(node) {\n var $a, self = this, manname_title = nil, next_section = nil, next_section_title = nil, manname_id_attr = nil, manname_id = nil;\n\n \n manname_title = node.$attr(\"manname-title\", \"Name\");\n if ($truthy(($truthy($a = (next_section = node.$sections()['$[]'](0))) ? (next_section_title = next_section.$title())['$=='](next_section_title.$upcase()) : $a))) {\n manname_title = manname_title.$upcase()};\n manname_id_attr = (function() {if ($truthy((manname_id = node.$attr(\"manname-id\")))) {\n return \"\" + \" id=\\\"\" + (manname_id) + \"\\\"\"\n } else {\n return \"\"\n }; return nil; })();\n return \"\" + \"\" + (manname_title) + \"\\n\" + \"
    \\n\" + \"

    \" + (node.$attr(\"mannames\").$join(\", \")) + \" - \" + (node.$attr(\"manpurpose\")) + \"

    \\n\" + \"
    \";\n }, $Html5Converter_generate_manname_section$65.$$arity = 1);\n \n Opal.def(self, '$get_root_document', $Html5Converter_get_root_document$66 = function $$get_root_document(node) {\n var $a, self = this;\n\n \n while ($truthy((node = node.$document())['$nested?']())) {\n node = node.$parent_document()\n };\n return node;\n }, $Html5Converter_get_root_document$66.$$arity = 1);\n \n Opal.def(self, '$method_missing', $Html5Converter_method_missing$67 = function $$method_missing(id, $a) {\n var $post_args, args, $b, $iter = $Html5Converter_method_missing$67.$$p, $yield = $iter || nil, self = this, name = nil, $zuper = nil, $zuper_i = nil, $zuper_ii = nil;\n\n if ($iter) $Html5Converter_method_missing$67.$$p = null;\n // Prepare super implicit arguments\n for($zuper_i = 0, $zuper_ii = arguments.length, $zuper = new Array($zuper_ii); $zuper_i < $zuper_ii; $zuper_i++) {\n $zuper[$zuper_i] = arguments[$zuper_i];\n }\n \n \n $post_args = Opal.slice.call(arguments, 1, arguments.length);\n \n args = $post_args;;\n if ($truthy(($truthy($b = (name = id.$to_s())['$start_with?'](\"convert_\")['$!']()) ? self['$handles?'](name) : $b))) {\n \n return $send(self, 'send', [\"\" + \"convert_\" + (name)].concat(Opal.to_a(args)));\n } else {\n return $send(self, Opal.find_super_dispatcher(self, 'method_missing', $Html5Converter_method_missing$67, false), $zuper, $iter)\n };\n }, $Html5Converter_method_missing$67.$$arity = -2);\n return (Opal.def(self, '$respond_to_missing?', $Html5Converter_respond_to_missing$ques$68 = function(id, $a) {\n var $post_args, options, $b, self = this, name = nil;\n\n \n \n $post_args = Opal.slice.call(arguments, 1, arguments.length);\n \n options = $post_args;;\n return ($truthy($b = (name = id.$to_s())['$start_with?'](\"convert_\")['$!']()) ? self['$handles?'](name) : $b);\n }, $Html5Converter_respond_to_missing$ques$68.$$arity = -2), nil) && 'respond_to_missing?';\n })($$($nesting, 'Converter'), $$$($$($nesting, 'Converter'), 'Base'), $nesting)\n })($nesting[0], $nesting)\n};\n\n/* Generated by Opal 0.11.99.dev */\nOpal.modules[\"asciidoctor/extensions\"] = function(Opal) {\n function $rb_minus(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs - rhs : lhs['$-'](rhs);\n }\n function $rb_plus(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs + rhs : lhs['$+'](rhs);\n }\n function $rb_gt(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs > rhs : lhs['$>'](rhs);\n }\n function $rb_lt(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs < rhs : lhs['$<'](rhs);\n }\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice, $module = Opal.module, $klass = Opal.klass, $truthy = Opal.truthy, $hash2 = Opal.hash2, $send = Opal.send, $hash = Opal.hash;\n\n Opal.add_stubs(['$==', '$[]=', '$config', '$-', '$const_defined?', '$singleton_class?', '$include', '$const_get', '$extend', '$attr_reader', '$merge', '$class', '$update', '$raise', '$document', '$doctype', '$[]', '$+', '$level', '$delete', '$>', '$casecmp', '$new', '$title=', '$sectname=', '$special=', '$fetch', '$numbered=', '$!', '$key?', '$attr?', '$special', '$numbered', '$generate_id', '$title', '$id=', '$update_attributes', '$tr', '$basename', '$create_block', '$assign_caption', '$===', '$parse_blocks', '$empty?', '$include?', '$sub_attributes', '$parse', '$each', '$define_method', '$unshift', '$shift', '$send', '$size', '$binding', '$receiver', '$define_singleton_method', '$instance_exec', '$to_proc', '$call', '$option', '$flatten', '$respond_to?', '$to_s', '$partition', '$to_i', '$<<', '$compact', '$inspect', '$attr_accessor', '$to_set', '$match?', '$resolve_regexp', '$method', '$register', '$values', '$groups', '$arity', '$activate', '$add_document_processor', '$any?', '$select', '$add_syntax_processor', '$to_sym', '$instance_variable_get', '$kind', '$private', '$join', '$map', '$split', '$capitalize', '$instance_variable_set', '$resolve_args', '$enable_dsl', '$singleton_class', '$process_block_given?', '$source_location', '$freeze', '$resolve_class', '$<', '$update_config', '$as_symbol', '$name', '$name=', '$pop', '$-@', '$next_auto_id', '$generate_name']);\n \n if ($$($nesting, 'RUBY_ENGINE')['$=='](\"opal\")) {\n } else {\n nil\n };\n return (function($base, $parent_nesting) {\n var self = $module($base, 'Asciidoctor');\n\n var $nesting = [self].concat($parent_nesting);\n\n (function($base, $parent_nesting) {\n var self = $module($base, 'Extensions');\n\n var $nesting = [self].concat($parent_nesting);\n\n \n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Processor');\n\n var $nesting = [self].concat($parent_nesting), $Processor_initialize$4, $Processor_update_config$5, $Processor_process$6, $Processor_create_section$7, $Processor_create_block$8, $Processor_create_list$9, $Processor_create_list_item$10, $Processor_create_image_block$11, $Processor_create_inline$12, $Processor_parse_content$13, $Processor_parse_attributes$14, $Processor$15;\n\n self.$$prototype.config = nil;\n \n (function(self, $parent_nesting) {\n var $nesting = [self].concat($parent_nesting), $config$1, $option$2, $enable_dsl$3;\n\n \n \n Opal.def(self, '$config', $config$1 = function $$config() {\n var $a, self = this;\n if (self.config == null) self.config = nil;\n\n return (self.config = ($truthy($a = self.config) ? $a : $hash2([], {})))\n }, $config$1.$$arity = 0);\n \n Opal.def(self, '$option', $option$2 = function $$option(key, default_value) {\n var self = this, $writer = nil;\n\n \n $writer = [key, default_value];\n $send(self.$config(), '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];\n }, $option$2.$$arity = 2);\n \n Opal.def(self, '$enable_dsl', $enable_dsl$3 = function $$enable_dsl() {\n var self = this;\n\n if ($truthy(self['$const_defined?'](\"DSL\"))) {\n if ($truthy(self['$singleton_class?']())) {\n return self.$include(self.$const_get(\"DSL\"))\n } else {\n return self.$extend(self.$const_get(\"DSL\"))\n }\n } else {\n return nil\n }\n }, $enable_dsl$3.$$arity = 0);\n return Opal.alias(self, \"use_dsl\", \"enable_dsl\");\n })(Opal.get_singleton_class(self), $nesting);\n self.$attr_reader(\"config\");\n \n Opal.def(self, '$initialize', $Processor_initialize$4 = function $$initialize(config) {\n var self = this;\n\n \n \n if (config == null) {\n config = $hash2([], {});\n };\n return (self.config = self.$class().$config().$merge(config));\n }, $Processor_initialize$4.$$arity = -1);\n \n Opal.def(self, '$update_config', $Processor_update_config$5 = function $$update_config(config) {\n var self = this;\n\n return self.config.$update(config)\n }, $Processor_update_config$5.$$arity = 1);\n \n Opal.def(self, '$process', $Processor_process$6 = function $$process($a) {\n var $post_args, args, self = this;\n\n \n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + ($$($nesting, 'Processor')) + \" subclass \" + (self.$class()) + \" must implement the #\" + (\"process\") + \" method\");\n }, $Processor_process$6.$$arity = -1);\n \n Opal.def(self, '$create_section', $Processor_create_section$7 = function $$create_section(parent, title, attrs, opts) {\n var $a, self = this, doc = nil, book = nil, doctype = nil, level = nil, style = nil, sectname = nil, special = nil, sect = nil, $writer = nil, id = nil;\n\n \n \n if (opts == null) {\n opts = $hash2([], {});\n };\n doc = parent.$document();\n book = (doctype = doc.$doctype())['$=='](\"book\");\n level = ($truthy($a = opts['$[]'](\"level\")) ? $a : $rb_plus(parent.$level(), 1));\n if ($truthy((style = attrs.$delete(\"style\")))) {\n if ($truthy(($truthy($a = book) ? style['$=='](\"abstract\") : $a))) {\n $a = [\"chapter\", 1], (sectname = $a[0]), (level = $a[1]), $a\n } else {\n \n $a = [style, true], (sectname = $a[0]), (special = $a[1]), $a;\n if (level['$=='](0)) {\n level = 1};\n }\n } else if ($truthy(book)) {\n sectname = (function() {if (level['$=='](0)) {\n return \"part\"\n } else {\n \n if ($truthy($rb_gt(level, 1))) {\n return \"section\"\n } else {\n return \"chapter\"\n };\n }; return nil; })()\n } else if ($truthy((($a = doctype['$=='](\"manpage\")) ? title.$casecmp(\"synopsis\")['$=='](0) : doctype['$=='](\"manpage\")))) {\n $a = [\"synopsis\", true], (sectname = $a[0]), (special = $a[1]), $a\n } else {\n sectname = \"section\"\n };\n sect = $$($nesting, 'Section').$new(parent, level);\n $a = [title, sectname], sect['$title=']($a[0]), sect['$sectname=']($a[1]), $a;\n if ($truthy(special)) {\n \n \n $writer = [true];\n $send(sect, 'special=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;\n if ($truthy(opts.$fetch(\"numbered\", style['$=='](\"appendix\")))) {\n \n $writer = [true];\n $send(sect, 'numbered=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];\n } else if ($truthy(($truthy($a = opts['$key?'](\"numbered\")['$!']()) ? doc['$attr?'](\"sectnums\", \"all\") : $a))) {\n \n $writer = [(function() {if ($truthy(($truthy($a = book) ? level['$=='](1) : $a))) {\n return \"chapter\"\n } else {\n return true\n }; return nil; })()];\n $send(sect, 'numbered=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];};\n } else if ($truthy($rb_gt(level, 0))) {\n if ($truthy(opts.$fetch(\"numbered\", doc['$attr?'](\"sectnums\")))) {\n \n $writer = [(function() {if ($truthy(sect.$special())) {\n return ($truthy($a = parent.$numbered()) ? true : $a)\n } else {\n return true\n }; return nil; })()];\n $send(sect, 'numbered=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];}\n } else if ($truthy(opts.$fetch(\"numbered\", ($truthy($a = book) ? doc['$attr?'](\"partnums\") : $a)))) {\n \n $writer = [true];\n $send(sect, 'numbered=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];};\n if ((id = attrs['$[]'](\"id\"))['$=='](false)) {\n attrs.$delete(\"id\")\n } else {\n \n $writer = [(($writer = [\"id\", ($truthy($a = id) ? $a : (function() {if ($truthy(doc['$attr?'](\"sectids\"))) {\n \n return $$($nesting, 'Section').$generate_id(sect.$title(), doc);\n } else {\n return nil\n }; return nil; })())]), $send(attrs, '[]=', Opal.to_a($writer)), $writer[$rb_minus($writer[\"length\"], 1)])];\n $send(sect, 'id=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];\n };\n sect.$update_attributes(attrs);\n return sect;\n }, $Processor_create_section$7.$$arity = -4);\n \n Opal.def(self, '$create_block', $Processor_create_block$8 = function $$create_block(parent, context, source, attrs, opts) {\n var self = this;\n\n \n \n if (opts == null) {\n opts = $hash2([], {});\n };\n return $$($nesting, 'Block').$new(parent, context, $hash2([\"source\", \"attributes\"], {\"source\": source, \"attributes\": attrs}).$merge(opts));\n }, $Processor_create_block$8.$$arity = -5);\n \n Opal.def(self, '$create_list', $Processor_create_list$9 = function $$create_list(parent, context, attrs) {\n var self = this, list = nil;\n\n \n \n if (attrs == null) {\n attrs = nil;\n };\n list = $$($nesting, 'List').$new(parent, context);\n if ($truthy(attrs)) {\n list.$update_attributes(attrs)};\n return list;\n }, $Processor_create_list$9.$$arity = -3);\n \n Opal.def(self, '$create_list_item', $Processor_create_list_item$10 = function $$create_list_item(parent, text) {\n var self = this;\n\n \n \n if (text == null) {\n text = nil;\n };\n return $$($nesting, 'ListItem').$new(parent, text);\n }, $Processor_create_list_item$10.$$arity = -2);\n \n Opal.def(self, '$create_image_block', $Processor_create_image_block$11 = function $$create_image_block(parent, attrs, opts) {\n var $a, self = this, target = nil, $writer = nil, title = nil, block = nil;\n\n \n \n if (opts == null) {\n opts = $hash2([], {});\n };\n if ($truthy((target = attrs['$[]'](\"target\")))) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"Unable to create an image block, target attribute is required\")\n };\n ($truthy($a = attrs['$[]'](\"alt\")) ? $a : (($writer = [\"alt\", (($writer = [\"default-alt\", $$($nesting, 'Helpers').$basename(target, true).$tr(\"_-\", \" \")]), $send(attrs, '[]=', Opal.to_a($writer)), $writer[$rb_minus($writer[\"length\"], 1)])]), $send(attrs, '[]=', Opal.to_a($writer)), $writer[$rb_minus($writer[\"length\"], 1)]));\n title = (function() {if ($truthy(attrs['$key?'](\"title\"))) {\n \n return attrs.$delete(\"title\");\n } else {\n return nil\n }; return nil; })();\n block = self.$create_block(parent, \"image\", nil, attrs, opts);\n if ($truthy(title)) {\n \n \n $writer = [title];\n $send(block, 'title=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;\n block.$assign_caption(attrs.$delete(\"caption\"), \"figure\");};\n return block;\n }, $Processor_create_image_block$11.$$arity = -3);\n \n Opal.def(self, '$create_inline', $Processor_create_inline$12 = function $$create_inline(parent, context, text, opts) {\n var self = this;\n\n \n \n if (opts == null) {\n opts = $hash2([], {});\n };\n return $$($nesting, 'Inline').$new(parent, context, text, (function() {if (context['$=='](\"quoted\")) {\n \n return $hash2([\"type\"], {\"type\": \"unquoted\"}).$merge(opts);\n } else {\n return opts\n }; return nil; })());\n }, $Processor_create_inline$12.$$arity = -4);\n \n Opal.def(self, '$parse_content', $Processor_parse_content$13 = function $$parse_content(parent, content, attributes) {\n var self = this, reader = nil;\n\n \n \n if (attributes == null) {\n attributes = nil;\n };\n reader = (function() {if ($truthy($$($nesting, 'Reader')['$==='](content))) {\n return content\n } else {\n \n return $$($nesting, 'Reader').$new(content);\n }; return nil; })();\n $$($nesting, 'Parser').$parse_blocks(reader, parent, attributes);\n return parent;\n }, $Processor_parse_content$13.$$arity = -3);\n \n Opal.def(self, '$parse_attributes', $Processor_parse_attributes$14 = function $$parse_attributes(block, attrlist, opts) {\n var $a, self = this;\n\n \n \n if (opts == null) {\n opts = $hash2([], {});\n };\n if ($truthy((function() {if ($truthy(attrlist)) {\n return attrlist['$empty?']()\n } else {\n return true\n }; return nil; })())) {\n return $hash2([], {})};\n if ($truthy(($truthy($a = opts['$[]'](\"sub_attributes\")) ? attrlist['$include?']($$($nesting, 'ATTR_REF_HEAD')) : $a))) {\n attrlist = block.$sub_attributes(attrlist)};\n return $$($nesting, 'AttributeList').$new(attrlist).$parse(($truthy($a = opts['$[]'](\"positional_attributes\")) ? $a : []));\n }, $Processor_parse_attributes$14.$$arity = -3);\n return $send([[\"create_paragraph\", \"create_block\", \"paragraph\"], [\"create_open_block\", \"create_block\", \"open\"], [\"create_example_block\", \"create_block\", \"example\"], [\"create_pass_block\", \"create_block\", \"pass\"], [\"create_listing_block\", \"create_block\", \"listing\"], [\"create_literal_block\", \"create_block\", \"literal\"], [\"create_anchor\", \"create_inline\", \"anchor\"], [\"create_inline_pass\", \"create_inline\", \"quoted\"]], 'each', [], ($Processor$15 = function(method_name, delegate_method_name, context){var self = $Processor$15.$$s || this, $$16;\n\n \n \n if (method_name == null) {\n method_name = nil;\n };\n \n if (delegate_method_name == null) {\n delegate_method_name = nil;\n };\n \n if (context == null) {\n context = nil;\n };\n return $send(self, 'define_method', [method_name], ($$16 = function($a){var self = $$16.$$s || this, $post_args, args;\n\n \n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n args.$unshift(args.$shift(), context);\n return $send(self, 'send', [delegate_method_name].concat(Opal.to_a(args)));}, $$16.$$s = self, $$16.$$arity = -1, $$16));}, $Processor$15.$$s = self, $Processor$15.$$arity = 3, $Processor$15));\n })($nesting[0], null, $nesting);\n (function($base, $parent_nesting) {\n var self = $module($base, 'ProcessorDsl');\n\n var $nesting = [self].concat($parent_nesting), $ProcessorDsl_option$17, $ProcessorDsl_process$18, $ProcessorDsl_process_block_given$ques$20;\n\n \n \n Opal.def(self, '$option', $ProcessorDsl_option$17 = function $$option(key, value) {\n var self = this, $writer = nil;\n\n \n $writer = [key, value];\n $send(self.$config(), '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];\n }, $ProcessorDsl_option$17.$$arity = 2);\n \n Opal.def(self, '$process', $ProcessorDsl_process$18 = function $$process($a) {\n var $iter = $ProcessorDsl_process$18.$$p, block = $iter || nil, $post_args, args, $b, $$19, self = this, context = nil;\n if (self.process_block == null) self.process_block = nil;\n\n if ($iter) $ProcessorDsl_process$18.$$p = null;\n \n \n if ($iter) $ProcessorDsl_process$18.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n if ((block !== nil)) {\n \n if ($truthy(args['$empty?']())) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"wrong number of arguments (given \" + (args.$size()) + \", expected 0)\")\n };\n if ($truthy(($truthy($b = block.$binding()) ? self['$=='](block.$binding().$receiver()) : $b))) {\n } else {\n \n context = self;\n $send(block, 'define_singleton_method', [\"call\"], ($$19 = function($c){var self = $$19.$$s || this, $post_args, m_args;\n\n \n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n m_args = $post_args;;\n return $send(context, 'instance_exec', Opal.to_a(m_args), block.$to_proc());}, $$19.$$s = self, $$19.$$arity = -1, $$19));\n };\n return (self.process_block = block);\n } else if ($truthy((($b = self['process_block'], $b != null && $b !== nil) ? 'instance-variable' : nil))) {\n return $send(self.process_block, 'call', Opal.to_a(args))\n } else {\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + (self.$class()) + \" #\" + (\"process\") + \" method called before being registered\")\n };\n }, $ProcessorDsl_process$18.$$arity = -1);\n \n Opal.def(self, '$process_block_given?', $ProcessorDsl_process_block_given$ques$20 = function() {\n var $a, self = this;\n\n return (($a = self['process_block'], $a != null && $a !== nil) ? 'instance-variable' : nil)\n }, $ProcessorDsl_process_block_given$ques$20.$$arity = 0);\n })($nesting[0], $nesting);\n (function($base, $parent_nesting) {\n var self = $module($base, 'DocumentProcessorDsl');\n\n var $nesting = [self].concat($parent_nesting), $DocumentProcessorDsl_prefer$21;\n\n \n self.$include($$($nesting, 'ProcessorDsl'));\n \n Opal.def(self, '$prefer', $DocumentProcessorDsl_prefer$21 = function $$prefer() {\n var self = this;\n\n return self.$option(\"position\", \">>\")\n }, $DocumentProcessorDsl_prefer$21.$$arity = 0);\n })($nesting[0], $nesting);\n (function($base, $parent_nesting) {\n var self = $module($base, 'SyntaxProcessorDsl');\n\n var $nesting = [self].concat($parent_nesting), $SyntaxProcessorDsl_named$22, $SyntaxProcessorDsl_content_model$23, $SyntaxProcessorDsl_positional_attributes$24, $SyntaxProcessorDsl_default_attributes$25, $SyntaxProcessorDsl_resolve_attributes$26;\n\n \n self.$include($$($nesting, 'ProcessorDsl'));\n \n Opal.def(self, '$named', $SyntaxProcessorDsl_named$22 = function $$named(value) {\n var self = this;\n\n if ($truthy($$($nesting, 'Processor')['$==='](self))) {\n return (self.name = value)\n } else {\n return self.$option(\"name\", value)\n }\n }, $SyntaxProcessorDsl_named$22.$$arity = 1);\n \n Opal.def(self, '$content_model', $SyntaxProcessorDsl_content_model$23 = function $$content_model(value) {\n var self = this;\n\n return self.$option(\"content_model\", value)\n }, $SyntaxProcessorDsl_content_model$23.$$arity = 1);\n Opal.alias(self, \"parse_content_as\", \"content_model\");\n \n Opal.def(self, '$positional_attributes', $SyntaxProcessorDsl_positional_attributes$24 = function $$positional_attributes($a) {\n var $post_args, value, self = this;\n\n \n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n value = $post_args;;\n return self.$option(\"positional_attrs\", value.$flatten());\n }, $SyntaxProcessorDsl_positional_attributes$24.$$arity = -1);\n Opal.alias(self, \"name_positional_attributes\", \"positional_attributes\");\n Opal.alias(self, \"positional_attrs\", \"positional_attributes\");\n \n Opal.def(self, '$default_attributes', $SyntaxProcessorDsl_default_attributes$25 = function $$default_attributes(value) {\n var self = this;\n\n return self.$option(\"default_attrs\", value)\n }, $SyntaxProcessorDsl_default_attributes$25.$$arity = 1);\n Opal.alias(self, \"default_attrs\", \"default_attributes\");\n \n Opal.def(self, '$resolve_attributes', $SyntaxProcessorDsl_resolve_attributes$26 = function $$resolve_attributes($a) {\n var $post_args, args, $b, $$27, $$28, self = this, $case = nil, names = nil, defaults = nil;\n\n \n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n if ($truthy($rb_gt(args.$size(), 1))) {\n } else if ($truthy((args = args.$fetch(0, true))['$respond_to?'](\"to_sym\"))) {\n args = [args]};\n return (function() {$case = args;\n if (true['$===']($case)) {\n self.$option(\"positional_attrs\", []);\n return self.$option(\"default_attrs\", $hash2([], {}));}\n else if ($$$('::', 'Array')['$===']($case)) {\n $b = [[], $hash2([], {})], (names = $b[0]), (defaults = $b[1]), $b;\n $send(args, 'each', [], ($$27 = function(arg){var self = $$27.$$s || this, $c, $d, name = nil, _ = nil, value = nil, idx = nil, $writer = nil;\n\n \n \n if (arg == null) {\n arg = nil;\n };\n if ($truthy((arg = arg.$to_s())['$include?'](\"=\"))) {\n \n $d = arg.$partition(\"=\"), $c = Opal.to_ary($d), (name = ($c[0] == null ? nil : $c[0])), (_ = ($c[1] == null ? nil : $c[1])), (value = ($c[2] == null ? nil : $c[2])), $d;\n if ($truthy(name['$include?'](\":\"))) {\n \n $d = name.$partition(\":\"), $c = Opal.to_ary($d), (idx = ($c[0] == null ? nil : $c[0])), (_ = ($c[1] == null ? nil : $c[1])), (name = ($c[2] == null ? nil : $c[2])), $d;\n idx = (function() {if (idx['$=='](\"@\")) {\n return names.$size()\n } else {\n return idx.$to_i()\n }; return nil; })();\n \n $writer = [idx, name];\n $send(names, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;};\n \n $writer = [name, value];\n $send(defaults, '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];;\n } else if ($truthy(arg['$include?'](\":\"))) {\n \n $d = arg.$partition(\":\"), $c = Opal.to_ary($d), (idx = ($c[0] == null ? nil : $c[0])), (_ = ($c[1] == null ? nil : $c[1])), (name = ($c[2] == null ? nil : $c[2])), $d;\n idx = (function() {if (idx['$=='](\"@\")) {\n return names.$size()\n } else {\n return idx.$to_i()\n }; return nil; })();\n \n $writer = [idx, name];\n $send(names, '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];;\n } else {\n return names['$<<'](arg)\n };}, $$27.$$s = self, $$27.$$arity = 1, $$27));\n self.$option(\"positional_attrs\", names.$compact());\n return self.$option(\"default_attrs\", defaults);}\n else if ($$$('::', 'Hash')['$===']($case)) {\n $b = [[], $hash2([], {})], (names = $b[0]), (defaults = $b[1]), $b;\n $send(args, 'each', [], ($$28 = function(key, val){var self = $$28.$$s || this, $c, $d, name = nil, idx = nil, _ = nil, $writer = nil;\n\n \n \n if (key == null) {\n key = nil;\n };\n \n if (val == null) {\n val = nil;\n };\n if ($truthy((name = key.$to_s())['$include?'](\":\"))) {\n \n $d = name.$partition(\":\"), $c = Opal.to_ary($d), (idx = ($c[0] == null ? nil : $c[0])), (_ = ($c[1] == null ? nil : $c[1])), (name = ($c[2] == null ? nil : $c[2])), $d;\n idx = (function() {if (idx['$=='](\"@\")) {\n return names.$size()\n } else {\n return idx.$to_i()\n }; return nil; })();\n \n $writer = [idx, name];\n $send(names, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;};\n if ($truthy(val)) {\n \n $writer = [name, val];\n $send(defaults, '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];\n } else {\n return nil\n };}, $$28.$$s = self, $$28.$$arity = 2, $$28));\n self.$option(\"positional_attrs\", names.$compact());\n return self.$option(\"default_attrs\", defaults);}\n else {return self.$raise($$$('::', 'ArgumentError'), \"\" + \"unsupported attributes specification for macro: \" + (args.$inspect()))}})();\n }, $SyntaxProcessorDsl_resolve_attributes$26.$$arity = -1);\n Opal.alias(self, \"resolves_attributes\", \"resolve_attributes\");\n })($nesting[0], $nesting);\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Preprocessor');\n\n var $nesting = [self].concat($parent_nesting), $Preprocessor_process$29;\n\n return (Opal.def(self, '$process', $Preprocessor_process$29 = function $$process(document, reader) {\n var self = this;\n\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + ($$($nesting, 'Preprocessor')) + \" subclass \" + (self.$class()) + \" must implement the #\" + (\"process\") + \" method\")\n }, $Preprocessor_process$29.$$arity = 2), nil) && 'process'\n })($nesting[0], $$($nesting, 'Processor'), $nesting);\n Opal.const_set($$($nesting, 'Preprocessor'), 'DSL', $$($nesting, 'DocumentProcessorDsl'));\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'TreeProcessor');\n\n var $nesting = [self].concat($parent_nesting), $TreeProcessor_process$30;\n\n return (Opal.def(self, '$process', $TreeProcessor_process$30 = function $$process(document) {\n var self = this;\n\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + ($$($nesting, 'TreeProcessor')) + \" subclass \" + (self.$class()) + \" must implement the #\" + (\"process\") + \" method\")\n }, $TreeProcessor_process$30.$$arity = 1), nil) && 'process'\n })($nesting[0], $$($nesting, 'Processor'), $nesting);\n Opal.const_set($$($nesting, 'TreeProcessor'), 'DSL', $$($nesting, 'DocumentProcessorDsl'));\n Opal.const_set($nesting[0], 'Treeprocessor', $$($nesting, 'TreeProcessor'));\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Postprocessor');\n\n var $nesting = [self].concat($parent_nesting), $Postprocessor_process$31;\n\n return (Opal.def(self, '$process', $Postprocessor_process$31 = function $$process(document, output) {\n var self = this;\n\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + ($$($nesting, 'Postprocessor')) + \" subclass \" + (self.$class()) + \" must implement the #\" + (\"process\") + \" method\")\n }, $Postprocessor_process$31.$$arity = 2), nil) && 'process'\n })($nesting[0], $$($nesting, 'Processor'), $nesting);\n Opal.const_set($$($nesting, 'Postprocessor'), 'DSL', $$($nesting, 'DocumentProcessorDsl'));\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'IncludeProcessor');\n\n var $nesting = [self].concat($parent_nesting), $IncludeProcessor_process$32, $IncludeProcessor_handles$ques$33;\n\n \n \n Opal.def(self, '$process', $IncludeProcessor_process$32 = function $$process(document, reader, target, attributes) {\n var self = this;\n\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + ($$($nesting, 'IncludeProcessor')) + \" subclass \" + (self.$class()) + \" must implement the #\" + (\"process\") + \" method\")\n }, $IncludeProcessor_process$32.$$arity = 4);\n return (Opal.def(self, '$handles?', $IncludeProcessor_handles$ques$33 = function(target) {\n var self = this;\n\n return true\n }, $IncludeProcessor_handles$ques$33.$$arity = 1), nil) && 'handles?';\n })($nesting[0], $$($nesting, 'Processor'), $nesting);\n (function($base, $parent_nesting) {\n var self = $module($base, 'IncludeProcessorDsl');\n\n var $nesting = [self].concat($parent_nesting), $IncludeProcessorDsl_handles$ques$34;\n\n \n self.$include($$($nesting, 'DocumentProcessorDsl'));\n \n Opal.def(self, '$handles?', $IncludeProcessorDsl_handles$ques$34 = function($a) {\n var $iter = $IncludeProcessorDsl_handles$ques$34.$$p, block = $iter || nil, $post_args, args, $b, self = this;\n if (self.handles_block == null) self.handles_block = nil;\n\n if ($iter) $IncludeProcessorDsl_handles$ques$34.$$p = null;\n \n \n if ($iter) $IncludeProcessorDsl_handles$ques$34.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n if ((block !== nil)) {\n \n if ($truthy(args['$empty?']())) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"wrong number of arguments (given \" + (args.$size()) + \", expected 0)\")\n };\n return (self.handles_block = block);\n } else if ($truthy((($b = self['handles_block'], $b != null && $b !== nil) ? 'instance-variable' : nil))) {\n return self.handles_block.$call(args['$[]'](0))\n } else {\n return true\n };\n }, $IncludeProcessorDsl_handles$ques$34.$$arity = -1);\n })($nesting[0], $nesting);\n Opal.const_set($$($nesting, 'IncludeProcessor'), 'DSL', $$($nesting, 'IncludeProcessorDsl'));\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'DocinfoProcessor');\n\n var $nesting = [self].concat($parent_nesting), $DocinfoProcessor_initialize$35, $DocinfoProcessor_process$36;\n\n self.$$prototype.config = nil;\n \n \n Opal.def(self, '$initialize', $DocinfoProcessor_initialize$35 = function $$initialize(config) {\n var $a, $iter = $DocinfoProcessor_initialize$35.$$p, $yield = $iter || nil, self = this, $writer = nil;\n\n if ($iter) $DocinfoProcessor_initialize$35.$$p = null;\n \n \n if (config == null) {\n config = $hash2([], {});\n };\n $send(self, Opal.find_super_dispatcher(self, 'initialize', $DocinfoProcessor_initialize$35, false), [config], null);\n return ($truthy($a = self.config['$[]'](\"location\")) ? $a : (($writer = [\"location\", \"head\"]), $send(self.config, '[]=', Opal.to_a($writer)), $writer[$rb_minus($writer[\"length\"], 1)]));\n }, $DocinfoProcessor_initialize$35.$$arity = -1);\n return (Opal.def(self, '$process', $DocinfoProcessor_process$36 = function $$process(document) {\n var self = this;\n\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + ($$($nesting, 'DocinfoProcessor')) + \" subclass \" + (self.$class()) + \" must implement the #\" + (\"process\") + \" method\")\n }, $DocinfoProcessor_process$36.$$arity = 1), nil) && 'process';\n })($nesting[0], $$($nesting, 'Processor'), $nesting);\n (function($base, $parent_nesting) {\n var self = $module($base, 'DocinfoProcessorDsl');\n\n var $nesting = [self].concat($parent_nesting), $DocinfoProcessorDsl_at_location$37;\n\n \n self.$include($$($nesting, 'DocumentProcessorDsl'));\n \n Opal.def(self, '$at_location', $DocinfoProcessorDsl_at_location$37 = function $$at_location(value) {\n var self = this;\n\n return self.$option(\"location\", value)\n }, $DocinfoProcessorDsl_at_location$37.$$arity = 1);\n })($nesting[0], $nesting);\n Opal.const_set($$($nesting, 'DocinfoProcessor'), 'DSL', $$($nesting, 'DocinfoProcessorDsl'));\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'BlockProcessor');\n\n var $nesting = [self].concat($parent_nesting), $BlockProcessor_initialize$38, $BlockProcessor_process$39;\n\n self.$$prototype.config = nil;\n \n self.$attr_accessor(\"name\");\n \n Opal.def(self, '$initialize', $BlockProcessor_initialize$38 = function $$initialize(name, config) {\n var $a, $iter = $BlockProcessor_initialize$38.$$p, $yield = $iter || nil, self = this, $case = nil, $writer = nil;\n\n if ($iter) $BlockProcessor_initialize$38.$$p = null;\n \n \n if (name == null) {\n name = nil;\n };\n \n if (config == null) {\n config = $hash2([], {});\n };\n $send(self, Opal.find_super_dispatcher(self, 'initialize', $BlockProcessor_initialize$38, false), [config], null);\n self.name = ($truthy($a = name) ? $a : self.config['$[]'](\"name\"));\n $case = self.config['$[]'](\"contexts\");\n if ($$$('::', 'NilClass')['$===']($case)) {($truthy($a = self.config['$[]'](\"contexts\")) ? $a : (($writer = [\"contexts\", [\"open\", \"paragraph\"].$to_set()]), $send(self.config, '[]=', Opal.to_a($writer)), $writer[$rb_minus($writer[\"length\"], 1)]))}\n else if ($$$('::', 'Symbol')['$===']($case)) {\n $writer = [\"contexts\", [self.config['$[]'](\"contexts\")].$to_set()];\n $send(self.config, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];}\n else {\n $writer = [\"contexts\", self.config['$[]'](\"contexts\").$to_set()];\n $send(self.config, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];};\n return ($truthy($a = self.config['$[]'](\"content_model\")) ? $a : (($writer = [\"content_model\", \"compound\"]), $send(self.config, '[]=', Opal.to_a($writer)), $writer[$rb_minus($writer[\"length\"], 1)]));\n }, $BlockProcessor_initialize$38.$$arity = -1);\n return (Opal.def(self, '$process', $BlockProcessor_process$39 = function $$process(parent, reader, attributes) {\n var self = this;\n\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + ($$($nesting, 'BlockProcessor')) + \" subclass \" + (self.$class()) + \" must implement the #\" + (\"process\") + \" method\")\n }, $BlockProcessor_process$39.$$arity = 3), nil) && 'process';\n })($nesting[0], $$($nesting, 'Processor'), $nesting);\n (function($base, $parent_nesting) {\n var self = $module($base, 'BlockProcessorDsl');\n\n var $nesting = [self].concat($parent_nesting), $BlockProcessorDsl_contexts$40;\n\n \n self.$include($$($nesting, 'SyntaxProcessorDsl'));\n \n Opal.def(self, '$contexts', $BlockProcessorDsl_contexts$40 = function $$contexts($a) {\n var $post_args, value, self = this;\n\n \n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n value = $post_args;;\n return self.$option(\"contexts\", value.$flatten().$to_set());\n }, $BlockProcessorDsl_contexts$40.$$arity = -1);\n Opal.alias(self, \"on_contexts\", \"contexts\");\n Opal.alias(self, \"on_context\", \"contexts\");\n Opal.alias(self, \"bind_to\", \"contexts\");\n })($nesting[0], $nesting);\n Opal.const_set($$($nesting, 'BlockProcessor'), 'DSL', $$($nesting, 'BlockProcessorDsl'));\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'MacroProcessor');\n\n var $nesting = [self].concat($parent_nesting), $MacroProcessor_initialize$41, $MacroProcessor_process$42;\n\n self.$$prototype.config = nil;\n \n self.$attr_accessor(\"name\");\n \n Opal.def(self, '$initialize', $MacroProcessor_initialize$41 = function $$initialize(name, config) {\n var $a, $iter = $MacroProcessor_initialize$41.$$p, $yield = $iter || nil, self = this, $writer = nil;\n\n if ($iter) $MacroProcessor_initialize$41.$$p = null;\n \n \n if (name == null) {\n name = nil;\n };\n \n if (config == null) {\n config = $hash2([], {});\n };\n $send(self, Opal.find_super_dispatcher(self, 'initialize', $MacroProcessor_initialize$41, false), [config], null);\n self.name = ($truthy($a = name) ? $a : self.config['$[]'](\"name\"));\n return ($truthy($a = self.config['$[]'](\"content_model\")) ? $a : (($writer = [\"content_model\", \"attributes\"]), $send(self.config, '[]=', Opal.to_a($writer)), $writer[$rb_minus($writer[\"length\"], 1)]));\n }, $MacroProcessor_initialize$41.$$arity = -1);\n return (Opal.def(self, '$process', $MacroProcessor_process$42 = function $$process(parent, target, attributes) {\n var self = this;\n\n return self.$raise($$$('::', 'NotImplementedError'), \"\" + ($$($nesting, 'MacroProcessor')) + \" subclass \" + (self.$class()) + \" must implement the #\" + (\"process\") + \" method\")\n }, $MacroProcessor_process$42.$$arity = 3), nil) && 'process';\n })($nesting[0], $$($nesting, 'Processor'), $nesting);\n (function($base, $parent_nesting) {\n var self = $module($base, 'MacroProcessorDsl');\n\n var $nesting = [self].concat($parent_nesting), $MacroProcessorDsl_resolve_attributes$43;\n\n \n self.$include($$($nesting, 'SyntaxProcessorDsl'));\n \n Opal.def(self, '$resolve_attributes', $MacroProcessorDsl_resolve_attributes$43 = function $$resolve_attributes($a) {\n var $post_args, args, $b, $iter = $MacroProcessorDsl_resolve_attributes$43.$$p, $yield = $iter || nil, self = this, $zuper = nil, $zuper_i = nil, $zuper_ii = nil;\n\n if ($iter) $MacroProcessorDsl_resolve_attributes$43.$$p = null;\n // Prepare super implicit arguments\n for($zuper_i = 0, $zuper_ii = arguments.length, $zuper = new Array($zuper_ii); $zuper_i < $zuper_ii; $zuper_i++) {\n $zuper[$zuper_i] = arguments[$zuper_i];\n }\n \n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n if ($truthy((($b = args.$size()['$=='](1)) ? args['$[]'](0)['$!']() : args.$size()['$=='](1)))) {\n return self.$option(\"content_model\", \"text\")\n } else {\n \n $send(self, Opal.find_super_dispatcher(self, 'resolve_attributes', $MacroProcessorDsl_resolve_attributes$43, false), $zuper, $iter);\n return self.$option(\"content_model\", \"attributes\");\n };\n }, $MacroProcessorDsl_resolve_attributes$43.$$arity = -1);\n Opal.alias(self, \"resolves_attributes\", \"resolve_attributes\");\n })($nesting[0], $nesting);\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'BlockMacroProcessor');\n\n var $nesting = [self].concat($parent_nesting), $BlockMacroProcessor_name$44;\n\n self.$$prototype.name = nil;\n return (Opal.def(self, '$name', $BlockMacroProcessor_name$44 = function $$name() {\n var self = this;\n\n \n if ($truthy($$($nesting, 'MacroNameRx')['$match?'](self.name.$to_s()))) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"invalid name for block macro: \" + (self.name))\n };\n return self.name;\n }, $BlockMacroProcessor_name$44.$$arity = 0), nil) && 'name'\n })($nesting[0], $$($nesting, 'MacroProcessor'), $nesting);\n Opal.const_set($$($nesting, 'BlockMacroProcessor'), 'DSL', $$($nesting, 'MacroProcessorDsl'));\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'InlineMacroProcessor');\n\n var $nesting = [self].concat($parent_nesting), $InlineMacroProcessor_regexp$45, $InlineMacroProcessor_resolve_regexp$46;\n\n self.$$prototype.config = self.$$prototype.name = nil;\n \n (Opal.class_variable_set($nesting[0], '@@rx_cache', $hash2([], {})));\n \n Opal.def(self, '$regexp', $InlineMacroProcessor_regexp$45 = function $$regexp() {\n var $a, self = this, $writer = nil;\n\n return ($truthy($a = self.config['$[]'](\"regexp\")) ? $a : (($writer = [\"regexp\", self.$resolve_regexp(self.name.$to_s(), self.config['$[]'](\"format\"))]), $send(self.config, '[]=', Opal.to_a($writer)), $writer[$rb_minus($writer[\"length\"], 1)]))\n }, $InlineMacroProcessor_regexp$45.$$arity = 0);\n return (Opal.def(self, '$resolve_regexp', $InlineMacroProcessor_resolve_regexp$46 = function $$resolve_regexp(name, format) {\n var $a, $b, self = this, $writer = nil;\n\n \n if ($truthy($$($nesting, 'MacroNameRx')['$match?'](name))) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"invalid name for inline macro: \" + (name))\n };\n return ($truthy($a = (($b = $nesting[0].$$cvars['@@rx_cache']) == null ? nil : $b)['$[]']([name, format])) ? $a : (($writer = [[name, format], new RegExp(\"\" + \"\\\\\\\\?\" + (name) + \":\" + ((function() {if (format['$=='](\"short\")) {\n return \"(){0}\"\n } else {\n return \"(\\\\S+?)\"\n }; return nil; })()) + \"\\\\[(|\" + ($$($nesting, 'CC_ANY')) + \"*?[^\\\\\\\\])\\\\]\")]), $send((($b = $nesting[0].$$cvars['@@rx_cache']) == null ? nil : $b), '[]=', Opal.to_a($writer)), $writer[$rb_minus($writer[\"length\"], 1)]));\n }, $InlineMacroProcessor_resolve_regexp$46.$$arity = 2), nil) && 'resolve_regexp';\n })($nesting[0], $$($nesting, 'MacroProcessor'), $nesting);\n (function($base, $parent_nesting) {\n var self = $module($base, 'InlineMacroProcessorDsl');\n\n var $nesting = [self].concat($parent_nesting), $InlineMacroProcessorDsl_format$47, $InlineMacroProcessorDsl_match$48;\n\n \n self.$include($$($nesting, 'MacroProcessorDsl'));\n \n Opal.def(self, '$format', $InlineMacroProcessorDsl_format$47 = function $$format(value) {\n var self = this;\n\n return self.$option(\"format\", value)\n }, $InlineMacroProcessorDsl_format$47.$$arity = 1);\n Opal.alias(self, \"match_format\", \"format\");\n Opal.alias(self, \"using_format\", \"format\");\n \n Opal.def(self, '$match', $InlineMacroProcessorDsl_match$48 = function $$match(value) {\n var self = this;\n\n return self.$option(\"regexp\", value)\n }, $InlineMacroProcessorDsl_match$48.$$arity = 1);\n })($nesting[0], $nesting);\n Opal.const_set($$($nesting, 'InlineMacroProcessor'), 'DSL', $$($nesting, 'InlineMacroProcessorDsl'));\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Extension');\n\n var $nesting = [self].concat($parent_nesting), $Extension_initialize$49;\n\n \n self.$attr_reader(\"kind\");\n self.$attr_reader(\"config\");\n self.$attr_reader(\"instance\");\n return (Opal.def(self, '$initialize', $Extension_initialize$49 = function $$initialize(kind, instance, config) {\n var self = this;\n\n \n self.kind = kind;\n self.instance = instance;\n return (self.config = config);\n }, $Extension_initialize$49.$$arity = 3), nil) && 'initialize';\n })($nesting[0], null, $nesting);\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'ProcessorExtension');\n\n var $nesting = [self].concat($parent_nesting), $ProcessorExtension_initialize$50;\n\n \n self.$attr_reader(\"process_method\");\n return (Opal.def(self, '$initialize', $ProcessorExtension_initialize$50 = function $$initialize(kind, instance, process_method) {\n var $a, $iter = $ProcessorExtension_initialize$50.$$p, $yield = $iter || nil, self = this;\n\n if ($iter) $ProcessorExtension_initialize$50.$$p = null;\n \n \n if (process_method == null) {\n process_method = nil;\n };\n $send(self, Opal.find_super_dispatcher(self, 'initialize', $ProcessorExtension_initialize$50, false), [kind, instance, instance.$config()], null);\n return (self.process_method = ($truthy($a = process_method) ? $a : instance.$method(\"process\")));\n }, $ProcessorExtension_initialize$50.$$arity = -3), nil) && 'initialize';\n })($nesting[0], $$($nesting, 'Extension'), $nesting);\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Group');\n\n var $nesting = [self].concat($parent_nesting), $Group_activate$52;\n\n \n (function(self, $parent_nesting) {\n var $nesting = [self].concat($parent_nesting), $register$51;\n\n return (Opal.def(self, '$register', $register$51 = function $$register(name) {\n var self = this;\n\n \n \n if (name == null) {\n name = nil;\n };\n return $$($nesting, 'Extensions').$register(name, self);\n }, $register$51.$$arity = -1), nil) && 'register'\n })(Opal.get_singleton_class(self), $nesting);\n return (Opal.def(self, '$activate', $Group_activate$52 = function $$activate(registry) {\n var self = this;\n\n return self.$raise($$$('::', 'NotImplementedError'))\n }, $Group_activate$52.$$arity = 1), nil) && 'activate';\n })($nesting[0], null, $nesting);\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Registry');\n\n var $nesting = [self].concat($parent_nesting), $Registry_initialize$53, $Registry_activate$54, $Registry_preprocessor$56, $Registry_preprocessors$ques$57, $Registry_preprocessors$58, $Registry_tree_processor$59, $Registry_tree_processors$ques$60, $Registry_tree_processors$61, $Registry_postprocessor$62, $Registry_postprocessors$ques$63, $Registry_postprocessors$64, $Registry_include_processor$65, $Registry_include_processors$ques$66, $Registry_include_processors$67, $Registry_docinfo_processor$68, $Registry_docinfo_processors$ques$69, $Registry_docinfo_processors$71, $Registry_block$73, $Registry_blocks$ques$74, $Registry_registered_for_block$ques$75, $Registry_find_block_extension$76, $Registry_block_macro$77, $Registry_block_macros$ques$78, $Registry_registered_for_block_macro$ques$79, $Registry_find_block_macro_extension$80, $Registry_inline_macro$81, $Registry_inline_macros$ques$82, $Registry_registered_for_inline_macro$ques$83, $Registry_find_inline_macro_extension$84, $Registry_inline_macros$85, $Registry_prefer$86, $Registry_add_document_processor$87, $Registry_add_syntax_processor$89, $Registry_resolve_args$91, $Registry_as_symbol$92;\n\n self.$$prototype.groups = self.$$prototype.preprocessor_extensions = self.$$prototype.tree_processor_extensions = self.$$prototype.postprocessor_extensions = self.$$prototype.include_processor_extensions = self.$$prototype.docinfo_processor_extensions = self.$$prototype.block_extensions = self.$$prototype.block_macro_extensions = self.$$prototype.inline_macro_extensions = nil;\n \n self.$attr_reader(\"document\");\n self.$attr_reader(\"groups\");\n \n Opal.def(self, '$initialize', $Registry_initialize$53 = function $$initialize(groups) {\n var self = this;\n\n \n \n if (groups == null) {\n groups = $hash2([], {});\n };\n self.groups = groups;\n self.preprocessor_extensions = (self.tree_processor_extensions = (self.postprocessor_extensions = (self.include_processor_extensions = (self.docinfo_processor_extensions = (self.block_extensions = (self.block_macro_extensions = (self.inline_macro_extensions = nil)))))));\n return (self.document = nil);\n }, $Registry_initialize$53.$$arity = -1);\n \n Opal.def(self, '$activate', $Registry_activate$54 = function $$activate(document) {\n var $$55, self = this, ext_groups = nil;\n\n \n self.document = document;\n if ($truthy((ext_groups = $rb_plus($$($nesting, 'Extensions').$groups().$values(), self.groups.$values()))['$empty?']())) {\n } else {\n $send(ext_groups, 'each', [], ($$55 = function(group){var self = $$55.$$s || this, $case = nil;\n\n \n \n if (group == null) {\n group = nil;\n };\n return (function() {$case = group;\n if ($$$('::', 'Proc')['$===']($case)) {return (function() {$case = group.$arity();\n if ((0)['$===']($case) || (-1)['$===']($case)) {return $send(self, 'instance_exec', [], group.$to_proc())}\n else if ((1)['$===']($case)) {return group.$call(self)}\n else { return nil }})()}\n else if ($$$('::', 'Class')['$===']($case)) {return group.$new().$activate(self)}\n else {return group.$activate(self)}})();}, $$55.$$s = self, $$55.$$arity = 1, $$55))\n };\n return self;\n }, $Registry_activate$54.$$arity = 1);\n \n Opal.def(self, '$preprocessor', $Registry_preprocessor$56 = function $$preprocessor($a) {\n var $iter = $Registry_preprocessor$56.$$p, block = $iter || nil, $post_args, args, self = this;\n\n if ($iter) $Registry_preprocessor$56.$$p = null;\n \n \n if ($iter) $Registry_preprocessor$56.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n return $send(self, 'add_document_processor', [\"preprocessor\", args], block.$to_proc());\n }, $Registry_preprocessor$56.$$arity = -1);\n \n Opal.def(self, '$preprocessors?', $Registry_preprocessors$ques$57 = function() {\n var self = this;\n\n return self.preprocessor_extensions['$!']()['$!']()\n }, $Registry_preprocessors$ques$57.$$arity = 0);\n \n Opal.def(self, '$preprocessors', $Registry_preprocessors$58 = function $$preprocessors() {\n var self = this;\n\n return self.preprocessor_extensions\n }, $Registry_preprocessors$58.$$arity = 0);\n \n Opal.def(self, '$tree_processor', $Registry_tree_processor$59 = function $$tree_processor($a) {\n var $iter = $Registry_tree_processor$59.$$p, block = $iter || nil, $post_args, args, self = this;\n\n if ($iter) $Registry_tree_processor$59.$$p = null;\n \n \n if ($iter) $Registry_tree_processor$59.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n return $send(self, 'add_document_processor', [\"tree_processor\", args], block.$to_proc());\n }, $Registry_tree_processor$59.$$arity = -1);\n \n Opal.def(self, '$tree_processors?', $Registry_tree_processors$ques$60 = function() {\n var self = this;\n\n return self.tree_processor_extensions['$!']()['$!']()\n }, $Registry_tree_processors$ques$60.$$arity = 0);\n \n Opal.def(self, '$tree_processors', $Registry_tree_processors$61 = function $$tree_processors() {\n var self = this;\n\n return self.tree_processor_extensions\n }, $Registry_tree_processors$61.$$arity = 0);\n Opal.alias(self, \"treeprocessor\", \"tree_processor\");\n Opal.alias(self, \"treeprocessors?\", \"tree_processors?\");\n Opal.alias(self, \"treeprocessors\", \"tree_processors\");\n \n Opal.def(self, '$postprocessor', $Registry_postprocessor$62 = function $$postprocessor($a) {\n var $iter = $Registry_postprocessor$62.$$p, block = $iter || nil, $post_args, args, self = this;\n\n if ($iter) $Registry_postprocessor$62.$$p = null;\n \n \n if ($iter) $Registry_postprocessor$62.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n return $send(self, 'add_document_processor', [\"postprocessor\", args], block.$to_proc());\n }, $Registry_postprocessor$62.$$arity = -1);\n \n Opal.def(self, '$postprocessors?', $Registry_postprocessors$ques$63 = function() {\n var self = this;\n\n return self.postprocessor_extensions['$!']()['$!']()\n }, $Registry_postprocessors$ques$63.$$arity = 0);\n \n Opal.def(self, '$postprocessors', $Registry_postprocessors$64 = function $$postprocessors() {\n var self = this;\n\n return self.postprocessor_extensions\n }, $Registry_postprocessors$64.$$arity = 0);\n \n Opal.def(self, '$include_processor', $Registry_include_processor$65 = function $$include_processor($a) {\n var $iter = $Registry_include_processor$65.$$p, block = $iter || nil, $post_args, args, self = this;\n\n if ($iter) $Registry_include_processor$65.$$p = null;\n \n \n if ($iter) $Registry_include_processor$65.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n return $send(self, 'add_document_processor', [\"include_processor\", args], block.$to_proc());\n }, $Registry_include_processor$65.$$arity = -1);\n \n Opal.def(self, '$include_processors?', $Registry_include_processors$ques$66 = function() {\n var self = this;\n\n return self.include_processor_extensions['$!']()['$!']()\n }, $Registry_include_processors$ques$66.$$arity = 0);\n \n Opal.def(self, '$include_processors', $Registry_include_processors$67 = function $$include_processors() {\n var self = this;\n\n return self.include_processor_extensions\n }, $Registry_include_processors$67.$$arity = 0);\n \n Opal.def(self, '$docinfo_processor', $Registry_docinfo_processor$68 = function $$docinfo_processor($a) {\n var $iter = $Registry_docinfo_processor$68.$$p, block = $iter || nil, $post_args, args, self = this;\n\n if ($iter) $Registry_docinfo_processor$68.$$p = null;\n \n \n if ($iter) $Registry_docinfo_processor$68.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n return $send(self, 'add_document_processor', [\"docinfo_processor\", args], block.$to_proc());\n }, $Registry_docinfo_processor$68.$$arity = -1);\n \n Opal.def(self, '$docinfo_processors?', $Registry_docinfo_processors$ques$69 = function(location) {\n var $$70, self = this;\n\n \n \n if (location == null) {\n location = nil;\n };\n if ($truthy(self.docinfo_processor_extensions)) {\n if ($truthy(location)) {\n return $send(self.docinfo_processor_extensions, 'any?', [], ($$70 = function(ext){var self = $$70.$$s || this;\n\n \n \n if (ext == null) {\n ext = nil;\n };\n return ext.$config()['$[]'](\"location\")['$=='](location);}, $$70.$$s = self, $$70.$$arity = 1, $$70))\n } else {\n return true\n }\n } else {\n return false\n };\n }, $Registry_docinfo_processors$ques$69.$$arity = -1);\n \n Opal.def(self, '$docinfo_processors', $Registry_docinfo_processors$71 = function $$docinfo_processors(location) {\n var $$72, self = this;\n\n \n \n if (location == null) {\n location = nil;\n };\n if ($truthy(self.docinfo_processor_extensions)) {\n if ($truthy(location)) {\n return $send(self.docinfo_processor_extensions, 'select', [], ($$72 = function(ext){var self = $$72.$$s || this;\n\n \n \n if (ext == null) {\n ext = nil;\n };\n return ext.$config()['$[]'](\"location\")['$=='](location);}, $$72.$$s = self, $$72.$$arity = 1, $$72))\n } else {\n return self.docinfo_processor_extensions\n }\n } else {\n return nil\n };\n }, $Registry_docinfo_processors$71.$$arity = -1);\n \n Opal.def(self, '$block', $Registry_block$73 = function $$block($a) {\n var $iter = $Registry_block$73.$$p, block = $iter || nil, $post_args, args, self = this;\n\n if ($iter) $Registry_block$73.$$p = null;\n \n \n if ($iter) $Registry_block$73.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n return $send(self, 'add_syntax_processor', [\"block\", args], block.$to_proc());\n }, $Registry_block$73.$$arity = -1);\n \n Opal.def(self, '$blocks?', $Registry_blocks$ques$74 = function() {\n var self = this;\n\n return self.block_extensions['$!']()['$!']()\n }, $Registry_blocks$ques$74.$$arity = 0);\n \n Opal.def(self, '$registered_for_block?', $Registry_registered_for_block$ques$75 = function(name, context) {\n var self = this, ext = nil;\n\n if ($truthy((ext = self.block_extensions['$[]'](name.$to_sym())))) {\n if ($truthy(ext.$config()['$[]'](\"contexts\")['$include?'](context))) {\n return ext\n } else {\n return false\n }\n } else {\n return false\n }\n }, $Registry_registered_for_block$ques$75.$$arity = 2);\n \n Opal.def(self, '$find_block_extension', $Registry_find_block_extension$76 = function $$find_block_extension(name) {\n var self = this;\n\n return self.block_extensions['$[]'](name.$to_sym())\n }, $Registry_find_block_extension$76.$$arity = 1);\n \n Opal.def(self, '$block_macro', $Registry_block_macro$77 = function $$block_macro($a) {\n var $iter = $Registry_block_macro$77.$$p, block = $iter || nil, $post_args, args, self = this;\n\n if ($iter) $Registry_block_macro$77.$$p = null;\n \n \n if ($iter) $Registry_block_macro$77.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n return $send(self, 'add_syntax_processor', [\"block_macro\", args], block.$to_proc());\n }, $Registry_block_macro$77.$$arity = -1);\n \n Opal.def(self, '$block_macros?', $Registry_block_macros$ques$78 = function() {\n var self = this;\n\n return self.block_macro_extensions['$!']()['$!']()\n }, $Registry_block_macros$ques$78.$$arity = 0);\n \n Opal.def(self, '$registered_for_block_macro?', $Registry_registered_for_block_macro$ques$79 = function(name) {\n var self = this, ext = nil;\n\n if ($truthy((ext = self.block_macro_extensions['$[]'](name.$to_sym())))) {\n return ext\n } else {\n return false\n }\n }, $Registry_registered_for_block_macro$ques$79.$$arity = 1);\n \n Opal.def(self, '$find_block_macro_extension', $Registry_find_block_macro_extension$80 = function $$find_block_macro_extension(name) {\n var self = this;\n\n return self.block_macro_extensions['$[]'](name.$to_sym())\n }, $Registry_find_block_macro_extension$80.$$arity = 1);\n \n Opal.def(self, '$inline_macro', $Registry_inline_macro$81 = function $$inline_macro($a) {\n var $iter = $Registry_inline_macro$81.$$p, block = $iter || nil, $post_args, args, self = this;\n\n if ($iter) $Registry_inline_macro$81.$$p = null;\n \n \n if ($iter) $Registry_inline_macro$81.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n return $send(self, 'add_syntax_processor', [\"inline_macro\", args], block.$to_proc());\n }, $Registry_inline_macro$81.$$arity = -1);\n \n Opal.def(self, '$inline_macros?', $Registry_inline_macros$ques$82 = function() {\n var self = this;\n\n return self.inline_macro_extensions['$!']()['$!']()\n }, $Registry_inline_macros$ques$82.$$arity = 0);\n \n Opal.def(self, '$registered_for_inline_macro?', $Registry_registered_for_inline_macro$ques$83 = function(name) {\n var self = this, ext = nil;\n\n if ($truthy((ext = self.inline_macro_extensions['$[]'](name.$to_sym())))) {\n return ext\n } else {\n return false\n }\n }, $Registry_registered_for_inline_macro$ques$83.$$arity = 1);\n \n Opal.def(self, '$find_inline_macro_extension', $Registry_find_inline_macro_extension$84 = function $$find_inline_macro_extension(name) {\n var self = this;\n\n return self.inline_macro_extensions['$[]'](name.$to_sym())\n }, $Registry_find_inline_macro_extension$84.$$arity = 1);\n \n Opal.def(self, '$inline_macros', $Registry_inline_macros$85 = function $$inline_macros() {\n var self = this;\n\n return self.inline_macro_extensions.$values()\n }, $Registry_inline_macros$85.$$arity = 0);\n \n Opal.def(self, '$prefer', $Registry_prefer$86 = function $$prefer($a) {\n var $iter = $Registry_prefer$86.$$p, block = $iter || nil, $post_args, args, self = this, extension = nil, arg0 = nil, extensions_store = nil;\n\n if ($iter) $Registry_prefer$86.$$p = null;\n \n \n if ($iter) $Registry_prefer$86.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n extension = (function() {if ($truthy($$($nesting, 'ProcessorExtension')['$===']((arg0 = args.$shift())))) {\n return arg0\n } else {\n \n return $send(self, 'send', [arg0].concat(Opal.to_a(args)), block.$to_proc());\n }; return nil; })();\n extensions_store = self.$instance_variable_get((((\"\" + \"@\") + (extension.$kind())) + \"_extensions\").$to_sym());\n extensions_store.$unshift(extensions_store.$delete(extension));\n return extension;\n }, $Registry_prefer$86.$$arity = -1);\n self.$private();\n \n Opal.def(self, '$add_document_processor', $Registry_add_document_processor$87 = function $$add_document_processor(kind, args) {\n var $iter = $Registry_add_document_processor$87.$$p, block = $iter || nil, $$88, $a, $b, $c, self = this, kind_name = nil, kind_class_symbol = nil, kind_class = nil, kind_java_class = nil, kind_store = nil, config = nil, processor = nil, extension = nil, processor_class = nil, processor_instance = nil;\n\n if ($iter) $Registry_add_document_processor$87.$$p = null;\n \n \n if ($iter) $Registry_add_document_processor$87.$$p = null;;\n kind_name = kind.$to_s().$tr(\"_\", \" \");\n kind_class_symbol = $send(kind_name.$split(), 'map', [], ($$88 = function(it){var self = $$88.$$s || this;\n\n \n \n if (it == null) {\n it = nil;\n };\n return it.$capitalize();}, $$88.$$s = self, $$88.$$arity = 1, $$88)).$join().$to_sym();\n kind_class = $$($nesting, 'Extensions').$const_get(kind_class_symbol, false);\n kind_java_class = (function() {if ($truthy((($a = $$$('::', 'AsciidoctorJ', 'skip_raise')) ? 'constant' : nil))) {\n \n return $$$($$$('::', 'AsciidoctorJ'), 'Extensions').$const_get(kind_class_symbol, false);\n } else {\n return nil\n }; return nil; })();\n kind_store = ($truthy($b = self.$instance_variable_get((((\"\" + \"@\") + (kind)) + \"_extensions\").$to_sym())) ? $b : self.$instance_variable_set((((\"\" + \"@\") + (kind)) + \"_extensions\").$to_sym(), []));\n if ((block !== nil)) {\n \n config = self.$resolve_args(args, 1);\n (processor = kind_class.$new(config)).$singleton_class().$enable_dsl();\n if (block.$arity()['$=='](0)) {\n $send(processor, 'instance_exec', [], block.$to_proc())\n } else {\n Opal.yield1(block, processor)\n };\n if ($truthy(processor['$process_block_given?']())) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"No block specified to process \" + (kind_name) + \" extension at \" + (block.$source_location()))\n };\n processor.$freeze();\n extension = $$($nesting, 'ProcessorExtension').$new(kind, processor);\n } else {\n \n $c = self.$resolve_args(args, 2), $b = Opal.to_ary($c), (processor = ($b[0] == null ? nil : $b[0])), (config = ($b[1] == null ? nil : $b[1])), $c;\n if ($truthy((processor_class = $$($nesting, 'Helpers').$resolve_class(processor)))) {\n \n if ($truthy(($truthy($b = $rb_lt(processor_class, kind_class)) ? $b : ($truthy($c = kind_java_class) ? $rb_lt(processor_class, kind_java_class) : $c)))) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"Invalid type for \" + (kind_name) + \" extension: \" + (processor))\n };\n processor_instance = processor_class.$new(config);\n processor_instance.$freeze();\n extension = $$($nesting, 'ProcessorExtension').$new(kind, processor_instance);\n } else if ($truthy(($truthy($b = kind_class['$==='](processor)) ? $b : ($truthy($c = kind_java_class) ? kind_java_class['$==='](processor) : $c)))) {\n \n processor.$update_config(config);\n processor.$freeze();\n extension = $$($nesting, 'ProcessorExtension').$new(kind, processor);\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"Invalid arguments specified for registering \" + (kind_name) + \" extension: \" + (args))\n };\n };\n if (extension.$config()['$[]'](\"position\")['$=='](\">>\")) {\n \n kind_store.$unshift(extension);\n } else {\n \n kind_store['$<<'](extension);\n };\n return extension;\n }, $Registry_add_document_processor$87.$$arity = 2);\n \n Opal.def(self, '$add_syntax_processor', $Registry_add_syntax_processor$89 = function $$add_syntax_processor(kind, args) {\n var $iter = $Registry_add_syntax_processor$89.$$p, block = $iter || nil, $$90, $a, $b, $c, self = this, kind_name = nil, kind_class_symbol = nil, kind_class = nil, kind_java_class = nil, kind_store = nil, name = nil, config = nil, processor = nil, $writer = nil, processor_class = nil, processor_instance = nil;\n\n if ($iter) $Registry_add_syntax_processor$89.$$p = null;\n \n \n if ($iter) $Registry_add_syntax_processor$89.$$p = null;;\n kind_name = kind.$to_s().$tr(\"_\", \" \");\n kind_class_symbol = $send(kind_name.$split(), 'map', [], ($$90 = function(it){var self = $$90.$$s || this;\n\n \n \n if (it == null) {\n it = nil;\n };\n return it.$capitalize();}, $$90.$$s = self, $$90.$$arity = 1, $$90))['$<<'](\"Processor\").$join().$to_sym();\n kind_class = $$($nesting, 'Extensions').$const_get(kind_class_symbol, false);\n kind_java_class = (function() {if ($truthy((($a = $$$('::', 'AsciidoctorJ', 'skip_raise')) ? 'constant' : nil))) {\n \n return $$$($$$('::', 'AsciidoctorJ'), 'Extensions').$const_get(kind_class_symbol, false);\n } else {\n return nil\n }; return nil; })();\n kind_store = ($truthy($b = self.$instance_variable_get((((\"\" + \"@\") + (kind)) + \"_extensions\").$to_sym())) ? $b : self.$instance_variable_set((((\"\" + \"@\") + (kind)) + \"_extensions\").$to_sym(), $hash2([], {})));\n if ((block !== nil)) {\n \n $c = self.$resolve_args(args, 2), $b = Opal.to_ary($c), (name = ($b[0] == null ? nil : $b[0])), (config = ($b[1] == null ? nil : $b[1])), $c;\n (processor = kind_class.$new(self.$as_symbol(name), config)).$singleton_class().$enable_dsl();\n if (block.$arity()['$=='](0)) {\n $send(processor, 'instance_exec', [], block.$to_proc())\n } else {\n Opal.yield1(block, processor)\n };\n if ($truthy((name = self.$as_symbol(processor.$name())))) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"No name specified for \" + (kind_name) + \" extension at \" + (block.$source_location()))\n };\n if ($truthy(processor['$process_block_given?']())) {\n } else {\n self.$raise($$$('::', 'NoMethodError'), \"\" + \"No block specified to process \" + (kind_name) + \" extension at \" + (block.$source_location()))\n };\n processor.$freeze();\n \n $writer = [name, $$($nesting, 'ProcessorExtension').$new(kind, processor)];\n $send(kind_store, '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];;\n } else {\n \n $c = self.$resolve_args(args, 3), $b = Opal.to_ary($c), (processor = ($b[0] == null ? nil : $b[0])), (name = ($b[1] == null ? nil : $b[1])), (config = ($b[2] == null ? nil : $b[2])), $c;\n if ($truthy((processor_class = $$($nesting, 'Helpers').$resolve_class(processor)))) {\n \n if ($truthy(($truthy($b = $rb_lt(processor_class, kind_class)) ? $b : ($truthy($c = kind_java_class) ? $rb_lt(processor_class, kind_java_class) : $c)))) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"Class specified for \" + (kind_name) + \" extension does not inherit from \" + (kind_class) + \": \" + (processor))\n };\n processor_instance = processor_class.$new(self.$as_symbol(name), config);\n if ($truthy((name = self.$as_symbol(processor_instance.$name())))) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"No name specified for \" + (kind_name) + \" extension: \" + (processor))\n };\n processor_instance.$freeze();\n \n $writer = [name, $$($nesting, 'ProcessorExtension').$new(kind, processor_instance)];\n $send(kind_store, '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];;\n } else if ($truthy(($truthy($b = kind_class['$==='](processor)) ? $b : ($truthy($c = kind_java_class) ? kind_java_class['$==='](processor) : $c)))) {\n \n processor.$update_config(config);\n if ($truthy((name = (function() {if ($truthy(name)) {\n \n \n $writer = [self.$as_symbol(name)];\n $send(processor, 'name=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];;\n } else {\n \n return self.$as_symbol(processor.$name());\n }; return nil; })()))) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"No name specified for \" + (kind_name) + \" extension: \" + (processor))\n };\n processor.$freeze();\n \n $writer = [name, $$($nesting, 'ProcessorExtension').$new(kind, processor)];\n $send(kind_store, '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];;\n } else {\n return self.$raise($$$('::', 'ArgumentError'), \"\" + \"Invalid arguments specified for registering \" + (kind_name) + \" extension: \" + (args))\n };\n };\n }, $Registry_add_syntax_processor$89.$$arity = 2);\n \n Opal.def(self, '$resolve_args', $Registry_resolve_args$91 = function $$resolve_args(args, expect) {\n var self = this, opts = nil, missing = nil;\n\n \n opts = (function() {if ($truthy($$$('::', 'Hash')['$==='](args['$[]'](-1)))) {\n return args.$pop()\n } else {\n return $hash2([], {})\n }; return nil; })();\n if (expect['$=='](1)) {\n return opts};\n if ($truthy($rb_gt((missing = $rb_minus($rb_minus(expect, 1), args.$size())), 0))) {\n args = $rb_plus(args, $$$('::', 'Array').$new(missing))\n } else if ($truthy($rb_lt(missing, 0))) {\n args.$pop(missing['$-@']())};\n args['$<<'](opts);\n return args;\n }, $Registry_resolve_args$91.$$arity = 2);\n return (Opal.def(self, '$as_symbol', $Registry_as_symbol$92 = function $$as_symbol(name) {\n var self = this;\n\n if ($truthy(name)) {\n return name.$to_sym()\n } else {\n return nil\n }\n }, $Registry_as_symbol$92.$$arity = 1), nil) && 'as_symbol';\n })($nesting[0], null, $nesting);\n (function(self, $parent_nesting) {\n var $nesting = [self].concat($parent_nesting), $generate_name$93, $next_auto_id$94, $groups$95, $create$96, $register$97, $unregister_all$98, $unregister$99;\n\n \n \n Opal.def(self, '$generate_name', $generate_name$93 = function $$generate_name() {\n var self = this;\n\n return \"\" + \"extgrp\" + (self.$next_auto_id())\n }, $generate_name$93.$$arity = 0);\n \n Opal.def(self, '$next_auto_id', $next_auto_id$94 = function $$next_auto_id() {\n var $a, self = this;\n if (self.auto_id == null) self.auto_id = nil;\n\n \n self.auto_id = ($truthy($a = self.auto_id) ? $a : -1);\n return (self.auto_id = $rb_plus(self.auto_id, 1));\n }, $next_auto_id$94.$$arity = 0);\n \n Opal.def(self, '$groups', $groups$95 = function $$groups() {\n var $a, self = this;\n if (self.groups == null) self.groups = nil;\n\n return (self.groups = ($truthy($a = self.groups) ? $a : $hash2([], {})))\n }, $groups$95.$$arity = 0);\n \n Opal.def(self, '$create', $create$96 = function $$create(name) {\n var $iter = $create$96.$$p, block = $iter || nil, $a, self = this;\n\n if ($iter) $create$96.$$p = null;\n \n \n if ($iter) $create$96.$$p = null;;\n \n if (name == null) {\n name = nil;\n };\n if ((block !== nil)) {\n return $$($nesting, 'Registry').$new($hash(($truthy($a = name) ? $a : self.$generate_name()), block))\n } else {\n return $$($nesting, 'Registry').$new()\n };\n }, $create$96.$$arity = -1);\n \n Opal.def(self, '$register', $register$97 = function $$register($a) {\n var $iter = $register$97.$$p, block = $iter || nil, $post_args, args, $b, self = this, argc = nil, resolved_group = nil, group = nil, name = nil, $writer = nil;\n\n if ($iter) $register$97.$$p = null;\n \n \n if ($iter) $register$97.$$p = null;;\n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n args = $post_args;;\n argc = args.$size();\n if ((block !== nil)) {\n resolved_group = block\n } else if ($truthy((group = args.$pop()))) {\n resolved_group = ($truthy($b = $$($nesting, 'Helpers').$resolve_class(group)) ? $b : group)\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"Extension group to register not specified\")\n };\n name = ($truthy($b = args.$pop()) ? $b : self.$generate_name());\n if ($truthy(args['$empty?']())) {\n } else {\n self.$raise($$$('::', 'ArgumentError'), \"\" + \"Wrong number of arguments (\" + (argc) + \" for 1..2)\")\n };\n \n $writer = [name.$to_sym(), resolved_group];\n $send(self.$groups(), '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];;\n }, $register$97.$$arity = -1);\n \n Opal.def(self, '$unregister_all', $unregister_all$98 = function $$unregister_all() {\n var self = this;\n\n \n self.groups = $hash2([], {});\n return nil;\n }, $unregister_all$98.$$arity = 0);\n return (Opal.def(self, '$unregister', $unregister$99 = function $$unregister($a) {\n var $post_args, names, $$100, self = this;\n\n \n \n $post_args = Opal.slice.call(arguments, 0, arguments.length);\n \n names = $post_args;;\n $send(names, 'each', [], ($$100 = function(group){var self = $$100.$$s || this;\n if (self.groups == null) self.groups = nil;\n\n \n \n if (group == null) {\n group = nil;\n };\n return self.groups.$delete(group.$to_sym());}, $$100.$$s = self, $$100.$$arity = 1, $$100));\n return nil;\n }, $unregister$99.$$arity = -1), nil) && 'unregister';\n })(Opal.get_singleton_class(self), $nesting);\n })($nesting[0], $nesting)\n })($nesting[0], $nesting);\n};\n\n/* Generated by Opal 0.11.99.dev */\nOpal.modules[\"asciidoctor/js/asciidoctor_ext/stylesheet\"] = function(Opal) {\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice, $module = Opal.module, $klass = Opal.klass, $truthy = Opal.truthy;\n\n Opal.add_stubs(['$rstrip', '$read', '$join']);\n return (function($base, $parent_nesting) {\n var self = $module($base, 'Asciidoctor');\n\n var $nesting = [self].concat($parent_nesting);\n\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Stylesheets');\n\n var $nesting = [self].concat($parent_nesting), $Stylesheets_primary_stylesheet_data$1;\n\n self.$$prototype.primary_stylesheet_data = nil;\n return (Opal.def(self, '$primary_stylesheet_data', $Stylesheets_primary_stylesheet_data$1 = function $$primary_stylesheet_data() {\n var $a, self = this;\n\n return (self.primary_stylesheet_data = ($truthy($a = self.primary_stylesheet_data) ? $a : $$$('::', 'IO').$read($$$('::', 'File').$join(\"css\", \"asciidoctor.css\")).$rstrip()))\n }, $Stylesheets_primary_stylesheet_data$1.$$arity = 0), nil) && 'primary_stylesheet_data'\n })($nesting[0], null, $nesting)\n })($nesting[0], $nesting)\n};\n\n/* Generated by Opal 0.11.99.dev */\nOpal.modules[\"asciidoctor/js/asciidoctor_ext/document\"] = function(Opal) {\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice, $module = Opal.module, $klass = Opal.klass;\n\n return (function($base, $parent_nesting) {\n var self = $module($base, 'Asciidoctor');\n\n var $nesting = [self].concat($parent_nesting);\n\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Document');\n\n var $nesting = [self].concat($parent_nesting), $Document_fill_datetime_attributes$1;\n\n return (Opal.def(self, '$fill_datetime_attributes', $Document_fill_datetime_attributes$1 = function $$fill_datetime_attributes(attrs, input_mtime) {\n var self = this;\n\n \n var $truthy = Opal.truthy\n var $falsy = Opal.falsy\n var nil = Opal.nil\n var utc_offset\n var source_date_epoch\n\n var getYear = function (time, utc_offset) {\n return utc_offset === 0 ? time.getUTCFullYear() : time.getFullYear()\n }\n var getMonth = function (time, utc_offset) {\n return utc_offset === 0 ? time.getUTCMonth() : time.getMonth()\n }\n var getDay = function (time, utc_offset) {\n return utc_offset === 0 ? time.getUTCDate() : time.getDate()\n }\n var getHours = function (time, utc_offset) {\n return utc_offset === 0 ? time.getUTCHours() : time.getHours()\n }\n\n var now = new Date()\n // See https://reproducible-builds.org/specs/source-date-epoch/\n if (Opal.const_get_qualified('::', 'ENV')['$key?']('SOURCE_DATE_EPOCH')) {\n now.setTime(parseInt(Opal.const_get_qualified('::', 'ENV')['$[]']('SOURCE_DATE_EPOCH')) * 1000)\n source_date_epoch = now\n utc_offset = 0 // utc\n } else {\n utc_offset = -now.getTimezoneOffset() / 60 // local date\n }\n // localdate and localyear\n if ($truthy((localdate = attrs['$[]']('localdate')))) {\n if ($falsy(localyear = attrs['$[]']('localyear'))) {\n localyear = localdate.indexOf('-') === 4 ? localdate.substring(0, 4) : nil\n attrs['$[]=']('localyear', localyear)\n }\n } else {\n var now_year = getYear(now, utc_offset).toString()\n var now_month = ('0' + (getMonth(now, utc_offset) + 1)).slice(-2)\n var now_day = ('0' + getDay(now, utc_offset)).slice(-2)\n localdate = now_year + '-' + now_month + '-' + now_day\n attrs['$[]=']('localdate', localdate)\n localyear = now_year\n attrs['$[]=']('localyear', now_year)\n }\n // localtime\n if ($falsy((localtime = attrs['$[]']('localtime')))) {\n var hours = ('0' + (getHours(now, utc_offset))).slice(-2)\n var minutes = ('0' + (now.getMinutes())).slice(-2)\n var seconds = ('0' + (now.getSeconds())).slice(-2)\n var utc_offset_format\n if (utc_offset === 0) {\n utc_offset_format = 'UTC'\n } else if (utc_offset > 0) {\n utc_offset_format = ('+0' + (utc_offset * 100)).slice(-5)\n } else {\n utc_offset_format = ('-0' + (-utc_offset * 100)).slice(-5)\n }\n localtime = hours + ':' + minutes + ':' + seconds + ' ' + utc_offset_format\n attrs['$[]=']('localtime', localtime)\n }\n // localdatetime\n if ($falsy((localdatetime = attrs['$[]']('localdatetime')))) {\n localdatetime = localdate + ' ' + localtime\n attrs['$[]=']('localdatetime', localdatetime)\n }\n\n // docdate, doctime and docdatetime should default to localdate, localtime and localdatetime if not otherwise set\n if ($truthy(source_date_epoch)) {\n input_mtime = source_date_epoch\n } else if ($truthy(input_mtime)) {\n utc_offset = -input_mtime.getTimezoneOffset() / 60\n } else {\n input_mtime = now\n }\n\n // docdate and docyear\n if ($truthy(docdate = attrs['$[]']('docdate'))) {\n attrs['$[]=']('docyear', docdate.indexOf('-') === 4 ? docdate.substring(0, 4) : nil)\n } else {\n var mtime_year = getYear(input_mtime, utc_offset).toString()\n var mtime_month = ('0' + (getMonth(input_mtime, utc_offset) + 1)).slice(-2)\n var mtime_day = ('0' + (getDay(input_mtime, utc_offset))).slice(-2)\n docdate = mtime_year + '-' + mtime_month + '-' + mtime_day\n attrs['$[]=']('docdate', docdate)\n if ($falsy(attrs['$[]']('docyear'))) {\n attrs['$[]=']('docyear', mtime_year)\n }\n }\n // doctime\n if ($falsy(doctime = attrs['$[]']('doctime'))) {\n var mtime_hours = ('0' + (getHours(input_mtime, utc_offset))).slice(-2)\n var mtime_minutes = ('0' + (input_mtime.getMinutes())).slice(-2)\n var mtime_seconds = ('0' + (input_mtime.getSeconds())).slice(-2)\n if (utc_offset === 0) {\n utc_offset_format = 'UTC'\n } else if (utc_offset > 0) {\n utc_offset_format = ('+0' + (utc_offset * 100)).slice(-5)\n } else {\n utc_offset_format = ('-0' + (-utc_offset * 100)).slice(-5)\n }\n doctime = mtime_hours + ':' + mtime_minutes + ':' + mtime_seconds + ' ' + utc_offset_format\n attrs['$[]=']('doctime', doctime)\n }\n // docdatetime\n if ($falsy(attrs['$[]']('docdatetime'))) {\n attrs['$[]=']('docdatetime', docdate + ' ' + doctime)\n }\n return nil\n \n }, $Document_fill_datetime_attributes$1.$$arity = 2), nil) && 'fill_datetime_attributes'\n })($nesting[0], $$($nesting, 'AbstractBlock'), $nesting)\n })($nesting[0], $nesting)\n};\n\n/* Generated by Opal 0.11.99.dev */\nOpal.modules[\"asciidoctor/js/asciidoctor_ext/substitutors\"] = function(Opal) {\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice, $module = Opal.module;\n\n return (function($base, $parent_nesting) {\n var self = $module($base, 'Asciidoctor');\n\n var $nesting = [self].concat($parent_nesting);\n\n (function($base, $parent_nesting) {\n var self = $module($base, 'Substitutors');\n\n var $nesting = [self].concat($parent_nesting), $Substitutors_sub_placeholder$1;\n\n \n Opal.def(self, '$sub_placeholder', $Substitutors_sub_placeholder$1 = function $$sub_placeholder(format_string, replacement) {\n var self = this;\n\n return format_string.replace('%s', replacement);\n }, $Substitutors_sub_placeholder$1.$$arity = 2)\n })($nesting[0], $nesting)\n })($nesting[0], $nesting)\n};\n\n/* Generated by Opal 0.11.99.dev */\nOpal.modules[\"asciidoctor/js/asciidoctor_ext/parser\"] = function(Opal) {\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice, $module = Opal.module, $klass = Opal.klass, $truthy = Opal.truthy;\n\n return (function($base, $parent_nesting) {\n var self = $module($base, 'Asciidoctor');\n\n var $nesting = [self].concat($parent_nesting);\n\n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Parser');\n\n var $nesting = [self].concat($parent_nesting), $Parser_uniform$ques$1, $Parser_uniform$ques$2;\n\n if ($truthy(String.prototype.repeat)) {\n return (Opal.defs(self, '$uniform?', $Parser_uniform$ques$1 = function(str, chr, len) {\n var self = this;\n\n return chr.repeat(len) === str;\n }, $Parser_uniform$ques$1.$$arity = 3), nil) && 'uniform?'\n } else {\n return (Opal.defs(self, '$uniform?', $Parser_uniform$ques$2 = function(str, chr, len) {\n var self = this;\n\n return Array.apply(null, { length: len }).map(function () { return chr }).join('') === str;\n }, $Parser_uniform$ques$2.$$arity = 3), nil) && 'uniform?'\n }\n })($nesting[0], null, $nesting)\n })($nesting[0], $nesting)\n};\n\n/* Generated by Opal 0.11.99.dev */\nOpal.modules[\"asciidoctor/js/asciidoctor_ext/syntax_highlighter\"] = function(Opal) {\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice, $module = Opal.module, $truthy = Opal.truthy;\n\n Opal.add_stubs(['$key?', '$registry', '$[]', '$include?', '$include', '$empty?', '$debug', '$logger', '$join', '$keys']);\n return (function($base, $parent_nesting) {\n var self = $module($base, 'Asciidoctor');\n\n var $nesting = [self].concat($parent_nesting);\n\n (function($base, $parent_nesting) {\n var self = $module($base, 'SyntaxHighlighter');\n\n var $nesting = [self].concat($parent_nesting);\n\n (function($base, $parent_nesting) {\n var self = $module($base, 'Factory');\n\n var $nesting = [self].concat($parent_nesting), $Factory_for$1;\n\n \n Opal.def(self, '$for', $Factory_for$1 = function(name) {\n var self = this;\n\n if ($truthy(self.$registry()['$key?'](name))) {\n return self.$registry()['$[]'](name)\n } else {\n \n if ($truthy(self['$include?']($$($nesting, 'Logging')))) {\n } else {\n self.$include($$($nesting, 'Logging'))\n };\n if ($truthy(self.$registry()['$empty?']())) {\n self.$logger().$debug(\"no syntax highlighter available, functionality disabled.\")\n } else {\n self.$logger().$debug(\"\" + \"syntax highlighter named '\" + (name) + \"' is not available, must be one of: '\" + (self.$registry().$keys().$join(\"', '\")) + \"'.\")\n };\n return nil;\n }\n }, $Factory_for$1.$$arity = 1)\n })($nesting[0], $nesting)\n })($nesting[0], $nesting)\n })($nesting[0], $nesting)\n};\n\n/* Generated by Opal 0.11.99.dev */\nOpal.modules[\"asciidoctor/js/asciidoctor_ext\"] = function(Opal) {\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice;\n\n Opal.add_stubs(['$require']);\n \n self.$require(\"asciidoctor/js/asciidoctor_ext/stylesheet\");\n self.$require(\"asciidoctor/js/asciidoctor_ext/document\");\n self.$require(\"asciidoctor/js/asciidoctor_ext/substitutors\");\n self.$require(\"asciidoctor/js/asciidoctor_ext/parser\");\n self.$require(\"asciidoctor/js/asciidoctor_ext/syntax_highlighter\");\n \n// Load specific runtime\nself.$require(\"asciidoctor/js/asciidoctor_ext/browser\");\n;\n};\n\n/* Generated by Opal 0.11.99.dev */\nOpal.modules[\"asciidoctor/js/opal_ext/logger\"] = function(Opal) {\n function $rb_lt(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs < rhs : lhs['$<'](rhs);\n }\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice, $klass = Opal.klass, $truthy = Opal.truthy;\n\n Opal.add_stubs(['$chr', '$rjust', '$message_as_string', '$<', '$write', '$call', '$[]']);\n return (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Logger');\n\n var $nesting = [self].concat($parent_nesting), $Logger_add$2;\n\n self.$$prototype.level = self.$$prototype.progname = self.$$prototype.pipe = self.$$prototype.formatter = nil;\n \n (function($base, $super, $parent_nesting) {\n var self = $klass($base, $super, 'Formatter');\n\n var $nesting = [self].concat($parent_nesting), $Formatter_call$1;\n\n return (Opal.def(self, '$call', $Formatter_call$1 = function $$call(severity, time, progname, msg) {\n var self = this, time_format = nil;\n\n \n time_format = time.getFullYear() + '-' + ('0'+(time.getMonth()+1)).slice(-2) + '-' + ('0'+time.getDate()).slice(-2) + 'T' + ('0'+time.getHours()).slice(-2) + ':' + ('0'+time.getMinutes()).slice(-2) + ':' + ('0'+time.getSeconds()).slice(-2) + '.' + ('00' + new Date().getMilliseconds() * 1000).slice(-6);\n return \"\" + (severity.$chr()) + \", [\" + (time_format) + \"] \" + (severity.$rjust(5)) + \" -- \" + (progname) + \": \" + (self.$message_as_string(msg));\n }, $Formatter_call$1.$$arity = 4), nil) && 'call'\n })($nesting[0], null, $nesting);\n return (Opal.def(self, '$add', $Logger_add$2 = function $$add(severity, message, progname) {\n var $iter = $Logger_add$2.$$p, block = $iter || nil, $a, self = this;\n\n if ($iter) $Logger_add$2.$$p = null;\n \n \n if ($iter) $Logger_add$2.$$p = null;;\n \n if (message == null) {\n message = nil;\n };\n \n if (progname == null) {\n progname = nil;\n };\n if ($truthy($rb_lt((severity = ($truthy($a = severity) ? $a : $$($nesting, 'UNKNOWN'))), self.level))) {\n return true};\n progname = ($truthy($a = progname) ? $a : self.progname);\n if ($truthy(message)) {\n } else if ((block !== nil)) {\n message = Opal.yieldX(block, [])\n } else {\n \n message = progname;\n progname = self.progname;\n };\n self.pipe.$write(self.formatter.$call(($truthy($a = $$($nesting, 'SEVERITY_LABELS')['$[]'](severity)) ? $a : \"ANY\"), new Date(), progname, message));\n return true;\n }, $Logger_add$2.$$arity = -2), nil) && 'add';\n })($nesting[0], null, $nesting)\n};\n\n/* Generated by Opal 0.11.99.dev */\nOpal.modules[\"asciidoctor/js/postscript\"] = function(Opal) {\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice;\n\n Opal.add_stubs(['$require']);\n \n self.$require(\"asciidoctor/converter/composite\");\n self.$require(\"asciidoctor/converter/html5\");\n self.$require(\"asciidoctor/extensions\");\n self.$require(\"asciidoctor/js/asciidoctor_ext\");\n return self.$require(\"asciidoctor/js/opal_ext/logger\");\n};\n\n/* Generated by Opal 0.11.99.dev */\n(function(Opal) {\n function $rb_minus(lhs, rhs) {\n return (typeof(lhs) === 'number' && typeof(rhs) === 'number') ? lhs - rhs : lhs['$-'](rhs);\n }\n var self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.const_get_qualified, $$ = Opal.const_get_relative, $breaker = Opal.breaker, $slice = Opal.slice, $module = Opal.module, $send = Opal.send, $truthy = Opal.truthy, $hash2 = Opal.hash2;\n\n Opal.add_stubs(['$require', '$==', '$to_h', '$sort', '$map', '$constants', '$const_get', '$downcase', '$to_s', '$<=>', '$upcase', '$[]', '$values', '$new', '$attr_reader', '$instance_variable_set', '$send', '$singleton_class', '$<<', '$define', '$dirname', '$absolute_path', '$__dir__', '$join', '$home', '$pwd', '$to_set', '$tap', '$each', '$chr', '$each_key', '$slice', '$[]=', '$-', '$length', '$merge', '$default=', '$drop', '$insert']);\n \n self.$require(\"set\");\n if ($$($nesting, 'RUBY_ENGINE')['$=='](\"opal\")) {\n self.$require(\"asciidoctor/js\")\n } else {\n nil\n };\n (function($base, $parent_nesting) {\n var self = $module($base, 'Asciidoctor');\n\n var $nesting = [self].concat($parent_nesting), $a, $b, $Asciidoctor$7, $Asciidoctor$9, $Asciidoctor$11, $Asciidoctor$13, $writer = nil;\n\n \n Opal.const_set($nesting[0], 'RUBY_ENGINE_OPAL', Opal.const_set($nesting[0], 'RUBY_ENGINE', $$$('::', 'RUBY_ENGINE'))['$=='](\"opal\"));\n (function($base, $parent_nesting) {\n var self = $module($base, 'SafeMode');\n\n var $nesting = [self].concat($parent_nesting), $SafeMode$1, $SafeMode$2, $SafeMode_value_for_name$3, $SafeMode_name_for_value$4, $SafeMode_names$5;\n\n \n Opal.const_set($nesting[0], 'UNSAFE', 0);\n Opal.const_set($nesting[0], 'SAFE', 1);\n Opal.const_set($nesting[0], 'SERVER', 10);\n Opal.const_set($nesting[0], 'SECURE', 20);\n self.names_by_value = $send($send(self.$constants(false), 'map', [], ($SafeMode$1 = function(sym){var self = $SafeMode$1.$$s || this;\n\n \n \n if (sym == null) {\n sym = nil;\n };\n return [self.$const_get(sym), sym.$to_s().$downcase()];}, $SafeMode$1.$$s = self, $SafeMode$1.$$arity = 1, $SafeMode$1)), 'sort', [], ($SafeMode$2 = function($mlhs_tmp1, $mlhs_tmp2){var self = $SafeMode$2.$$s || this, $a, $b, a = nil, b = nil;\n\n \n \n if ($mlhs_tmp1 == null) {\n $mlhs_tmp1 = nil;\n };\n \n if ($mlhs_tmp2 == null) {\n $mlhs_tmp2 = nil;\n };\n $b = $mlhs_tmp1, $a = Opal.to_ary($b), (a = ($a[0] == null ? nil : $a[0])), $b;\n $b = $mlhs_tmp2, $a = Opal.to_ary($b), (b = ($a[0] == null ? nil : $a[0])), $b;\n return a['$<=>'](b);}, $SafeMode$2.$$s = self, $SafeMode$2.$$arity = 2, $SafeMode$2.$$has_top_level_mlhs_arg = true, $SafeMode$2)).$to_h();\n Opal.defs(self, '$value_for_name', $SafeMode_value_for_name$3 = function $$value_for_name(name) {\n var self = this;\n\n return self.$const_get(name.$upcase(), false)\n }, $SafeMode_value_for_name$3.$$arity = 1);\n Opal.defs(self, '$name_for_value', $SafeMode_name_for_value$4 = function $$name_for_value(value) {\n var self = this;\n if (self.names_by_value == null) self.names_by_value = nil;\n\n return self.names_by_value['$[]'](value)\n }, $SafeMode_name_for_value$4.$$arity = 1);\n Opal.defs(self, '$names', $SafeMode_names$5 = function $$names() {\n var self = this;\n if (self.names_by_value == null) self.names_by_value = nil;\n\n return self.names_by_value.$values()\n }, $SafeMode_names$5.$$arity = 0);\n })($nesting[0], $nesting);\n (function($base, $parent_nesting) {\n var self = $module($base, 'Compliance');\n\n var $nesting = [self].concat($parent_nesting);\n\n \n self.keys = $$$('::', 'Set').$new();\n (function(self, $parent_nesting) {\n var $nesting = [self].concat($parent_nesting), $define$6;\n\n \n self.$attr_reader(\"keys\");\n return (Opal.def(self, '$define', $define$6 = function $$define(key, value) {\n var self = this;\n if (self.keys == null) self.keys = nil;\n\n \n self.$instance_variable_set(\"\" + \"@\" + (key), value);\n self.$singleton_class().$send(\"attr_accessor\", key);\n self.keys['$<<'](key);\n return nil;\n }, $define$6.$$arity = 2), nil) && 'define';\n })(Opal.get_singleton_class(self), $nesting);\n self.$define(\"block_terminates_paragraph\", true);\n self.$define(\"strict_verbatim_paragraphs\", true);\n self.$define(\"underline_style_section_titles\", true);\n self.$define(\"unwrap_standalone_preamble\", true);\n self.$define(\"attribute_missing\", \"skip\");\n self.$define(\"attribute_undefined\", \"drop-line\");\n self.$define(\"shorthand_property_syntax\", true);\n self.$define(\"natural_xrefs\", true);\n self.$define(\"unique_id_start_index\", 2);\n self.$define(\"markdown_syntax\", true);\n })($nesting[0], $nesting);\n if ($truthy((($a = $$($nesting, 'ROOT_DIR', 'skip_raise')) ? 'constant' : nil))) {\n } else {\n Opal.const_set($nesting[0], 'ROOT_DIR', $$$('::', 'File').$dirname($$$('::', 'File').$absolute_path(self.$__dir__())))\n };\n Opal.const_set($nesting[0], 'LIB_DIR', $$$('::', 'File').$join($$($nesting, 'ROOT_DIR'), \"lib\"));\n Opal.const_set($nesting[0], 'DATA_DIR', $$$('::', 'File').$join($$($nesting, 'ROOT_DIR'), \"data\"));\n Opal.const_set($nesting[0], 'USER_HOME', (function() { try {\n return $$$('::', 'Dir').$home()\n } catch ($err) {\n if (Opal.rescue($err, [$$($nesting, 'StandardError')])) {\n try {\n \n return ($truthy($b = $$$('::', 'ENV')['$[]'](\"HOME\")) ? $b : $$$('::', 'Dir').$pwd());\n } finally { Opal.pop_exception() }\n } else { throw $err; }\n }})());\n Opal.const_set($nesting[0], 'LF', \"\\n\");\n Opal.const_set($nesting[0], 'NULL', \"\\u0000\");\n Opal.const_set($nesting[0], 'TAB', \"\\t\");\n Opal.const_set($nesting[0], 'MAX_INT', 9007199254740991);\n Opal.const_set($nesting[0], 'UTF_8', $$$($$$('::', 'Encoding'), 'UTF_8'));\n Opal.const_set($nesting[0], 'BOM_BYTES_UTF_8', [239, 187, 191]);\n Opal.const_set($nesting[0], 'BOM_BYTES_UTF_16LE', [255, 254]);\n Opal.const_set($nesting[0], 'BOM_BYTES_UTF_16BE', [254, 255]);\n Opal.const_set($nesting[0], 'FILE_READ_MODE', (function() {if ($truthy($$($nesting, 'RUBY_ENGINE_OPAL'))) {\n return \"r\"\n } else {\n return \"rb:utf-8:utf-8\"\n }; return nil; })());\n Opal.const_set($nesting[0], 'URI_READ_MODE', $$($nesting, 'FILE_READ_MODE'));\n Opal.const_set($nesting[0], 'FILE_WRITE_MODE', (function() {if ($truthy($$($nesting, 'RUBY_ENGINE_OPAL'))) {\n return \"w\"\n } else {\n return \"w:utf-8\"\n }; return nil; })());\n Opal.const_set($nesting[0], 'DEFAULT_DOCTYPE', \"article\");\n Opal.const_set($nesting[0], 'DEFAULT_BACKEND', \"html5\");\n Opal.const_set($nesting[0], 'DEFAULT_STYLESHEET_KEYS', [\"\", \"DEFAULT\"].$to_set());\n Opal.const_set($nesting[0], 'DEFAULT_STYLESHEET_NAME', \"asciidoctor.css\");\n Opal.const_set($nesting[0], 'BACKEND_ALIASES', $hash2([\"html\", \"docbook\"], {\"html\": \"html5\", \"docbook\": \"docbook5\"}));\n Opal.const_set($nesting[0], 'DEFAULT_PAGE_WIDTHS', $hash2([\"docbook\"], {\"docbook\": 425}));\n Opal.const_set($nesting[0], 'DEFAULT_EXTENSIONS', $hash2([\"html\", \"docbook\", \"pdf\", \"epub\", \"manpage\", \"asciidoc\"], {\"html\": \".html\", \"docbook\": \".xml\", \"pdf\": \".pdf\", \"epub\": \".epub\", \"manpage\": \".man\", \"asciidoc\": \".adoc\"}));\n Opal.const_set($nesting[0], 'ASCIIDOC_EXTENSIONS', $hash2([\".adoc\", \".asciidoc\", \".asc\", \".ad\", \".txt\"], {\".adoc\": true, \".asciidoc\": true, \".asc\": true, \".ad\": true, \".txt\": true}));\n Opal.const_set($nesting[0], 'SETEXT_SECTION_LEVELS', $hash2([\"=\", \"-\", \"~\", \"^\", \"+\"], {\"=\": 0, \"-\": 1, \"~\": 2, \"^\": 3, \"+\": 4}));\n Opal.const_set($nesting[0], 'ADMONITION_STYLES', [\"NOTE\", \"TIP\", \"IMPORTANT\", \"WARNING\", \"CAUTION\"].$to_set());\n Opal.const_set($nesting[0], 'ADMONITION_STYLE_HEADS', $send($$$('::', 'Set').$new(), 'tap', [], ($Asciidoctor$7 = function(accum){var self = $Asciidoctor$7.$$s || this, $$8;\n\n \n \n if (accum == null) {\n accum = nil;\n };\n return $send($$($nesting, 'ADMONITION_STYLES'), 'each', [], ($$8 = function(s){var self = $$8.$$s || this;\n\n \n \n if (s == null) {\n s = nil;\n };\n return accum['$<<'](s.$chr());}, $$8.$$s = self, $$8.$$arity = 1, $$8));}, $Asciidoctor$7.$$s = self, $Asciidoctor$7.$$arity = 1, $Asciidoctor$7)));\n Opal.const_set($nesting[0], 'PARAGRAPH_STYLES', [\"comment\", \"example\", \"literal\", \"listing\", \"normal\", \"open\", \"pass\", \"quote\", \"sidebar\", \"source\", \"verse\", \"abstract\", \"partintro\"].$to_set());\n Opal.const_set($nesting[0], 'VERBATIM_STYLES', [\"literal\", \"listing\", \"source\", \"verse\"].$to_set());\n Opal.const_set($nesting[0], 'DELIMITED_BLOCKS', $hash2([\"--\", \"----\", \"....\", \"====\", \"****\", \"____\", \"++++\", \"|===\", \",===\", \":===\", \"!===\", \"////\", \"```\"], {\"--\": [\"open\", [\"comment\", \"example\", \"literal\", \"listing\", \"pass\", \"quote\", \"sidebar\", \"source\", \"verse\", \"admonition\", \"abstract\", \"partintro\"].$to_set()], \"----\": [\"listing\", [\"literal\", \"source\"].$to_set()], \"....\": [\"literal\", [\"listing\", \"source\"].$to_set()], \"====\": [\"example\", [\"admonition\"].$to_set()], \"****\": [\"sidebar\", $$$('::', 'Set').$new()], \"____\": [\"quote\", [\"verse\"].$to_set()], \"++++\": [\"pass\", [\"stem\", \"latexmath\", \"asciimath\"].$to_set()], \"|===\": [\"table\", $$$('::', 'Set').$new()], \",===\": [\"table\", $$$('::', 'Set').$new()], \":===\": [\"table\", $$$('::', 'Set').$new()], \"!===\": [\"table\", $$$('::', 'Set').$new()], \"////\": [\"comment\", $$$('::', 'Set').$new()], \"```\": [\"fenced_code\", $$$('::', 'Set').$new()]}));\n Opal.const_set($nesting[0], 'DELIMITED_BLOCK_HEADS', $send($hash2([], {}), 'tap', [], ($Asciidoctor$9 = function(accum){var self = $Asciidoctor$9.$$s || this, $$10;\n\n \n \n if (accum == null) {\n accum = nil;\n };\n return $send($$($nesting, 'DELIMITED_BLOCKS'), 'each_key', [], ($$10 = function(k){var self = $$10.$$s || this, $writer = nil;\n\n \n \n if (k == null) {\n k = nil;\n };\n $writer = [k.$slice(0, 2), true];\n $send(accum, '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];}, $$10.$$s = self, $$10.$$arity = 1, $$10));}, $Asciidoctor$9.$$s = self, $Asciidoctor$9.$$arity = 1, $Asciidoctor$9)));\n Opal.const_set($nesting[0], 'DELIMITED_BLOCK_TAILS', $send($hash2([], {}), 'tap', [], ($Asciidoctor$11 = function(accum){var self = $Asciidoctor$11.$$s || this, $$12;\n\n \n \n if (accum == null) {\n accum = nil;\n };\n return $send($$($nesting, 'DELIMITED_BLOCKS'), 'each_key', [], ($$12 = function(k){var self = $$12.$$s || this, $writer = nil;\n\n \n \n if (k == null) {\n k = nil;\n };\n if (k.$length()['$=='](4)) {\n \n $writer = [k, k['$[]']($rb_minus(k.$length(), 1))];\n $send(accum, '[]=', Opal.to_a($writer));\n return $writer[$rb_minus($writer[\"length\"], 1)];\n } else {\n return nil\n };}, $$12.$$s = self, $$12.$$arity = 1, $$12));}, $Asciidoctor$11.$$s = self, $Asciidoctor$11.$$arity = 1, $Asciidoctor$11)));\n Opal.const_set($nesting[0], 'CAPTION_ATTRIBUTE_NAMES', $hash2([\"example\", \"figure\", \"listing\", \"table\"], {\"example\": \"example-caption\", \"figure\": \"figure-caption\", \"listing\": \"listing-caption\", \"table\": \"table-caption\"}));\n Opal.const_set($nesting[0], 'LAYOUT_BREAK_CHARS', $hash2([\"'\", \"<\"], {\"'\": \"thematic_break\", \"<\": \"page_break\"}));\n Opal.const_set($nesting[0], 'MARKDOWN_THEMATIC_BREAK_CHARS', $hash2([\"-\", \"*\", \"_\"], {\"-\": \"thematic_break\", \"*\": \"thematic_break\", \"_\": \"thematic_break\"}));\n Opal.const_set($nesting[0], 'HYBRID_LAYOUT_BREAK_CHARS', $$($nesting, 'LAYOUT_BREAK_CHARS').$merge($$($nesting, 'MARKDOWN_THEMATIC_BREAK_CHARS')));\n Opal.const_set($nesting[0], 'NESTABLE_LIST_CONTEXTS', [\"ulist\", \"olist\", \"dlist\"]);\n Opal.const_set($nesting[0], 'ORDERED_LIST_STYLES', [\"arabic\", \"loweralpha\", \"lowerroman\", \"upperalpha\", \"upperroman\"]);\n Opal.const_set($nesting[0], 'ORDERED_LIST_KEYWORDS', $hash2([\"loweralpha\", \"lowerroman\", \"upperalpha\", \"upperroman\"], {\"loweralpha\": \"a\", \"lowerroman\": \"i\", \"upperalpha\": \"A\", \"upperroman\": \"I\"}));\n Opal.const_set($nesting[0], 'ATTR_REF_HEAD', \"{\");\n Opal.const_set($nesting[0], 'LIST_CONTINUATION', \"+\");\n Opal.const_set($nesting[0], 'HARD_LINE_BREAK', \" +\");\n Opal.const_set($nesting[0], 'LINE_CONTINUATION', \" \\\\\");\n Opal.const_set($nesting[0], 'LINE_CONTINUATION_LEGACY', \" +\");\n Opal.const_set($nesting[0], 'BLOCK_MATH_DELIMITERS', $hash2([\"asciimath\", \"latexmath\"], {\"asciimath\": [\"\\\\$\", \"\\\\$\"], \"latexmath\": [\"\\\\[\", \"\\\\]\"]}));\n Opal.const_set($nesting[0], 'INLINE_MATH_DELIMITERS', $hash2([\"asciimath\", \"latexmath\"], {\"asciimath\": [\"\\\\$\", \"\\\\$\"], \"latexmath\": [\"\\\\(\", \"\\\\)\"]}));\n \n $writer = [\"asciimath\"];\n $send(Opal.const_set($nesting[0], 'STEM_TYPE_ALIASES', $hash2([\"latexmath\", \"latex\", \"tex\"], {\"latexmath\": \"latexmath\", \"latex\": \"latexmath\", \"tex\": \"latexmath\"})), 'default=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;\n Opal.const_set($nesting[0], 'FONT_AWESOME_VERSION', \"4.7.0\");\n Opal.const_set($nesting[0], 'HIGHLIGHT_JS_VERSION', \"9.18.3\");\n Opal.const_set($nesting[0], 'MATHJAX_VERSION', \"2.7.9\");\n Opal.const_set($nesting[0], 'DEFAULT_ATTRIBUTES', $hash2([\"appendix-caption\", \"appendix-refsig\", \"caution-caption\", \"chapter-refsig\", \"example-caption\", \"figure-caption\", \"important-caption\", \"last-update-label\", \"note-caption\", \"part-refsig\", \"prewrap\", \"sectids\", \"section-refsig\", \"table-caption\", \"tip-caption\", \"toc-placement\", \"toc-title\", \"untitled-label\", \"version-label\", \"warning-caption\"], {\"appendix-caption\": \"Appendix\", \"appendix-refsig\": \"Appendix\", \"caution-caption\": \"Caution\", \"chapter-refsig\": \"Chapter\", \"example-caption\": \"Example\", \"figure-caption\": \"Figure\", \"important-caption\": \"Important\", \"last-update-label\": \"Last updated\", \"note-caption\": \"Note\", \"part-refsig\": \"Part\", \"prewrap\": \"\", \"sectids\": \"\", \"section-refsig\": \"Section\", \"table-caption\": \"Table\", \"tip-caption\": \"Tip\", \"toc-placement\": \"auto\", \"toc-title\": \"Table of Contents\", \"untitled-label\": \"Untitled\", \"version-label\": \"Version\", \"warning-caption\": \"Warning\"}));\n Opal.const_set($nesting[0], 'FLEXIBLE_ATTRIBUTES', [\"sectnums\"]);\n Opal.const_set($nesting[0], 'INTRINSIC_ATTRIBUTES', $hash2([\"startsb\", \"endsb\", \"vbar\", \"caret\", \"asterisk\", \"tilde\", \"plus\", \"backslash\", \"backtick\", \"blank\", \"empty\", \"sp\", \"two-colons\", \"two-semicolons\", \"nbsp\", \"deg\", \"zwsp\", \"quot\", \"apos\", \"lsquo\", \"rsquo\", \"ldquo\", \"rdquo\", \"wj\", \"brvbar\", \"pp\", \"cpp\", \"amp\", \"lt\", \"gt\"], {\"startsb\": \"[\", \"endsb\": \"]\", \"vbar\": \"|\", \"caret\": \"^\", \"asterisk\": \"*\", \"tilde\": \"~\", \"plus\": \"+\", \"backslash\": \"\\\\\", \"backtick\": \"`\", \"blank\": \"\", \"empty\": \"\", \"sp\": \" \", \"two-colons\": \"::\", \"two-semicolons\": \";;\", \"nbsp\": \" \", \"deg\": \"°\", \"zwsp\": \"​\", \"quot\": \""\", \"apos\": \"'\", \"lsquo\": \"‘\", \"rsquo\": \"’\", \"ldquo\": \"“\", \"rdquo\": \"”\", \"wj\": \"⁠\", \"brvbar\": \"¦\", \"pp\": \"++\", \"cpp\": \"C++\", \"amp\": \"&\", \"lt\": \"<\", \"gt\": \">\"}));\n if ($$($nesting, 'RUBY_ENGINE')['$=='](\"opal\")) {\n } else {\n nil\n };\n Opal.const_set($nesting[0], 'QUOTE_SUBS', $send($hash2([], {}), 'tap', [], ($Asciidoctor$13 = function(accum){var self = $Asciidoctor$13.$$s || this, normal = nil, compat = nil;\n\n \n \n if (accum == null) {\n accum = nil;\n };\n \n $writer = [false, (normal = [[\"strong\", \"unconstrained\", new RegExp(\"\" + \"\\\\\\\\?(?:\\\\[([^\\\\]]+)\\\\])?\\\\*\\\\*(\" + ($$($nesting, 'CC_ALL')) + \"+?)\\\\*\\\\*\", 'm')], [\"strong\", \"constrained\", new RegExp(\"\" + \"(^|[^\" + ($$($nesting, 'CC_WORD')) + \";:}])(?:\\\\[([^\\\\]]+)\\\\])?\\\\*(\\\\S|\\\\S\" + ($$($nesting, 'CC_ALL')) + \"*?\\\\S)\\\\*(?!\" + ($$($nesting, 'CG_WORD')) + \")\", 'm')], [\"double\", \"constrained\", new RegExp(\"\" + \"(^|[^\" + ($$($nesting, 'CC_WORD')) + \";:}])(?:\\\\[([^\\\\]]+)\\\\])?\\\"`(\\\\S|\\\\S\" + ($$($nesting, 'CC_ALL')) + \"*?\\\\S)`\\\"(?!\" + ($$($nesting, 'CG_WORD')) + \")\", 'm')], [\"single\", \"constrained\", new RegExp(\"\" + \"(^|[^\" + ($$($nesting, 'CC_WORD')) + \";:`}])(?:\\\\[([^\\\\]]+)\\\\])?'`(\\\\S|\\\\S\" + ($$($nesting, 'CC_ALL')) + \"*?\\\\S)`'(?!\" + ($$($nesting, 'CG_WORD')) + \")\", 'm')], [\"monospaced\", \"unconstrained\", new RegExp(\"\" + \"\\\\\\\\?(?:\\\\[([^\\\\]]+)\\\\])?``(\" + ($$($nesting, 'CC_ALL')) + \"+?)``\", 'm')], [\"monospaced\", \"constrained\", new RegExp(\"\" + \"(^|[^\" + ($$($nesting, 'CC_WORD')) + \";:\\\"'`}])(?:\\\\[([^\\\\]]+)\\\\])?`(\\\\S|\\\\S\" + ($$($nesting, 'CC_ALL')) + \"*?\\\\S)`(?![\" + ($$($nesting, 'CC_WORD')) + \"\\\"'`])\", 'm')], [\"emphasis\", \"unconstrained\", new RegExp(\"\" + \"\\\\\\\\?(?:\\\\[([^\\\\]]+)\\\\])?__(\" + ($$($nesting, 'CC_ALL')) + \"+?)__\", 'm')], [\"emphasis\", \"constrained\", new RegExp(\"\" + \"(^|[^\" + ($$($nesting, 'CC_WORD')) + \";:}])(?:\\\\[([^\\\\]]+)\\\\])?_(\\\\S|\\\\S\" + ($$($nesting, 'CC_ALL')) + \"*?\\\\S)_(?!\" + ($$($nesting, 'CG_WORD')) + \")\", 'm')], [\"mark\", \"unconstrained\", new RegExp(\"\" + \"\\\\\\\\?(?:\\\\[([^\\\\]]+)\\\\])?##(\" + ($$($nesting, 'CC_ALL')) + \"+?)##\", 'm')], [\"mark\", \"constrained\", new RegExp(\"\" + \"(^|[^\" + ($$($nesting, 'CC_WORD')) + \"&;:}])(?:\\\\[([^\\\\]]+)\\\\])?#(\\\\S|\\\\S\" + ($$($nesting, 'CC_ALL')) + \"*?\\\\S)#(?!\" + ($$($nesting, 'CG_WORD')) + \")\", 'm')], [\"superscript\", \"unconstrained\", /\\\\?(?:\\[([^\\]]+)\\])?\\^(\\S+?)\\^/], [\"subscript\", \"unconstrained\", /\\\\?(?:\\[([^\\]]+)\\])?~(\\S+?)~/]])];\n $send(accum, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;\n \n $writer = [true, (compat = normal.$drop(0))];\n $send(accum, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;\n \n $writer = [2, [\"double\", \"constrained\", new RegExp(\"\" + \"(^|[^\" + ($$($nesting, 'CC_WORD')) + \";:}])(?:\\\\[([^\\\\]]+)\\\\])?``(\\\\S|\\\\S\" + ($$($nesting, 'CC_ALL')) + \"*?\\\\S)''(?!\" + ($$($nesting, 'CG_WORD')) + \")\", 'm')]];\n $send(compat, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;\n \n $writer = [3, [\"single\", \"constrained\", new RegExp(\"\" + \"(^|[^\" + ($$($nesting, 'CC_WORD')) + \";:}])(?:\\\\[([^\\\\]]+)\\\\])?`(\\\\S|\\\\S\" + ($$($nesting, 'CC_ALL')) + \"*?\\\\S)'(?!\" + ($$($nesting, 'CG_WORD')) + \")\", 'm')]];\n $send(compat, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;\n \n $writer = [4, [\"monospaced\", \"unconstrained\", new RegExp(\"\" + \"\\\\\\\\?(?:\\\\[([^\\\\]]+)\\\\])?\\\\+\\\\+(\" + ($$($nesting, 'CC_ALL')) + \"+?)\\\\+\\\\+\", 'm')]];\n $send(compat, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;\n \n $writer = [5, [\"monospaced\", \"constrained\", new RegExp(\"\" + \"(^|[^\" + ($$($nesting, 'CC_WORD')) + \";:}])(?:\\\\[([^\\\\]]+)\\\\])?\\\\+(\\\\S|\\\\S\" + ($$($nesting, 'CC_ALL')) + \"*?\\\\S)\\\\+(?!\" + ($$($nesting, 'CG_WORD')) + \")\", 'm')]];\n $send(compat, '[]=', Opal.to_a($writer));\n $writer[$rb_minus($writer[\"length\"], 1)];;\n return compat.$insert(3, [\"emphasis\", \"constrained\", new RegExp(\"\" + \"(^|[^\" + ($$($nesting, 'CC_WORD')) + \";:}])(?:\\\\[([^\\\\]]+)\\\\])?'(\\\\S|\\\\S\" + ($$($nesting, 'CC_ALL')) + \"*?\\\\S)'(?!\" + ($$($nesting, 'CG_WORD')) + \")\", 'm')]);}, $Asciidoctor$13.$$s = self, $Asciidoctor$13.$$arity = 1, $Asciidoctor$13)));\n Opal.const_set($nesting[0], 'REPLACEMENTS', [[/\\\\?\\(C\\)/, \"©\", \"none\"], [/\\\\?\\(R\\)/, \"®\", \"none\"], [/\\\\?\\(TM\\)/, \"™\", \"none\"], [/(?: |\\n|^|\\\\)--(?: |\\n|$)/, \" — \", \"none\"], [new RegExp(\"\" + \"(\" + ($$($nesting, 'CG_WORD')) + \")\\\\\\\\?--(?=\" + ($$($nesting, 'CG_WORD')) + \")\"), \"—​\", \"leading\"], [/\\\\?\\.\\.\\./, \"…​\", \"none\"], [/\\\\?`'/, \"’\", \"none\"], [new RegExp(\"\" + \"(\" + ($$($nesting, 'CG_ALNUM')) + \")\\\\\\\\?'(?=\" + ($$($nesting, 'CG_ALPHA')) + \")\"), \"’\", \"leading\"], [/\\\\?->/, \"→\", \"none\"], [/\\\\?=>/, \"⇒\", \"none\"], [/\\\\?<-/, \"←\", \"none\"], [/\\\\?<=/, \"⇐\", \"none\"], [/\\\\?(&)amp;((?:[a-zA-Z][a-zA-Z]+\\d{0,2}|#\\d\\d\\d{0,4}|#x[\\da-fA-F][\\da-fA-F][\\da-fA-F]{0,3});)/, \"\", \"bounding\"]]);\n if ($$($nesting, 'RUBY_ENGINE')['$=='](\"opal\")) {\n } else {\n nil\n };\n if ($$($nesting, 'RUBY_ENGINE')['$=='](\"opal\")) {\n } else {\n nil\n };\n })($nesting[0], $nesting);\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/core_ext\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/helpers\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/logging\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/rx\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/substitutors\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/version\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/abstract_node\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/abstract_block\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/attribute_list\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/block\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/callouts\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/converter\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/document\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/inline\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/list\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/parser\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/path_resolver\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/reader\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/section\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/stylesheets\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/table\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/writer\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/load\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/convert\");\n if ($$($nesting, 'RUBY_ENGINE')['$=='](\"opal\")) {\n \n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/syntax_highlighter\");\n self.$require(\"asciidoctor.rb\"+ '/../' + \"asciidoctor/timings\");\n return self.$require(\"asciidoctor/js/postscript\");\n } else {\n return nil\n };\n})(Opal);\n\n\n/* global Opal */\n\n/**\n * Convert a JSON to an (Opal) Hash.\n * @private\n */\nvar toHash = function (object) {\n return object && !object.$$is_hash ? Opal.hash2(Object.keys(object), object) : object\n}\n\n/**\n * Convert an (Opal) Hash to JSON.\n * @private\n */\nvar fromHash = function (hash) {\n var object = {}\n if (hash) {\n var stringMap = hash.$$smap\n for (var stringMapKey in stringMap) {\n var stringMapValue = stringMap[stringMapKey]\n object[stringMapKey] = stringMapValue === Opal.nil ? undefined : stringMapValue\n }\n var numericMap = hash.$$map\n if (numericMap) {\n var positional = []\n for (var numericMapKey in numericMap) {\n var entry = numericMap[numericMapKey]\n var numericMapValue = entry.value\n var index = entry.key - 1\n positional[index] = numericMapValue === Opal.nil ? undefined : numericMapValue\n }\n if (positional.length > 0) {\n object.$positional = positional\n }\n }\n }\n return object\n}\n\nvar fromHashKeys = function (hash) {\n var object = {}\n if (hash) {\n var data = hash.$$keys\n for (var key in data) {\n var value = data[key].value\n object[key.toString()] = value === Opal.nil ? undefined : value\n }\n }\n return object\n}\n\n/**\n * @private\n */\nvar prepareOptions = function (options) {\n options = toHash(options)\n if (options) {\n var attrs = options['$[]']('attributes')\n if (attrs && typeof attrs === 'object' && attrs.constructor.name === 'Object') {\n options = options.$dup()\n options['$[]=']('attributes', toHash(attrs))\n }\n }\n return options\n}\n\nfunction initializeClass (superClass, className, functions, defaultFunctions, argProxyFunctions) {\n var scope = Opal.klass(Opal.Object, superClass, className, function () { })\n var postConstructFunction\n var initializeFunction\n var constructorFunction\n var defaultFunctionsOverridden = {}\n for (var functionName in functions) {\n if (Object.prototype.hasOwnProperty.call(functions, functionName)) {\n (function (functionName) {\n var userFunction = functions[functionName]\n if (functionName === 'postConstruct') {\n postConstructFunction = userFunction\n } else if (functionName === 'initialize') {\n initializeFunction = userFunction\n } else if (functionName === 'constructor') {\n constructorFunction = userFunction\n } else {\n if (defaultFunctions && Object.prototype.hasOwnProperty.call(defaultFunctions, functionName)) {\n defaultFunctionsOverridden[functionName] = true\n }\n Opal.def(scope, '$' + functionName, function () {\n var args\n if (argProxyFunctions && Object.prototype.hasOwnProperty.call(argProxyFunctions, functionName)) {\n args = argProxyFunctions[functionName](arguments)\n } else {\n args = arguments\n }\n return userFunction.apply(this, args)\n })\n }\n }(functionName))\n }\n }\n var initialize\n if (typeof constructorFunction === 'function') {\n initialize = function () {\n var args = Array.from(arguments)\n for (var i = 0; i < args.length; i++) {\n // convert all (Opal) Hash arguments to JSON.\n if (typeof args[i] === 'object' && '$$smap' in args[i]) {\n args[i] = fromHash(args[i])\n }\n }\n args.unshift(null)\n var result = new (Function.prototype.bind.apply(constructorFunction, args)) // eslint-disable-line\n Object.assign(this, result)\n if (typeof postConstructFunction === 'function') {\n postConstructFunction.bind(this)()\n }\n }\n } else if (typeof initializeFunction === 'function') {\n initialize = function () {\n var args = Array.from(arguments)\n for (var i = 0; i < args.length; i++) {\n // convert all (Opal) Hash arguments to JSON.\n if (typeof args[i] === 'object' && '$$smap' in args[i]) {\n args[i] = fromHash(args[i])\n }\n }\n initializeFunction.apply(this, args)\n if (typeof postConstructFunction === 'function') {\n postConstructFunction.bind(this)()\n }\n }\n } else {\n initialize = function () {\n Opal.send(this, Opal.find_super_dispatcher(this, 'initialize', initialize))\n if (typeof postConstructFunction === 'function') {\n postConstructFunction.bind(this)()\n }\n }\n }\n Opal.def(scope, '$initialize', initialize)\n Opal.def(scope, 'super', function (func) {\n if (typeof func === 'function') {\n Opal.send(this, Opal.find_super_dispatcher(this, func.name, func))\n } else {\n // Bind the initialize function to super();\n var argumentsList = Array.from(arguments)\n for (var i = 0; i < argumentsList.length; i++) {\n // convert all (Opal) Hash arguments to JSON.\n if (typeof argumentsList[i] === 'object') {\n argumentsList[i] = toHash(argumentsList[i])\n }\n }\n Opal.send(this, Opal.find_super_dispatcher(this, 'initialize', initialize), argumentsList)\n }\n })\n if (defaultFunctions) {\n for (var defaultFunctionName in defaultFunctions) {\n if (Object.prototype.hasOwnProperty.call(defaultFunctions, defaultFunctionName) && !Object.prototype.hasOwnProperty.call(defaultFunctionsOverridden, defaultFunctionName)) {\n (function (defaultFunctionName) {\n var defaultFunction = defaultFunctions[defaultFunctionName]\n Opal.def(scope, '$' + defaultFunctionName, function () {\n return defaultFunction.apply(this, arguments)\n })\n }(defaultFunctionName))\n }\n }\n }\n return scope\n}\n\n// Asciidoctor API\n\n/**\n * @namespace\n * @description\n * The main application interface (API) for Asciidoctor.\n * This API provides methods to parse AsciiDoc content and convert it to various output formats using built-in or third-party converters.\n *\n * An AsciiDoc document can be as simple as a single line of content,\n * though it more commonly starts with a document header that declares the document title and document attribute definitions.\n * The document header is then followed by zero or more section titles, optionally nested, to organize the paragraphs, blocks, lists, etc. of the document.\n *\n * By default, the processor converts the AsciiDoc document to HTML 5 using a built-in converter.\n * However, this behavior can be changed by specifying a different backend (e.g., +docbook+).\n * A backend is a keyword for an output format (e.g., DocBook).\n * That keyword, in turn, is used to select a converter, which carries out the request to convert the document to that format.\n *\n * @example\n * asciidoctor.convertFile('document.adoc', { 'safe': 'safe' }) // Convert an AsciiDoc file\n *\n * asciidoctor.convert(\"I'm using *Asciidoctor* version {asciidoctor-version}.\", { 'safe': 'safe' }) // Convert an AsciiDoc string\n *\n * const doc = asciidoctor.loadFile('document.adoc', { 'safe': 'safe' }) // Parse an AsciiDoc file into a document object\n *\n * const doc = asciidoctor.load(\"= Document Title\\n\\nfirst paragraph\\n\\nsecond paragraph\", { 'safe': 'safe' }) // Parse an AsciiDoc string into a document object\n */\nvar Asciidoctor = Opal.Asciidoctor.$$class\n\n/**\n * Get Asciidoctor core version number.\n *\n * @returns {string} - the version number of Asciidoctor core.\n * @memberof Asciidoctor\n */\nAsciidoctor.prototype.getCoreVersion = function () {\n return this.$$const.VERSION\n}\n\n/**\n * Get Asciidoctor.js runtime environment information.\n *\n * @returns {Object} - the runtime environment including the ioModule, the platform, the engine and the framework.\n * @memberof Asciidoctor\n */\nAsciidoctor.prototype.getRuntime = function () {\n return {\n ioModule: Opal.const_get_qualified('::', 'JAVASCRIPT_IO_MODULE'),\n platform: Opal.const_get_qualified('::', 'JAVASCRIPT_PLATFORM'),\n engine: Opal.const_get_qualified('::', 'JAVASCRIPT_ENGINE'),\n framework: Opal.const_get_qualified('::', 'JAVASCRIPT_FRAMEWORK')\n }\n}\n\n/**\n * Parse the AsciiDoc source input into an {@link Document} and convert it to the specified backend format.\n *\n * Accepts input as a Buffer or String.\n *\n * @param {string|Buffer} input - AsciiDoc input as String or Buffer\n * @param {Object} options - a JSON of options to control processing (default: {})\n * @returns {string|Document} - the {@link Document} object if the converted String is written to a file,\n * otherwise the converted String\n * @example\n * var input = '= Hello, AsciiDoc!\\n' +\n * 'Guillaume Grossetie \\n\\n' +\n * 'An introduction to http://asciidoc.org[AsciiDoc].\\n\\n' +\n * '== First Section\\n\\n' +\n * '* item 1\\n' +\n * '* item 2\\n';\n *\n * var html = asciidoctor.convert(input);\n * @memberof Asciidoctor\n */\nAsciidoctor.prototype.convert = function (input, options) {\n if (typeof input === 'object' && input.constructor.name === 'Buffer') {\n input = input.toString('utf8')\n }\n var result = this.$convert(input, prepareOptions(options))\n return result === Opal.nil ? '' : result\n}\n\n/**\n * Parse the AsciiDoc source input into an {@link Document} and convert it to the specified backend format.\n *\n * @param {string} filename - source filename\n * @param {Object} options - a JSON of options to control processing (default: {})\n * @returns {string|Document} - the {@link Document} object if the converted String is written to a file,\n * otherwise the converted String\n * @example\n * var html = asciidoctor.convertFile('./document.adoc');\n * @memberof Asciidoctor\n */\nAsciidoctor.prototype.convertFile = function (filename, options) {\n return this.$convert_file(filename, prepareOptions(options))\n}\n\n/**\n * Parse the AsciiDoc source input into an {@link Document}\n *\n * Accepts input as a Buffer or String.\n *\n * @param {string|Buffer} input - AsciiDoc input as String or Buffer\n * @param {Object} options - a JSON of options to control processing (default: {})\n * @returns {Document} - the {@link Document} object\n * @memberof Asciidoctor\n */\nAsciidoctor.prototype.load = function (input, options) {\n if (typeof input === 'object' && input.constructor.name === 'Buffer') {\n input = input.toString('utf8')\n }\n return this.$load(input, prepareOptions(options))\n}\n\n/**\n * Parse the contents of the AsciiDoc source file into an {@link Document}\n *\n * @param {string} filename - source filename\n * @param {Object} options - a JSON of options to control processing (default: {})\n * @returns {Document} - the {@link Document} object\n * @memberof Asciidoctor\n */\nAsciidoctor.prototype.loadFile = function (filename, options) {\n return this.$load_file(filename, prepareOptions(options))\n}\n\n// AbstractBlock API\n\n/**\n * @namespace\n * @extends AbstractNode\n */\nvar AbstractBlock = Opal.Asciidoctor.AbstractBlock\n\n/**\n * Append a block to this block's list of child blocks.\n * @param {AbstractBlock} block - the block to append\n * @returns {AbstractBlock} - the parent block to which this block was appended.\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.append = function (block) {\n this.$append(block)\n return this\n}\n\n/**\n * Get the String title of this Block with title substitions applied\n *\n * The following substitutions are applied to block and section titles:\n *\n * specialcharacters, quotes, replacements, macros, attributes and post_replacements\n *\n * @returns {string} - the converted String title for this Block, or undefined if the title is not set.\n * @example\n * block.title // \"Foo 3^ # {two-colons} Bar(1)\"\n * block.getTitle(); // \"Foo 3^ # :: Bar(1)\"\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getTitle = function () {\n var title = this.$title()\n return title === Opal.nil ? undefined : title\n}\n\n/**\n * Set the String block title.\n *\n * @param {string} title - The block title\n * @returns {string} - the new String title assigned to this Block.\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.setTitle = function (title) {\n title = typeof title === 'undefined' ? Opal.nil : title\n return this['$title='](title)\n}\n\n/**\n * Generate and assign caption to block if not already assigned.\n *\n * If the block has a title and a caption prefix is available for this block,\n * then build a caption from this information, assign it a number and store it\n * to the caption attribute on the block.\n *\n * If a caption has already been assigned to this block, do nothing.\n *\n * The parts of a complete caption are: . \n * This partial caption represents the part the precedes the title.\n *\n * @param {string} value - the String caption to assign to this block or nil to use document attribute.\n * @param {string} captionContext - the String context to use when resolving caption-related attributes.\n * If not provided, the name of the context for this block is used. Only certain contexts allow the caption to be looked up.\n *\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.assignCaption = function (value, captionContext) {\n value = typeof value === 'undefined' ? Opal.nil : value\n captionContext = typeof captionContext === 'undefined' ? null : captionContext\n this.$assign_caption(value, captionContext)\n}\n\n/**\n * Convenience method that returns the interpreted title of the Block\n * with the caption prepended.\n * Concatenates the value of this Block's caption instance variable and the\n * return value of this Block's title method. No space is added between the\n * two values. If the Block does not have a caption, the interpreted title is\n * returned.\n *\n * @returns {string} - the converted String title prefixed with the caption, or just the converted String title if no caption is set\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getCaptionedTitle = function () {\n return this.$captioned_title()\n}\n\n/**\n * Get the style (block type qualifier) for this block.\n *\n * @returns {string} - the style for this block\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getStyle = function () {\n var style = this.style\n return style === Opal.nil ? undefined : style\n}\n\n/**\n * Set the style for this block.\n *\n * @param {string} style - Style\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.setStyle = function (style) {\n this.style = style\n}\n\n/**\n * Get the location in the AsciiDoc source where this block begins.\n *\n * @returns {string} - the style for this block\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getSourceLocation = function () {\n var sourceLocation = this.source_location\n if (sourceLocation === Opal.nil) {\n return undefined\n }\n sourceLocation.getFile = function () {\n var file = this.file\n return file === Opal.nil ? undefined : file\n }\n sourceLocation.getDirectory = function () {\n var dir = this.dir\n return dir === Opal.nil ? undefined : dir\n }\n sourceLocation.getPath = function () {\n var path = this.path\n return path === Opal.nil ? undefined : path\n }\n sourceLocation.getLineNumber = function () {\n var lineno = this.lineno\n return lineno === Opal.nil ? undefined : lineno\n }\n return sourceLocation\n}\n\n/**\n * Get the caption for this block.\n *\n * @returns {string} - the caption for this block\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getCaption = function () {\n var caption = this.$caption()\n return caption === Opal.nil ? undefined : caption\n}\n\n/**\n * Set the caption for this block.\n *\n * @param {string} caption - Caption\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.setCaption = function (caption) {\n this.caption = typeof caption === 'undefined' ? Opal.nil : caption\n}\n\n/**\n * Get the level of this section or the section level in which this block resides.\n *\n * @returns {number} - the level (Integer) of this section\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getLevel = function () {\n var level = this.level\n return level === Opal.nil ? undefined : level\n}\n\n/**\n * Get the substitution keywords to be applied to the contents of this block.\n *\n * @returns {Array<string>} - the list of {string} substitution keywords associated with this block.\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getSubstitutions = function () {\n return this.subs\n}\n\n/**\n * Check whether a given substitution keyword is present in the substitutions for this block.\n *\n * @returns {boolean} - whether the substitution is present on this block.\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.hasSubstitution = function (substitution) {\n return this['$sub?'](substitution)\n}\n\n/**\n * Remove the specified substitution keyword from the list of substitutions for this block.\n *\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.removeSubstitution = function (substitution) {\n this.$remove_sub(substitution)\n}\n\n/**\n * Checks if the {@link AbstractBlock} contains any child blocks.\n *\n * @returns {boolean} - whether the {@link AbstractBlock} has child blocks.\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.hasBlocks = function () {\n return this.blocks.length > 0\n}\n\n/**\n * Get the list of {@link AbstractBlock} sub-blocks for this block.\n *\n * @returns {Array<AbstractBlock>} - a list of {@link AbstractBlock} sub-blocks\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getBlocks = function () {\n return this.blocks\n}\n\n/**\n * Get the converted result of the child blocks by converting the children appropriate to content model that this block supports.\n *\n * @returns {string} - the converted result of the child blocks\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getContent = function () {\n return this.$content()\n}\n\n/**\n * Get the converted content for this block.\n * If the block has child blocks, the content method should cause them to be converted\n * and returned as content that can be included in the parent block's template.\n *\n * @returns {string} - the converted String content for this block\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.convert = function () {\n return this.$convert()\n}\n\n/**\n * Query for all descendant block-level nodes in the document tree\n * that match the specified selector (context, style, id, and/or role).\n * If a function block is given, it's used as an additional filter.\n * If no selector or function block is supplied, all block-level nodes in the tree are returned.\n * @param {Object} [selector]\n * @param {function} [block]\n * @example\n * doc.findBy({'context': 'section'});\n * // => { level: 0, title: \"Hello, AsciiDoc!\", blocks: 0 }\n * // => { level: 1, title: \"First Section\", blocks: 1 }\n *\n * doc.findBy({'context': 'section'}, function (section) { return section.getLevel() === 1; });\n * // => { level: 1, title: \"First Section\", blocks: 1 }\n *\n * doc.findBy({'context': 'listing', 'style': 'source'});\n * // => { context: :listing, content_model: :verbatim, style: \"source\", lines: 1 }\n *\n * @returns {Array<AbstractBlock>} - a list of block-level nodes that match the filter or an empty list if no matches are found\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.findBy = function (selector, block) {\n if (typeof block === 'undefined' && typeof selector === 'function') {\n return Opal.send(this, 'find_by', null, selector)\n } else if (typeof block === 'function') {\n return Opal.send(this, 'find_by', [toHash(selector)], block)\n } else {\n return this.$find_by(toHash(selector))\n }\n}\n\n/**\n * Get the source line number where this block started.\n * @returns {number} - the source line number where this block started\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getLineNumber = function () {\n var lineno = this.$lineno()\n return lineno === Opal.nil ? undefined : lineno\n}\n\n/**\n * Check whether this block has any child Section objects.\n * Only applies to Document and Section instances.\n * @returns {boolean} - true if this block has child Section objects, otherwise false\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.hasSections = function () {\n // REMIND: call directly the underlying method \"$sections?\"\n // once https://github.com/asciidoctor/asciidoctor/pull/3591 is merged and a new version is released.\n // return this['$sections?']()\n return this.next_section_index !== Opal.nil && this.next_section_index > 0\n}\n\n/**\n * Get the Array of child Section objects.\n * Only applies to Document and Section instances.\n * @memberof AbstractBlock\n * @returns {Array<Section>} - an {Array} of {@link Section} objects\n */\nAbstractBlock.prototype.getSections = function () {\n return this.$sections()\n}\n\n/**\n * Get the numeral of this block (if section, relative to parent, otherwise absolute).\n * Only assigned to section if automatic section numbering is enabled.\n * Only assigned to formal block (block with title) if corresponding caption attribute is present.\n * If the section is an appendix, the numeral is a letter (starting with A).\n * @returns {string} - the numeral\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getNumeral = function () {\n return this.$numeral()\n}\n\n/**\n * Set the numeral of this block.\n * @param {string} value - The numeral value\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.setNumeral = function (value) {\n this['$numeral='](value)\n}\n\n/**\n * A convenience method that checks whether the title of this block is defined.\n *\n * @returns {boolean} - a {boolean} indicating whether this block has a title.\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.hasTitle = function () {\n return this['$title?']()\n}\n\n/**\n * Returns the converted alt text for this block image.\n * @returns {string} - the {string} value of the alt attribute with XML special character and replacement substitutions applied.\n * @memberof AbstractBlock\n */\nAbstractBlock.prototype.getAlt = function () {\n return this.$alt()\n}\n\n// Section API\n\n/**\n * @description\n * Methods for managing sections of AsciiDoc content in a document.\n *\n * @example\n * <pre>\n * section = asciidoctor.Section.create()\n * section.setTitle('Section 1')\n * section.setId('sect1')\n * section.getBlocks().length // 0\n * section.getId() // \"sect1\"\n * section.append(newBlock)\n * section.getBlocks().length // 1\n * </pre>\n * @namespace\n * @extends AbstractBlock\n */\nvar Section = Opal.Asciidoctor.Section\n\n/**\n * Create a {Section} object.\n * @param {AbstractBlock} [parent] - The parent AbstractBlock. If set, must be a Document or Section object (default: undefined)\n * @param {number} [level] - The Integer level of this section (default: 1 more than parent level or 1 if parent not defined)\n * @param {boolean} [numbered] - A Boolean indicating whether numbering is enabled for this Section (default: false)\n * @param {Object} [opts] - An optional JSON of options (default: {})\n * @returns {Section} - a new {Section} object\n * @memberof Section\n */\nSection.create = function (parent, level, numbered, opts) {\n if (opts && opts.attributes) {\n opts.attributes = toHash(opts.attributes)\n }\n return this.$new(parent, level, numbered, toHash(opts))\n}\n\n/**\n * Set the level of this section or the section level in which this block resides.\n * @param {number} level - Level (Integer)\n * @memberof AbstractBlock\n */\nSection.prototype.setLevel = function (level) {\n this.level = level\n}\n\n/**\n * Get the 0-based index order of this section within the parent block.\n * @returns {number}\n * @memberof Section\n */\nSection.prototype.getIndex = function () {\n return this.index\n}\n\n/**\n * Set the 0-based index order of this section within the parent block.\n * @param {string} index - The index order of this section\n * @memberof Section\n */\nSection.prototype.setIndex = function (index) {\n this.index = index\n}\n\n/**\n * Get the section name of this section.\n * @returns {string|undefined}\n * @memberof Section\n */\nSection.prototype.getSectionName = function () {\n var sectname = this.sectname\n return sectname === Opal.nil ? undefined : sectname\n}\n\n/**\n * Set the section name of this section.\n * @param {string} value - The section name\n * @memberof Section\n */\nSection.prototype.setSectionName = function (value) {\n this.sectname = value\n}\n\n/**\n * Get the flag to indicate whether this is a special section or a child of one.\n * @returns {boolean}\n * @memberof Section\n */\nSection.prototype.isSpecial = function () {\n return this.special\n}\n\n/**\n * Set the flag to indicate whether this is a special section or a child of one.\n * @param {boolean} value - A flag to indicated if this is a special section\n * @memberof Section\n */\nSection.prototype.setSpecial = function (value) {\n this.special = value\n}\n\n/**\n * Get the state of the numbered attribute at this section (need to preserve for creating TOC).\n * @returns {boolean}\n * @memberof Section\n */\nSection.prototype.isNumbered = function () {\n return this.numbered\n}\n\n/**\n * Get the caption for this section (only relevant for appendices).\n * @returns {string}\n * @memberof Section\n */\nSection.prototype.getCaption = function () {\n var value = this.caption\n return value === Opal.nil ? undefined : value\n}\n\n/**\n * Get the name of the Section (title)\n * @returns {string}\n * @see {@link AbstractBlock#getTitle}\n * @memberof Section\n */\nSection.prototype.getName = function () {\n return this.getTitle()\n}\n\n/**\n * @description\n * Methods for managing AsciiDoc content blocks.\n *\n * @example\n * block = asciidoctor.Block.create(parent, 'paragraph', {source: '_This_ is a <test>'})\n * block.getContent()\n * // \"<em>This</em> is a <test>\"\n *\n * @namespace\n * @extends AbstractBlock\n */\nvar Block = Opal.Asciidoctor.Block\n\n/**\n * Create a {Block} object.\n * @param {AbstractBlock} parent - The parent {AbstractBlock} with a compound content model to which this {Block} will be appended.\n * @param {string} context - The context name for the type of content (e.g., \"paragraph\").\n * @param {Object} [opts] - a JSON of options to customize block initialization: (default: {})\n * @param {string} opts.content_model - indicates whether blocks can be nested in this {Block} (\"compound\"),\n * otherwise how the lines should be processed (\"simple\", \"verbatim\", \"raw\", \"empty\"). (default: \"simple\")\n * @param {Object} opts.attributes - a JSON of attributes (key/value pairs) to assign to this {Block}. (default: {})\n * @param {string|Array<string>} opts.source - a String or {Array} of raw source for this {Block}. (default: undefined)\n *\n * IMPORTANT: If you don't specify the `subs` option, you must explicitly call the `commit_subs` method to resolve and assign the substitutions\n * to this block (which are resolved from the `subs` attribute, if specified, or the default substitutions based on this block's context).\n * If you want to use the default subs for a block, pass the option `subs: \"default\"`.\n * You can override the default subs using the `default_subs` option.\n *\n * @returns {Block} - a new {Block} object\n * @memberof Block\n */\nBlock.create = function (parent, context, opts) {\n if (opts && opts.attributes) {\n opts.attributes = toHash(opts.attributes)\n }\n return this.$new(parent, context, toHash(opts))\n}\n\n/**\n * Get the source of this block.\n * @returns {string} - the String source of this block.\n * @memberof Block\n */\nBlock.prototype.getSource = function () {\n return this.$source()\n}\n\n/**\n * Get the source lines of this block.\n * @returns {Array<string>} - the String {Array} of source lines for this block.\n * @memberof Block\n */\nBlock.prototype.getSourceLines = function () {\n return this.lines\n}\n\n// AbstractNode API\n\n/**\n * @namespace\n * @description\n * An abstract base class that provides state and methods for managing a node of AsciiDoc content.\n * The state and methods on this class are common to all content segments in an AsciiDoc document.\n */\nvar AbstractNode = Opal.Asciidoctor.AbstractNode\n\n/**\n * Apply the specified substitutions to the text.\n * If no substitutions are specified, the following substitutions are applied:\n * <code>specialcharacters</code>, <code>quotes</code>, <code>attributes</code>, <code>replacements</code>, <code>macros</code>, and <code>post_replacements</code>.\n *\n * @param {string|Array<string>} text - The String or String Array of text to process; must not be undefined.\n * @param {Array<string>} [subs] - The substitutions to perform; must be an Array or undefined.\n * @returns {string|Array<string>} - a String or String Array to match the type of the text argument with substitutions applied.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.applySubstitutions = function (text, subs) {\n return this.$apply_subs(text, subs)\n}\n\n/**\n * Resolve the list of comma-delimited subs against the possible options.\n *\n * @param {string} subs - The comma-delimited String of substitution names or aliases.\n * @param {string} [type] - A String representing the context for which the subs are being resolved (default: 'block').\n * @param {Array<string>} [defaults] - An Array of substitutions to start with when computing incremental substitutions (default: undefined).\n * @param {string} [subject] - The String to use in log messages to communicate the subject for which subs are being resolved (default: undefined)\n *\n * @returns {Array<string>} - An Array of Strings representing the substitution operation or nothing if no subs are found.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.resolveSubstitutions = function (subs, type, defaults, subject) {\n if (typeof type === 'undefined') {\n type = 'block'\n }\n if (typeof defaults === 'undefined') {\n defaults = Opal.nil\n }\n if (typeof subject === 'undefined') {\n subject = Opal.nil\n }\n const value = this.$resolve_subs(subs, type, defaults, subject)\n return value === Opal.nil ? undefined : value\n}\n\n/**\n * Call {@link AbstractNode#resolveSubstitutions} for the 'block' type.\n *\n * @see {@link AbstractNode#resolveSubstitutions}\n */\nAbstractNode.prototype.resolveBlockSubstitutions = function (subs, defaults, subject) {\n return this.resolveSubstitutions(subs, 'block', defaults, subject)\n}\n\n/**\n * Call {@link AbstractNode#resolveSubstitutions} for the 'inline' type with the subject set as passthrough macro.\n *\n * @see {@link AbstractNode#resolveSubstitutions}\n */\nAbstractNode.prototype.resolvePassSubstitutions = function (subs) {\n return this.resolveSubstitutions(subs, 'inline', undefined, 'passthrough macro')\n}\n\n/**\n * @returns {string} - the String name of this node\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getNodeName = function () {\n return this.node_name\n}\n\n/**\n * @returns {Object} - the JSON of attributes for this node\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getAttributes = function () {\n return fromHash(this.attributes)\n}\n\n/**\n * Get the value of the specified attribute.\n * If the attribute is not found on this node, fallback_name is set, and this node is not the Document node, get the value of the specified attribute from the Document node.\n *\n * Look for the specified attribute in the attributes on this node and return the value of the attribute, if found.\n * Otherwise, if fallback_name is set (default: same as name) and this node is not the Document node, look for that attribute on the Document node and return its value, if found.\n * Otherwise, return the default value (default: undefined).\n *\n * @param {string} name - The String of the attribute to resolve.\n * @param {*} [defaultValue] - The {Object} value to return if the attribute is not found (default: undefined).\n * @param {string} [fallbackName] - The String of the attribute to resolve on the Document if the attribute is not found on this node (default: same as name).\n *\n * @returns {*} - the {Object} value (typically a String) of the attribute or defaultValue if the attribute is not found.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getAttribute = function (name, defaultValue, fallbackName) {\n var value = this.$attr(name, defaultValue, fallbackName)\n return value === Opal.nil ? undefined : value\n}\n\n/**\n * Check whether the specified attribute is present on this node.\n *\n * @param {string} name - The String of the attribute to resolve.\n * @returns {boolean} - true if the attribute is present, otherwise false\n * @memberof AbstractNode\n */\nAbstractNode.prototype.hasAttribute = function (name) {\n return name in this.attributes.$$smap\n}\n\n/**\n * Check if the specified attribute is defined using the same logic as {AbstractNode#getAttribute}, optionally performing acomparison with the expected value if specified.\n *\n * Look for the specified attribute in the attributes on this node.\n * If not found, fallback_name is specified (default: same as name), and this node is not the Document node, look for that attribute on the Document node.\n * In either case, if the attribute is found, and the comparison value is truthy, return whether the two values match.\n * Otherwise, return whether the attribute was found.\n *\n * @param {string} name - The String name of the attribute to resolve.\n * @param {*} [expectedValue] - The expected Object value of the attribute (default: undefined).\n * @param {string} fallbackName - The String of the attribute to resolve on the Document if the attribute is not found on this node (default: same as name).\n *\n * @returns {boolean} - a Boolean indicating whether the attribute exists and, if a truthy comparison value is specified, whether the value of the attribute matches the comparison value.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.isAttribute = function (name, expectedValue, fallbackName) {\n var result = this['$attr?'](name, expectedValue, fallbackName)\n return result === Opal.nil ? false : result\n}\n\n/**\n * Assign the value to the attribute name for the current node.\n *\n * @param {string} name - The String attribute name to assign\n * @param {*} value - The Object value to assign to the attribute (default: '')\n * @param {boolean} overwrite - A Boolean indicating whether to assign the attribute if currently present in the attributes JSON (default: true)\n *\n * @returns {boolean} - a Boolean indicating whether the assignment was performed\n * @memberof AbstractNode\n */\nAbstractNode.prototype.setAttribute = function (name, value, overwrite) {\n if (typeof overwrite === 'undefined') overwrite = true\n return this.$set_attr(name, value, overwrite)\n}\n\n/**\n * Remove the attribute from the current node.\n * @param {string} name - The String attribute name to remove\n * @returns {string} - the previous {string} value, or undefined if the attribute was not present.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.removeAttribute = function (name) {\n var value = this.$remove_attr(name)\n return value === Opal.nil ? undefined : value\n}\n\n/**\n * Get the {@link Document} to which this node belongs.\n *\n * @returns {Document} - the {@link Document} object to which this node belongs.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getDocument = function () {\n return this.document\n}\n\n/**\n * Get the {@link AbstractNode} to which this node is attached.\n *\n * @memberof AbstractNode\n * @returns {AbstractNode} - the {@link AbstractNode} object to which this node is attached,\n * or undefined if this node has no parent.\n */\nAbstractNode.prototype.getParent = function () {\n var parent = this.parent\n return parent === Opal.nil ? undefined : parent\n}\n\n/**\n * @returns {boolean} - true if this {AbstractNode} is an instance of {Inline}\n * @memberof AbstractNode\n */\nAbstractNode.prototype.isInline = function () {\n return this['$inline?']()\n}\n\n/**\n * @returns {boolean} - true if this {AbstractNode} is an instance of {Block}\n * @memberof AbstractNode\n */\nAbstractNode.prototype.isBlock = function () {\n return this['$block?']()\n}\n\n/**\n * Checks if the role attribute is set on this node and, if an expected value is given, whether the space-separated role matches that value.\n *\n * @param {string} expectedValue - The expected String value of the role (optional, default: undefined)\n *\n * @returns {boolean} - a Boolean indicating whether the role attribute is set on this node and, if an expected value is given, whether the space-separated role matches that value.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.isRole = function (expectedValue) {\n return this['$role?'](expectedValue)\n}\n\n/**\n * Retrieves the space-separated String role for this node.\n *\n * @returns {string} - the role as a space-separated String.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getRole = function () {\n return this.$role()\n}\n\n/**\n * Checks if the specified role is present in the list of roles for this node.\n *\n * @param {string} name - The String name of the role to find.\n *\n * @returns {boolean} - a Boolean indicating whether this node has the specified role.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.hasRole = function (name) {\n return this['$has_role?'](name)\n}\n\n/**\n * Retrieves the String role names for this node as an Array.\n *\n * @returns {Array<string>} - the role names as a String {Array}, which is empty if the role attribute is absent on this node.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getRoles = function () {\n return this.$roles()\n}\n\n/**\n * Adds the given role directly to this node.\n *\n * @param {string} name - The name of the role to add\n *\n * @returns {boolean} - a Boolean indicating whether the role was added.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.addRole = function (name) {\n return this.$add_role(name)\n}\n\n/**\n * Public: Removes the given role directly from this node.\n *\n * @param {string} name - The name of the role to remove\n *\n * @returns {boolean} - a Boolean indicating whether the role was removed.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.removeRole = function (name) {\n return this.$remove_role(name)\n}\n\n/**\n * A convenience method that checks if the reftext attribute is defined.\n * @returns {boolean} - A Boolean indicating whether the reftext attribute is defined\n * @memberof AbstractNode\n */\nAbstractNode.prototype.isReftext = function () {\n return this['$reftext?']()\n}\n\n/**\n * A convenience method that returns the value of the reftext attribute with substitutions applied.\n * @returns {string|undefined} - the value of the reftext attribute with substitutions applied.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getReftext = function () {\n var reftext = this.$reftext()\n return reftext === Opal.nil ? undefined : reftext\n}\n\n/**\n * @returns {string} - Get the context name for this node\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getContext = function () {\n var context = this.context\n // Automatically convert Opal pseudo-symbol to String\n return typeof context === 'string' ? context : context.toString()\n}\n\n/**\n * @returns {string} - the String id of this node\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getId = function () {\n var id = this.id\n return id === Opal.nil ? undefined : id\n}\n\n/**\n * @param {string} id - the String id of this node\n * @memberof AbstractNode\n */\nAbstractNode.prototype.setId = function (id) {\n this.id = id\n}\n\n/**\n * A convenience method to check if the specified option attribute is enabled on the current node.\n * Check if the option is enabled. This method simply checks to see if the <name>-option attribute is defined on the current node.\n *\n * @param {string} name - the String name of the option\n *\n * @return {boolean} - a Boolean indicating whether the option has been specified\n * @memberof AbstractNode\n */\nAbstractNode.prototype.isOption = function (name) {\n return this['$option?'](name)\n}\n\n/**\n * Set the specified option on this node.\n * This method sets the specified option on this node by setting the <name>-option attribute.\n *\n * @param {string} name - the String name of the option\n *\n * @memberof AbstractNode\n */\nAbstractNode.prototype.setOption = function (name) {\n return this.$set_option(name)\n}\n\n/**\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getIconUri = function (name) {\n return this.$icon_uri(name)\n}\n\n/**\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getMediaUri = function (target, assetDirKey) {\n return this.$media_uri(target, assetDirKey)\n}\n\n/**\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getImageUri = function (targetImage, assetDirKey) {\n return this.$image_uri(targetImage, assetDirKey)\n}\n\n/**\n * Get the {Converter} instance being used to convert the current {Document}.\n * @returns {Object}\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getConverter = function () {\n return this.$converter()\n}\n\n/**\n * @memberof AbstractNode\n */\nAbstractNode.prototype.readContents = function (target, options) {\n return this.$read_contents(target, toHash(options))\n}\n\n/**\n * Read the contents of the file at the specified path.\n * This method assumes that the path is safe to read.\n * It checks that the file is readable before attempting to read it.\n *\n * @param path - the {string} path from which to read the contents\n * @param {Object} options - a JSON {Object} of options to control processing (default: {})\n * @param {boolean} options.warn_on_failure - a {boolean} that controls whether a warning is issued if the file cannot be read (default: false)\n * @param {boolean} options.normalize - a {boolean} that controls whether the lines are normalized and coerced to UTF-8 (default: false)\n *\n * @returns {string} - the String content of the file at the specified path, or undefined if the file does not exist.\n * @memberof AbstractNode\n */\nAbstractNode.prototype.readAsset = function (path, options) {\n var result = this.$read_asset(path, toHash(options))\n return result === Opal.nil ? undefined : result\n}\n\n/**\n * @memberof AbstractNode\n */\nAbstractNode.prototype.normalizeWebPath = function (target, start, preserveTargetUri) {\n return this.$normalize_web_path(target, start, preserveTargetUri)\n}\n\n/**\n * @memberof AbstractNode\n */\nAbstractNode.prototype.normalizeSystemPath = function (target, start, jail, options) {\n return this.$normalize_system_path(target, start, jail, toHash(options))\n}\n\n/**\n * @memberof AbstractNode\n */\nAbstractNode.prototype.normalizeAssetPath = function (assetRef, assetName, autoCorrect) {\n return this.$normalize_asset_path(assetRef, assetName, autoCorrect)\n}\n\n// Document API\n\n/**\n * The {@link Document} class represents a parsed AsciiDoc document.\n *\n * Document is the root node of a parsed AsciiDoc document.<br/>\n * It provides an abstract syntax tree (AST) that represents the structure of the AsciiDoc document\n * from which the Document object was parsed.\n *\n * Although the constructor can be used to create an empty document object,\n * more commonly, you'll load the document object from AsciiDoc source\n * using the primary API methods on {@link Asciidoctor}.\n * When using one of these APIs, you almost always want to set the safe mode to 'safe' (or 'unsafe')\n * to enable all of Asciidoctor's features.\n *\n * <pre>\n * var doc = Asciidoctor.load('= Hello, AsciiDoc!', { 'safe': 'safe' })\n * // => Asciidoctor::Document { doctype: \"article\", doctitle: \"Hello, AsciiDoc!\", blocks: 0 }\n * </pre>\n *\n * Instances of this class can be used to extract information from the document or alter its structure.\n * As such, the Document object is most often used in extensions and by integrations.\n *\n * The most basic usage of the Document object is to retrieve the document's title.\n *\n * <pre>\n * var source = '= Document Title'\n * var doc = asciidoctor.load(source, { 'safe': 'safe' })\n * console.log(doc.getTitle()) // 'Document Title'\n * </pre>\n *\n * You can also use the Document object to access document attributes defined in the header, such as the author and doctype.\n * @namespace\n * @extends AbstractBlock\n */\nvar Document = Opal.Asciidoctor.Document\n\n/**\n * Returns a JSON {Object} of references captured by the processor.\n *\n * @returns {Object} - a JSON {Object} of {AbstractNode} in the document.\n * @memberof Document\n */\nDocument.prototype.getRefs = function () {\n return fromHash(this.catalog.$$smap.refs)\n}\n\n/**\n * Returns an {Array} of {Document/ImageReference} captured by the processor.\n *\n * @returns {Array<ImageReference>} - an {Array} of {Document/ImageReference} in the document.\n * Will return an empty array if the option \"catalog_assets: true\" was not defined on the processor.\n * @memberof Document\n */\nDocument.prototype.getImages = function () {\n return this.catalog.$$smap.images\n}\n\n/**\n * Returns an {Array} of links captured by the processor.\n *\n * @returns {Array<string>} - an {Array} of links in the document.\n * Will return an empty array if:\n * - the function was called before the document was converted\n * - the option \"catalog_assets: true\" was not defined on the processor\n * @memberof Document\n */\nDocument.prototype.getLinks = function () {\n return this.catalog.$$smap.links\n}\n\n/**\n * @returns {boolean} - true if the document has footnotes otherwise false\n * @memberof Document\n */\nDocument.prototype.hasFootnotes = function () {\n return this['$footnotes?']()\n}\n\n/**\n * Returns an {Array} of {Document/Footnote} captured by the processor.\n *\n * @returns {Array<Footnote>} - an {Array} of {Document/Footnote} in the document.\n * Will return an empty array if the function was called before the document was converted.\n * @memberof Document\n */\nDocument.prototype.getFootnotes = function () {\n return this.$footnotes()\n}\n\n/**\n * Returns the level-0 {Section} (i.e. the document title).\n * Only stores the title, not the header attributes.\n *\n * @returns {string} - the level-0 {Section}.\n * @memberof Document\n */\nDocument.prototype.getHeader = function () {\n return this.header\n}\n\n/**\n * @memberof Document\n */\nDocument.prototype.setAttribute = function (name, value) {\n return this.$set_attribute(name, value)\n}\n\n/**\n\n * @memberof Document\n */\nDocument.prototype.removeAttribute = function (name) {\n this.attributes.$delete(name)\n this.attribute_overrides.$delete(name)\n}\n\n/**\n * Convert the AsciiDoc document using the templates loaded by the Converter.\n * If a \"template_dir\" is not specified, or a template is missing, the converter will fall back to using the appropriate built-in template.\n *\n * @param {Object} [options] - a JSON of options to control processing (default: {})\n *\n * @returns {string}\n * @memberof Document\n */\nDocument.prototype.convert = function (options) {\n var result = this.$convert(toHash(options))\n return result === Opal.nil ? '' : result\n}\n\n/**\n * Write the output to the specified file.\n *\n * If the converter responds to \"write\", delegate the work of writing the file to that method.\n * Otherwise, write the output the specified file.\n *\n * @param {string} output\n * @param {string} target\n *\n * @memberof Document\n */\nDocument.prototype.write = function (output, target) {\n return this.$write(output, target)\n}\n\n/**\n * @returns {string} - the full name of the author as a String\n * @memberof Document\n */\nDocument.prototype.getAuthor = function () {\n return this.$author()\n}\n\n/**\n * @returns {string}\n * @memberof Document\n */\nDocument.prototype.getSource = function () {\n return this.$source()\n}\n\n/**\n * @returns {Array<string>}\n * @memberof Document\n */\nDocument.prototype.getSourceLines = function () {\n return this.$source_lines()\n}\n\n/**\n * @returns {boolean}\n * @memberof Document\n */\nDocument.prototype.isNested = function () {\n return this['$nested?']()\n}\n\n/**\n * @returns {boolean}\n * @memberof Document\n */\nDocument.prototype.isEmbedded = function () {\n return this['$embedded?']()\n}\n\n/**\n * @returns {boolean}\n * @memberof Document\n */\nDocument.prototype.hasExtensions = function () {\n return this['$extensions?']()\n}\n\n/**\n * Get the value of the doctype attribute for this document.\n * @returns {string}\n * @memberof Document\n */\nDocument.prototype.getDoctype = function () {\n return this.doctype\n}\n\n/**\n * Get the value of the backend attribute for this document.\n * @returns {string}\n * @memberof Document\n */\nDocument.prototype.getBackend = function () {\n return this.backend\n}\n\n/**\n * @returns {boolean}\n * @memberof Document\n */\nDocument.prototype.isBasebackend = function (base) {\n return this['$basebackend?'](base)\n}\n\n/**\n * Get the title explicitly defined in the document attributes.\n * @returns {string}\n * @see {@link AbstractNode#getAttributes}\n * @memberof Document\n */\nDocument.prototype.getTitle = function () {\n var title = this.$title()\n return title === Opal.nil ? undefined : title\n}\n\n/**\n * Set the title on the document header\n *\n * Set the title of the document header to the specified value.\n * If the header does not exist, it is first created.\n *\n * @param {string} title - the String title to assign as the title of the document header\n *\n * @returns {string} - the new String title assigned to the document header\n * @memberof Document\n */\nDocument.prototype.setTitle = function (title) {\n return this['$title='](title)\n}\n\n/**\n * @returns {Document/Title} - a {@link Document/Title}\n * @memberof Document\n */\nDocument.prototype.getDocumentTitle = function (options) {\n var doctitle = this.$doctitle(toHash(options))\n return doctitle === Opal.nil ? undefined : doctitle\n}\n\n/**\n * @see {@link Document#getDocumentTitle}\n * @memberof Document\n */\nDocument.prototype.getDoctitle = Document.prototype.getDocumentTitle\n\n/**\n * Get the document catalog JSON object.\n * @returns {Object}\n * @memberof Document\n */\nDocument.prototype.getCatalog = function () {\n return fromHash(this.catalog)\n}\n\n/**\n *\n * @returns {Object}\n * @see Document#getCatalog\n * @memberof Document\n */\nDocument.prototype.getReferences = Document.prototype.getCatalog\n\n/**\n * Get the document revision date from document header (document attribute <code>revdate</code>).\n * @returns {string}\n * @memberof Document\n */\nDocument.prototype.getRevisionDate = function () {\n return this.getAttribute('revdate')\n}\n\n/**\n * @see Document#getRevisionDate\n * @returns {string}\n * @memberof Document\n */\nDocument.prototype.getRevdate = function () {\n return this.getRevisionDate()\n}\n\n/**\n * Get the document revision number from document header (document attribute <code>revnumber</code>).\n * @returns {string}\n * @memberof Document\n */\nDocument.prototype.getRevisionNumber = function () {\n return this.getAttribute('revnumber')\n}\n\n/**\n * Get the document revision remark from document header (document attribute <code>revremark</code>).\n * @returns {string}\n * @memberof Document\n */\nDocument.prototype.getRevisionRemark = function () {\n return this.getAttribute('revremark')\n}\n\n/**\n * Assign a value to the specified attribute in the document header.\n *\n * The assignment will be visible when the header attributes are restored,\n * typically between processor phases (e.g., between parse and convert).\n *\n * @param {string} name - The {string} attribute name to assign\n * @param {Object} value - The {Object} value to assign to the attribute (default: '')\n * @param {boolean} overwrite - A {boolean} indicating whether to assign the attribute\n * if already present in the attributes Hash (default: true)\n *\n * @returns {boolean} - true if the assignment was performed otherwise false\n * @memberof Document\n */\nDocument.prototype.setHeaderAttribute = function (name, value, overwrite) {\n if (typeof overwrite === 'undefined') overwrite = true\n if (typeof value === 'undefined') value = ''\n return this.$set_header_attribute(name, value, overwrite)\n}\n\n/**\n * Convenience method to retrieve the authors of this document as an {Array} of {Document/Author} objects.\n *\n * This method is backed by the author-related attributes on the document.\n *\n * @returns {Array<Author>} - an {Array} of {Document/Author} objects.\n * @memberof Document\n */\nDocument.prototype.getAuthors = function () {\n return this.$authors()\n}\n\n// Document.Footnote API\n\n/**\n * @namespace\n * @module Document/Footnote\n */\nvar Footnote = Document.Footnote\n\n/**\n * @returns {number} - the footnote's index\n * @memberof Document/Footnote\n */\nFootnote.prototype.getIndex = function () {\n var index = this.$$data.index\n return index === Opal.nil ? undefined : index\n}\n\n/**\n * @returns {number} - the footnote's id\n * @memberof Document/Footnote\n */\nFootnote.prototype.getId = function () {\n var id = this.$$data.id\n return id === Opal.nil ? undefined : id\n}\n\n/**\n * @returns {string} - the footnote's text\n * @memberof Document/Footnote\n */\nFootnote.prototype.getText = function () {\n var text = this.$$data.text\n return text === Opal.nil ? undefined : text\n}\n\n// Document.ImageReference API\n\n/**\n * @class\n * @module Document/ImageReference\n */\nvar ImageReference = Document.ImageReference\n\n/**\n * @returns {string} - the image's target\n * @memberof Document/ImageReference\n */\nImageReference.prototype.getTarget = function () {\n return this.$$data.target\n}\n\n/**\n * @returns {string} - the image's directory (imagesdir attribute)\n * @memberof Document/ImageReference\n */\nImageReference.prototype.getImagesDirectory = function () {\n var value = this.$$data.imagesdir\n return value === Opal.nil ? undefined : value\n}\n\n// Document.Author API\n\n/**\n * The Author class represents information about an author extracted from document attributes.\n * @namespace\n * @module Document/Author\n */\nvar Author = Document.Author\n\n/**\n * @returns {string} - the author's full name\n * @memberof Document/Author\n */\nAuthor.prototype.getName = function () {\n var name = this.$$data.name\n return name === Opal.nil ? undefined : name\n}\n\n/**\n * @returns {string} - the author's first name\n * @memberof Document/Author\n */\nAuthor.prototype.getFirstName = function () {\n var firstName = this.$$data.firstname\n return firstName === Opal.nil ? undefined : firstName\n}\n\n/**\n * @returns {string} - the author's middle name (or undefined if the author has no middle name)\n * @memberof Document/Author\n */\nAuthor.prototype.getMiddleName = function () {\n var middleName = this.$$data.middlename\n return middleName === Opal.nil ? undefined : middleName\n}\n\n/**\n * @returns {string} - the author's last name\n * @memberof Document/Author\n */\nAuthor.prototype.getLastName = function () {\n var lastName = this.$$data.lastname\n return lastName === Opal.nil ? undefined : lastName\n}\n\n/**\n * @returns {string} - the author's initials (by default based on the author's name)\n * @memberof Document/Author\n */\nAuthor.prototype.getInitials = function () {\n var initials = this.$$data.initials\n return initials === Opal.nil ? undefined : initials\n}\n\n/**\n * @returns {string} - the author's email\n * @memberof Document/Author\n */\nAuthor.prototype.getEmail = function () {\n var email = this.$$data.email\n return email === Opal.nil ? undefined : email\n}\n\n// private constructor\nDocument.RevisionInfo = function (date, number, remark) {\n this.date = date\n this.number = number\n this.remark = remark\n}\n\n/**\n * @class\n * @namespace\n * @module Document/RevisionInfo\n */\nvar RevisionInfo = Document.RevisionInfo\n\n/**\n * Get the document revision date from document header (document attribute <code>revdate</code>).\n * @returns {string}\n * @memberof Document/RevisionInfo\n */\nRevisionInfo.prototype.getDate = function () {\n return this.date\n}\n\n/**\n * Get the document revision number from document header (document attribute <code>revnumber</code>).\n * @returns {string}\n * @memberof Document/RevisionInfo\n */\nRevisionInfo.prototype.getNumber = function () {\n return this.number\n}\n\n/**\n * Get the document revision remark from document header (document attribute <code>revremark</code>).\n * A short summary of changes in this document revision.\n * @returns {string}\n * @memberof Document/RevisionInfo\n */\nRevisionInfo.prototype.getRemark = function () {\n return this.remark\n}\n\n/**\n * @returns {boolean} - true if the revision info is empty (ie. not defined), otherwise false\n * @memberof Document/RevisionInfo\n */\nRevisionInfo.prototype.isEmpty = function () {\n return this.date === undefined && this.number === undefined && this.remark === undefined\n}\n\n// SafeMode API\n\n/**\n * @namespace\n */\nvar SafeMode = Opal.Asciidoctor.SafeMode\n\n/**\n * @param {string} name - the name of the security level\n * @returns {number} - the integer value of the corresponding security level\n */\nSafeMode.getValueForName = function (name) {\n return this.$value_for_name(name)\n}\n\n/**\n * @param {number} value - the integer value of the security level\n * @returns {string} - the name of the corresponding security level\n */\nSafeMode.getNameForValue = function (value) {\n var name = this.$name_for_value(value)\n return name === Opal.nil ? undefined : name\n}\n\n/**\n * @returns {Array<string>} - the String {Array} of security levels\n */\nSafeMode.getNames = function () {\n return this.$names()\n}\n\n// Callouts API\n\n/**\n * Maintains a catalog of callouts and their associations.\n * @namespace\n */\nvar Callouts = Opal.Asciidoctor.Callouts\n\n/**\n * Create a new Callouts.\n * @returns {Callouts} - a new Callouts\n * @memberof Callouts\n */\nCallouts.create = function () {\n return this.$new()\n}\n\n/**\n * Register a new callout for the given list item ordinal.\n * Generates a unique id for this callout based on the index of the next callout list in the document and the index of this callout since the end of the last callout list.\n *\n * @param {number} ordinal - the Integer ordinal (1-based) of the list item to which this callout is to be associated\n * @returns {string} - The unique String id of this callout\n * @example\n * callouts = asciidoctor.Callouts.create()\n * callouts.register(1)\n * // => \"CO1-1\"\n * callouts.nextList()\n * callouts.register(2)\n * // => \"CO2-1\"\n * @memberof Callouts\n */\n\nCallouts.prototype.register = function (ordinal) {\n return this.$register(ordinal)\n}\n/**\n * Get the next callout index in the document.\n *\n * Reads the next callout index in the document and advances the pointer.\n * This method is used during conversion to retrieve the unique id of the callout that was generated during parsing.\n *\n * @returns {string} - The unique String id of the next callout in the document\n * @memberof Callouts\n */\nCallouts.prototype.readNextId = function () {\n return this.$read_next_id()\n}\n\n/**\n * et a space-separated list of callout ids for the specified list item.\n * @param {number} ordinal - the Integer ordinal (1-based) of the list item for which to retrieve the callouts\n * @returns {string} - a space-separated String of callout ids associated with the specified list item\n * @memberof Callouts\n */\nCallouts.prototype.getCalloutIds = function (ordinal) {\n return this.$callout_ids(ordinal)\n}\n\n/**\n * @memberof Callouts\n */\nCallouts.prototype.getLists = function () {\n var lists = this.lists\n if (lists && lists.length > 0) {\n for (var i = 0; i < lists.length; i++) {\n var list = lists[i]\n if (list && list.length > 0) {\n for (var j = 0; j < list.length; j++) {\n if (typeof list[j] === 'object' && '$$smap' in list[j]) {\n list[j] = fromHash(list[j])\n }\n }\n }\n }\n }\n return lists\n}\n\n/**\n * @memberof Callouts\n */\nCallouts.prototype.getListIndex = function () {\n return this.list_index\n}\n\n/**\n * The current list for which callouts are being collected.\n * @returns {Array} - The Array of callouts at the position of the list index pointer\n * @memberof Callouts\n */\nCallouts.prototype.getCurrentList = function () {\n var currentList = this.$current_list()\n if (currentList && currentList.length > 0) {\n for (var i = 0; i < currentList.length; i++) {\n if (typeof currentList[i] === 'object' && '$$smap' in currentList[i]) {\n currentList[i] = fromHash(currentList[i])\n }\n }\n }\n return currentList\n}\n\n/**\n * Advance to the next callout list in the document.\n * @memberof Callouts\n */\nCallouts.prototype.nextList = function () {\n return this.$nextList()\n}\n\n/**\n * Rewind the list index pointer, intended to be used when switching from the parsing to conversion phase.\n * @memberof Callouts\n */\nCallouts.prototype.rewind = function () {\n return this.$rewind()\n}\n\n/**\n * @returns {Document/RevisionInfo} - a {@link Document/RevisionInfo}\n * @memberof Document\n */\nDocument.prototype.getRevisionInfo = function () {\n return new Document.RevisionInfo(this.getRevisionDate(), this.getRevisionNumber(), this.getRevisionRemark())\n}\n\n/**\n * @returns {boolean} - true if the document contains revision info, otherwise false\n * @memberof Document\n */\nDocument.prototype.hasRevisionInfo = function () {\n var revisionInfo = this.getRevisionInfo()\n return !revisionInfo.isEmpty()\n}\n\n/**\n * @returns {boolean}\n * @memberof Document\n */\nDocument.prototype.getNotitle = function () {\n return this.$notitle()\n}\n\n/**\n * @returns {boolean}\n * @memberof Document\n */\nDocument.prototype.getNoheader = function () {\n return this.$noheader()\n}\n\n/**\n * @returns {boolean}\n * @memberof Document\n */\nDocument.prototype.getNofooter = function () {\n return this.$nofooter()\n}\n\n/**\n * @returns {boolean}\n * @memberof Document\n */\nDocument.prototype.hasHeader = function () {\n return this['$header?']()\n}\n\n/**\n * Replay attribute assignments at the block level.\n *\n * <i>This method belongs to an internal API that deals with how attributes are managed by the processor.</i>\n * If you understand why this group of methods are necessary, and what they do, feel free to use them.\n * <strong>However, keep in mind they are subject to change at any time.</strong>\n *\n * @param {Object} blockAttributes - A JSON of attributes\n * @memberof Document\n */\nDocument.prototype.playbackAttributes = function (blockAttributes) {\n blockAttributes = toHash(blockAttributes)\n if (blockAttributes) {\n var attrEntries = blockAttributes['$[]']('attribute_entries')\n if (attrEntries && Array.isArray(attrEntries)) {\n var result = []\n for (var i = 0; i < attrEntries.length; i++) {\n var attrEntryObject = attrEntries[i]\n if (attrEntryObject && typeof attrEntryObject === 'object' && attrEntryObject.constructor.name === 'Object') {\n attrEntryObject.$name = function () {\n return this.name\n }\n attrEntryObject.$value = function () {\n return this.value\n }\n attrEntryObject.$negate = function () {\n return this.negate\n }\n }\n result.push(attrEntryObject)\n }\n blockAttributes['$[]=']('attribute_entries', result)\n }\n }\n this.$playback_attributes(blockAttributes)\n}\n\n/**\n * Delete the specified attribute from the document if the name is not locked.\n * If the attribute is locked, false is returned.\n * Otherwise, the attribute is deleted.\n *\n * @param {string} name - the String attribute name\n *\n * @returns {boolean} - true if the attribute was deleted, false if it was not because it's locked\n * @memberof Document\n */\nDocument.prototype.deleteAttribute = function (name) {\n return this.$delete_attribute(name)\n}\n\n/**\n * Determine if the attribute has been locked by being assigned in document options.\n *\n * @param {string} key - The attribute key to check\n *\n * @returns {boolean} - true if the attribute is locked, false otherwise\n * @memberof Document\n */\nDocument.prototype.isAttributeLocked = function (key) {\n return this['$attribute_locked?'](key)\n}\n\n/**\n * Restore the attributes to the previously saved state (attributes in header).\n *\n * @memberof Document\n */\nDocument.prototype.restoreAttributes = function () {\n return this.$restore_attributes()\n}\n\n/**\n * Parse the AsciiDoc source stored in the {Reader} into an abstract syntax tree.\n *\n * If the data parameter is not nil, create a new {PreprocessorReader} and assigned it to the reader property of this object.\n * Otherwise, continue with the reader that was created when the {Document} was instantiated.\n * Pass the reader to {Parser.parse} to parse the source data into an abstract syntax tree.\n *\n * If parsing has already been performed, this method returns without performing any processing.\n *\n * @param {string|Array<string>} [data] - The optional replacement AsciiDoc source data as a String or String Array. (default: undefined)\n *\n * @returns {Document} - this {Document}\n * @memberof Document\n */\nDocument.prototype.parse = function (data) {\n return this.$parse(data)\n}\n\n/**\n * @memberof Document\n */\nDocument.prototype.getDocinfo = function (docinfoLocation, suffix) {\n return this.$docinfo(docinfoLocation, suffix)\n}\n\n/**\n * @param {string} [docinfoLocation] - A {string} for checking docinfo extensions at a given location (head or footer) (default: head)\n * @returns {boolean}\n * @memberof Document\n */\nDocument.prototype.hasDocinfoProcessors = function (docinfoLocation) {\n return this['$docinfo_processors?'](docinfoLocation)\n}\n\n/**\n * Increment the specified counter and store it in the block's attributes.\n *\n * @param {string} counterName - the String name of the counter attribute\n * @param {Block} block - the {Block} on which to save the counter\n *\n * @returns {number} - the next number in the sequence for the specified counter\n * @memberof Document\n */\nDocument.prototype.incrementAndStoreCounter = function (counterName, block) {\n return this.$increment_and_store_counter(counterName, block)\n}\n\n/**\n * @deprecated Please use {Document#incrementAndStoreCounter} method.\n * @memberof Document\n */\nDocument.prototype.counterIncrement = Document.prototype.incrementAndStoreCounter\n\n/**\n * Get the named counter and take the next number in the sequence.\n *\n * @param {string} name - the String name of the counter\n * @param {string|number} seed - the initial value as a String or Integer\n *\n * @returns {number} the next number in the sequence for the specified counter\n * @memberof Document\n */\nDocument.prototype.counter = function (name, seed) {\n return this.$counter(name, seed)\n}\n\n/**\n * A read-only integer value indicating the level of security that should be enforced while processing this document.\n * The value must be set in the Document constructor using the \"safe\" option.\n *\n * A value of 0 (UNSAFE) disables any of the security features enforced by Asciidoctor.\n *\n * A value of 1 (SAFE) closely parallels safe mode in AsciiDoc.\n * In particular, it prevents access to files which reside outside of the parent directory of the source file and disables any macro other than the include directive.\n *\n * A value of 10 (SERVER) disallows the document from setting attributes that would affect the conversion of the document,\n * in addition to all the security features of SafeMode.SAFE.\n * For instance, this level forbids changing the backend or source-highlighter using an attribute defined in the source document header.\n * This is the most fundamental level of security for server deployments (hence the name).\n *\n * A value of 20 (SECURE) disallows the document from attempting to read files from the file system and including the contents of them into the document,\n * in addition to all the security features of SafeMode.SECURE.\n * In particular, it disallows use of the include::[] directive and the embedding of binary content (data uri), stylesheets and JavaScripts referenced by the document.\n * (Asciidoctor and trusted extensions may still be allowed to embed trusted content into the document).\n *\n * Since Asciidoctor is aiming for wide adoption, 20 (SECURE) is the default value and is recommended for server deployments.\n *\n * A value of 100 (PARANOID) is planned to disallow the use of passthrough macros and prevents the document from setting any known attributes,\n * in addition to all the security features of SafeMode.SECURE.\n * Please note that this level is not currently implemented (and therefore not enforced)!\n *\n * @returns {number} - An integer value indicating the level of security\n * @memberof Document\n */\nDocument.prototype.getSafe = function () {\n return this.safe\n}\n\n/**\n * Get the Boolean AsciiDoc compatibility mode.\n * Enabling this attribute activates the following syntax changes:\n *\n * * single quotes as constrained emphasis formatting marks\n * * single backticks parsed as inline literal, formatted as monospace\n * * single plus parsed as constrained, monospaced inline formatting\n * * double plus parsed as constrained, monospaced inline formatting\n *\n * @returns {boolean}\n * @memberof Document\n */\nDocument.prototype.getCompatMode = function () {\n return this.compat_mode\n}\n\n/**\n * Get the Boolean flag that indicates whether source map information should be tracked by the parser.\n * @returns {boolean}\n * @memberof Document\n */\nDocument.prototype.getSourcemap = function () {\n var sourcemap = this.sourcemap\n return sourcemap === Opal.nil ? false : sourcemap\n}\n\n/**\n * Set the Boolean flag that indicates whether source map information should be tracked by the parser.\n * @param {boolean} value\n * @memberof Document\n */\nDocument.prototype.setSourcemap = function (value) {\n this.sourcemap = value\n}\n\n/**\n * Get the JSON of document counters.\n * @returns {Object}\n * @memberof Document\n */\nDocument.prototype.getCounters = function () {\n return fromHash(this.counters)\n}\n\n/**\n * @returns {Object}\n * @memberof Document\n */\nDocument.prototype.getCallouts = function () {\n return this.$callouts()\n}\n\n/**\n * Get the String base directory for converting this document.\n *\n * Defaults to directory of the source file.\n * If the source is a string, defaults to the current directory.\n * @returns {string}\n * @memberof Document\n */\nDocument.prototype.getBaseDir = function () {\n return this.base_dir\n}\n\n/**\n * Get the JSON of resolved options used to initialize this {Document}.\n * @returns {Object}\n * @memberof Document\n */\nDocument.prototype.getOptions = function () {\n return fromHash(this.options)\n}\n\n/**\n * Get the outfilesuffix defined at the end of the header.\n * @returns {string}\n * @memberof Document\n */\nDocument.prototype.getOutfilesuffix = function () {\n return this.outfilesuffix\n}\n\n/**\n * Get a reference to the parent Document of this nested document.\n * @returns {Document|undefined}\n * @memberof Document\n */\nDocument.prototype.getParentDocument = function () {\n var parentDocument = this.parent_document\n return parentDocument === Opal.nil ? undefined : parentDocument\n}\n\n/**\n * Get the {Reader} associated with this document.\n * @returns {Object}\n * @memberof Document\n */\nDocument.prototype.getReader = function () {\n return this.reader\n}\n\n/**\n * Get the {Converter} instance being used to convert the current {Document}.\n * @returns {Object}\n * @memberof Document\n */\nDocument.prototype.getConverter = function () {\n return this.converter\n}\n\n/**\n * Get the activated {Extensions.Registry} associated with this document.\n * @returns {Extensions/Registry}\n * @memberof Document\n */\nDocument.prototype.getExtensions = function () {\n var extensions = this.extensions\n return extensions === Opal.nil ? undefined : extensions\n}\n\n// Document.Title API\n\n/**\n * A partitioned title (i.e., title & subtitle).\n * @namespace\n * @module Document/Title\n */\nvar Title = Document.Title\n\n/**\n * @returns {string}\n * @memberof Document/Title\n */\nTitle.prototype.getMain = function () {\n return this.main\n}\n\n/**\n * @returns {string}\n * @memberof Document/Title\n */\nTitle.prototype.getCombined = function () {\n return this.combined\n}\n\n/**\n * @returns {string}\n * @memberof Document/Title\n */\nTitle.prototype.getSubtitle = function () {\n var subtitle = this.subtitle\n return subtitle === Opal.nil ? undefined : subtitle\n}\n\n/**\n * @returns {boolean}\n * @memberof Document/Title\n */\nTitle.prototype.isSanitized = function () {\n var sanitized = this['$sanitized?']()\n return sanitized === Opal.nil ? false : sanitized\n}\n\n/**\n * @returns {boolean}\n * @memberof Document/Title\n */\nTitle.prototype.hasSubtitle = function () {\n return this['$subtitle?']()\n}\n\n// Inline API\n\n/**\n * Methods for managing inline elements in AsciiDoc block.\n * @namespace\n * @extends AbstractNode\n */\nvar Inline = Opal.Asciidoctor.Inline\n\n/**\n * Create a new Inline element.\n * @param {AbstractBlock} parent\n * @param {string} context\n * @param {string|undefined} text\n * @param {Object|undefined} opts\n * @returns {Inline} - a new Inline element\n * @memberof Inline\n */\nInline.create = function (parent, context, text, opts) {\n return this.$new(parent, context, text, prepareOptions(opts))\n}\n\n/**\n * Get the converted content for this inline node.\n *\n * @returns {string} - the converted String content for this inline node\n * @memberof Inline\n */\nInline.prototype.convert = function () {\n return this.$convert()\n}\n\n/**\n * Get the converted String text of this Inline node, if applicable.\n *\n * @returns {string|undefined} - the converted String text for this Inline node, or undefined if not applicable for this node.\n * @memberof Inline\n */\nInline.prototype.getText = function () {\n var text = this.$text()\n return text === Opal.nil ? undefined : text\n}\n\n/**\n * Get the String sub-type (aka qualifier) of this Inline node.\n *\n * This value is used to distinguish different variations of the same node\n * category, such as different types of anchors.\n *\n * @returns {string} - the string sub-type of this Inline node.\n * @memberof Inline\n */\nInline.prototype.getType = function () {\n return this.$type()\n}\n\n/**\n * Get the primary String target of this Inline node.\n *\n * @returns {string|undefined} - the string target of this Inline node.\n * @memberof Inline\n */\nInline.prototype.getTarget = function () {\n var target = this.$target()\n return target === Opal.nil ? undefined : target\n}\n\n/**\n * Returns the converted alt text for this inline image.\n *\n * @returns {string} - the String value of the alt attribute.\n * @memberof Inline\n */\nInline.prototype.getAlt = function () {\n return this.$alt()\n}\n\n// List API\n\n/**\n * Methods for managing AsciiDoc lists (ordered, unordered and description lists).\n * @namespace\n * @extends AbstractBlock\n */\nvar List = Opal.Asciidoctor.List\n\n/**\n * Checks if the {@link List} contains any child {@link ListItem}.\n *\n * @memberof List\n * @returns {boolean} - whether the {@link List} has child {@link ListItem}.\n */\nList.prototype.hasItems = function () {\n return this['$items?']()\n}\n\n/**\n * Get the Array of {@link ListItem} nodes for this {@link List}.\n *\n * @returns {Array<ListItem>} - an Array of {@link ListItem} nodes.\n * @memberof List\n */\nList.prototype.getItems = function () {\n return this.blocks\n}\n\n// ListItem API\n\n/**\n * Methods for managing items for AsciiDoc olists, ulist, and dlists.\n *\n * In a description list (dlist), each item is a tuple that consists of a 2-item Array of ListItem terms and a ListItem description (i.e., [[term, term, ...], desc].\n * If a description is not set, then the second entry in the tuple is nil.\n * @namespace\n * @extends AbstractBlock\n */\nvar ListItem = Opal.Asciidoctor.ListItem\n\n/**\n * Get the converted String text of this {@link ListItem} node.\n *\n * @returns {string} - the converted String text for this {@link ListItem} node.\n * @memberof ListItem\n */\nListItem.prototype.getText = function () {\n return this.$text()\n}\n\n/**\n * Set the String source text of this {@link ListItem} node.\n *\n * @returns {string} - the new String text assigned to this {@link ListItem}\n * @memberof ListItem\n */\nListItem.prototype.setText = function (text) {\n return this['$text='](text)\n}\n\n/**\n * A convenience method that checks whether the text of this {@link ListItem} is not blank (i.e. not undefined or empty string).\n *\n * @returns {boolean} - whether the text is not blank\n * @memberof ListItem\n */\nListItem.prototype.hasText = function () {\n return this['$text?']()\n}\n\n/**\n * Get the {string} used to mark this {@link ListItem}.\n *\n * @returns {string}\n * @memberof ListItem\n */\nListItem.prototype.getMarker = function () {\n return this.marker\n}\n\n/**\n * Set the {string} used to mark this {@link ListItem}.\n *\n * @param {string} marker - the {string} used to mark this {@link ListItem}\n * @memberof ListItem\n */\nListItem.prototype.setMarker = function (marker) {\n this.marker = marker\n}\n\n/**\n * Get the {@link List} to which this {@link ListItem} is attached.\n *\n * @returns {List} - the {@link List} object to which this {@link ListItem} is attached,\n * or undefined if this node has no parent.\n * @memberof ListItem\n */\nListItem.prototype.getList = function () {\n return this.$list()\n}\n\n/**\n * @see {@link ListItem#getList}\n * @memberof ListItem\n */\nListItem.prototype.getParent = ListItem.prototype.getList\n\n// Reader API\n\n/** @namespace */\nvar Reader = Opal.Asciidoctor.Reader\n\n/**\n * Push source onto the front of the reader and switch the context based on the file, document-relative path and line information given.\n *\n * This method is typically used in an IncludeProcessor to add source read from the target specified.\n *\n * @param {string} data\n * @param {string|undefined} file\n * @param {string|undefined} path\n * @param {number} lineno - The line number\n * @param {Object} attributes - a JSON of attributes\n * @returns {Reader} - this {Reader} object.\n * @memberof Reader\n */\nReader.prototype.pushInclude = function (data, file, path, lineno, attributes) {\n return this.$push_include(data, file, path, lineno, toHash(attributes))\n}\n\n/**\n * Get the current location of the reader's cursor, which encapsulates the file, dir, path, and lineno of the file being read.\n *\n * @returns {Cursor}\n * @memberof Reader\n */\nReader.prototype.getCursor = function () {\n return this.$cursor()\n}\n\n/**\n * Get the remaining unprocessed lines, without consuming them, as an {Array} of {string}.\n *\n * Lines will not be consumed from the Reader (ie. you will be able to read these lines again).\n *\n * @returns {Array<string>} - the remaining unprocessed lines as an {Array} of {string}.\n * @memberof Reader\n */\nReader.prototype.getLines = function () {\n return this.$lines()\n}\n\n/**\n * Get the remaining unprocessed lines, without consuming them, as a {string}.\n *\n * Lines will not be consumed from the Reader (ie. you will be able to read these lines again).\n *\n * @returns {string} - the remaining unprocessed lines as a {string} (joined by linefeed characters).\n * @memberof Reader\n */\nReader.prototype.getString = function () {\n return this.$string()\n}\n\n/**\n * Check whether there are any lines left to read.\n * If a previous call to this method resulted in a value of false, immediately returned the cached value.\n * Otherwise, delegate to peekLine to determine if there is a next line available.\n *\n * @returns {boolean} - true if there are more lines, false if there are not.\n * @memberof Reader\n */\nReader.prototype.hasMoreLines = function () {\n return this['$has_more_lines?']()\n}\n\n/**\n * Check whether this reader is empty (contains no lines).\n *\n * @returns {boolean} - true if there are no more lines to peek, otherwise false.\n * @memberof Reader\n */\nReader.prototype.isEmpty = function () {\n return this['$empty?']()\n}\n\n/**\n * Peek at the next line.\n * Processes the line if not already marked as processed, but does not consume it (ie. you will be able to read this line again).\n *\n * This method will probe the reader for more lines.\n * If there is a next line that has not previously been visited, the line is passed to the Reader#processLine method to be initialized.\n * This call gives sub-classes the opportunity to do preprocessing.\n * If the return value of the Reader#processLine is undefined, the data is assumed to be changed and Reader#peekLine is invoked again to perform further processing.\n *\n * If hasMoreLines is called immediately before peekLine, the direct flag is implicitly true (since the line is flagged as visited).\n *\n * @param {boolean} direct - A {boolean} flag to bypasses the check for more lines and immediately returns the first element of the internal lines {Array}. (default: false)\n * @returns {string} - the next line as a {string} if there are lines remaining.\n * @memberof Reader\n */\nReader.prototype.peekLine = function (direct) {\n direct = direct || false\n var line = this.$peek_line(direct)\n return line === Opal.nil ? undefined : line\n}\n\n/**\n * Consume, preprocess, and return the next line.\n *\n * Line will be consumed from the Reader (ie. you won't be able to read this line again).\n *\n * @returns {string} - the next line as a {string} if data is present.\n * @memberof Reader\n */\nReader.prototype.readLine = function () {\n var line = this.$read_line()\n return line === Opal.nil ? undefined : line\n}\n\n/**\n * Consume, preprocess, and return the remaining lines.\n *\n * This method calls Reader#readLine repeatedly until all lines are consumed and returns the lines as an {Array} of {string}.\n * This method differs from Reader#getLines in that it processes each line in turn, hence triggering any preprocessors implemented in sub-classes.\n *\n * Lines will be consumed from the Reader (ie. you won't be able to read these lines again).\n *\n * @returns {Array<string>} - the lines read as an {Array} of {string}.\n * @memberof Reader\n */\nReader.prototype.readLines = function () {\n return this.$read_lines()\n}\n\n/**\n * Consume, preprocess, and return the remaining lines joined as a {string}.\n *\n * Delegates to Reader#readLines, then joins the result.\n *\n * Lines will be consumed from the Reader (ie. you won't be able to read these lines again).\n *\n * @returns {string} - the lines read joined as a {string}\n * @memberof Reader\n */\nReader.prototype.read = function () {\n return this.$read()\n}\n\n/**\n * Advance to the next line by discarding the line at the front of the stack.\n *\n * @returns {boolean} - a Boolean indicating whether there was a line to discard.\n * @memberof Reader\n */\nReader.prototype.advance = function () {\n return this.$advance()\n}\n\n// Cursor API\n\n/** @namespace */\nvar Cursor = Opal.Asciidoctor.Reader.Cursor\n\n/**\n * Get the file associated to the cursor.\n * @returns {string|undefined}\n * @memberof Cursor\n */\nCursor.prototype.getFile = function () {\n var file = this.file\n return file === Opal.nil ? undefined : file\n}\n\n/**\n * Get the directory associated to the cursor.\n * @returns {string|undefined} - the directory associated to the cursor\n * @memberof Cursor\n */\nCursor.prototype.getDirectory = function () {\n var dir = this.dir\n return dir === Opal.nil ? undefined : dir\n}\n\n/**\n * Get the path associated to the cursor.\n * @returns {string|undefined} - the path associated to the cursor (or '<stdin>')\n * @memberof Cursor\n */\nCursor.prototype.getPath = function () {\n var path = this.path\n return path === Opal.nil ? undefined : path\n}\n\n/**\n * Get the line number of the cursor.\n * @returns {number|undefined} - the line number of the cursor\n * @memberof Cursor\n */\nCursor.prototype.getLineNumber = function () {\n return this.lineno\n}\n\n// Logger API (available in Asciidoctor 1.5.7+)\n\nfunction initializeLoggerFormatterClass (className, functions) {\n var superclass = Opal.const_get_qualified(Opal.Logger, 'Formatter')\n return initializeClass(superclass, className, functions, {}, {\n call: function (args) {\n for (var i = 0; i < args.length; i++) {\n // convert all (Opal) Hash arguments to JSON.\n if (typeof args[i] === 'object' && '$$smap' in args[i]) {\n args[i] = fromHash(args[i])\n }\n }\n return args\n }\n })\n}\n\nfunction initializeLoggerClass (className, functions) {\n var superClass = Opal.const_get_qualified(Opal.Asciidoctor, 'Logger')\n return initializeClass(superClass, className, functions, {}, {\n add: function (args) {\n if (args.length >= 2 && typeof args[2] === 'object' && '$$smap' in args[2]) {\n var message = args[2]\n var messageObject = fromHash(message)\n messageObject.getText = function () {\n return this.text\n }\n messageObject.getSourceLocation = function () {\n return this.source_location\n }\n messageObject.$inspect = function () {\n var sourceLocation = this.getSourceLocation()\n if (sourceLocation) {\n return sourceLocation.getPath() + ': line ' + sourceLocation.getLineNumber() + ': ' + this.getText()\n } else {\n return this.getText()\n }\n }\n args[2] = messageObject\n }\n if (args.length >= 1) {\n args[1] = args[1] === Opal.nil ? undefined : args[1]\n }\n return args\n }\n })\n}\n\n/**\n * @namespace\n */\nvar LoggerManager = Opal.const_get_qualified(Opal.Asciidoctor, 'LoggerManager', true)\n\n// Alias\nOpal.Asciidoctor.LoggerManager = LoggerManager\n\n/**\n * @memberof LoggerManager\n */\nLoggerManager.getLogger = function () {\n return this.$logger()\n}\n\n/**\n * @memberof LoggerManager\n */\nLoggerManager.setLogger = function (logger) {\n this['$logger='](logger)\n}\n\n/**\n * @memberof LoggerManager\n */\nLoggerManager.newLogger = function (name, functions) {\n return initializeLoggerClass(name, functions).$new()\n}\n\n/**\n * @memberof LoggerManager\n */\nLoggerManager.newFormatter = function (name, functions) {\n return initializeLoggerFormatterClass(name, functions).$new()\n}\n\n/**\n * @namespace\n */\nvar LoggerSeverity = Opal.const_get_qualified(Opal.Logger, 'Severity', true)\n\n// Alias\nOpal.Asciidoctor.LoggerSeverity = LoggerSeverity\n\n/**\n * @memberof LoggerSeverity\n */\nLoggerSeverity.get = function (severity) {\n return LoggerSeverity.$constants()[severity]\n}\n\n/**\n * @namespace\n */\nvar LoggerFormatter = Opal.const_get_qualified(Opal.Logger, 'Formatter', true)\n\n// Alias\nOpal.Asciidoctor.LoggerFormatter = LoggerFormatter\n\n/**\n * @memberof LoggerFormatter\n */\nLoggerFormatter.prototype.call = function (severity, time, programName, message) {\n return this.$call(LoggerSeverity.get(severity), time, programName, message)\n}\n\n/**\n * @namespace\n */\nvar MemoryLogger = Opal.const_get_qualified(Opal.Asciidoctor, 'MemoryLogger', true)\n\n// Alias\nOpal.Asciidoctor.MemoryLogger = MemoryLogger\n\n/**\n * Create a new MemoryLogger.\n * @returns {MemoryLogger} - a MemoryLogger\n * @memberof MemoryLogger\n */\nMemoryLogger.create = function () {\n return this.$new()\n}\n\n/**\n * @returns {Array<Object>} - a list of messages\n * @memberof MemoryLogger\n */\nMemoryLogger.prototype.getMessages = function () {\n var messages = this.messages\n var result = []\n for (var i = 0; i < messages.length; i++) {\n var message = messages[i]\n var messageObject = fromHash(message)\n if (typeof messageObject.message === 'string') {\n messageObject.getText = function () {\n return this.message\n }\n } else {\n // also convert the message attribute\n messageObject.message = fromHash(messageObject.message)\n messageObject.getText = function () {\n return this.message.text\n }\n }\n messageObject.getSeverity = function () {\n return this.severity.toString()\n }\n messageObject.getSourceLocation = function () {\n return this.message.source_location\n }\n result.push(messageObject)\n }\n return result\n}\n\nvar Logging = Opal.const_get_qualified(Opal.Asciidoctor, 'Logging', true)\n\nOpal.Asciidoctor.Logging = Logging\n\nLogging.getLogger = function () {\n return LoggerManager.$logger()\n}\n\nLogging.createLogMessage = function (text, context) {\n return Logging.prototype.$message_with_context(text, toHash(context))\n}\n\n// alias\n\n/**\n * @memberof Reader\n */\nReader.prototype.getLogger = Logging.getLogger\n/**\n * @memberof Reader\n */\nReader.prototype.createLogMessage = Logging.createLogMessage\n\n/**\n * @memberof AbstractNode\n */\nAbstractNode.prototype.getLogger = Logging.getLogger\n/**\n * @memberof AbstractNode\n */\nAbstractNode.prototype.createLogMessage = Logging.createLogMessage\n\n/**\n * @namespace\n */\nvar Logger = Opal.const_get_qualified(Opal.Asciidoctor, 'Logger', true)\n\n// Alias\nOpal.Asciidoctor.Logger = Logger\n\n/**\n * @returns {number|undefined} - the maximum severity\n * @memberof Logger\n */\nLogger.prototype.getMaxSeverity = function () {\n var result = this.max_severity\n return result === Opal.nil ? undefined : result\n}\n/**\n * @returns {LoggerFormatter} - the formatter\n * @memberof Logger\n */\nLogger.prototype.getFormatter = function () {\n return this.formatter\n}\n/**\n * @param {LoggerFormatter} formatter - the formatter\n * @memberof Logger\n */\nLogger.prototype.setFormatter = function (formatter) {\n this.formatter = formatter\n}\n/**\n * @returns {number} - the logging severity threshold\n * @memberof Logger\n */\nLogger.prototype.getLevel = function () {\n return this.level\n}\n/**\n * @param {number} level - the logging severity threshold\n * @memberof Logger\n */\nLogger.prototype.setLevel = function (level) {\n this.level = level\n}\n/**\n * @returns {string} - the program name\n * @memberof Logger\n */\nLogger.prototype.getProgramName = function () {\n return this.progname\n}\n/**\n * @param {string} programName - the program name\n * @memberof Logger\n */\nLogger.prototype.setProgramName = function (programName) {\n this.progname = programName\n}\n\nvar RubyLogger = Opal.const_get_qualified('::', 'Logger')\n\nvar log = function (logger, level, message) {\n logger['$' + level](message)\n}\nRubyLogger.prototype.add = function (severity, message, programName) {\n var severityValue = typeof severity === 'string' ? LoggerSeverity[severity.toUpperCase()] : severity\n this.$add(severityValue, message, programName)\n}\nRubyLogger.prototype.log = RubyLogger.prototype.add\nRubyLogger.prototype.debug = function (message) {\n log(this, 'debug', message)\n}\nRubyLogger.prototype.info = function (message) {\n log(this, 'info', message)\n}\nRubyLogger.prototype.warn = function (message) {\n log(this, 'warn', message)\n}\nRubyLogger.prototype.error = function (message) {\n log(this, 'error', message)\n}\nRubyLogger.prototype.fatal = function (message) {\n log(this, 'fatal', message)\n}\nRubyLogger.prototype.isDebugEnabled = function () {\n return this['$debug?']()\n}\nRubyLogger.prototype.isInfoEnabled = function () {\n return this['$info?']()\n}\nRubyLogger.prototype.isWarnEnabled = function () {\n return this['$warn?']()\n}\nRubyLogger.prototype.isErrorEnabled = function () {\n return this['$error?']()\n}\nRubyLogger.prototype.isFatalEnabled = function () {\n return this['$fatal?']()\n}\n\n/**\n * @namespace\n */\nvar NullLogger = Opal.const_get_qualified(Opal.Asciidoctor, 'NullLogger', true)\n\n// Alias\nOpal.Asciidoctor.NullLogger = NullLogger\n\n/**\n * Create a new NullLogger.\n * @returns {NullLogger} - a NullLogger\n * @memberof NullLogger\n */\nNullLogger.create = function () {\n return this.$new()\n}\n\n/**\n * @returns {number|undefined} - the maximum severity\n * @memberof NullLogger\n */\nNullLogger.prototype.getMaxSeverity = function () {\n return this.max_severity\n}\n\n// Alias\nOpal.Asciidoctor.StopIteration = Opal.StopIteration\n\n/**\n * @namespace\n */\nvar Timings = Opal.const_get_qualified(Opal.Asciidoctor, 'Timings', true)\n\n// Alias\nOpal.Asciidoctor.Timings = Timings\n\n/**\n * Create a new Timings.\n * @returns {Timings} - a Timings\n * @memberof Timings\n */\nTimings.create = function () {\n return this.$new()\n}\n\n/**\n * Print a report to the specified output.\n * The report will include:\n * - the time to read and parse source\n * - the time to convert document\n * - the total time (read, parse and convert)\n * @param {RubyLogger|console|Object} [to] - an optional output (by default stdout)\n * @param {string} [subject] - an optional subject (usually the file name)\n * @memberof Timings\n */\nTimings.prototype.printReport = function (to, subject) {\n var outputFunction\n if (to) {\n if (typeof to.$add === 'function') {\n outputFunction = function (message) {\n to.$add(1, message)\n }\n } else if (typeof to.log === 'function') {\n outputFunction = to.log\n } else if (typeof to.write === 'function') {\n outputFunction = function (message) {\n to.write(message, 'utf-8')\n }\n } else {\n throw new Error('The output should be a Stream (with a write function), an object with a log function or a Ruby Logger (with a add function)')\n }\n } else {\n outputFunction = function (message) {\n Opal.gvars.stdout.$write(message)\n }\n }\n if (subject) {\n outputFunction('Input file: ' + subject)\n }\n outputFunction(' Time to read and parse source: ' + this.$read_parse().toFixed(2))\n outputFunction(' Time to convert document: ' + this.$convert().toFixed(2))\n outputFunction(' Total time (read, parse and convert): ' + this.$read_parse_convert().toFixed(2))\n}\n\n/**\n * @namespace\n * @description\n * This API is experimental and subject to change.\n *\n * A pluggable adapter for integrating a syntax (aka code) highlighter into AsciiDoc processing.\n *\n * There are two types of syntax highlighter adapters. The first performs syntax highlighting during the convert phase.\n * This adapter type must define a \"handlesHighlighting\" method that returns true.\n * The companion \"highlight\" method will then be called to handle the \"specialcharacters\" substitution for source blocks.\n *\n * The second assumes syntax highlighting is performed on the client (e.g., when the HTML document is loaded).\n * This adapter type must define a \"hasDocinfo\" method that returns true.\n * The companion \"docinfo\" method will then be called to insert markup into the output document.\n * The docinfo functionality is available to both adapter types.\n *\n * Asciidoctor.js provides several a built-in adapter for highlight.js.\n * Additional adapters can be registered using SyntaxHighlighter.register.\n */\nvar SyntaxHighlighter = Opal.const_get_qualified(Opal.Asciidoctor, 'SyntaxHighlighter', true)\n\n// Alias\nOpal.Asciidoctor.SyntaxHighlighter = SyntaxHighlighter\n\n/**\n * Associates the syntax highlighter class or object with the specified names.\n *\n * @description This API is experimental and subject to change.\n *\n * @param {string|Array} names - A {string} name or an {Array} of {string} names\n * @param functions - A list of functions representing a {SyntaxHighlighter} or a {SyntaxHighlighter} class to instantiate\n * @memberof SyntaxHighlighter\n */\nSyntaxHighlighter.register = function (names, functions) {\n var name = typeof names === 'string' ? names : names[0]\n if (typeof functions === 'function') {\n var classObject = functions\n var prototype = classObject.prototype\n var properties = Object.getOwnPropertyNames(prototype)\n functions = {}\n for (var propertyIdx in properties) {\n var propertyName = properties[propertyIdx]\n functions[propertyName] = prototype[propertyName]\n }\n }\n var scope = initializeClass(SyntaxHighlighterBase, name, functions, {}, {\n format: function (args) {\n if (args.length >= 2 && typeof args[2] === 'object' && '$$smap' in args[2]) {\n args[2] = fromHash(args[2])\n }\n if (args.length >= 1) {\n args[1] = args[1] === Opal.nil ? undefined : args[1]\n }\n return args\n },\n highlight: function (args) {\n if (args.length >= 3 && typeof args[3] === 'object' && '$$smap' in args[3]) {\n var opts = args[3]\n opts = fromHash(opts)\n for (var key in opts) {\n var value = opts[key]\n if (key === 'callouts') {\n var callouts = fromHashKeys(value)\n for (var idx in callouts) {\n var callout = callouts[idx]\n for (var i = 0; i < callout.length; i++) {\n var items = callout[i]\n for (var j = 0; j < items.length; j++) {\n items[j] = items[j] === Opal.nil ? undefined : items[j]\n }\n }\n }\n opts[key] = callouts\n } else {\n opts[key] = value === Opal.nil ? undefined : value\n }\n }\n args[3] = opts\n }\n if (args.length >= 2) {\n args[2] = args[2] === Opal.nil ? undefined : args[2]\n }\n return args\n }\n })\n for (var functionName in functions) {\n if (Object.prototype.hasOwnProperty.call(functions, functionName)) {\n (function (functionName) {\n var userFunction = functions[functionName]\n if (functionName === 'handlesHighlighting') {\n Opal.def(scope, '$highlight?', function () {\n return userFunction.call()\n })\n } else if (functionName === 'hasDocinfo') {\n Opal.def(scope, '$docinfo?', function (location) {\n return userFunction.apply(this, [location])\n })\n }\n }(functionName))\n }\n }\n Opal.def(scope, '$name', function () {\n return name\n })\n SyntaxHighlighter.$register(scope, names)\n return scope\n}\n\n/**\n * Retrieves the syntax highlighter class or object registered for the specified name.\n *\n * @description This API is experimental and subject to change.\n *\n * @param {string} name - The {string} name of the syntax highlighter to retrieve.\n * @returns {SyntaxHighlighter} - the {SyntaxHighlighter} registered for this name.\n * @memberof SyntaxHighlighter\n */\nSyntaxHighlighter.get = function (name) {\n var result = SyntaxHighlighter.$for(name)\n return result === Opal.nil ? undefined : result\n}\n\n/**\n * @deprecated Please use {SyntaxHighlighter#get} method as \"for\" is a reserved keyword.\n */\nSyntaxHighlighter.for = SyntaxHighlighter.get\n\n/**\n * @namespace\n */\nvar SyntaxHighlighterBase = Opal.const_get_qualified(SyntaxHighlighter, 'Base', true)\n\n// Alias\nOpal.Asciidoctor.SyntaxHighlighterBase = SyntaxHighlighterBase\n\n/**\n * Statically register the current class in the registry for the specified names.\n *\n * @description This API is experimental and subject to change.\n *\n * @param {string|Array<string>} names - A {string} name or an {Array} of {string} names\n * @memberof SyntaxHighlighterBase\n */\nSyntaxHighlighterBase.prototype.registerFor = function (names) {\n SyntaxHighlighter.$register(this, names)\n}\n\n// Table API\n\n/**\n * Methods for managing AsciiDoc tables.\n * @namespace\n * @extends AbstractBlock\n */\nvar Table = Opal.Asciidoctor.Table\n\n/**\n * Create a new Table element.\n * @param {AbstractBlock} parent\n * @param {Object|undefined} attributes\n * @returns {Table} - a new {Table} object\n */\nTable.create = function (parent, attributes) {\n return this.$new(parent, toHash(attributes))\n}\n\n/**\n * Get the caption of the table.\n * @returns {string}\n * @memberof Table\n */\nTable.prototype.getCaption = function () {\n return this.caption\n}\n\n/**\n * Get the rows of this table.\n * @returns {Table.Rows} - an {Table.Rows} object with the members \"head\", \"body\" and \"foot\"\n * @memberof Table\n */\nTable.prototype.getRows = function () {\n return this.rows\n}\n\n/**\n * Get the columns of this table.\n * @returns {Array<Column>}\n * @memberof Table\n */\nTable.prototype.getColumns = function () {\n return this.columns\n}\n\n/**\n * Get the head rows of this table.\n * @returns {Array<Array<Cell>>} - an Array of Array of Cell\n * @memberof Table\n */\nTable.prototype.getHeadRows = function () {\n return this.rows.head\n}\n\n/**\n * Check if the table has a head rows.\n * @returns {boolean}\n * @memberof Table\n */\nTable.prototype.hasHeadRows = function () {\n return this.rows !== Opal.nil && this.rows.head.length > 0\n}\n\n/**\n * Get the body rows of this table.\n * @returns {Array<Array<Cell>>} - an Array of Array of Cell\n * @memberof Table\n */\nTable.prototype.getBodyRows = function () {\n return this.rows.body\n}\n\n/**\n * Check if the table has a body rows.\n * @returns {boolean}\n */\nTable.prototype.hasBodyRows = function () {\n return this.rows !== Opal.nil && this.rows.body.length > 0\n}\n\n/**\n * Get the foot rows of this table.\n * @returns {Array<Array<Cell>>} - an Array of Array of Cell\n * @memberof Table\n */\nTable.prototype.getFootRows = function () {\n return this.rows.foot\n}\n\n/**\n * Check if the table has a foot rows.\n * @returns {boolean}\n */\nTable.prototype.hasFootRows = function () {\n return this.rows !== Opal.nil && this.rows.foot.length > 0\n}\n\n/**\n * Check if the table has a header option set.\n * @returns {boolean}\n * @memberof Table\n */\nTable.prototype.hasHeaderOption = function () {\n return this.has_header_option\n}\n\n/**\n * Check if the table has the footer option set.\n * @returns {boolean}\n * @memberof Table\n */\nTable.prototype.hasFooterOption = function () {\n var footerOption = this.getAttributes()['footer-option']\n return footerOption === ''\n}\n\n/**\n * Check if the table has the autowidth option set.\n * @returns {boolean}\n * @memberof Table\n */\nTable.prototype.hasAutowidthOption = function () {\n var autowidthOption = this.getAttributes()['autowidth-option']\n return autowidthOption === ''\n}\n\n/**\n * Get the number of rows in the table.\n * Please note that the header and footer rows are also counted.\n * @returns {number|undefined}\n * @memberof Table\n */\nTable.prototype.getRowCount = function () {\n return this.getAttribute('rowcount')\n}\n\n/**\n * Set the number of rows in the table.\n * Please note that the header and footer rows are also counted.\n * @param {number} value - the value\n * @memberof Table\n */\nTable.prototype.setRowCount = function (value) {\n this.setAttribute('rowcount', value)\n}\n\n/**\n * Get the number of columns in the table.\n * @returns {number|undefined}\n * @memberof Table\n */\nTable.prototype.getColumnCount = function () {\n return this.getAttribute('colcount')\n}\n\n/**\n * Set the number of columns in the table.\n * @param {number} value - the value\n * @memberof Table\n */\nTable.prototype.setColumnCount = function (value) {\n this.setAttribute('colcount', value)\n}\n\n// Rows\n\n/**\n * @namespace\n */\nvar Rows = Opal.Asciidoctor.Table.Rows\n\n/**\n * Create a new Rows element.\n * @param {array<array<Cell>>} head\n * @param {array<array<Cell>>} foot\n * @param {array<array<Cell>>} body\n * @returns Rows\n */\nRows.create = function (head, foot, body) {\n return this.$new(head, foot, body)\n}\n\n/**\n * Get head rows.\n * @returns {array<array<Cell>>}\n */\nRows.prototype.getHead = function () {\n return this.head\n}\n\n/**\n * Get foot rows.\n * @returns {array<array<Cell>>}\n */\nRows.prototype.getFoot = function () {\n return this.foot\n}\n\n/**\n * Get body rows.\n * @returns {array<array<Cell>>}\n */\nRows.prototype.getBody = function () {\n return this.body\n}\n\n/**\n * Retrieve the rows grouped by section as a nested Array.\n *\n * Creates a 2-dimensional array of two element entries.\n * The first element is the section name as a string.\n * The second element is the Array of rows in that section.\n * The entries are in document order (head, foot, body).\n * @returns {[[string, array<array<Cell>>], [string, array<array<Cell>>], [string, array<array<Cell>>]]}\n */\nRows.prototype.bySection = function () {\n return [['head', this.head], ['body', this.body], ['foot', this.foot]]\n}\n\n// Table Column\n\n/**\n * Methods to manage the columns of an AsciiDoc table.\n * In particular, it keeps track of the column specs.\n * @namespace\n * @extends AbstractNode\n */\nvar Column = Opal.Asciidoctor.Table.Column\n\n/**\n * Create a new Column element.\n * @param {Table} table\n * @param {number} index\n * @param {Object|undefined} attributes\n * @returns Column\n */\nColumn.create = function (table, index, attributes) {\n return this.$new(table, index, toHash(attributes))\n}\n\n/**\n * Get the column number of this cell.\n * @returns {number|undefined}\n * @memberof Column\n */\nColumn.prototype.getColumnNumber = function () {\n return this.getAttribute('colnumber')\n}\n\n/**\n * Get the width of this cell.\n * @returns {string|undefined}\n * @memberof Column\n */\nColumn.prototype.getWidth = function () {\n return this.getAttribute('width')\n}\n\n/**\n * Get the horizontal align of this cell.\n * @returns {string|undefined}\n * @memberof Column\n */\nColumn.prototype.getHorizontalAlign = function () {\n return this.getAttribute('halign')\n}\n\n/**\n * Get the vertical align of this cell.\n * @returns {string|undefined}\n * @memberof Column\n */\nColumn.prototype.getVerticalAlign = function () {\n return this.getAttribute('valign')\n}\n\n/**\n * Get the style of this cell.\n * @returns {string}\n * @memberof Column\n */\nColumn.prototype.getStyle = function () {\n var style = this.style\n return style === Opal.nil ? undefined : style\n}\n\n// Table Cell\n\n/**\n * Methods for managing the cells in an AsciiDoc table.\n * @namespace\n * @extends AbstractBlock\n */\nvar Cell = Opal.Asciidoctor.Table.Cell\n\n/**\n * Create a new Cell element\n * @param {Column} column\n * @param {string} cellText\n * @param {Object|undefined} attributes\n * @param {Object|undefined} opts\n * @returns {Cell}\n */\nCell.create = function (column, cellText, attributes, opts) {\n return this.$new(column, cellText, toHash(attributes), toHash(opts))\n}\n\n/**\n * Get the column span of this {@link Cell} node.\n * @returns {number} - An Integer of the number of columns this cell will span (default: undefined)\n * @memberof Cell\n */\nCell.prototype.getColumnSpan = function () {\n var colspan = this.colspan\n return colspan === Opal.nil ? undefined : colspan\n}\n\n/**\n * Set the column span of this {@link Cell} node.\n * @param {number} value\n * @returns {number} - The new colspan value\n * @memberof Cell\n */\nCell.prototype.setColumnSpan = function (value) {\n return this['$colspan='](value)\n}\n\n/**\n * Get the row span of this {@link Cell} node\n * @returns {number|undefined} - An Integer of the number of rows this cell will span (default: undefined)\n * @memberof Cell\n */\nCell.prototype.getRowSpan = function () {\n var rowspan = this.rowspan\n return rowspan === Opal.nil ? undefined : rowspan\n}\n\n/**\n * Set the row span of this {@link Cell} node\n * @param {number} value\n * @returns {number} - The new rowspan value\n * @memberof Cell\n */\nCell.prototype.setRowSpan = function (value) {\n return this['$rowspan='](value)\n}\n\n/**\n * Get the content of the cell.\n * This method should not be used for cells in the head row or that have the literal style.\n * @returns {string}\n * @memberof Cell\n */\nCell.prototype.getContent = function () {\n return this.$content()\n}\n\n/**\n * Get the text of the cell.\n * @returns {string}\n * @memberof Cell\n */\nCell.prototype.getText = function () {\n return this.$text()\n}\n\n/**\n * Get the source of the cell.\n * @returns {string}\n * @memberof Cell\n */\nCell.prototype.getSource = function () {\n return this.$source()\n}\n\n/**\n * Get the lines of the cell.\n * @returns {Array<string>}\n * @memberof Cell\n */\nCell.prototype.getLines = function () {\n return this.$lines()\n}\n\n/**\n * Get the line number of the cell.\n * @returns {number|undefined}\n * @memberof Cell\n */\nCell.prototype.getLineNumber = function () {\n var lineno = this.$lineno()\n return lineno === Opal.nil ? undefined : lineno\n}\n\n/**\n * Get the source file of the cell.\n * @returns {string|undefined}\n * @memberof Cell\n */\nCell.prototype.getFile = function () {\n var file = this.$file()\n return file === Opal.nil ? undefined : file\n}\n\n/**\n * Get the style of the cell.\n * @returns {string|undefined}\n * @memberof Cell\n */\nCell.prototype.getStyle = function () {\n var style = this.$style()\n return style === Opal.nil ? undefined : style\n}\n\n/**\n * Get the column of this cell.\n * @returns {Column|undefined}\n * @memberof Cell\n */\nCell.prototype.getColumn = function () {\n var column = this.$column()\n return column === Opal.nil ? undefined : column\n}\n\n/**\n * Get the width of this cell.\n * @returns {string|undefined}\n * @memberof Cell\n */\nCell.prototype.getWidth = function () {\n return this.getAttribute('width')\n}\n\n/**\n * Get the column width in percentage of this cell.\n * @returns {string|undefined}\n * @memberof Cell\n */\nCell.prototype.getColumnPercentageWidth = function () {\n return this.getAttribute('colpcwidth')\n}\n\n/**\n * Get the nested {Document} of this cell when style is 'asciidoc'.\n * @returns {Document|undefined} - the nested {Document}\n * @memberof Cell\n */\nCell.prototype.getInnerDocument = function () {\n var innerDocument = this.inner_document\n return innerDocument === Opal.nil ? undefined : innerDocument\n}\n\n// Templates\n\n/**\n * @description\n * This API is experimental and subject to change.\n *\n * Please note that this API is currently only available in a Node environment.\n * We recommend to use a custom converter if you are running in the browser.\n *\n * @namespace\n * @module Converter/TemplateConverter\n */\nvar TemplateConverter = Opal.Asciidoctor.Converter.TemplateConverter\n\nif (TemplateConverter) {\n // Alias\n Opal.Asciidoctor.TemplateConverter = TemplateConverter\n\n /**\n * Create a new TemplateConverter.\n * @param {string} backend - the backend name\n * @param templateDirectories - a list of template directories\n * @param {Object} opts - a JSON of options\n * @param {string} opts.template_engine - the name of the template engine\n * @param {Object} [opts.template_cache] - an optional template cache\n * @param {Object} [opts.template_cache.scans] - a JSON of template objects keyed by template name keyed by path patterns\n * @param {Object} [opts.template_cache.templates] - a JSON of template objects keyed by file paths\n * @returns {TemplateConverter}\n * @memberof Converter/TemplateConverter\n */\n TemplateConverter.create = function (backend, templateDirectories, opts) {\n if (opts && opts.template_cache) {\n opts.template_cache = toHash(opts.template_cache)\n }\n this.$new(backend, templateDirectories, toHash(opts))\n }\n\n /**\n * @returns {Object} - The global cache\n * @memberof Converter/TemplateConverter\n */\n TemplateConverter.getCache = function () {\n var caches = fromHash(this.caches)\n if (caches) {\n if (caches.scans) {\n caches.scans = fromHash(caches.scans)\n for (var key in caches.scans) {\n caches.scans[key] = fromHash(caches.scans[key])\n }\n }\n if (caches.templates) {\n caches.templates = fromHash(caches.templates)\n }\n }\n return caches\n }\n\n /**\n * Clear the global cache.\n * @memberof Converter/TemplateConverter\n */\n TemplateConverter.clearCache = function () {\n this.$clear_caches()\n }\n\n /**\n * Convert an {AbstractNode} to the backend format using the named template.\n *\n * Looks for a template that matches the value of the template name or,\n * if the template name is not specified, the value of the {@see AbstractNode.getNodeName} function.\n *\n * @param {AbstractNode} node - the AbstractNode to convert\n * @param {string} templateName - the {string} name of the template to use, or the node name of the node if a template name is not specified. (optional, default: undefined)\n * @param {Object} opts - an optional JSON that is passed as local variables to the template. (optional, default: undefined)\n * @returns {string} - The {string} result from rendering the template\n * @memberof Converter/TemplateConverter\n */\n TemplateConverter.prototype.convert = function (node, templateName, opts) {\n return this.$convert(node, templateName, toHash(opts))\n }\n\n /**\n * Checks whether there is a template registered with the specified name.\n *\n * @param {string} name - the {string} template name\n * @returns {boolean} - a {boolean} that indicates whether a template is registered for the specified template name.\n * @memberof Converter/TemplateConverter\n */\n TemplateConverter.prototype.handles = function (name) {\n return this['$handles?'](name)\n }\n\n /**\n * Retrieves the templates that this converter manages.\n *\n * @returns {Object} - a JSON of template objects keyed by template name\n * @memberof Converter/TemplateConverter\n */\n TemplateConverter.prototype.getTemplates = function () {\n return fromHash(this.$templates())\n }\n\n /**\n * Registers a template with this converter.\n *\n * @param {string} name - the {string} template name\n * @param {Object} template - the template object to register\n * @returns {Object} - the template object\n * @memberof Converter/TemplateConverter\n */\n TemplateConverter.prototype.register = function (name, template) {\n return this.$register(name, template)\n }\n\n /**\n * @namespace\n * @description\n * This API is experimental and subject to change.\n *\n * Please note that this API is currently only available in a Node environment.\n * We recommend to use a custom converter if you are running in the browser.\n *\n * A pluggable adapter for integrating a template engine into the built-in template converter.\n */\n var TemplateEngine = {}\n TemplateEngine.registry = {}\n\n // Alias\n Opal.Asciidoctor.TemplateEngine = TemplateEngine\n\n /**\n * Register a template engine adapter for the given names.\n * @param {string|Array} names - a {string} name or an {Array} of {string} names\n * @param {Object} templateEngineAdapter - a template engine adapter instance\n * @example\n * const fs = require('fs')\n * class DotTemplateEngineAdapter {\n * constructor () {\n * this.doT = require('dot')\n * }\n * compile (file, _) {\n * const templateFn = this.doT.template(fs.readFileSync(file, 'utf8'))\n * return {\n * render: templateFn\n * }\n * }\n * }\n * asciidoctor.TemplateEngine.register('dot, new DotTemplateEngineAdapter())\n * @memberof TemplateEngine\n */\n TemplateEngine.register = function (names, templateEngineAdapter) {\n if (typeof names === 'string') {\n this.registry[names] = templateEngineAdapter\n } else {\n // array\n for (var i = 0; i < names.length; i++) {\n var name = names[i]\n this.registry[name] = templateEngineAdapter\n }\n }\n }\n}\n\n/* global Opal, fromHash, toHash, initializeClass */\n// Extensions API\n\n/**\n * @private\n */\nvar toBlock = function (block) {\n // arity is a mandatory field\n block.$$arity = block.length\n return block\n}\n\nvar registerExtension = function (registry, type, processor, name) {\n if (typeof processor === 'object' || processor.$$is_class) {\n // processor is an instance or a class\n return registry['$' + type](processor, name)\n } else {\n // processor is a function/lambda\n return Opal.send(registry, type, name && [name], toBlock(processor))\n }\n}\n\n/**\n * @namespace\n * @description\n * Extensions provide a way to participate in the parsing and converting\n * phases of the AsciiDoc processor or extend the AsciiDoc syntax.\n *\n * The various extensions participate in AsciiDoc processing as follows:\n *\n * 1. After the source lines are normalized, {{@link Extensions/Preprocessor}}s modify or replace\n * the source lines before parsing begins. {{@link Extensions/IncludeProcessor}}s are used to\n * process include directives for targets which they claim to handle.\n * 2. The Parser parses the block-level content into an abstract syntax tree.\n * Custom blocks and block macros are processed by associated {{@link Extensions/BlockProcessor}}s\n * and {{@link Extensions/BlockMacroProcessor}}s, respectively.\n * 3. {{@link Extensions/TreeProcessor}}s are run on the abstract syntax tree.\n * 4. Conversion of the document begins, at which point inline markup is processed\n * and converted. Custom inline macros are processed by associated {InlineMacroProcessor}s.\n * 5. {{@link Extensions/Postprocessor}}s modify or replace the converted document.\n * 6. The output is written to the output stream.\n *\n * Extensions may be registered globally using the {Extensions.register} method\n * or added to a custom {Registry} instance and passed as an option to a single\n * Asciidoctor processor.\n *\n * @example\n * asciidoctor.Extensions.register(function () {\n * this.block(function () {\n * var self = this;\n * self.named('shout');\n * self.onContext('paragraph');\n * self.process(function (parent, reader) {\n * var lines = reader.getLines().map(function (l) { return l.toUpperCase(); });\n * return self.createBlock(parent, 'paragraph', lines);\n * });\n * });\n * });\n */\nvar Extensions = Opal.const_get_qualified(Opal.Asciidoctor, 'Extensions')\n\n// Alias\nOpal.Asciidoctor.Extensions = Extensions\n\n/**\n * Create a new {@link Extensions/Registry}.\n * @param {string} name\n * @param {function} block\n * @memberof Extensions\n * @returns {Extensions/Registry} - returns a {@link Extensions/Registry}\n */\nExtensions.create = function (name, block) {\n if (typeof name === 'function' && typeof block === 'undefined') {\n return Opal.send(this, 'create', null, toBlock(name))\n } else if (typeof block === 'function') {\n return Opal.send(this, 'create', [name], toBlock(block))\n } else {\n return this.$create()\n }\n}\n\n/**\n * @memberof Extensions\n */\nExtensions.register = function (name, block) {\n if (typeof name === 'function' && typeof block === 'undefined') {\n return Opal.send(this, 'register', null, toBlock(name))\n } else {\n return Opal.send(this, 'register', [name], toBlock(block))\n }\n}\n\n/**\n * Get statically-registered extension groups.\n * @memberof Extensions\n */\nExtensions.getGroups = function () {\n return fromHash(this.$groups())\n}\n\n/**\n * Unregister all statically-registered extension groups.\n * @memberof Extensions\n */\nExtensions.unregisterAll = function () {\n this.$unregister_all()\n}\n\n/**\n * Unregister the specified statically-registered extension groups.\n *\n * NOTE Opal cannot delete an entry from a Hash that is indexed by symbol, so\n * we have to resort to using low-level operations in this method.\n *\n * @memberof Extensions\n */\nExtensions.unregister = function () {\n var names = Array.prototype.concat.apply([], arguments)\n var groups = this.$groups()\n var groupNameIdx = {}\n for (var i = 0, groupSymbolNames = groups.$$keys; i < groupSymbolNames.length; i++) {\n var groupSymbolName = groupSymbolNames[i]\n groupNameIdx[groupSymbolName.toString()] = groupSymbolName\n }\n for (var j = 0; j < names.length; j++) {\n var groupStringName = names[j]\n if (groupStringName in groupNameIdx) Opal.hash_delete(groups, groupNameIdx[groupStringName])\n }\n}\n\n/**\n * @namespace\n * @module Extensions/Registry\n */\nvar Registry = Extensions.Registry\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.getGroups = Extensions.getGroups\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.unregisterAll = function () {\n this.groups = Opal.hash()\n}\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.unregister = Extensions.unregister\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.prefer = function (name, processor) {\n if (arguments.length === 1) {\n processor = name\n name = null\n }\n if (typeof processor === 'object' || processor.$$is_class) {\n // processor is an instance or a class\n return this.$prefer(name, processor)\n } else {\n // processor is a function/lambda\n return Opal.send(this, 'prefer', name && [name], toBlock(processor))\n }\n}\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.block = function (name, processor) {\n if (arguments.length === 1) {\n processor = name\n name = null\n }\n return registerExtension(this, 'block', processor, name)\n}\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.inlineMacro = function (name, processor) {\n if (arguments.length === 1) {\n processor = name\n name = null\n }\n return registerExtension(this, 'inline_macro', processor, name)\n}\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.includeProcessor = function (name, processor) {\n if (arguments.length === 1) {\n processor = name\n name = null\n }\n return registerExtension(this, 'include_processor', processor, name)\n}\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.blockMacro = function (name, processor) {\n if (arguments.length === 1) {\n processor = name\n name = null\n }\n return registerExtension(this, 'block_macro', processor, name)\n}\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.treeProcessor = function (name, processor) {\n if (arguments.length === 1) {\n processor = name\n name = null\n }\n return registerExtension(this, 'tree_processor', processor, name)\n}\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.postprocessor = function (name, processor) {\n if (arguments.length === 1) {\n processor = name\n name = null\n }\n return registerExtension(this, 'postprocessor', processor, name)\n}\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.preprocessor = function (name, processor) {\n if (arguments.length === 1) {\n processor = name\n name = null\n }\n return registerExtension(this, 'preprocessor', processor, name)\n}\n\n/**\n * @memberof Extensions/Registry\n */\nRegistry.prototype.docinfoProcessor = function (name, processor) {\n if (arguments.length === 1) {\n processor = name\n name = null\n }\n return registerExtension(this, 'docinfo_processor', processor, name)\n}\n\n/**\n * Checks whether any {{@link Extensions/Preprocessor}} extensions have been registered.\n *\n * @memberof Extensions/Registry\n * @returns a {boolean} indicating whether any {{@link Extensions/Preprocessor}} extensions are registered.\n */\nRegistry.prototype.hasPreprocessors = function () {\n return this['$preprocessors?']()\n}\n\n/**\n * Checks whether any {{@link Extensions/TreeProcessor}} extensions have been registered.\n *\n * @memberof Extensions/Registry\n * @returns a {boolean} indicating whether any {{@link Extensions/TreeProcessor}} extensions are registered.\n */\nRegistry.prototype.hasTreeProcessors = function () {\n return this['$tree_processors?']()\n}\n\n/**\n * Checks whether any {{@link Extensions/IncludeProcessor}} extensions have been registered.\n *\n * @memberof Extensions/Registry\n * @returns a {boolean} indicating whether any {{@link Extensions/IncludeProcessor}} extensions are registered.\n */\nRegistry.prototype.hasIncludeProcessors = function () {\n return this['$include_processors?']()\n}\n\n/**\n * Checks whether any {{@link Extensions/Postprocessor}} extensions have been registered.\n *\n * @memberof Extensions/Registry\n * @returns a {boolean} indicating whether any {{@link Extensions/Postprocessor}} extensions are registered.\n */\nRegistry.prototype.hasPostprocessors = function () {\n return this['$postprocessors?']()\n}\n\n/**\n * Checks whether any {{@link Extensions/DocinfoProcessor}} extensions have been registered.\n *\n * @memberof Extensions/Registry\n * @param location - A {string} for selecting docinfo extensions at a given location (head or footer) (default: undefined)\n * @returns a {boolean} indicating whether any {{@link Extensions/DocinfoProcessor}} extensions are registered.\n */\nRegistry.prototype.hasDocinfoProcessors = function (location) {\n return this['$docinfo_processors?'](location)\n}\n\n/**\n * Checks whether any {{@link Extensions/BlockProcessor}} extensions have been registered.\n *\n * @memberof Extensions/Registry\n * @returns a {boolean} indicating whether any {{@link Extensions/BlockProcessor}} extensions are registered.\n */\nRegistry.prototype.hasBlocks = function () {\n return this['$blocks?']()\n}\n\n/**\n * Checks whether any {{@link Extensions/BlockMacroProcessor}} extensions have been registered.\n *\n * @memberof Extensions/Registry\n * @returns a {boolean} indicating whether any {{@link Extensions/BlockMacroProcessor}} extensions are registered.\n */\nRegistry.prototype.hasBlockMacros = function () {\n return this['$block_macros?']()\n}\n\n/**\n * Checks whether any {{@link Extensions/InlineMacroProcessor}} extensions have been registered.\n *\n * @memberof Extensions/Registry\n * @returns a {boolean} indicating whether any {{@link Extensions/InlineMacroProcessor}} extensions are registered.\n */\nRegistry.prototype.hasInlineMacros = function () {\n return this['$inline_macros?']()\n}\n\n/**\n * Retrieves the Extension proxy objects for all the {{@link Extensions/Preprocessor}} instances stored in this registry.\n *\n * @memberof Extensions/Registry\n * @returns an {array} of Extension proxy objects.\n */\nRegistry.prototype.getPreprocessors = function () {\n return this.$preprocessors()\n}\n\n/**\n * Retrieves the Extension proxy objects for all the {{@link Extensions/TreeProcessor}} instances stored in this registry.\n *\n * @memberof Extensions/Registry\n * @returns an {array} of Extension proxy objects.\n */\nRegistry.prototype.getTreeProcessors = function () {\n return this.$tree_processors()\n}\n\n/**\n * Retrieves the Extension proxy objects for all the {{@link Extensions/IncludeProcessor}} instances stored in this registry.\n *\n * @memberof Extensions/Registry\n * @returns an {array} of Extension proxy objects.\n */\nRegistry.prototype.getIncludeProcessors = function () {\n return this.$include_processors()\n}\n\n/**\n * Retrieves the Extension proxy objects for all the {{@link Extensions/Postprocessor}} instances stored in this registry.\n *\n * @memberof Extensions/Registry\n * @returns an {array} of Extension proxy objects.\n */\nRegistry.prototype.getPostprocessors = function () {\n return this.$postprocessors()\n}\n\n/**\n * Retrieves the Extension proxy objects for all the {{@link Extensions/DocinfoProcessor}} instances stored in this registry.\n *\n * @memberof Extensions/Registry\n * @param location - A {string} for selecting docinfo extensions at a given location (head or footer) (default: undefined)\n * @returns an {array} of Extension proxy objects.\n */\nRegistry.prototype.getDocinfoProcessors = function (location) {\n return this.$docinfo_processors(location)\n}\n\n/**\n * Retrieves the Extension proxy objects for all the {{@link Extensions/BlockProcessor}} instances stored in this registry.\n *\n * @memberof Extensions/Registry\n * @returns an {array} of Extension proxy objects.\n */\nRegistry.prototype.getBlocks = function () {\n return this.block_extensions.$values()\n}\n\n/**\n * Retrieves the Extension proxy objects for all the {{@link Extensions/BlockMacroProcessor}} instances stored in this registry.\n *\n * @memberof Extensions/Registry\n * @returns an {array} of Extension proxy objects.\n */\nRegistry.prototype.getBlockMacros = function () {\n return this.block_macro_extensions.$values()\n}\n\n/**\n * Retrieves the Extension proxy objects for all the {{@link Extensions/InlineMacroProcessor}} instances stored in this registry.\n *\n * @memberof Extensions/Registry\n * @returns an {array} of Extension proxy objects.\n */\nRegistry.prototype.getInlineMacros = function () {\n return this.$inline_macros()\n}\n\n/**\n * Get any {{@link Extensions/InlineMacroProcessor}} extensions are registered to handle the specified inline macro name.\n *\n * @param name - the {string} inline macro name\n * @memberof Extensions/Registry\n * @returns the Extension proxy object for the {{@link Extensions/InlineMacroProcessor}} that matches the inline macro name or undefined if no match is found.\n */\nRegistry.prototype.getInlineMacroFor = function (name) {\n var result = this['$registered_for_inline_macro?'](name)\n return result === false ? undefined : result\n}\n\n/**\n * Get any {{@link Extensions/BlockProcessor}} extensions are registered to handle the specified block name appearing on the specified context.\n * @param name - the {string} block name\n * @param context - the context of the block: paragraph, open... (optional)\n * @memberof Extensions/Registry\n * @returns the Extension proxy object for the {{@link Extensions/BlockProcessor}} that matches the block name and context or undefined if no match is found.\n */\nRegistry.prototype.getBlockFor = function (name, context) {\n if (typeof context === 'undefined') {\n var ext = this.$find_block_extension(name)\n return ext === Opal.nil ? undefined : ext\n }\n var result = this['$registered_for_block?'](name, context)\n return result === false ? undefined : result\n}\n\n/**\n * Get any {{@link Extensions/BlockMacroProcessor}} extensions are registered to handle the specified macro name.\n *\n * @param name - the {string} macro name\n * @memberof Extensions/Registry\n * @returns the Extension proxy object for the {{@link Extensions/BlockMacroProcessor}} that matches the macro name or undefined if no match is found.\n */\nRegistry.prototype.getBlockMacroFor = function (name) {\n var result = this['$registered_for_block_macro?'](name)\n return result === false ? undefined : result\n}\n\n/**\n * @namespace\n * @module Extensions/Processor\n */\nvar Processor = Extensions.Processor\n\n/**\n * The extension will be added to the beginning of the list for that extension type. (default is append).\n * @memberof Extensions/Processor\n * @deprecated Please use the <code>prefer</pre> function on the {@link Extensions/Registry},\n * the {@link Extensions/IncludeProcessor},\n * the {@link Extensions/TreeProcessor},\n * the {@link Extensions/Postprocessor},\n * the {@link Extensions/Preprocessor}\n * or the {@link Extensions/DocinfoProcessor}\n */\nProcessor.prototype.prepend = function () {\n this.$option('position', '>>')\n}\n\n/**\n * @memberof Extensions/Processor\n */\nProcessor.prototype.process = function (block) {\n var handler = {\n apply: function (target, thisArg, argumentsList) {\n for (var i = 0; i < argumentsList.length; i++) {\n // convert all (Opal) Hash arguments to JSON.\n if (typeof argumentsList[i] === 'object' && '$$smap' in argumentsList[i]) {\n argumentsList[i] = fromHash(argumentsList[i])\n }\n }\n return target.apply(thisArg, argumentsList)\n }\n }\n var blockProxy = new Proxy(block, handler)\n return Opal.send(this, 'process', null, toBlock(blockProxy))\n}\n\n/**\n * @param {string} name\n * @memberof Extensions/Processor\n */\nProcessor.prototype.named = function (name) {\n return this.$named(name)\n}\n\n/**\n * Creates a block and links it to the specified parent.\n *\n * @param {Block|Section|Document} parent - The parent Block (Block, Section, or Document) of this new block.\n * @param {string} context\n * @param {string|Array<string>} source\n * @param {Object|undefined} attrs - A JSON of attributes\n * @param {Object|undefined} opts - A JSON of options\n * @return {Block}\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createBlock = function (parent, context, source, attrs, opts) {\n return this.$create_block(parent, context, source, toHash(attrs), toHash(opts))\n}\n\n/**\n * Creates a list block node and links it to the specified parent.\n *\n * @param parent - The parent Block (Block, Section, or Document) of this new list block.\n * @param {string} context - The list context (e.g., ulist, olist, colist, dlist)\n * @param {Object} attrs - An object of attributes to set on this list block\n * @returns {List}\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createList = function (parent, context, attrs) {\n return this.$create_list(parent, context, toHash(attrs))\n}\n\n/**\n * Creates a list item node and links it to the specified parent.\n *\n * @param {List} parent - The parent {List} of this new list item block.\n * @param {string} text - The text of the list item.\n * @returns {ListItem}\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createListItem = function (parent, text) {\n return this.$create_list_item(parent, text)\n}\n\n/**\n * Creates an image block node and links it to the specified parent.\n * @param {Block|Section|Document} parent - The parent Block of this new image block.\n * @param {Object} attrs - A JSON of attributes\n * @param {string} attrs.target - the target attribute to set the source of the image.\n * @param {string} attrs.alt - the alt attribute to specify an alternative text for the image.\n * @param {Object} opts - A JSON of options\n * @returns {Block}\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createImageBlock = function (parent, attrs, opts) {\n return this.$create_image_block(parent, toHash(attrs), toHash(opts))\n}\n\n/**\n * Creates a paragraph block and links it to the specified parent.\n *\n * @param {Block|Section|Document} parent - The parent Block (Block, Section, or Document) of this new block.\n * @param {string|Array<string>} source - The source\n * @param {Object|undefined} attrs - An object of attributes to set on this block\n * @param {Object|undefined} opts - An object of options to set on this block\n * @returns {Block} - a paragraph {Block}\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createParagraph = function (parent, source, attrs, opts) {\n return this.$create_paragraph(parent, source, toHash(attrs), toHash(opts))\n}\n\n/**\n * Creates an open block and links it to the specified parent.\n *\n * @param {Block|Section|Document} parent - The parent Block (Block, Section, or Document) of this new block.\n * @param {string|Array<string>} source - The source\n * @param {Object|undefined} attrs - An object of attributes to set on this block\n * @param {Object|undefined} opts - An object of options to set on this block\n * @returns {Block} - an open {Block}\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createOpenBlock = function (parent, source, attrs, opts) {\n return this.$create_open_block(parent, source, toHash(attrs), toHash(opts))\n}\n\n/**\n * Creates an example block and links it to the specified parent.\n *\n * @param {Block|Section|Document} parent - The parent Block (Block, Section, or Document) of this new block.\n * @param {string|Array<string>} source - The source\n * @param {Object|undefined} attrs - An object of attributes to set on this block\n * @param {Object|undefined} opts - An object of options to set on this block\n * @returns {Block} - an example {Block}\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createExampleBlock = function (parent, source, attrs, opts) {\n return this.$create_example_block(parent, source, toHash(attrs), toHash(opts))\n}\n\n/**\n * Creates a literal block and links it to the specified parent.\n *\n * @param {Block|Section|Document} parent - The parent Block (Block, Section, or Document) of this new block.\n * @param {string|Array<string>} source - The source\n * @param {Object|undefined} attrs - An object of attributes to set on this block\n * @param {Object|undefined} opts - An object of options to set on this block\n * @returns {Block} - a literal {Block}\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createPassBlock = function (parent, source, attrs, opts) {\n return this.$create_pass_block(parent, source, toHash(attrs), toHash(opts))\n}\n\n/**\n * Creates a listing block and links it to the specified parent.\n *\n * @param {Block|Section|Document} parent - The parent Block (Block, Section, or Document) of this new block.\n * @param {string|Array<string>} source - The source\n * @param {Object|undefined} attrs - An object of attributes to set on this block\n * @param {Object|undefined} opts - An object of options to set on this block\n * @returns {Block} - a listing {Block}\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createListingBlock = function (parent, source, attrs, opts) {\n return this.$create_listing_block(parent, source, toHash(attrs), toHash(opts))\n}\n\n/**\n * Creates a literal block and links it to the specified parent.\n *\n * @param {Block|Section|Document} parent - The parent Block (Block, Section, or Document) of this new block.\n * @param {string|Array<string>} source - The source\n * @param {Object|undefined} attrs - An object of attributes to set on this block\n * @param {Object|undefined} opts - An object of options to set on this block\n * @returns {Block} - a literal {Block}\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createLiteralBlock = function (parent, source, attrs, opts) {\n return this.$create_literal_block(parent, source, toHash(attrs), toHash(opts))\n}\n\n/**\n * Creates an inline anchor and links it to the specified parent.\n *\n * @param {Block|Section|Document} parent - The parent Block (Block, Section, or Document) of this new block.\n * @param {string} text - The text\n * @param {Object|undefined} opts - An object of options to set on this block\n * @returns {Inline} - an {Inline} anchor\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createAnchor = function (parent, text, opts) {\n if (opts && opts.attributes) {\n opts.attributes = toHash(opts.attributes)\n }\n return this.$create_anchor(parent, text, toHash(opts))\n}\n\n/**\n * Creates an inline pass and links it to the specified parent.\n *\n * @param {Block|Section|Document} parent - The parent Block (Block, Section, or Document) of this new block.\n * @param {string} text - The text\n * @param {Object|undefined} opts - An object of options to set on this block\n * @returns {Inline} - an {Inline} pass\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createInlinePass = function (parent, text, opts) {\n if (opts && opts.attributes) {\n opts.attributes = toHash(opts.attributes)\n }\n return this.$create_inline_pass(parent, text, toHash(opts))\n}\n\n/**\n * Creates an inline node and links it to the specified parent.\n *\n * @param {Block|Section|Document} parent - The parent Block of this new inline node.\n * @param {string} context - The context name\n * @param {string} text - The text\n * @param {Object|undefined} opts - A JSON of options\n * @returns {Inline} - an {Inline} node\n * @memberof Extensions/Processor\n */\nProcessor.prototype.createInline = function (parent, context, text, opts) {\n if (opts && opts.attributes) {\n opts.attributes = toHash(opts.attributes)\n }\n return this.$create_inline(parent, context, text, toHash(opts))\n}\n\n/**\n * Parses blocks in the content and attaches the block to the parent.\n * @param {AbstractBlock} parent - the parent block\n * @param {string|Array<string>} content - the content\n * @param {Object|undefined} attrs - an object of attributes\n * @returns {AbstractNode} - The parent node into which the blocks are parsed.\n * @memberof Extensions/Processor\n */\nProcessor.prototype.parseContent = function (parent, content, attrs) {\n return this.$parse_content(parent, content, attrs)\n}\n\n/**\n * Parses the attrlist String into a JSON of attributes\n * @param {AbstractBlock} block - the current AbstractBlock or the parent AbstractBlock if there is no current block (used for applying subs)\n * @param {string} attrlist - the list of attributes as a String\n * @param {Object|undefined} opts - an optional JSON of options to control processing:\n * - positional_attributes: an Array of attribute names to map positional arguments to (optional, default: [])\n * - sub_attributes: enables attribute substitution on the attrlist argument (optional, default: false)\n *\n * @returns - a JSON of parsed attributes\n * @memberof Extensions/Processor\n */\nProcessor.prototype.parseAttributes = function (block, attrlist, opts) {\n if (opts && opts.attributes) {\n opts.attributes = toHash(opts.attributes)\n }\n return fromHash(this.$parse_attributes(block, attrlist, toHash(opts)))\n}\n\n/**\n * @param {string|Array<string>} value - Name of a positional attribute or an Array of positional attribute names\n * @memberof Extensions/Processor\n */\nProcessor.prototype.positionalAttributes = function (value) {\n return this.$positional_attrs(value)\n}\n\n/**\n * Specify how to resolve attributes.\n *\n * @param {string|Array<string>|Object|boolean} [value] - A specification to resolve attributes.\n * @memberof Extensions/Processor\n */\nProcessor.prototype.resolveAttributes = function (value) {\n if (typeof value === 'object' && !Array.isArray(value)) {\n return this.$resolves_attributes(toHash(value))\n }\n if (arguments.length > 1) {\n return this.$resolves_attributes(Array.prototype.slice.call(arguments))\n }\n if (typeof value === 'undefined') {\n // Convert to nil otherwise an exception is thrown at:\n // https://github.com/asciidoctor/asciidoctor/blob/0bcb4addc17b307f62975aad203fb556a1bcd8a5/lib/asciidoctor/extensions.rb#L583\n //\n // if args.size == 1 && !args[0]\n //\n // In the above Ruby code, args[0] is undefined and Opal will try to call the function \"!\" on an undefined object.\n return this.$resolves_attributes(Opal.nil)\n }\n return this.$resolves_attributes(value)\n}\n\n/**\n * @deprecated Please use the <code>resolveAttributes</pre> function on the {@link Extensions/Processor}.\n * @memberof Extensions/Processor\n * @see {Processor#resolveAttributes}\n */\nProcessor.prototype.resolvesAttributes = Processor.prototype.resolveAttributes\n\n/**\n * Get the configuration JSON for this processor instance.\n * @memberof Extensions/Processor\n */\nProcessor.prototype.getConfig = function () {\n return fromHash(this.config)\n}\n\n/**\n * @memberof Extensions/Processor\n */\nProcessor.prototype.option = function (key, value) {\n this.$option(key, value)\n}\n\n/**\n * @namespace\n * @module Extensions/BlockProcessor\n */\nvar BlockProcessor = Extensions.BlockProcessor\n\n/**\n * @param {Object} value - a JSON of default values for attributes\n * @memberof Extensions/BlockProcessor\n */\nBlockProcessor.prototype.defaultAttributes = function (value) {\n this.$default_attributes(toHash(value))\n}\n\n/**\n * @param {string} context - A context name\n * @memberof Extensions/BlockProcessor\n */\nBlockProcessor.prototype.onContext = function (context) {\n return this.$on_context(context)\n}\n\n/**\n * @param {...string} contexts - A list of context names\n * @memberof Extensions/BlockProcessor\n */\nBlockProcessor.prototype.onContexts = function (contexts) {\n return this.$on_contexts(Array.prototype.slice.call(arguments))\n}\n\n/**\n * @returns {string}\n * @memberof Extensions/BlockProcessor\n */\nBlockProcessor.prototype.getName = function () {\n var name = this.name\n return name === Opal.nil ? undefined : name\n}\n\n/**\n * @param {string} value\n * @memberof Extensions/BlockProcessor\n */\nBlockProcessor.prototype.parseContentAs = function (value) {\n this.$parse_content_as(value)\n}\n\n/**\n * @namespace\n * @module Extensions/BlockMacroProcessor\n */\nvar BlockMacroProcessor = Extensions.BlockMacroProcessor\n\n/**\n * @param {Object} value - a JSON of default values for attributes\n * @memberof Extensions/BlockMacroProcessor\n */\nBlockMacroProcessor.prototype.defaultAttributes = function (value) {\n this.$default_attributes(toHash(value))\n}\n\n/**\n * @returns {string} - the block macro name\n * @memberof Extensions/BlockMacroProcessor\n */\nBlockMacroProcessor.prototype.getName = function () {\n var name = this.name\n return name === Opal.nil ? undefined : name\n}\n\n/**\n * @param {string} value\n * @memberof Extensions/BlockMacroProcessor\n */\nBlockMacroProcessor.prototype.parseContentAs = function (value) {\n this.$parse_content_as(value)\n}\n\n/**\n * @namespace\n * @module Extensions/InlineMacroProcessor\n */\nvar InlineMacroProcessor = Extensions.InlineMacroProcessor\n\n/**\n * @param {Object} value - a JSON of default values for attributes\n * @memberof Extensions/InlineMacroProcessor\n */\nInlineMacroProcessor.prototype.defaultAttributes = function (value) {\n this.$default_attributes(toHash(value))\n}\n\n/**\n * @returns {string} - the inline macro name\n * @memberof Extensions/InlineMacroProcessor\n */\nInlineMacroProcessor.prototype.getName = function () {\n var name = this.name\n return name === Opal.nil ? undefined : name\n}\n\n/**\n * @param {string} value\n * @memberof Extensions/InlineMacroProcessor\n */\nInlineMacroProcessor.prototype.parseContentAs = function (value) {\n this.$parse_content_as(value)\n}\n\n/**\n * @param {string} value\n * @memberof Extensions/InlineMacroProcessor\n */\nInlineMacroProcessor.prototype.matchFormat = function (value) {\n this.$match_format(value)\n}\n\n/**\n * @param {RegExp} value\n * @memberof Extensions/InlineMacroProcessor\n */\nInlineMacroProcessor.prototype.match = function (value) {\n this.$match(value)\n}\n\n/**\n * @namespace\n * @module Extensions/IncludeProcessor\n */\nvar IncludeProcessor = Extensions.IncludeProcessor\n\n/**\n * @memberof Extensions/IncludeProcessor\n */\nIncludeProcessor.prototype.handles = function (block) {\n return Opal.send(this, 'handles?', null, toBlock(block))\n}\n\n/**\n * @memberof Extensions/IncludeProcessor\n */\nIncludeProcessor.prototype.prefer = function () {\n this.$prefer()\n}\n\n/**\n * @namespace\n * @module Extensions/TreeProcessor\n */\nvar TreeProcessor = Extensions.TreeProcessor\n\n/**\n * @memberof Extensions/TreeProcessor\n */\nTreeProcessor.prototype.prefer = function () {\n this.$prefer()\n}\n\n/**\n * @namespace\n * @module Extensions/Postprocessor\n */\nvar Postprocessor = Extensions.Postprocessor\n\n/**\n * @memberof Extensions/Postprocessor\n */\nPostprocessor.prototype.prefer = function () {\n this.$prefer()\n}\n\n/**\n * @namespace\n * @module Extensions/Preprocessor\n */\nvar Preprocessor = Extensions.Preprocessor\n\n/**\n * @memberof Extensions/Preprocessor\n */\nPreprocessor.prototype.prefer = function () {\n this.$prefer()\n}\n\n/**\n * @namespace\n * @module Extensions/DocinfoProcessor\n */\nvar DocinfoProcessor = Extensions.DocinfoProcessor\n\n/**\n * @memberof Extensions/DocinfoProcessor\n */\nDocinfoProcessor.prototype.prefer = function () {\n this.$prefer()\n}\n\n/**\n * @param {string} value - The docinfo location (\"head\", \"header\" or \"footer\")\n * @memberof Extensions/DocinfoProcessor\n */\nDocinfoProcessor.prototype.atLocation = function (value) {\n this.$at_location(value)\n}\n\nfunction initializeProcessorClass (superclassName, className, functions) {\n var superClass = Opal.const_get_qualified(Extensions, superclassName)\n return initializeClass(superClass, className, functions, {\n 'handles?': function () {\n return true\n }\n })\n}\n\n// Postprocessor\n\n/**\n * Create a postprocessor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.createPostprocessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return initializeProcessorClass('Postprocessor', name, functions)\n}\n\n/**\n * Create and instantiate a postprocessor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.newPostprocessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return this.createPostprocessor(name, functions).$new()\n}\n\n// Preprocessor\n\n/**\n * Create a preprocessor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.createPreprocessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return initializeProcessorClass('Preprocessor', name, functions)\n}\n\n/**\n * Create and instantiate a preprocessor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.newPreprocessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return this.createPreprocessor(name, functions).$new()\n}\n\n// Tree Processor\n\n/**\n * Create a tree processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.createTreeProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return initializeProcessorClass('TreeProcessor', name, functions)\n}\n\n/**\n * Create and instantiate a tree processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.newTreeProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return this.createTreeProcessor(name, functions).$new()\n}\n\n// Include Processor\n\n/**\n * Create an include processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.createIncludeProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return initializeProcessorClass('IncludeProcessor', name, functions)\n}\n\n/**\n * Create and instantiate an include processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.newIncludeProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return this.createIncludeProcessor(name, functions).$new()\n}\n\n// Docinfo Processor\n\n/**\n * Create a Docinfo processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.createDocinfoProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return initializeProcessorClass('DocinfoProcessor', name, functions)\n}\n\n/**\n * Create and instantiate a Docinfo processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.newDocinfoProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return this.createDocinfoProcessor(name, functions).$new()\n}\n\n// Block Processor\n\n/**\n * Create a block processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.createBlockProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return initializeProcessorClass('BlockProcessor', name, functions)\n}\n\n/**\n * Create and instantiate a block processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.newBlockProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return this.createBlockProcessor(name, functions).$new()\n}\n\n// Inline Macro Processor\n\n/**\n * Create an inline macro processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.createInlineMacroProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return initializeProcessorClass('InlineMacroProcessor', name, functions)\n}\n\n/**\n * Create and instantiate an inline macro processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.newInlineMacroProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return this.createInlineMacroProcessor(name, functions).$new()\n}\n\n// Block Macro Processor\n\n/**\n * Create a block macro processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.createBlockMacroProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return initializeProcessorClass('BlockMacroProcessor', name, functions)\n}\n\n/**\n * Create and instantiate a block macro processor\n * @description this API is experimental and subject to change\n * @memberof Extensions\n */\nExtensions.newBlockMacroProcessor = function (name, functions) {\n if (arguments.length === 1) {\n functions = name\n name = null\n }\n return this.createBlockMacroProcessor(name, functions).$new()\n}\n\n// Converter API\n\n/**\n * @namespace\n * @module Converter\n */\nvar Converter = Opal.const_get_qualified(Opal.Asciidoctor, 'Converter')\n\n// Alias\nOpal.Asciidoctor.Converter = Converter\n\n/**\n * Convert the specified node.\n *\n * @param {AbstractNode} node - the AbstractNode to convert\n * @param {string} transform - an optional String transform that hints at\n * which transformation should be applied to this node.\n * @param {Object} opts - a JSON of options that provide additional hints about how to convert the node (default: {})\n * @returns the {Object} result of the conversion, typically a {string}.\n * @memberof Converter\n */\nConverter.prototype.convert = function (node, transform, opts) {\n return this.$convert(node, transform, toHash(opts))\n}\n\n/**\n * Create an instance of the converter bound to the specified backend.\n *\n * @param {string} backend - look for a converter bound to this keyword.\n * @param {Object} opts - a JSON of options to pass to the converter (default: {})\n * @returns {Converter} - a converter instance for converting nodes in an Asciidoctor AST.\n * @memberof Converter\n */\nConverter.create = function (backend, opts) {\n return this.$create(backend, toHash(opts))\n}\n\n// Converter Factory API\n\n/**\n * @namespace\n * @module Converter/Factory\n */\nvar ConverterFactory = Opal.Asciidoctor.Converter.Factory\n\nvar ConverterBase = Opal.Asciidoctor.Converter.Base\n\n// Alias\nOpal.Asciidoctor.ConverterFactory = ConverterFactory\n\nvar ConverterBackendTraits = Opal.Asciidoctor.Converter.BackendTraits\n\n// Alias\nOpal.Asciidoctor.ConverterBackendTraits = ConverterBackendTraits\n\n/**\n * Register a custom converter in the global converter factory to handle conversion to the specified backends.\n * If the backend value is an asterisk, the converter is used to handle any backend that does not have an explicit converter.\n *\n * @param converter - The Converter instance to register\n * @param backends {Array} - A {string} {Array} of backend names that this converter should be registered to handle (optional, default: ['*'])\n * @return {*} - Returns nothing\n * @memberof Converter/Factory\n */\nConverterFactory.register = function (converter, backends) {\n var object\n var buildBackendTraitsFromObject = function (obj) {\n return Object.assign({},\n obj.basebackend ? { basebackend: obj.basebackend } : {},\n obj.outfilesuffix ? { outfilesuffix: obj.outfilesuffix } : {},\n obj.filetype ? { filetype: obj.filetype } : {},\n obj.htmlsyntax ? { htmlsyntax: obj.htmlsyntax } : {},\n obj.supports_templates ? { supports_templates: obj.supports_templates } : {}\n )\n }\n var assignBackendTraitsToInstance = function (obj, instance) {\n if (obj.backend_traits) {\n instance.backend_traits = toHash(obj.backend_traits)\n } else if (obj.backendTraits) {\n instance.backend_traits = toHash(obj.backendTraits)\n } else if (obj.basebackend || obj.outfilesuffix || obj.filetype || obj.htmlsyntax || obj.supports_templates) {\n instance.backend_traits = toHash(buildBackendTraitsFromObject(obj))\n }\n }\n var bridgeHandlesMethodToInstance = function (obj, instance) {\n bridgeMethodToInstance(obj, instance, '$handles?', 'handles', function () {\n return true\n })\n }\n var bridgeComposedMethodToInstance = function (obj, instance) {\n bridgeMethodToInstance(obj, instance, '$composed', 'composed')\n }\n var bridgeMethodToInstance = function (obj, instance, methodName, functionName, defaultImplementation) {\n if (typeof obj[methodName] === 'undefined') {\n if (typeof obj[functionName] === 'function') {\n instance[methodName] = obj[functionName]\n } else if (defaultImplementation) {\n instance[methodName] = defaultImplementation\n }\n }\n }\n var addRespondToMethod = function (instance) {\n if (typeof instance['$respond_to?'] !== 'function') {\n instance['$respond_to?'] = function (name) {\n return typeof this[name] === 'function'\n }\n }\n }\n if (typeof converter === 'function') {\n // Class\n object = initializeClass(ConverterBase, converter.constructor.name, {\n initialize: function (backend, opts) {\n var self = this\n var result = new converter(backend, opts) // eslint-disable-line\n Object.assign(this, result)\n assignBackendTraitsToInstance(result, self)\n var propertyNames = Object.getOwnPropertyNames(converter.prototype)\n for (var i = 0; i < propertyNames.length; i++) {\n var propertyName = propertyNames[i]\n if (propertyName !== 'constructor') {\n self[propertyName] = result[propertyName]\n }\n }\n if (typeof result.$convert === 'undefined' && typeof result.convert === 'function') {\n self.$convert = result.convert\n }\n bridgeHandlesMethodToInstance(result, self)\n bridgeComposedMethodToInstance(result, self)\n addRespondToMethod(self)\n self.super(backend, opts)\n }\n })\n object.$extend(ConverterBackendTraits)\n } else if (typeof converter === 'object') {\n // Instance\n if (typeof converter.$convert === 'undefined' && typeof converter.convert === 'function') {\n converter.$convert = converter.convert\n }\n assignBackendTraitsToInstance(converter, converter)\n if (converter.backend_traits) {\n // \"extends\" ConverterBackendTraits\n var converterBackendTraitsFunctionNames = [\n 'basebackend',\n 'filetype',\n 'htmlsyntax',\n 'outfilesuffix',\n 'supports_templates',\n 'supports_templates?',\n 'init_backend_traits',\n 'backend_traits'\n ]\n for (var functionName of converterBackendTraitsFunctionNames) {\n converter['$' + functionName] = ConverterBackendTraits.prototype['$' + functionName]\n }\n converter.$$meta = ConverterBackendTraits\n }\n bridgeHandlesMethodToInstance(converter, converter)\n bridgeComposedMethodToInstance(converter, converter)\n addRespondToMethod(converter)\n object = converter\n }\n var args = [object].concat(backends)\n return Converter.$register.apply(Converter, args)\n}\n\n/**\n * Retrieves the singleton instance of the converter factory.\n *\n * @param {boolean} initialize - instantiate the singleton if it has not yet\n * been instantiated. If this value is false and the singleton has not yet been\n * instantiated, this method returns a fresh instance.\n * @returns {Converter/Factory} an instance of the converter factory.\n * @memberof Converter/Factory\n */\nConverterFactory.getDefault = function (initialize) {\n return this.$default(initialize)\n}\n\n/**\n * Create an instance of the converter bound to the specified backend.\n *\n * @param {string} backend - look for a converter bound to this keyword.\n * @param {Object} opts - a JSON of options to pass to the converter (default: {})\n * @returns {Converter} - a converter instance for converting nodes in an Asciidoctor AST.\n * @memberof Converter/Factory\n */\nConverterFactory.prototype.create = function (backend, opts) {\n return this.$create(backend, toHash(opts))\n}\n\n/**\n * Get the converter registry.\n * @returns the registry of converter instances or classes keyed by backend name\n * @memberof Converter/Factory\n */\nConverterFactory.getRegistry = function () {\n return fromHash(Converter.$registry())\n}\n\n/**\n * Lookup the custom converter registered with this factory to handle the specified backend.\n *\n * @param {string} backend - The {string} backend name.\n * @returns the {Converter} class or instance registered to convert the specified backend or undefined if no match is found.\n * @memberof Converter/Factory\n */\nConverterFactory.for = function (backend) {\n const converter = Converter.$for(backend)\n return converter === Opal.nil ? undefined : converter\n}\n\n/*\n * Unregister any custom converter classes that are registered with this factory.\n * Intended for testing only!\n */\nConverterFactory.unregisterAll = function () {\n var internalRegistry = Converter.DefaultFactory.$$cvars['@@registry']\n Converter.DefaultFactory.$$cvars['@@registry'] = toHash({ html5: internalRegistry['$[]']('html5') })\n}\n\n// Built-in converter\n\n/**\n * @namespace\n * @module Converter/Html5Converter\n */\nvar Html5Converter = Opal.Asciidoctor.Converter.Html5Converter\n\n// Alias\nOpal.Asciidoctor.Html5Converter = Html5Converter\n\n/**\n * Create a new Html5Converter.\n * @returns {Html5Converter} - a Html5Converter\n * @memberof Converter/Html5Converter\n */\nHtml5Converter.create = function () {\n return this.$new()\n}\n\n/**\n * Converts an {AbstractNode} using the given transform.\n * This method must be implemented by a concrete converter class.\n *\n * @param {AbstractNode} node - The concrete instance of AbstractNode to convert.\n * @param {string} [transform] - An optional String transform that hints at which transformation should be applied to this node.\n * If a transform is not given, the transform is often derived from the value of the {AbstractNode#getNodeName} property. (optional, default: undefined)\n * @param {Object} [opts]- An optional JSON of options hints about how to convert the node. (optional, default: undefined)\n *\n * @returns {string} - the String result.\n * @memberof Converter/Html5Converter\n */\nHtml5Converter.prototype.convert = function (node, transform, opts) {\n return this.$convert(node, transform, opts)\n}\n\n\nvar ASCIIDOCTOR_JS_VERSION = '2.2.5';\n\n /**\n * Get Asciidoctor.js version number.\n *\n * @memberof Asciidoctor\n * @returns {string} - returns the version number of Asciidoctor.js.\n */\n Opal.Asciidoctor.prototype.getVersion = function () {\n return ASCIIDOCTOR_JS_VERSION\n }\n return Opal.Asciidoctor\n}))\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <http://feross.org>\n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar isArray = require('isarray')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n * incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n ? global.TYPED_ARRAY_SUPPORT\n : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n try {\n var arr = new Uint8Array(1)\n arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n return arr.foo() === 42 && // typed array instances can be augmented\n typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n } catch (e) {\n return false\n }\n}\n\nfunction kMaxLength () {\n return Buffer.TYPED_ARRAY_SUPPORT\n ? 0x7fffffff\n : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n if (kMaxLength() < length) {\n throw new RangeError('Invalid typed array length')\n }\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = new Uint8Array(length)\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n if (that === null) {\n that = new Buffer(length)\n }\n that.length = length\n }\n\n return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n return new Buffer(arg, encodingOrOffset, length)\n }\n\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new Error(\n 'If encoding is specified then the first argument must be a string'\n )\n }\n return allocUnsafe(this, arg)\n }\n return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n arr.__proto__ = Buffer.prototype\n return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('\"value\" argument must not be a number')\n }\n\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n return fromArrayBuffer(that, value, encodingOrOffset, length)\n }\n\n if (typeof value === 'string') {\n return fromString(that, value, encodingOrOffset)\n }\n\n return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n Buffer.prototype.__proto__ = Uint8Array.prototype\n Buffer.__proto__ = Uint8Array\n if (typeof Symbol !== 'undefined' && Symbol.species &&\n Buffer[Symbol.species] === Buffer) {\n // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n Object.defineProperty(Buffer, Symbol.species, {\n value: null,\n configurable: true\n })\n }\n}\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be a number')\n } else if (size < 0) {\n throw new RangeError('\"size\" argument must not be negative')\n }\n}\n\nfunction alloc (that, size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(that, size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpretted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(that, size).fill(fill, encoding)\n : createBuffer(that, size).fill(fill)\n }\n return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n assertSize(size)\n that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) {\n for (var i = 0; i < size; ++i) {\n that[i] = 0\n }\n }\n return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('\"encoding\" must be a valid string encoding')\n }\n\n var length = byteLength(string, encoding) | 0\n that = createBuffer(that, length)\n\n var actual = that.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n that = that.slice(0, actual)\n }\n\n return that\n}\n\nfunction fromArrayLike (that, array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0\n that = createBuffer(that, length)\n for (var i = 0; i < length; i += 1) {\n that[i] = array[i] & 255\n }\n return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\\'offset\\' is out of bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\\'length\\' is out of bounds')\n }\n\n if (byteOffset === undefined && length === undefined) {\n array = new Uint8Array(array)\n } else if (length === undefined) {\n array = new Uint8Array(array, byteOffset)\n } else {\n array = new Uint8Array(array, byteOffset, length)\n }\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = array\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n that = fromArrayLike(that, array)\n }\n return that\n}\n\nfunction fromObject (that, obj) {\n if (Buffer.isBuffer(obj)) {\n var len = checked(obj.length) | 0\n that = createBuffer(that, len)\n\n if (that.length === 0) {\n return that\n }\n\n obj.copy(that, 0, 0, len)\n return that\n }\n\n if (obj) {\n if ((typeof ArrayBuffer !== 'undefined' &&\n obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n if (typeof obj.length !== 'number' || isnan(obj.length)) {\n return createBuffer(that, 0)\n }\n return fromArrayLike(that, obj)\n }\n\n if (obj.type === 'Buffer' && isArray(obj.data)) {\n return fromArrayLike(that, obj.data)\n }\n }\n\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n // Note: cannot use `length < kMaxLength()` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= kMaxLength()) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + kMaxLength().toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError('Arguments must be Buffers')\n }\n\n if (a === b) return 0\n\n var x = a.length\n var y = b.length\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n var i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n var buffer = Buffer.allocUnsafe(length)\n var pos = 0\n for (i = 0; i < list.length; ++i) {\n var buf = list[i]\n if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n buf.copy(buffer, pos)\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n string = '' + string\n }\n\n var len = string.length\n if (len === 0) return 0\n\n // Use a for loop to avoid recursion\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n case undefined:\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) return utf8ToBytes(string).length // assume utf8\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n var loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n var i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n var len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n var len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n var len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n var length = this.length | 0\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n var str = ''\n var max = exports.INSPECT_MAX_BYTES\n if (this.length > 0) {\n str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n if (this.length > max) str += ' ... '\n }\n return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (!Buffer.isBuffer(target)) {\n throw new TypeError('Argument must be a Buffer')\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n var x = thisEnd - thisStart\n var y = end - start\n var len = Math.min(x, y)\n\n var thisCopy = this.slice(thisStart, thisEnd)\n var targetCopy = target.slice(start, end)\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (isNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (Buffer.TYPED_ARRAY_SUPPORT &&\n typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1\n var arrLength = arr.length\n var valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n var i\n if (dir) {\n var foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n var found = true\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n var remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n // must be an even number of digits\n var strLen = string.length\n if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16)\n if (isNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset | 0\n if (isFinite(length)) {\n length = length | 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n // legacy write(string, encoding, offset, length) - remove in v0.13\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n var remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n return asciiWrite(this, string, offset, length)\n\n case 'latin1':\n case 'binary':\n return latin1Write(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n var res = []\n\n var i = start\n while (i < end) {\n var firstByte = buf[i]\n var codePoint = null\n var bytesPerSequence = (firstByte > 0xEF) ? 4\n : (firstByte > 0xDF) ? 3\n : (firstByte > 0xBF) ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n var len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n var res = ''\n var i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n var len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n var out = ''\n for (var i = start; i < end; ++i) {\n out += toHex(buf[i])\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n var bytes = buf.slice(start, end)\n var res = ''\n for (var i = 0; i < bytes.length; i += 2) {\n res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n var newBuf\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n newBuf = this.subarray(start, end)\n newBuf.__proto__ = Buffer.prototype\n } else {\n var sliceLen = end - start\n newBuf = new Buffer(sliceLen, undefined)\n for (var i = 0; i < sliceLen; ++i) {\n newBuf[i] = this[i + start]\n }\n }\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n var val = this[offset + --byteLength]\n var mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var i = byteLength\n var mul = 1\n var val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var mul = 1\n var i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var i = byteLength - 1\n var mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n (littleEndian ? i : 1 - i) * 8\n }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffffffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = 0\n var mul = 1\n var sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = byteLength - 1\n var mul = 1\n var sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n var len = end - start\n var i\n\n if (this === target && start < targetStart && targetStart < end) {\n // descending copy from end\n for (i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start]\n }\n } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n // ascending copy from start\n for (i = 0; i < len; ++i) {\n target[i + targetStart] = this[i + start]\n }\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, start + len),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0)\n if (code < 256) {\n val = code\n }\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n } else if (typeof val === 'number') {\n val = val & 255\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n var i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n var bytes = Buffer.isBuffer(val)\n ? val\n : utf8ToBytes(new Buffer(val, encoding).toString())\n var len = bytes.length\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction stringtrim (str) {\n if (str.trim) return str.trim()\n return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n if (n < 16) return '0' + n.toString(16)\n return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n var codePoint\n var length = string.length\n var leadSurrogate = null\n var bytes = []\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n var c, hi, lo\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\nfunction isnan (val) {\n return val !== val // eslint-disable-line no-self-compare\n}\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n return toString.call(arr) == '[object Array]';\n};\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport Route from \"./Route\";\nimport Link from \"./Link\";\n\n/**\n * A <Link> wrapper that knows if it's \"active\" or not.\n */\nvar NavLink = function NavLink(_ref) {\n var to = _ref.to,\n exact = _ref.exact,\n strict = _ref.strict,\n location = _ref.location,\n activeClassName = _ref.activeClassName,\n className = _ref.className,\n activeStyle = _ref.activeStyle,\n style = _ref.style,\n getIsActive = _ref.isActive,\n ariaCurrent = _ref[\"aria-current\"],\n rest = _objectWithoutProperties(_ref, [\"to\", \"exact\", \"strict\", \"location\", \"activeClassName\", \"className\", \"activeStyle\", \"style\", \"isActive\", \"aria-current\"]);\n\n var path = (typeof to === \"undefined\" ? \"undefined\" : _typeof(to)) === \"object\" ? to.pathname : to;\n\n // Regex taken from: https://github.com/pillarjs/path-to-regexp/blob/master/index.js#L202\n var escapedPath = path && path.replace(/([.+*?=^!:${}()[\\]|/\\\\])/g, \"\\\\$1\");\n\n return React.createElement(Route, {\n path: escapedPath,\n exact: exact,\n strict: strict,\n location: location,\n children: function children(_ref2) {\n var location = _ref2.location,\n match = _ref2.match;\n\n var isActive = !!(getIsActive ? getIsActive(match, location) : match);\n\n return React.createElement(Link, _extends({\n to: to,\n className: isActive ? [className, activeClassName].filter(function (i) {\n return i;\n }).join(\" \") : className,\n style: isActive ? _extends({}, style, activeStyle) : style,\n \"aria-current\": isActive && ariaCurrent || null\n }, rest));\n }\n });\n};\n\nNavLink.propTypes = {\n to: Link.propTypes.to,\n exact: PropTypes.bool,\n strict: PropTypes.bool,\n location: PropTypes.object,\n activeClassName: PropTypes.string,\n className: PropTypes.string,\n activeStyle: PropTypes.object,\n style: PropTypes.object,\n isActive: PropTypes.func,\n \"aria-current\": PropTypes.oneOf([\"page\", \"step\", \"location\", \"date\", \"time\", \"true\"])\n};\n\nNavLink.defaultProps = {\n activeClassName: \"active\",\n \"aria-current\": \"page\"\n};\n\nexport default NavLink;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"bsPrefix\", \"variant\", \"size\", \"active\", \"className\", \"block\", \"type\", \"as\"];\nimport classNames from 'classnames';\nimport React from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport SafeAnchor from './SafeAnchor';\nvar defaultProps = {\n variant: 'primary',\n active: false,\n disabled: false\n};\nvar Button = /*#__PURE__*/React.forwardRef(function (_ref, ref) {\n var bsPrefix = _ref.bsPrefix,\n variant = _ref.variant,\n size = _ref.size,\n active = _ref.active,\n className = _ref.className,\n block = _ref.block,\n type = _ref.type,\n as = _ref.as,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n var prefix = useBootstrapPrefix(bsPrefix, 'btn');\n var classes = classNames(className, prefix, active && 'active', variant && prefix + \"-\" + variant, block && prefix + \"-block\", size && prefix + \"-\" + size);\n\n if (props.href) {\n return /*#__PURE__*/React.createElement(SafeAnchor, _extends({}, props, {\n as: as,\n ref: ref,\n className: classNames(classes, props.disabled && 'disabled')\n }));\n }\n\n if (ref) {\n props.ref = ref;\n }\n\n if (type) {\n props.type = type;\n } else if (!as) {\n props.type = 'button';\n }\n\n var Component = as || 'button';\n return /*#__PURE__*/React.createElement(Component, _extends({}, props, {\n className: classes\n }));\n});\nButton.displayName = 'Button';\nButton.defaultProps = defaultProps;\nexport default Button;","import React from 'react';\nvar context = /*#__PURE__*/React.createContext(null);\ncontext.displayName = 'CardContext';\nexport default context;","var toArray = Function.prototype.bind.call(Function.prototype.call, [].slice);\n/**\n * Runs `querySelectorAll` on a given element.\n * \n * @param element the element\n * @param selector the selector\n */\n\nexport default function qsa(element, selector) {\n return toArray(element.querySelectorAll(selector));\n}","import { useMemo } from 'react';\n\nvar toFnRef = function toFnRef(ref) {\n return !ref || typeof ref === 'function' ? ref : function (value) {\n ref.current = value;\n };\n};\n\nexport function mergeRefs(refA, refB) {\n var a = toFnRef(refA);\n var b = toFnRef(refB);\n return function (value) {\n if (a) a(value);\n if (b) b(value);\n };\n}\n/**\n * Create and returns a single callback ref composed from two other Refs.\n *\n * ```tsx\n * const Button = React.forwardRef((props, ref) => {\n * const [element, attachRef] = useCallbackRef<HTMLButtonElement>();\n * const mergedRef = useMergedRefs(ref, attachRef);\n *\n * return <button ref={mergedRef} {...props}/>\n * })\n * ```\n *\n * @param refA A Callback or mutable Ref\n * @param refB A Callback or mutable Ref\n * @category refs\n */\n\nfunction useMergedRefs(refA, refB) {\n return useMemo(function () {\n return mergeRefs(refA, refB);\n }, [refA, refB]);\n}\n\nexport default useMergedRefs;","import React from 'react'; // TODO: check this\n\nvar NavContext = /*#__PURE__*/React.createContext(null);\nNavContext.displayName = 'NavContext';\nexport default NavContext;","import React from 'react';\nvar TabContext = /*#__PURE__*/React.createContext(null);\nexport default TabContext;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"as\", \"onSelect\", \"activeKey\", \"role\", \"onKeyDown\"];\nimport qsa from 'dom-helpers/querySelectorAll';\nimport React, { useContext, useEffect, useRef } from 'react';\nimport useForceUpdate from '@restart/hooks/useForceUpdate';\nimport useMergedRefs from '@restart/hooks/useMergedRefs';\nimport NavContext from './NavContext';\nimport SelectableContext, { makeEventKey } from './SelectableContext';\nimport TabContext from './TabContext';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nvar noop = function noop() {};\n\nvar AbstractNav = /*#__PURE__*/React.forwardRef(function (_ref, ref) {\n var _ref$as = _ref.as,\n Component = _ref$as === void 0 ? 'ul' : _ref$as,\n onSelect = _ref.onSelect,\n activeKey = _ref.activeKey,\n role = _ref.role,\n onKeyDown = _ref.onKeyDown,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n // A ref and forceUpdate for refocus, b/c we only want to trigger when needed\n // and don't want to reset the set in the effect\n var forceUpdate = useForceUpdate();\n var needsRefocusRef = useRef(false);\n var parentOnSelect = useContext(SelectableContext);\n var tabContext = useContext(TabContext);\n var getControlledId, getControllerId;\n\n if (tabContext) {\n role = role || 'tablist';\n activeKey = tabContext.activeKey;\n getControlledId = tabContext.getControlledId;\n getControllerId = tabContext.getControllerId;\n }\n\n var listNode = useRef(null);\n\n var getNextActiveChild = function getNextActiveChild(offset) {\n var currentListNode = listNode.current;\n if (!currentListNode) return null;\n var items = qsa(currentListNode, '[data-rb-event-key]:not(.disabled)');\n var activeChild = currentListNode.querySelector('.active');\n if (!activeChild) return null;\n var index = items.indexOf(activeChild);\n if (index === -1) return null;\n var nextIndex = index + offset;\n if (nextIndex >= items.length) nextIndex = 0;\n if (nextIndex < 0) nextIndex = items.length - 1;\n return items[nextIndex];\n };\n\n var handleSelect = function handleSelect(key, event) {\n if (key == null) return;\n if (onSelect) onSelect(key, event);\n if (parentOnSelect) parentOnSelect(key, event);\n };\n\n var handleKeyDown = function handleKeyDown(event) {\n if (onKeyDown) onKeyDown(event);\n var nextActiveChild;\n\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowUp':\n nextActiveChild = getNextActiveChild(-1);\n break;\n\n case 'ArrowRight':\n case 'ArrowDown':\n nextActiveChild = getNextActiveChild(1);\n break;\n\n default:\n return;\n }\n\n if (!nextActiveChild) return;\n event.preventDefault();\n handleSelect(nextActiveChild.dataset.rbEventKey, event);\n needsRefocusRef.current = true;\n forceUpdate();\n };\n\n useEffect(function () {\n if (listNode.current && needsRefocusRef.current) {\n var activeChild = listNode.current.querySelector('[data-rb-event-key].active');\n if (activeChild) activeChild.focus();\n }\n\n needsRefocusRef.current = false;\n });\n var mergedRef = useMergedRefs(ref, listNode);\n return /*#__PURE__*/React.createElement(SelectableContext.Provider, {\n value: handleSelect\n }, /*#__PURE__*/React.createElement(NavContext.Provider, {\n value: {\n role: role,\n // used by NavLink to determine it's role\n activeKey: makeEventKey(activeKey),\n getControlledId: getControlledId || noop,\n getControllerId: getControllerId || noop\n }\n }, /*#__PURE__*/React.createElement(Component, _extends({}, props, {\n onKeyDown: handleKeyDown,\n ref: mergedRef,\n role: role\n }))));\n});\nexport default AbstractNav;","import { useReducer } from 'react';\n/**\n * Returns a function that triggers a component update. the hook equivalent to\n * `this.forceUpdate()` in a class component. In most cases using a state value directly\n * is preferable but may be required in some advanced usages of refs for interop or\n * when direct DOM manipulation is required.\n *\n * ```ts\n * const forceUpdate = useForceUpdate();\n *\n * const updateOnClick = useCallback(() => {\n * forceUpdate()\n * }, [forceUpdate])\n *\n * return <button type=\"button\" onClick={updateOnClick}>Hi there</button>\n * ```\n */\n\nexport default function useForceUpdate() {\n // The toggling state value is designed to defeat React optimizations for skipping\n // updates when they are stricting equal to the last state value\n var _useReducer = useReducer(function (state) {\n return !state;\n }, false),\n dispatch = _useReducer[1];\n\n return dispatch;\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"bsPrefix\", \"className\", \"children\", \"as\"];\nimport classNames from 'classnames';\nimport React from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nvar NavItem = /*#__PURE__*/React.forwardRef( // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\nfunction (_ref, ref) {\n var bsPrefix = _ref.bsPrefix,\n className = _ref.className,\n children = _ref.children,\n _ref$as = _ref.as,\n Component = _ref$as === void 0 ? 'div' : _ref$as,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n bsPrefix = useBootstrapPrefix(bsPrefix, 'nav-item');\n return /*#__PURE__*/React.createElement(Component, _extends({}, props, {\n ref: ref,\n className: classNames(className, bsPrefix)\n }), children);\n});\nNavItem.displayName = 'NavItem';\nexport default NavItem;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"active\", \"className\", \"eventKey\", \"onSelect\", \"onClick\", \"as\"];\nimport classNames from 'classnames';\nimport React, { useContext } from 'react';\nimport useEventCallback from '@restart/hooks/useEventCallback';\nimport warning from 'warning';\nimport NavContext from './NavContext';\nimport SelectableContext, { makeEventKey } from './SelectableContext';\nvar defaultProps = {\n disabled: false\n};\nvar AbstractNavItem = /*#__PURE__*/React.forwardRef(function (_ref, ref) {\n var active = _ref.active,\n className = _ref.className,\n eventKey = _ref.eventKey,\n onSelect = _ref.onSelect,\n onClick = _ref.onClick,\n Component = _ref.as,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n var navKey = makeEventKey(eventKey, props.href);\n var parentOnSelect = useContext(SelectableContext);\n var navContext = useContext(NavContext);\n var isActive = active;\n\n if (navContext) {\n if (!props.role && navContext.role === 'tablist') props.role = 'tab';\n var contextControllerId = navContext.getControllerId(navKey);\n var contextControlledId = navContext.getControlledId(navKey);\n process.env.NODE_ENV !== \"production\" ? warning(!contextControllerId || !props.id, \"[react-bootstrap] The provided id '\" + props.id + \"' was overwritten by the current navContext with '\" + contextControllerId + \"'.\") : void 0;\n process.env.NODE_ENV !== \"production\" ? warning(!contextControlledId || !props['aria-controls'], \"[react-bootstrap] The provided aria-controls value '\" + props['aria-controls'] + \"' was overwritten by the current navContext with '\" + contextControlledId + \"'.\") : void 0;\n props['data-rb-event-key'] = navKey;\n props.id = contextControllerId || props.id;\n props['aria-controls'] = contextControlledId || props['aria-controls'];\n isActive = active == null && navKey != null ? navContext.activeKey === navKey : active;\n }\n\n if (props.role === 'tab') {\n if (props.disabled) {\n props.tabIndex = -1;\n props['aria-disabled'] = true;\n }\n\n props['aria-selected'] = isActive;\n }\n\n var handleOnclick = useEventCallback(function (e) {\n if (onClick) onClick(e);\n if (navKey == null) return;\n if (onSelect) onSelect(navKey, e);\n if (parentOnSelect) parentOnSelect(navKey, e);\n });\n return /*#__PURE__*/React.createElement(Component, _extends({}, props, {\n ref: ref,\n onClick: handleOnclick,\n className: classNames(className, isActive && 'active')\n }));\n});\nAbstractNavItem.defaultProps = defaultProps;\nexport default AbstractNavItem;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"bsPrefix\", \"disabled\", \"className\", \"href\", \"eventKey\", \"onSelect\", \"as\"];\nimport classNames from 'classnames';\nimport React from 'react';\nimport SafeAnchor from './SafeAnchor';\nimport AbstractNavItem from './AbstractNavItem';\nimport { useBootstrapPrefix } from './ThemeProvider';\nvar defaultProps = {\n disabled: false,\n as: SafeAnchor\n};\nvar NavLink = /*#__PURE__*/React.forwardRef(function (_ref, ref) {\n var bsPrefix = _ref.bsPrefix,\n disabled = _ref.disabled,\n className = _ref.className,\n href = _ref.href,\n eventKey = _ref.eventKey,\n onSelect = _ref.onSelect,\n as = _ref.as,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n bsPrefix = useBootstrapPrefix(bsPrefix, 'nav-link');\n return /*#__PURE__*/React.createElement(AbstractNavItem, _extends({}, props, {\n href: href,\n ref: ref,\n eventKey: eventKey,\n as: as,\n disabled: disabled,\n onSelect: onSelect,\n className: classNames(className, bsPrefix, disabled && 'disabled')\n }));\n});\nNavLink.displayName = 'NavLink';\nNavLink.defaultProps = defaultProps;\nexport default NavLink;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"as\", \"bsPrefix\", \"variant\", \"fill\", \"justify\", \"navbar\", \"navbarScroll\", \"className\", \"children\", \"activeKey\"];\nimport classNames from 'classnames';\nimport all from 'prop-types-extra/lib/all';\nimport React, { useContext } from 'react';\nimport { useUncontrolled } from 'uncontrollable';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport NavbarContext from './NavbarContext';\nimport CardContext from './CardContext';\nimport AbstractNav from './AbstractNav';\nimport NavItem from './NavItem';\nimport NavLink from './NavLink';\nvar defaultProps = {\n justify: false,\n fill: false\n};\nvar Nav = /*#__PURE__*/React.forwardRef(function (uncontrolledProps, ref) {\n var _classNames;\n\n var _useUncontrolled = useUncontrolled(uncontrolledProps, {\n activeKey: 'onSelect'\n }),\n _useUncontrolled$as = _useUncontrolled.as,\n as = _useUncontrolled$as === void 0 ? 'div' : _useUncontrolled$as,\n initialBsPrefix = _useUncontrolled.bsPrefix,\n variant = _useUncontrolled.variant,\n fill = _useUncontrolled.fill,\n justify = _useUncontrolled.justify,\n navbar = _useUncontrolled.navbar,\n navbarScroll = _useUncontrolled.navbarScroll,\n className = _useUncontrolled.className,\n children = _useUncontrolled.children,\n activeKey = _useUncontrolled.activeKey,\n props = _objectWithoutPropertiesLoose(_useUncontrolled, _excluded);\n\n var bsPrefix = useBootstrapPrefix(initialBsPrefix, 'nav');\n var navbarBsPrefix;\n var cardHeaderBsPrefix;\n var isNavbar = false;\n var navbarContext = useContext(NavbarContext);\n var cardContext = useContext(CardContext);\n\n if (navbarContext) {\n navbarBsPrefix = navbarContext.bsPrefix;\n isNavbar = navbar == null ? true : navbar;\n } else if (cardContext) {\n cardHeaderBsPrefix = cardContext.cardHeaderBsPrefix;\n }\n\n return /*#__PURE__*/React.createElement(AbstractNav, _extends({\n as: as,\n ref: ref,\n activeKey: activeKey,\n className: classNames(className, (_classNames = {}, _classNames[bsPrefix] = !isNavbar, _classNames[navbarBsPrefix + \"-nav\"] = isNavbar, _classNames[navbarBsPrefix + \"-nav-scroll\"] = isNavbar && navbarScroll, _classNames[cardHeaderBsPrefix + \"-\" + variant] = !!cardHeaderBsPrefix, _classNames[bsPrefix + \"-\" + variant] = !!variant, _classNames[bsPrefix + \"-fill\"] = fill, _classNames[bsPrefix + \"-justified\"] = justify, _classNames))\n }, props), children);\n});\nNav.displayName = 'Nav';\nNav.defaultProps = defaultProps;\nNav.Item = NavItem;\nNav.Link = NavLink;\nexport default Nav;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"bsPrefix\", \"className\", \"as\"];\nimport classNames from 'classnames';\nimport React from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nvar NavbarBrand = /*#__PURE__*/React.forwardRef(function (_ref, ref) {\n var bsPrefix = _ref.bsPrefix,\n className = _ref.className,\n as = _ref.as,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n bsPrefix = useBootstrapPrefix(bsPrefix, 'navbar-brand');\n var Component = as || (props.href ? 'a' : 'span');\n return /*#__PURE__*/React.createElement(Component, _extends({}, props, {\n ref: ref,\n className: classNames(className, bsPrefix)\n }));\n});\nNavbarBrand.displayName = 'NavbarBrand';\nexport default NavbarBrand;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"onEnter\", \"onEntering\", \"onEntered\", \"onExit\", \"onExiting\", \"className\", \"children\", \"dimension\", \"getDimensionValue\"];\n\nvar _collapseStyles;\n\nimport classNames from 'classnames';\nimport css from 'dom-helpers/css';\nimport React, { useMemo } from 'react';\nimport Transition, { ENTERED, ENTERING, EXITED, EXITING } from 'react-transition-group/Transition';\nimport transitionEndListener from './transitionEndListener';\nimport createChainedFunction from './createChainedFunction';\nimport triggerBrowserReflow from './triggerBrowserReflow';\nvar MARGINS = {\n height: ['marginTop', 'marginBottom'],\n width: ['marginLeft', 'marginRight']\n};\n\nfunction getDefaultDimensionValue(dimension, elem) {\n var offset = \"offset\" + dimension[0].toUpperCase() + dimension.slice(1);\n var value = elem[offset];\n var margins = MARGINS[dimension];\n return value + // @ts-ignore\n parseInt(css(elem, margins[0]), 10) + // @ts-ignore\n parseInt(css(elem, margins[1]), 10);\n}\n\nvar collapseStyles = (_collapseStyles = {}, _collapseStyles[EXITED] = 'collapse', _collapseStyles[EXITING] = 'collapsing', _collapseStyles[ENTERING] = 'collapsing', _collapseStyles[ENTERED] = 'collapse show', _collapseStyles);\nvar defaultProps = {\n in: false,\n timeout: 300,\n mountOnEnter: false,\n unmountOnExit: false,\n appear: false,\n getDimensionValue: getDefaultDimensionValue\n};\nvar Collapse = /*#__PURE__*/React.forwardRef(function (_ref, ref) {\n var onEnter = _ref.onEnter,\n onEntering = _ref.onEntering,\n onEntered = _ref.onEntered,\n onExit = _ref.onExit,\n onExiting = _ref.onExiting,\n className = _ref.className,\n children = _ref.children,\n _ref$dimension = _ref.dimension,\n dimension = _ref$dimension === void 0 ? 'height' : _ref$dimension,\n _ref$getDimensionValu = _ref.getDimensionValue,\n getDimensionValue = _ref$getDimensionValu === void 0 ? getDefaultDimensionValue : _ref$getDimensionValu,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n /* Compute dimension */\n var computedDimension = typeof dimension === 'function' ? dimension() : dimension;\n /* -- Expanding -- */\n\n var handleEnter = useMemo(function () {\n return createChainedFunction(function (elem) {\n elem.style[computedDimension] = '0';\n }, onEnter);\n }, [computedDimension, onEnter]);\n var handleEntering = useMemo(function () {\n return createChainedFunction(function (elem) {\n var scroll = \"scroll\" + computedDimension[0].toUpperCase() + computedDimension.slice(1);\n elem.style[computedDimension] = elem[scroll] + \"px\";\n }, onEntering);\n }, [computedDimension, onEntering]);\n var handleEntered = useMemo(function () {\n return createChainedFunction(function (elem) {\n elem.style[computedDimension] = null;\n }, onEntered);\n }, [computedDimension, onEntered]);\n /* -- Collapsing -- */\n\n var handleExit = useMemo(function () {\n return createChainedFunction(function (elem) {\n elem.style[computedDimension] = getDimensionValue(computedDimension, elem) + \"px\";\n triggerBrowserReflow(elem);\n }, onExit);\n }, [onExit, getDimensionValue, computedDimension]);\n var handleExiting = useMemo(function () {\n return createChainedFunction(function (elem) {\n elem.style[computedDimension] = null;\n }, onExiting);\n }, [computedDimension, onExiting]);\n return /*#__PURE__*/React.createElement(Transition // @ts-ignore\n , _extends({\n ref: ref,\n addEndListener: transitionEndListener\n }, props, {\n \"aria-expanded\": props.role ? props.in : null,\n onEnter: handleEnter,\n onEntering: handleEntering,\n onEntered: handleEntered,\n onExit: handleExit,\n onExiting: handleExiting\n }), function (state, innerProps) {\n return /*#__PURE__*/React.cloneElement(children, _extends({}, innerProps, {\n className: classNames(className, children.props.className, collapseStyles[state], computedDimension === 'width' && 'width')\n }));\n });\n}); // @ts-ignore\n\n// @ts-ignore\nCollapse.defaultProps = defaultProps;\nexport default Collapse;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"children\", \"bsPrefix\"];\nimport React from 'react';\nimport Collapse from './Collapse';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport NavbarContext from './NavbarContext';\nvar NavbarCollapse = /*#__PURE__*/React.forwardRef(function (_ref, ref) {\n var children = _ref.children,\n bsPrefix = _ref.bsPrefix,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n bsPrefix = useBootstrapPrefix(bsPrefix, 'navbar-collapse');\n return /*#__PURE__*/React.createElement(NavbarContext.Consumer, null, function (context) {\n return /*#__PURE__*/React.createElement(Collapse, _extends({\n in: !!(context && context.expanded)\n }, props), /*#__PURE__*/React.createElement(\"div\", {\n ref: ref,\n className: bsPrefix\n }, children));\n });\n});\nNavbarCollapse.displayName = 'NavbarCollapse';\nexport default NavbarCollapse;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"bsPrefix\", \"className\", \"children\", \"label\", \"as\", \"onClick\"];\nimport classNames from 'classnames';\nimport React, { useContext } from 'react';\nimport useEventCallback from '@restart/hooks/useEventCallback';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport NavbarContext from './NavbarContext';\nvar defaultProps = {\n label: 'Toggle navigation'\n};\nvar NavbarToggle = /*#__PURE__*/React.forwardRef(function (_ref, ref) {\n var bsPrefix = _ref.bsPrefix,\n className = _ref.className,\n children = _ref.children,\n label = _ref.label,\n _ref$as = _ref.as,\n Component = _ref$as === void 0 ? 'button' : _ref$as,\n onClick = _ref.onClick,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n bsPrefix = useBootstrapPrefix(bsPrefix, 'navbar-toggler');\n\n var _ref2 = useContext(NavbarContext) || {},\n onToggle = _ref2.onToggle,\n expanded = _ref2.expanded;\n\n var handleClick = useEventCallback(function (e) {\n if (onClick) onClick(e);\n if (onToggle) onToggle();\n });\n\n if (Component === 'button') {\n props.type = 'button';\n }\n\n return /*#__PURE__*/React.createElement(Component, _extends({}, props, {\n ref: ref,\n onClick: handleClick,\n \"aria-label\": label,\n className: classNames(className, bsPrefix, !expanded && 'collapsed')\n }), children || /*#__PURE__*/React.createElement(\"span\", {\n className: bsPrefix + \"-icon\"\n }));\n});\nNavbarToggle.displayName = 'NavbarToggle';\nNavbarToggle.defaultProps = defaultProps;\nexport default NavbarToggle;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"bsPrefix\", \"expand\", \"variant\", \"bg\", \"fixed\", \"sticky\", \"className\", \"children\", \"as\", \"expanded\", \"onToggle\", \"onSelect\", \"collapseOnSelect\"];\nimport classNames from 'classnames';\nimport React, { useCallback, useMemo } from 'react';\nimport { useUncontrolled } from 'uncontrollable';\nimport createWithBsPrefix from './createWithBsPrefix';\nimport NavbarBrand from './NavbarBrand';\nimport NavbarCollapse from './NavbarCollapse';\nimport NavbarToggle from './NavbarToggle';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport NavbarContext from './NavbarContext';\nimport SelectableContext from './SelectableContext';\nvar NavbarText = createWithBsPrefix('navbar-text', {\n Component: 'span'\n});\nvar defaultProps = {\n expand: true,\n variant: 'light',\n collapseOnSelect: false\n};\nvar Navbar = /*#__PURE__*/React.forwardRef(function (props, ref) {\n var _useUncontrolled = useUncontrolled(props, {\n expanded: 'onToggle'\n }),\n initialBsPrefix = _useUncontrolled.bsPrefix,\n expand = _useUncontrolled.expand,\n variant = _useUncontrolled.variant,\n bg = _useUncontrolled.bg,\n fixed = _useUncontrolled.fixed,\n sticky = _useUncontrolled.sticky,\n className = _useUncontrolled.className,\n children = _useUncontrolled.children,\n _useUncontrolled$as = _useUncontrolled.as,\n Component = _useUncontrolled$as === void 0 ? 'nav' : _useUncontrolled$as,\n expanded = _useUncontrolled.expanded,\n _onToggle = _useUncontrolled.onToggle,\n onSelect = _useUncontrolled.onSelect,\n collapseOnSelect = _useUncontrolled.collapseOnSelect,\n controlledProps = _objectWithoutPropertiesLoose(_useUncontrolled, _excluded);\n\n var bsPrefix = useBootstrapPrefix(initialBsPrefix, 'navbar');\n var handleCollapse = useCallback(function () {\n if (onSelect) onSelect.apply(void 0, arguments);\n\n if (collapseOnSelect && expanded) {\n if (_onToggle) {\n _onToggle(false);\n }\n }\n }, [onSelect, collapseOnSelect, expanded, _onToggle]); // will result in some false positives but that seems better\n // than false negatives. strict `undefined` check allows explicit\n // \"nulling\" of the role if the user really doesn't want one\n\n if (controlledProps.role === undefined && Component !== 'nav') {\n controlledProps.role = 'navigation';\n }\n\n var expandClass = bsPrefix + \"-expand\";\n if (typeof expand === 'string') expandClass = expandClass + \"-\" + expand;\n var navbarContext = useMemo(function () {\n return {\n onToggle: function onToggle() {\n return _onToggle && _onToggle(!expanded);\n },\n bsPrefix: bsPrefix,\n expanded: !!expanded\n };\n }, [bsPrefix, expanded, _onToggle]);\n return /*#__PURE__*/React.createElement(NavbarContext.Provider, {\n value: navbarContext\n }, /*#__PURE__*/React.createElement(SelectableContext.Provider, {\n value: handleCollapse\n }, /*#__PURE__*/React.createElement(Component, _extends({\n ref: ref\n }, controlledProps, {\n className: classNames(className, bsPrefix, expand && expandClass, variant && bsPrefix + \"-\" + variant, bg && \"bg-\" + bg, sticky && \"sticky-\" + sticky, fixed && \"fixed-\" + fixed)\n }), children)));\n});\nNavbar.defaultProps = defaultProps;\nNavbar.displayName = 'Navbar';\nNavbar.Brand = NavbarBrand;\nNavbar.Toggle = NavbarToggle;\nNavbar.Collapse = NavbarCollapse;\nNavbar.Text = NavbarText;\nexport default Navbar;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"className\", \"children\"];\n\nvar _fadeStyles;\n\nimport classNames from 'classnames';\nimport React, { useCallback } from 'react';\nimport Transition, { ENTERED, ENTERING } from 'react-transition-group/Transition';\nimport transitionEndListener from './transitionEndListener';\nimport triggerBrowserReflow from './triggerBrowserReflow';\nvar defaultProps = {\n in: false,\n timeout: 300,\n mountOnEnter: false,\n unmountOnExit: false,\n appear: false\n};\nvar fadeStyles = (_fadeStyles = {}, _fadeStyles[ENTERING] = 'show', _fadeStyles[ENTERED] = 'show', _fadeStyles);\nvar Fade = /*#__PURE__*/React.forwardRef(function (_ref, ref) {\n var className = _ref.className,\n children = _ref.children,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n var handleEnter = useCallback(function (node) {\n triggerBrowserReflow(node);\n if (props.onEnter) props.onEnter(node);\n }, [props]);\n return /*#__PURE__*/React.createElement(Transition, _extends({\n ref: ref,\n addEndListener: transitionEndListener\n }, props, {\n onEnter: handleEnter\n }), function (status, innerProps) {\n return /*#__PURE__*/React.cloneElement(children, _extends({}, innerProps, {\n className: classNames('fade', className, children.props.className, fadeStyles[status])\n }));\n });\n});\nFade.defaultProps = defaultProps;\nFade.displayName = 'Fade';\nexport default Fade;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"label\", \"onClick\", \"className\"];\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport classNames from 'classnames';\nvar propTypes = {\n label: PropTypes.string.isRequired,\n onClick: PropTypes.func\n};\nvar defaultProps = {\n label: 'Close'\n};\nvar CloseButton = /*#__PURE__*/React.forwardRef(function (_ref, ref) {\n var label = _ref.label,\n onClick = _ref.onClick,\n className = _ref.className,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"button\", _extends({\n ref: ref,\n type: \"button\",\n className: classNames('close', className),\n onClick: onClick\n }, props), /*#__PURE__*/React.createElement(\"span\", {\n \"aria-hidden\": \"true\"\n }, \"\\xD7\"), /*#__PURE__*/React.createElement(\"span\", {\n className: \"sr-only\"\n }, label));\n});\nCloseButton.displayName = 'CloseButton';\nCloseButton.propTypes = propTypes;\nCloseButton.defaultProps = defaultProps;\nexport default CloseButton;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport React from 'react';\nimport classNames from 'classnames';\nexport default (function (className) {\n return /*#__PURE__*/React.forwardRef(function (p, ref) {\n return /*#__PURE__*/React.createElement(\"div\", _extends({}, p, {\n ref: ref,\n className: classNames(p.className, className)\n }));\n });\n});","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"bsPrefix\", \"show\", \"closeLabel\", \"className\", \"children\", \"variant\", \"onClose\", \"dismissible\", \"transition\"];\nimport classNames from 'classnames';\nimport React from 'react';\nimport { useUncontrolled } from 'uncontrollable';\nimport useEventCallback from '@restart/hooks/useEventCallback';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport Fade from './Fade';\nimport CloseButton from './CloseButton';\nimport divWithClassName from './divWithClassName';\nimport createWithBsPrefix from './createWithBsPrefix';\nimport SafeAnchor from './SafeAnchor';\nvar DivStyledAsH4 = divWithClassName('h4');\nDivStyledAsH4.displayName = 'DivStyledAsH4';\nvar AlertHeading = createWithBsPrefix('alert-heading', {\n Component: DivStyledAsH4\n});\nvar AlertLink = createWithBsPrefix('alert-link', {\n Component: SafeAnchor\n});\nvar defaultProps = {\n show: true,\n transition: Fade,\n closeLabel: 'Close alert'\n};\nvar Alert = /*#__PURE__*/React.forwardRef(function (uncontrolledProps, ref) {\n var _useUncontrolled = useUncontrolled(uncontrolledProps, {\n show: 'onClose'\n }),\n bsPrefix = _useUncontrolled.bsPrefix,\n show = _useUncontrolled.show,\n closeLabel = _useUncontrolled.closeLabel,\n className = _useUncontrolled.className,\n children = _useUncontrolled.children,\n variant = _useUncontrolled.variant,\n onClose = _useUncontrolled.onClose,\n dismissible = _useUncontrolled.dismissible,\n transition = _useUncontrolled.transition,\n props = _objectWithoutPropertiesLoose(_useUncontrolled, _excluded);\n\n var prefix = useBootstrapPrefix(bsPrefix, 'alert');\n var handleClose = useEventCallback(function (e) {\n if (onClose) {\n onClose(false, e);\n }\n });\n var Transition = transition === true ? Fade : transition;\n var alert = /*#__PURE__*/React.createElement(\"div\", _extends({\n role: \"alert\"\n }, !Transition ? props : undefined, {\n ref: ref,\n className: classNames(className, prefix, variant && prefix + \"-\" + variant, dismissible && prefix + \"-dismissible\")\n }), dismissible && /*#__PURE__*/React.createElement(CloseButton, {\n onClick: handleClose,\n label: closeLabel\n }), children);\n if (!Transition) return show ? alert : null;\n return /*#__PURE__*/React.createElement(Transition, _extends({\n unmountOnExit: true\n }, props, {\n ref: undefined,\n in: show\n }), alert);\n});\nAlert.displayName = 'Alert';\nAlert.defaultProps = defaultProps;\nAlert.Link = AlertLink;\nAlert.Heading = AlertHeading;\nexport default Alert;","import pathToRegexp from \"path-to-regexp\";\n\nvar patternCache = {};\nvar cacheLimit = 10000;\nvar cacheCount = 0;\n\nvar compileGenerator = function compileGenerator(pattern) {\n var cacheKey = pattern;\n var cache = patternCache[cacheKey] || (patternCache[cacheKey] = {});\n\n if (cache[pattern]) return cache[pattern];\n\n var compiledGenerator = pathToRegexp.compile(pattern);\n\n if (cacheCount < cacheLimit) {\n cache[pattern] = compiledGenerator;\n cacheCount++;\n }\n\n return compiledGenerator;\n};\n\n/**\n * Public API for generating a URL pathname from a pattern and parameters.\n */\nvar generatePath = function generatePath() {\n var pattern = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"/\";\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (pattern === \"/\") {\n return pattern;\n }\n var generator = compileGenerator(pattern);\n return generator(params, { pretty: true });\n};\n\nexport default generatePath;","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport warning from \"warning\";\nimport invariant from \"invariant\";\nimport { createLocation, locationsAreEqual } from \"history\";\nimport generatePath from \"./generatePath\";\n\n/**\n * The public API for updating the location programmatically\n * with a component.\n */\n\nvar Redirect = function (_React$Component) {\n _inherits(Redirect, _React$Component);\n\n function Redirect() {\n _classCallCheck(this, Redirect);\n\n return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));\n }\n\n Redirect.prototype.isStatic = function isStatic() {\n return this.context.router && this.context.router.staticContext;\n };\n\n Redirect.prototype.componentWillMount = function componentWillMount() {\n invariant(this.context.router, \"You should not use <Redirect> outside a <Router>\");\n\n if (this.isStatic()) this.perform();\n };\n\n Redirect.prototype.componentDidMount = function componentDidMount() {\n if (!this.isStatic()) this.perform();\n };\n\n Redirect.prototype.componentDidUpdate = function componentDidUpdate(prevProps) {\n var prevTo = createLocation(prevProps.to);\n var nextTo = createLocation(this.props.to);\n\n if (locationsAreEqual(prevTo, nextTo)) {\n warning(false, \"You tried to redirect to the same route you're currently on: \" + (\"\\\"\" + nextTo.pathname + nextTo.search + \"\\\"\"));\n return;\n }\n\n this.perform();\n };\n\n Redirect.prototype.computeTo = function computeTo(_ref) {\n var computedMatch = _ref.computedMatch,\n to = _ref.to;\n\n if (computedMatch) {\n if (typeof to === \"string\") {\n return generatePath(to, computedMatch.params);\n } else {\n return _extends({}, to, {\n pathname: generatePath(to.pathname, computedMatch.params)\n });\n }\n }\n\n return to;\n };\n\n Redirect.prototype.perform = function perform() {\n var history = this.context.router.history;\n var push = this.props.push;\n\n var to = this.computeTo(this.props);\n\n if (push) {\n history.push(to);\n } else {\n history.replace(to);\n }\n };\n\n Redirect.prototype.render = function render() {\n return null;\n };\n\n return Redirect;\n}(React.Component);\n\nRedirect.propTypes = {\n computedMatch: PropTypes.object, // private, from <Switch>\n push: PropTypes.bool,\n from: PropTypes.string,\n to: PropTypes.oneOfType([PropTypes.string, PropTypes.object]).isRequired\n};\nRedirect.defaultProps = {\n push: false\n};\nRedirect.contextTypes = {\n router: PropTypes.shape({\n history: PropTypes.shape({\n push: PropTypes.func.isRequired,\n replace: PropTypes.func.isRequired\n }).isRequired,\n staticContext: PropTypes.object\n }).isRequired\n};\n\n\nexport default Redirect;","// Written in this round about way for babel-transform-imports\nimport Redirect from \"react-router/es/Redirect\";\n\nexport default Redirect;","function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport warning from \"warning\";\nimport invariant from \"invariant\";\nimport matchPath from \"./matchPath\";\n\n/**\n * The public API for rendering the first <Route> that matches.\n */\n\nvar Switch = function (_React$Component) {\n _inherits(Switch, _React$Component);\n\n function Switch() {\n _classCallCheck(this, Switch);\n\n return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));\n }\n\n Switch.prototype.componentWillMount = function componentWillMount() {\n invariant(this.context.router, \"You should not use <Switch> outside a <Router>\");\n };\n\n Switch.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n warning(!(nextProps.location && !this.props.location), '<Switch> elements should not change from uncontrolled to controlled (or vice versa). You initially used no \"location\" prop and then provided one on a subsequent render.');\n\n warning(!(!nextProps.location && this.props.location), '<Switch> elements should not change from controlled to uncontrolled (or vice versa). You provided a \"location\" prop initially but omitted it on a subsequent render.');\n };\n\n Switch.prototype.render = function render() {\n var route = this.context.router.route;\n var children = this.props.children;\n\n var location = this.props.location || route.location;\n\n var match = void 0,\n child = void 0;\n React.Children.forEach(children, function (element) {\n if (match == null && React.isValidElement(element)) {\n var _element$props = element.props,\n pathProp = _element$props.path,\n exact = _element$props.exact,\n strict = _element$props.strict,\n sensitive = _element$props.sensitive,\n from = _element$props.from;\n\n var path = pathProp || from;\n\n child = element;\n match = matchPath(location.pathname, { path: path, exact: exact, strict: strict, sensitive: sensitive }, route.match);\n }\n });\n\n return match ? React.cloneElement(child, { location: location, computedMatch: match }) : null;\n };\n\n return Switch;\n}(React.Component);\n\nSwitch.contextTypes = {\n router: PropTypes.shape({\n route: PropTypes.object.isRequired\n }).isRequired\n};\nSwitch.propTypes = {\n children: PropTypes.node,\n location: PropTypes.object\n};\n\n\nexport default Switch;","// Written in this round about way for babel-transform-imports\nimport Switch from \"react-router/es/Switch\";\n\nexport default Switch;","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport warning from \"warning\";\nimport invariant from \"invariant\";\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\n\n/**\n * The public API for putting history on context.\n */\n\nvar Router = function (_React$Component) {\n _inherits(Router, _React$Component);\n\n function Router() {\n var _temp, _this, _ret;\n\n _classCallCheck(this, Router);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.state = {\n match: _this.computeMatch(_this.props.history.location.pathname)\n }, _temp), _possibleConstructorReturn(_this, _ret);\n }\n\n Router.prototype.getChildContext = function getChildContext() {\n return {\n router: _extends({}, this.context.router, {\n history: this.props.history,\n route: {\n location: this.props.history.location,\n match: this.state.match\n }\n })\n };\n };\n\n Router.prototype.computeMatch = function computeMatch(pathname) {\n return {\n path: \"/\",\n url: \"/\",\n params: {},\n isExact: pathname === \"/\"\n };\n };\n\n Router.prototype.componentWillMount = function componentWillMount() {\n var _this2 = this;\n\n var _props = this.props,\n children = _props.children,\n history = _props.history;\n\n\n invariant(children == null || React.Children.count(children) === 1, \"A <Router> may have only one child element\");\n\n // Do this here so we can setState when a <Redirect> changes the\n // location in componentWillMount. This happens e.g. when doing\n // server rendering using a <StaticRouter>.\n this.unlisten = history.listen(function () {\n _this2.setState({\n match: _this2.computeMatch(history.location.pathname)\n });\n });\n };\n\n Router.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n warning(this.props.history === nextProps.history, \"You cannot change <Router history>\");\n };\n\n Router.prototype.componentWillUnmount = function componentWillUnmount() {\n this.unlisten();\n };\n\n Router.prototype.render = function render() {\n var children = this.props.children;\n\n return children ? React.Children.only(children) : null;\n };\n\n return Router;\n}(React.Component);\n\nRouter.propTypes = {\n history: PropTypes.object.isRequired,\n children: PropTypes.node\n};\nRouter.contextTypes = {\n router: PropTypes.object\n};\nRouter.childContextTypes = {\n router: PropTypes.object.isRequired\n};\n\n\nexport default Router;","// Written in this round about way for babel-transform-imports\nimport Router from \"react-router/es/Router\";\n\nexport default Router;"],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/main.30543131.chunk.js b/static/js/main.30543131.chunk.js new file mode 100644 index 00000000..344da429 --- /dev/null +++ b/static/js/main.30543131.chunk.js @@ -0,0 +1,2 @@ +(this["webpackJsonpmicrometer-docs"]=this["webpackJsonpmicrometer-docs"]||[]).push([[0],Array(34).concat([function(e,t,n){var r=n(53);r.registerLanguage("gradle",n(54)),r.registerLanguage("groovy",n(55)),r.registerLanguage("http",n(56)),r.registerLanguage("java",n(57)),r.registerLanguage("xml",n(58)),r.registerLanguage("yaml",n(59)),r.registerLanguage("json",n(60)),e.exports=r},,,,,,,,,,function(e,t,n){},,,,,,function(e,t,n){},,,function(e,t,n){!function(e){"object"===typeof window&&window||"object"===typeof self&&self;(function(e){var t=[],n=Object.keys,r={},a={},i=/^(no-?highlight|plain|text)$/i,o=/\blang(?:uage)?-([\w-]+)\b/i,s=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,c="</span>",l={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};function u(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function d(e){return e.nodeName.toLowerCase()}function m(e,t){var n=e&&e.exec(t);return n&&0===n.index}function g(e){return i.test(e)}function p(e){var t,n,r,a,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",n=o.exec(i))return R(n[1])?n[1]:"no-highlight";for(t=0,r=(i=i.split(/\s+/)).length;t<r;t++)if(g(a=i[t])||R(a))return a}function h(e){var t,n={},r=Array.prototype.slice.call(arguments,1);for(t in e)n[t]=e[t];return r.forEach((function(e){for(t in e)n[t]=e[t]})),n}function f(e){var t=[];return function e(n,r){for(var a=n.firstChild;a;a=a.nextSibling)3===a.nodeType?r+=a.nodeValue.length:1===a.nodeType&&(t.push({event:"start",offset:r,node:a}),r=e(a,r),d(a).match(/br|hr|img|input/)||t.push({event:"stop",offset:r,node:a}));return r}(e,0),t}function b(e,n,r){var a=0,i="",o=[];function s(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset<n[0].offset?e:n:"start"===n[0].event?e:n:e.length?e:n}function c(e){function n(e){return" "+e.nodeName+'="'+u(e.value).replace('"',""")+'"'}i+="<"+d(e)+t.map.call(e.attributes,n).join("")+">"}function l(e){i+="</"+d(e)+">"}function m(e){("start"===e.event?c:l)(e.node)}for(;e.length||n.length;){var g=s();if(i+=u(r.substring(a,g[0].offset)),a=g[0].offset,g===e){o.reverse().forEach(l);do{m(g.splice(0,1)[0]),g=s()}while(g===e&&g.length&&g[0].offset===a);o.reverse().forEach(c)}else"start"===g[0].event?o.push(g[0].node):o.pop(),m(g.splice(0,1)[0])}return i+u(r.substr(a))}function y(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(t){return h(e,{variants:null},t)}))),e.cached_variants||e.endsWithParent&&[h(e)]||[e]}function v(e){function t(e){return e&&e.source||e}function r(n,r){return new RegExp(t(n),"m"+(e.case_insensitive?"i":"")+(r?"g":""))}function a(i,o){if(!i.compiled){if(i.compiled=!0,i.keywords=i.keywords||i.beginKeywords,i.keywords){var s={},c=function(t,n){e.case_insensitive&&(n=n.toLowerCase()),n.split(" ").forEach((function(e){var n=e.split("|");s[n[0]]=[t,n[1]?Number(n[1]):1]}))};"string"===typeof i.keywords?c("keyword",i.keywords):n(i.keywords).forEach((function(e){c(e,i.keywords[e])})),i.keywords=s}i.lexemesRe=r(i.lexemes||/\w+/,!0),o&&(i.beginKeywords&&(i.begin="\\b("+i.beginKeywords.split(" ").join("|")+")\\b"),i.begin||(i.begin=/\B|\b/),i.beginRe=r(i.begin),i.end||i.endsWithParent||(i.end=/\B|\b/),i.end&&(i.endRe=r(i.end)),i.terminator_end=t(i.end)||"",i.endsWithParent&&o.terminator_end&&(i.terminator_end+=(i.end?"|":"")+o.terminator_end)),i.illegal&&(i.illegalRe=r(i.illegal)),null==i.relevance&&(i.relevance=1),i.contains||(i.contains=[]),i.contains=Array.prototype.concat.apply([],i.contains.map((function(e){return y("self"===e?i:e)}))),i.contains.forEach((function(e){a(e,i)})),i.starts&&a(i.starts,o);var l=i.contains.map((function(e){return e.beginKeywords?"\\.?("+e.begin+")\\.?":e.begin})).concat([i.terminator_end,i.illegal]).map(t).filter(Boolean);i.terminators=l.length?r(l.join("|"),!0):{exec:function(){return null}}}}a(e)}function w(e,t,n,a){function i(e,t){var n,r;for(n=0,r=t.contains.length;n<r;n++)if(m(t.contains[n].beginRe,e))return t.contains[n]}function o(e,t){if(m(e.endRe,t)){for(;e.endsParent&&e.parent;)e=e.parent;return e}if(e.endsWithParent)return o(e.parent,t)}function s(e,t){return!n&&m(t.illegalRe,e)}function d(e,t){var n=x.case_insensitive?t[0].toLowerCase():t[0];return e.keywords.hasOwnProperty(n)&&e.keywords[n]}function g(e,t,n,r){var a='<span class="'+(r?"":l.classPrefix);return(a+=e+'">')+t+(n?"":c)}function p(){var e,t,n,r;if(!O.keywords)return u(I);for(r="",t=0,O.lexemesRe.lastIndex=0,n=O.lexemesRe.exec(I);n;)r+=u(I.substring(t,n.index)),(e=d(O,n))?(k+=e[1],r+=g(e[0],u(n[0]))):r+=u(n[0]),t=O.lexemesRe.lastIndex,n=O.lexemesRe.exec(I);return r+u(I.substr(t))}function h(){var e="string"===typeof O.subLanguage;if(e&&!r[O.subLanguage])return u(I);var t=e?w(O.subLanguage,I,!0,C[O.subLanguage]):T(I,O.subLanguage.length?O.subLanguage:void 0);return O.relevance>0&&(k+=t.relevance),e&&(C[O.subLanguage]=t.top),g(t.language,t.value,!1,!0)}function f(){M+=null!=O.subLanguage?h():p(),I=""}function b(e){M+=e.className?g(e.className,"",!0):"",O=Object.create(e,{parent:{value:O}})}function y(e,t){if(I+=e,null==t)return f(),0;var n=i(t,O);if(n)return n.skip?I+=t:(n.excludeBegin&&(I+=t),f(),n.returnBegin||n.excludeBegin||(I=t)),b(n,t),n.returnBegin?0:t.length;var r=o(O,t);if(r){var a=O;a.skip?I+=t:(a.returnEnd||a.excludeEnd||(I+=t),f(),a.excludeEnd&&(I=t));do{O.className&&(M+=c),O.skip||O.subLanguage||(k+=O.relevance),O=O.parent}while(O!==r.parent);return r.starts&&b(r.starts,""),a.returnEnd?0:t.length}if(s(t,O))throw new Error('Illegal lexeme "'+t+'" for mode "'+(O.className||"<unnamed>")+'"');return I+=t,t.length||1}var x=R(e);if(!x)throw new Error('Unknown language: "'+e+'"');v(x);var S,O=a||x,C={},M="";for(S=O;S!==x;S=S.parent)S.className&&(M=g(S.className,"",!0)+M);var I="",k=0;try{for(var E,A,D=0;O.terminators.lastIndex=D,E=O.terminators.exec(t);)A=y(t.substring(D,E.index),E[0]),D=E.index+A;for(y(t.substr(D)),S=O;S.parent;S=S.parent)S.className&&(M+=c);return{relevance:k,value:M,language:e,top:O}}catch(N){if(N.message&&-1!==N.message.indexOf("Illegal"))return{relevance:0,value:u(t)};throw N}}function T(e,t){t=t||l.languages||n(r);var a={relevance:0,value:u(e)},i=a;return t.filter(R).forEach((function(t){var n=w(t,e,!1);n.language=t,n.relevance>i.relevance&&(i=n),n.relevance>a.relevance&&(i=a,a=n)})),i.language&&(a.second_best=i),a}function x(e){return l.tabReplace||l.useBR?e.replace(s,(function(e,t){return l.useBR&&"\n"===e?"<br>":l.tabReplace?t.replace(/\t/g,l.tabReplace):""})):e}function S(e,t,n){var r=t?a[t]:n,i=[e.trim()];return e.match(/\bhljs\b/)||i.push("hljs"),-1===e.indexOf(r)&&i.push(r),i.join(" ").trim()}function O(e){var t,n,r,a,i,o=p(e);g(o)||(l.useBR?(t=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n"):t=e,i=t.textContent,r=o?w(o,i,!0):T(i),(n=f(t)).length&&((a=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=r.value,r.value=b(n,f(a),i)),r.value=x(r.value),e.innerHTML=r.value,e.className=S(e.className,o,r.language),e.result={language:r.language,re:r.relevance},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.relevance}))}function C(e){l=h(l,e)}function M(){if(!M.called){M.called=!0;var e=document.querySelectorAll("pre code");t.forEach.call(e,O)}}function I(){addEventListener("DOMContentLoaded",M,!1),addEventListener("load",M,!1)}function k(t,n){var i=r[t]=n(e);i.aliases&&i.aliases.forEach((function(e){a[e]=t}))}function E(){return n(r)}function R(e){return e=(e||"").toLowerCase(),r[e]||r[a[e]]}e.highlight=w,e.highlightAuto=T,e.fixMarkup=x,e.highlightBlock=O,e.configure=C,e.initHighlighting=M,e.initHighlightingOnLoad=I,e.registerLanguage=k,e.listLanguages=E,e.getLanguage=R,e.inherit=h,e.IDENT_RE="[a-zA-Z]\\w*",e.UNDERSCORE_IDENT_RE="[a-zA-Z_]\\w*",e.NUMBER_RE="\\b\\d+(\\.\\d+)?",e.C_NUMBER_RE="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BINARY_NUMBER_RE="\\b(0b[01]+)",e.RE_STARTERS_RE="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BACKSLASH_ESCAPE={begin:"\\\\[\\s\\S]",relevance:0},e.APOS_STRING_MODE={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},e.QUOTE_STRING_MODE={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},e.PHRASAL_WORDS_MODE={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/},e.COMMENT=function(t,n,r){var a=e.inherit({className:"comment",begin:t,end:n,contains:[]},r||{});return a.contains.push(e.PHRASAL_WORDS_MODE),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|XXX):",relevance:0}),a},e.C_LINE_COMMENT_MODE=e.COMMENT("//","$"),e.C_BLOCK_COMMENT_MODE=e.COMMENT("/\\*","\\*/"),e.HASH_COMMENT_MODE=e.COMMENT("#","$"),e.NUMBER_MODE={className:"number",begin:e.NUMBER_RE,relevance:0},e.C_NUMBER_MODE={className:"number",begin:e.C_NUMBER_RE,relevance:0},e.BINARY_NUMBER_MODE={className:"number",begin:e.BINARY_NUMBER_RE,relevance:0},e.CSS_NUMBER_MODE={className:"number",begin:e.NUMBER_RE+"(%|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},e.REGEXP_MODE={className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,{begin:/\[/,end:/\]/,relevance:0,contains:[e.BACKSLASH_ESCAPE]}]},e.TITLE_MODE={className:"title",begin:e.IDENT_RE,relevance:0},e.UNDERSCORE_TITLE_MODE={className:"title",begin:e.UNDERSCORE_IDENT_RE,relevance:0},e.METHOD_GUARD={begin:"\\.\\s*"+e.UNDERSCORE_IDENT_RE,relevance:0}})(t)}()},function(e,t){e.exports=function(e){return{case_insensitive:!0,keywords:{keyword:"task project allprojects subprojects artifacts buildscript configurations dependencies repositories sourceSets description delete from into include exclude source classpath destinationDir includes options sourceCompatibility targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant def abstract break case catch continue default do else extends final finally for if implements instanceof native new private protected public return static switch synchronized throw throws transient try volatile while strictfp package import false null super this true antlrtask checkstyle codenarc copy boolean byte char class double float int interface long short void compile runTime file fileTree abs any append asList asWritable call collect compareTo count div dump each eachByte eachFile eachLine every find findAll flatten getAt getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter newReader newWriter next plus pop power previous print println push putAt read readBytes readLines reverse reverseEach round size sort splitEachLine step subMap times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader withStream withWriter withWriterAppend write writeLine"},contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.NUMBER_MODE,e.REGEXP_MODE]}}},function(e,t){e.exports=function(e){return{keywords:{literal:"true false null",keyword:"byte short char int long boolean float double void def as in assert trait super this abstract static volatile transient public private protected synchronized final class interface enum if else for while switch case break default continue throw throws try catch finally implements extends new import package return instanceof"},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,{className:"string",begin:'"""',end:'"""'},{className:"string",begin:"'''",end:"'''"},{className:"string",begin:"\\$/",end:"/\\$",relevance:10},e.APOS_STRING_MODE,{className:"regexp",begin:/~?\/[^\/\n]+\//,contains:[e.BACKSLASH_ESCAPE]},e.QUOTE_STRING_MODE,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},e.BINARY_NUMBER_MODE,{className:"class",beginKeywords:"class interface trait enum",end:"{",illegal:":",contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"},{className:"string",begin:/[^\?]{0}[A-Za-z0-9_$]+ *:/},{begin:/\?/,end:/\:/},{className:"symbol",begin:"^\\s*[A-Za-z0-9_$]+:",relevance:0}],illegal:/#|<\//}}},function(e,t){e.exports=function(e){var t="HTTP/[0-9\\.]+";return{aliases:["https"],illegal:"\\S",contains:[{begin:"^"+t,end:"$",contains:[{className:"number",begin:"\\b\\d{3}\\b"}]},{begin:"^[A-Z]+ (.*?) "+t+"$",returnBegin:!0,end:"$",contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{begin:t},{className:"keyword",begin:"[A-Z]+"}]},{className:"attribute",begin:"^\\w",end:": ",excludeEnd:!0,illegal:"\\n|\\s|=",starts:{end:"$",relevance:0}},{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}]}}},function(e,t){e.exports=function(e){var t="false synchronized int abstract float private char boolean 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",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};return{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:"([\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*(<[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*(\\s*,\\s*[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-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:[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]},n,{className:"meta",begin:"@[A-Za-z]+"}]}}},function(e,t){e.exports=function(e){var t={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:"attr",begin:"[A-Za-z0-9\\._:-]+",relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/},{begin:/[^\s"'=<>`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],case_insensitive:!0,contains:[{className:"meta",begin:"<!DOCTYPE",end:">",relevance:10,contains:[{begin:"\\[",end:"\\]"}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{begin:/<\?(php)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0}]},{className:"tag",begin:"<style(?=\\s|>|$)",end:">",keywords:{name:"style"},contains:[t],starts:{end:"</style>",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:"<script(?=\\s|>|$)",end:">",keywords:{name:"script"},contains:[t],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["actionscript","javascript","handlebars","xml"]}},{className:"tag",begin:"</?",end:"/?>",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},t]}]}}},function(e,t){e.exports=function(e){var t="true false yes no null",n="^[ \\-]*",r="[a-zA-Z_][\\w\\-]*",a={className:"attr",variants:[{begin:n+r+":"},{begin:'^[ \\-]*"'+r+'":'},{begin:"^[ \\-]*'"+r+"':"}]},i={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]};return{case_insensitive:!0,aliases:["yml","YAML","yaml"],contains:[a,{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>] *$",returnEnd:!0,contains:i.contains,end:a.variants[0].begin},{className:"type",begin:"!!"+e.UNDERSCORE_IDENT_RE},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"^ *-",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:t,keywords:{literal:t}},e.C_NUMBER_MODE,i]}}},function(e,t){e.exports=function(e){var t={literal:"true false null"},n=[e.QUOTE_STRING_MODE,e.C_NUMBER_MODE],r={end:",",endsWithParent:!0,excludeEnd:!0,contains:n,keywords:t},a={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE],illegal:"\\n"},e.inherit(r,{begin:/:/})],illegal:"\\S"},i={begin:"\\[",end:"\\]",contains:[e.inherit(r)],illegal:"\\S"};return n.splice(n.length,0,a,i),{contains:n,keywords:t,illegal:"\\S"}}},function(e,t,n){},,,,,,,,,function(e,t,n){},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\nMicrometer contains a core library with the instrumentation SPI and an in-memory implementation that does not export data anywhere, a series of modules with implementations for various monitoring systems, and a test module.\n\nTo use Micrometer, add the dependency for your monitoring system.\n\nThe following example adds Prometheus in Gradle:\n\n[source,groovy]\n----\nimplementation 'io.micrometer:micrometer-registry-prometheus:latest.release'\n----\n\nThe following example adds Prometheus in Maven:\n\n[source,xml]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-prometheus</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\nThrough Micrometer's composite meter registry (described in greater detail in link:/docs/concepts#_composite_registries[\"Concepts\"]), you may configure more than one registry implementation if you intend to publish metrics to more than one monitoring system.\n\nIf you have not decided on a monitoring system yet and want only to try out the instrumentation SPI, you can add a dependency on `micrometer-core` instead and configure the `SimpleMeterRegistry`.\n\n== Snapshots\n\nEvery successful https://app.circleci.com/pipelines/github/micrometer-metrics/micrometer[build] of Micrometer's `main` and maintenance branches (for example, `1.7.x`) results in the publication of a new snapshot version. You can use the latest snapshot by adding the Maven repository `https://repo.spring.io/snapshot` to your build and using the corresponding snapshot version -- for example, `1.8.0-SNAPSHOT`.\n\n== Milestones\n\nMilestone releases are made available for early testing purposes and are not intended for production use.\nMilestone releases are published to https://repo.spring.io/milestone.\nInclude that as a Maven repository in your build configuration to use milestone releases.\nMilestones are marked as \"`pre-releases`\" on GitHub, and the version has a suffix, such as `-M1` or `-RC1` (milestone 1 or release candidate 1, respectively).\n"},function(e,t,n){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Concepts\n:toc:\n:sectnums:\n:dimensional: true\n\n== Purpose\n\nMicrometer is a metrics instrumentation library for JVM-based applications. It provides a simple facade over the instrumentation clients for the most popular monitoring systems, letting you instrument your JVM-based application code without vendor lock-in. It is designed to add little to no overhead to your metrics collection activity while maximizing the portability of your metrics effort.\n\nStarting from Micrometer 1.10, Micrometer provides the link:../docs/observation[Observation API] and a plugin mechanism that allows you to add capabilities including the tracing features. You can read more about this in the link:../docs/tracing[Micrometer Tracing documentation].\n\nFor better understanding the differences among these different types of systems (Metrics, Distributed Tracing, and Logging) we recommend Adrian Cole\'s talk, titled https://www.dotconferences.com/2017/04/adrian-cole-observability-3-ways-logging-metrics-tracing[Observability\n3 Ways]. To learn more about Micrometer Observation API we recommend Tommy Ludwig\'s and Marcin Grzejszczak\'s talk, titled https://www.youtube.com/watch?v=fh3VbrPvAjg[Observability of Your Application].\n\n== Dependencies\n\nThe `micrometer-core` module aims to have minimal dependencies. It does not require any third-party (non-Micrometer) dependencies on the classpath at compile time for applications using Micrometer.\n\nUse of the link:#_pause_detection[pause detection] feature requires the https://github.com/LatencyUtils/LatencyUtils[LatencyUtils] dependency to be available on the classpath at runtime. If your application does not use the pause detection feature, you can exclude LatencyUtils from your runtime classpath.\n\nhttps://github.com/HdrHistogram/HdrHistogram[HdrHistogram] is needed on the classpath at runtime if you use link:#_histograms_and_percentiles[client-side percentiles]. If you are not using client-side percentiles, you may exclude HdrHistogram from your application\'s runtime classpath.\n\n== Supported Monitoring Systems\n\n:leveloffset: +1\n\nMicrometer contains a core module with an instrumentation https://en.wikipedia.org/wiki/Service_provider_interface[SPI], a set of modules containing implementations for various monitoring systems (each is called a registry), and a test kit. You need to understand three important characteristics of monitoring systems:\n\n* *Dimensionality*. Whether the system supports metric names to be enriched with tag key/value pairs. If a system is not _dimensional_, it is _hierarchical_, which means it supports only a flat metric name. When publishing metrics to hierarchical systems, Micrometer flattens the set of tag key/value pairs and adds them to the name.\n\n[cols=2*,options="header"]\n|===\n|Dimensional\n|Hierarchical\n\n|AppOptics, Atlas, Azure Monitor, Cloudwatch, Datadog, Datadog StatsD, Dynatrace, Elastic, Humio, Influx, KairosDB, New Relic, Prometheus, SignalFx, Sysdig StatsD, Telegraf StatsD, Wavefront\n|Graphite, Ganglia, JMX, Etsy StatsD\n|===\n\n\n* *<<rate-aggregation>>*. In this context, we mean aggregation of a set of samples over a prescribed time interval. Some monitoring systems expect some types of discrete samples (such as counts) to be converted to a rate by the application prior to being published. Other systems expect cumulative values to always be sent. Still others have no opinion on it either way.\n\n[cols=2*,options="header"]\n|===\n|Client-side\n|Server-side\n\n|AppOptics, Atlas, Azure Monitor, Datadog, Dynatrace, Elastic, Graphite, Ganglia, Humio, Influx, JMX, Kairos, New Relic, all StatsD flavors, SignalFx\n|Prometheus, Wavefront footnote:[As of 1.2.0, Micrometer sends cumulative values to Wavefront.]\n|===\n\n* *Publishing*. Some systems expect to poll applications for metrics at their leisure, while others expect metrics to be pushed to them on a regular interval.\n\n[cols=2*,options="header"]\n|===\n|Client pushes\n|Server polls\n\n|AppOptics, Atlas, Azure Monitor, Datadog, Dynatrace, Elastic, Graphite, Ganglia, Humio, Influx, JMX, Kairos, New Relic, SignalFx, Wavefront\n|Prometheus, all StatsD flavors\n|===\n\nThere are other, more minor, variations in expectations from one monitoring system to another, such as their conception of base units of measurement (particularly time) and the canonical naming convention for metrics. Micrometer customizes your metrics to meet these demands on a per-registry basis.\n\n:leveloffset!:\n\n== Registry\n\n:leveloffset: +1\n\nA `Meter` is the interface for collecting a set of measurements (which we individually call metrics) about your application. Meters in Micrometer are created from and held in a `MeterRegistry`. Each supported monitoring system has an implementation of `MeterRegistry`. How a registry is created varies for each implementation.\n\nMicrometer includes a `SimpleMeterRegistry` that holds the latest value of each meter in memory and does not export the data anywhere. If you do not yet have a preferred monitoring system, you can get started playing with metrics by using the simple registry:\n\n====\n[source,java]\n----\nMeterRegistry registry = new SimpleMeterRegistry();\n----\n====\n\nNOTE: A `SimpleMeterRegistry` is autowired for you in Spring-based applications.\n\n== Composite Registries\n\nMicrometer provides a `CompositeMeterRegistry` to which you can add multiple registries, letting you publish metrics to more than one monitoring system simultaneously:\n\n====\n[source,java]\n----\nCompositeMeterRegistry composite = new CompositeMeterRegistry();\n\nCounter compositeCounter = composite.counter("counter");\ncompositeCounter.increment(); <1>\n\nSimpleMeterRegistry simple = new SimpleMeterRegistry();\ncomposite.add(simple); <2>\n\ncompositeCounter.increment(); <3>\n----\n\n1. Increments are NOOP\'d until there is a registry in the composite. The counter\'s count still yields 0 at this point.\n2. A counter named `counter` is registered to the simple registry.\n3. The simple registry counter is incremented, along with counters for any other registries in the composite.\n====\n\n== Global Registry\n\nMicrometer provides a static global registry `Metrics.globalRegistry` and a set of static builders for generating meters based on this registry (note that `globalRegistry` is a composite registry):\n\n====\n[source,java]\n----\nclass MyComponent {\n Counter featureCounter = Metrics.counter("feature", "region", "test"); <1>\n\n void feature() {\n featureCounter.increment();\n }\n\n void feature2(String type) {\n Metrics.counter("feature.2", "type", type).increment(); <2>\n }\n}\n\nclass MyApplication {\n void start() {\n // wire your monitoring system to global static state\n Metrics.addRegistry(new SimpleMeterRegistry()); <3>\n }\n}\n----\n\n1. Wherever possible (and especially where instrumentation performance is critical), store `Meter` instances in fields to avoid a lookup on their name or tags on each use.\n2. When tags need to be determined from local context, you have no choice but to construct or lookup the Meter inside your method body. The lookup cost is just a single hash lookup, so it is acceptable for most use cases.\n3. It is OK to add registries _after_ meters have been created with code like `Metrics.counter(...)`. These meters are added to each registry, as it is bound to the global composite.\n====\n\n:leveloffset!:\n\n== Meters\n\n:leveloffset: +1\n\nMicrometer supports a set of `Meter` primitives, including `Timer`, `Counter`, `Gauge`, `DistributionSummary`, `LongTaskTimer`, `FunctionCounter`, `FunctionTimer`, and `TimeGauge`. Different meter types result in a different number of time series metrics. For example, while there is a single metric that represents a `Gauge`, a `Timer` measures both the count of timed events and the total time of all timed events.\n\nA meter is uniquely identified by its name and dimensions. We use the terms, "`dimensions`" and "`tags,`" interchangeably, and the Micrometer interface is `Tag` simply because it is shorter. As a general rule, it should be possible to use the name as a pivot. Dimensions let a particular named metric be sliced to drill down and reason about the data. This means that, if only the name is selected, you can drill down by using other dimensions and reason about the value being shown.\n\n:leveloffset!:\n\n== Naming Meters\n\n:leveloffset: +1\n\nMicrometer employs a naming convention that separates lowercase words with a `.` (dot) character. Different monitoring systems have different recommendations regarding naming convention, and some naming conventions may be incompatible between one system and another. Each Micrometer implementation for a monitoring system comes with a naming convention that transforms lowercase dot notation names to the monitoring system\'s recommended naming convention. Additionally, this naming convention implementation removes special characters that are disallowed by the monitoring system from the metric names and tags. You can override the default naming convention for a registry by implementing `NamingConvention` and setting it on the registry:\n\n====\n[source,java]\n----\nregistry.config().namingConvention(myCustomNamingConvention);\n----\n====\n\nWith naming conventions in place, the following timer registered in Micrometer looks good natively in a wide variety of monitoring systems:\n\n====\n[source,java]\n----\nregistry.timer("http.server.requests");\n----\n====\n\n. Prometheus - `http_server_requests_duration_seconds`\n. Atlas - `httpServerRequests`\n. Graphite - `http.server.requests`\n. InfluxDB - `http_server_requests`\n\nBy adhering to Micrometer\'s lowercase dot notation convention, you guarantee the maximum degree of portability for your metric names across monitoring systems.\n\n== Tag Naming\n\nTIP: We recommend that you follow the same lowercase dot notation described for meter names when naming tags. Using this consistent naming convention for tags allows for better translation into the respective monitoring system\'s idiomatic naming schemes.\n\nSuppose we are trying to measure the number of http requests and the number of database calls.\n\n*Recommended Approach*\n\n====\n[source,java]\n----\nregistry.counter("database.calls", "db", "users")\nregistry.counter("http.requests", "uri", "/api/users")\n----\n====\n\nThis variant provides enough context so that, if only the name is selected, the value can be reasoned about and is at least potentially meaningful. For example if we select `database.calls`, we can see the total number of calls to all databases. Then we can group by or select by `db` to drill down further or perform comparative analysis on the contribution of calls to each database.\n\n*Bad Approach*\n\n====\n[source,java]\n----\nregistry.counter("calls",\n "class", "database",\n "db", "users");\n\nregistry.counter("calls",\n "class", "http",\n "uri", "/api/users");\n----\n====\n\nIn this approach, if we select `calls`, we get a value that is an aggregate of the number of calls to the database and to our API endpoint. This time series is not useful without further dimensional drill-down.\n\n== Common Tags\n\nYou can define common tags at the registry level and add them to every metric reported to the monitoring system. This is generally used for dimensional drill-down on the operating environment, such as host, instance, region, stack, and others:\n\n====\n[source,java]\n----\nregistry.config().commonTags("stack", "prod", "region", "us-east-1");\nregistry.config().commonTags(Arrays.asList(Tag.of("stack", "prod"), Tag.of("region", "us-east-1"))); // equivalently\n----\n====\n\nCalls to `commonTags` append additional common tags.\n\n[IMPORTANT]\n====\nCommon tags generally have to be added to the registry _before_ any (possibly autoconfigured) meter binders. Depending on your environment, there are different ways to achieve this.\n\nIf you use Spring Boot, you have two options:\n\n* Add your common tags with https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.metrics.customizing.common-tags[configuration properties]\n* If you need more flexibility (for example, you have to add common tags to a registry defined in a shared library), register a `MeterRegistryCustomizer` callback interface as a bean to add your common tags. See the\nhttps://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.metrics.getting-started[Spring Boot Reference Documentation] for more information.\n====\n\n== Tag Values\n\nTag values must be non-null.\n\nWARNING: Beware of the potential for tag values coming from user-supplied sources to blow up the cardinality of a metric. You should always carefully normalize and add bounds to user-supplied input. Sometimes, the cause is sneaky. Consider the URI tag for recording HTTP requests on service endpoints. If we do not constrain 404\'s to a value like NOT_FOUND, the dimensionality of the metric would grow with each resource that cannot be found.\n\n:leveloffset!:\n\n== Meter Filters\n\n:leveloffset: +1\n\nYou can configure each registry with meter filters, which give you greater control over how and when meters are registered and what kinds of statistics they emit. Meter filters serve three basic functions:\n\n1. **Deny** (or **Accept**) meters being registered.\n2. **Transform** meter IDs (for example, changing the name, adding or removing tags, and changing description or base units).\n3. **Configure** distribution statistics for some meter types.\n\nImplementations of `MeterFilter` are added to the registry programmatically:\n\n====\n[source, java]\n----\nregistry.config()\n .meterFilter(MeterFilter.ignoreTags("too.much.information"))\n .meterFilter(MeterFilter.denyNameStartsWith("jvm"));\n----\n====\n\nMeter filters are applied in order, and the results of transforming or configuring a meter are chained.\n\n== Deny or Accept Meters\n\nThe verbose form of an accept or deny filter is:\n\n====\n[source, java]\n----\nnew MeterFilter() {\n @Override\n public MeterFilterReply accept(Meter.Id id) {\n if(id.getName().contains("test")) {\n return MeterFilterReply.DENY;\n }\n return MeterFilterReply.NEUTRAL;\n }\n}\n----\n====\n\n`MeterFilterReply` has three possible states:\n\n* `DENY`: Do not let this meter be registered. When you try to register a meter against a registry and the filter returns `DENY`, the registry returns a NOOP version of that meter (for example, `NoopCounter` or `NoopTimer`). Your code can continue to interact with the NOOP meter, but anything recorded to it is discarded immediately with minimal overhead.\n* `NEUTRAL`: If no other meter filter has returned `DENY`, registration of meters proceeds normally.\n* `ACCEPT`: If a filter returns `ACCEPT`, the meter is immediately registered without interrogating the accept methods of any further filters.\n\n=== Convenience Methods\n\n`MeterFilter` provides several convenience static builders for deny and accept type filters:\n\n* `accept()`: Accept every meter, overriding the decisions of any filters that follow.\n* `accept(Predicate<Meter.Id>)`: Accept any meter matching the predicate.\n* `acceptNameStartsWith(String)`: Accept every meter with a matching prefix.\n* `deny()`: Deny every meter, overriding the decisions of any filters that follow.\n* `denyNameStartsWith(String)`: Deny every meter with a matching prefix. All `MeterBinder` implementations provided by Micrometer have names with common prefixes to allow for easy grouping visualization in UIs but also to make them easy to disable or enable as a group with a prefix. For example, you can deny all JVM metrics with `MeterFilter.denyNameStartsWith("jvm")`.\n* `deny(Predicate<Meter.Id>)`: Deny any meter that matches the predicate.\n* `maximumAllowableMetrics(int)`: Deny any meter after the registry has reached a certain number of meters.\n* `maximumAllowableTags(String meterNamePrefix, String tagKey, int maximumTagValues, MeterFilter onMaxReached)`: Places an upper bound on the number of tags produced by matching series.\n\n**Whitelisting** only a certain group of metrics is a particularly common case for monitoring systems that are _expensive_. This can be achieved with a static call:\n\n* `denyUnless(Predicate<Meter.Id>)`: Deny all meters that _do not_ match the predicate.\n\n=== Chaining Deny Accept Meters\n\nMeter filters are applied in the order in which they are configured on the registry, so it is possible to stack deny and accept filters to achieve more complex rules:\n\n====\n[source, java]\n----\nregistry.config()\n .meterFilter(MeterFilter.acceptNameStartsWith("http"))\n .meterFilter(MeterFilter.deny()); <1>\n----\n====\n\nThis achieves another form of whitelisting by stacking two filters together. Only `http` metrics are allowed to exist in this registry.\n\n== Transforming metrics\n\nThe following example shows a transform filter:\n\n====\n[source, java]\n----\nnew MeterFilter() {\n @Override\n public Meter.Id map(Meter.Id id) {\n if(id.getName().startsWith("test")) {\n return id.withName("extra." + id.getName()).withTag("extra.tag", "value");\n }\n return id;\n }\n}\n----\n====\n\nThis filter adds a name prefix and an additional tag conditionally to meters starting with a name of `test`.\n\n`MeterFilter` provides convenience builders for many common transformation cases:\n\n* `commonTags(Iterable<Tag>)`: Adds a set of tags to all metrics. Adding common tags for application name, host, region, and others is a highly recommended practice.\n* `ignoreTags(String...)`: Drops matching tag keys from every meter. This is particularly useful when a tag provably comes to have\ntoo high cardinality and starts stressing your monitoring system or costing too much but you cannot change all the instrumentation points quickly.\n* `replaceTagValues(String tagKey, Function<String, String> replacement, String... exceptions)`: Replace tag values according to the provided mapping for all matching tag keys. You can use this to reduce the total cardinality of a tag by mapping some portion of tag values to something else.\n* `renameTag(String meterNamePrefix, String fromTagKey, String toTagKey)`: Rename a tag key for every metric that begins with a given prefix.\n\n== Configuring Distribution Statistics\n\n`Timer` and `DistributionSummary` contain a set of optional distribution statistics (in addition to the basics of count, total, and max) that you can configure through filters. These distribution statistics include pre-computed percentiles, SLOs, and histograms.\n\n====\n[source, java]\n----\nnew MeterFilter() {\n @Override\n public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) {\n if (id.getName().startsWith(prefix)) {\n return DistributionStatisticConfig.builder()\n .publishPercentiles(0.9, 0.95)\n .build()\n .merge(config);\n }\n return config;\n }\n};\n----\n====\n\nGenerally, you should create a new `DistributionStatisticConfig` with only the pieces you wish to configure and then `merge` it with the input configuration. This lets you drop down on registry-provided defaults for distribution statistics and to chain multiple filters together, each configuring some part of the distribution statistics (for example, you might want a 100ms SLO for all HTTP requests but only percentile histograms on a few critical endpoints).\n\n`MeterFilter` provides convenience builders for:\n\n* `maxExpected(Duration/long)`: Governs the upper bound of percentile histogram buckets shipped from a timer or summary.\n* `minExpected(Duration/long)`: Governs the lower bound of percentile histogram buckets shipped from a timer or summary.\n\nSpring Boot offers property-based filters for configuring SLOs, percentiles, and percentile histograms by name prefix.\n\n:leveloffset!:\n\n[[rate-aggregation]]\n== Rate Aggregation\n\n:leveloffset: +1\n\nMicrometer is aware of whether a particular monitoring system expects rate aggregation to happen client-side before metrics are published or ad-hoc as part of the query on the server. It accumulates metrics according to which style the monitoring system expects.\n\nNot all measurements are reported or best viewed as a rate. For example, gauge values and the active task count long task timers are not rates.\n\n== Server-side\n\nMonitoring systems that perform server-side rate math expect absolute values to be reported at each publishing interval. For example, the absolute count of all increments to a counter since the beginning of the application is sent on each publishing interval.\n\nSuppose we have a slightly positively biased random walk that chooses to increment a counter once every 10 milliseconds. If we view the raw counter value in a system like Prometheus, we see a step-wise monotonically increasing function (the width of the step is the interval at which Prometheus is polling or scraping for data).\n\nimage::'+n(73)+"[Absolute counter value]\n\nRepresenting a counter without rate aggregation over some time window is rarely useful, as the representation is a function of both the rapidity with which the counter is incremented and the longevity of the service. In the preceding example, the counter drops back to zero on service restart. The rate-aggregated graph would return back to a value around 55 as soon as the new instance (say on a production deployment) was in service.\n\nimage::"+n(74)+'[Rate-aggregated counter]\n\nIf you have achieved zero-downtime deployments (for example, through red-black deployments), you should be able to comfortably set _minimum_ alert thresholds on the rate-aggregated graph without service restarts causing dips in the counter value.\n\nIMPORTANT: For most production purposes, whether it be alerting, automated canary analysis, or other use cases, base your automation off of rate-aggregated data.\n\n== Client-side\n\nTwo other classes of monitoring system either:\n\n. Expect rate-aggregated data. Given the key insight that for most production purposes, we should be basing our decisions off of rates rather than absolute values, such systems benefit from having to do less math to satisfy queries.\n. Have relatively little or no math operations that would let us rate-aggregate data through our queries. For these systems, publishing pre-aggregated data is the only way to build meaningful representations.\n\nMicrometer efficiently maintains rate data by means of a step value that accumulates data for the current publishing interval. When the step value is polled (when publishing, for example), if the step value detects that the current interval has elapsed, it moves current data to "`previous`" state. This previous state is what is reported until the next time current data overwrites it. The following image shows the interaction of current and previous state, along with polling:\n\nimage::'+n(75)+'[Behavior of a step value,width=1200]\n\nThe value returned by the poll function is always _rate per second * interval_. If the step value shown in the preceding image represents the values of a counter, we could say that the counter saw "`0.3 increments per second`" in the first interval, which is reportable to the backend at any time during the second interval.\n\nMicrometer timers track at least a count and the total time as separate measurements. Suppose we configure publishing at 10-second intervals and we saw 20 requests that each took 100ms. Then, for the first interval:\n\n. `count` = 10 seconds * (20 requests / 10 seconds) = 20 requests\n. `totalTime` = 10 seconds * (20 * 100 ms / 10 seconds) = 2 seconds\n\nThe `count` statistic is meaningful by itself: It is a measure of _throughput_. `totalTime` represents the total latency of all requests in the interval. Additionally:\n\n`totalTime / count` = 2 seconds / 20 requests = 0.1 seconds / request = 100 ms / request\n\nThis is a useful measure of _average latency_. When the same idea is applied to the `totalAmount` and `count` emanating from distribution summaries, the measure is called a _distribution average_. Average latency is just the distribution average for a distribution summary measured in time (a timer). Some monitoring systems (such as Atlas) provide facilities for computing the distribution average from these statistics, and Micrometer includes `totalTime` and `count` as separate statistics. Others, (such as Datadog) do not have this kind of operation built-in, and Micrometer calculates the distribution average client-side and ships that.\n\nShipping the rate for the publishing interval is sufficient to reason about the rate over any time window greater than or equal to the publishing interval. In our example, if a service continues to receive 20 requests that each take 100ms for every 10 second interval in a given minute, we could say:\n\n. Micrometer reported "`20 requests`" for `count` on every 10 second interval. The monitoring system sums these six 10 second intervals and arrives at the conclusion that there are 120 requests / minute. Note that it is the monitoring system doing this summation, not Micrometer.\n. Micrometer reported "`2 seconds`" of `totalTime` on every 10 second interval. The monitoring system can sum all total time statistics over the minute to yield "`12 seconds`" of total time in the minute interval. Then, the average latency is as we expect: 12 seconds / 120 requests = 100 ms / request.\n\n:leveloffset!:\n\n== Counters\n\n:leveloffset: +1\n\nCounters report a single metric: a count. The `Counter` interface lets you increment by a fixed amount, which must be positive.\n\nTIP: Never count something you can time with a `Timer` or summarize with a `DistributionSummary`! Both `Timer` and `DistributionSummary` always publish a count of events in addition to other measurements.\n\nWhen building graphs and alerts off of counters, you should generally be most interested in measuring the rate at which some event occurs over a given time interval. Consider a simple queue. You could use counters to measure various things, such as the rate at which items are being inserted and removed.\n\nIt is tempting, at first, to conceive of visualizing absolute counts rather than a rate, but the absolute count is usually both a function of the rapidity with which something is used *and* the longevity of the application instance under instrumentation. Building dashboards and alerts of the rate of a counter per some interval of time disregards the longevity of the app, letting you see aberrant behavior long after the application has started.\n\nNOTE: Be sure to read through the timer section before jumping into using counters, as timers record a count of timed events as part of the suite of metrics that go into timing. For those pieces of code you intend to time, you do NOT need to add a separate counter.\n\nThe following code simulates a real counter whose rate exhibits some perturbation over a short time window:\n\n[source,java]\n----\nNormal rand = ...; // a random generator\n\nMeterRegistry registry = ...\nCounter counter = registry.counter("counter"); <1>\n\nFlux.interval(Duration.ofMillis(10))\n .doOnEach(d -> {\n if (rand.nextDouble() + 0.1 > 0) { <2>\n counter.increment(); <3>\n }\n })\n .blockLast();\n----\n<1> Most counters can be created off of the registry itself with a name and, optionally, a set of tags.\n<2> A slightly positively biased random walk.\n<3> This is how you interact with a counter. You could also call `counter.increment(n)` to increment by more than one in a single operation.\n\nA fluent builder for counters on the `Counter` interface itself provides access to less frequently used options, such as\nbase units and description. You can register the counter as the last step of its construction by calling `register`:\n\n[source, java]\n----\nCounter counter = Counter\n .builder("counter")\n .baseUnit("beans") // optional\n .description("a description of what this counter does") // optional\n .tags("region", "test") // optional\n .register(registry);\n----\n\n== Function-tracking Counters\n\nMicrometer also provides a more infrequently used counter pattern that tracks a monotonically increasing function (a function that stays the same or increases over time but never decreases). Some monitoring systems, such as Prometheus, push cumulative values for counters to the backend, but others publish the rate at which a counter is incrementing over the push interval. By employing this pattern, you let the Micrometer implementation for your monitoring system choose whether to rate-normalize the counter, and your counter remains portable across different types of monitoring systems.\n\n[source, java]\n-----\nCache cache = ...; // suppose we have a Guava cache with stats recording on\nregistry.more().counter("evictions", tags, cache, c -> c.stats().evictionCount()); <1>\n-----\n\n<1> `evictionCount()` is a monotonically increasing function that increments with every cache eviction from the beginning of its life.\n\nThe function-tracking counter, in concert with the monitoring system\'s rate normalizing functionality (whether this is an artifact of the query language or the way data is pushed to the system), adds a layer of richness on top of the cumulative value of the function itself. You can reason about the _rate_ at which the value is increasing, whether that rate is within an acceptable bound, is increasing or decreasing over time, and so on.\n\nWARNING: Micrometer cannot guarantee the monotonicity of the function for you. By using this signature, you are asserting its monotonicity based on what you know about its definition.\n\nA fluent builder for function counters on the `FunctionCounter` interface itself provides access to less frequently used options, such as base units and description. You can register the counter as the last step of its construction by calling `register(MeterRegistry)`.\n\n[source, java]\n----\nMyCounterState state = ...;\n\nFunctionCounter counter = FunctionCounter\n .builder("counter", state, state -> state.count())\n .baseUnit("beans") // optional\n .description("a description of what this counter does") // optional\n .tags("region", "test") // optional\n .register(registry);\n----\n\n:leveloffset!:\n\n== Gauges\n\n:leveloffset: +1\n\nA gauge is a handle to get the current value. Typical examples for gauges would be the size of a collection or map or number of threads in a running state.\n\nTIP: Gauges are useful for monitoring things with natural upper bounds. We do not recommend using a gauge to monitor things like request count, as they can grow without bound for the duration of an application instance\'s life.\n\nTIP: Never gauge something you can count with a `Counter`!\n\nMicrometer takes the stance that gauges should be sampled and not be set, so there is no information about what might have occurred between samples. Any intermediate values set on a gauge are lost by the time the gauge value is reported to a metrics backend, so there is little value in setting those intermediate values in the first place.\n\nThink of a `Gauge` as a "`heisen-gauge`": a meter that changes only when it is observed. Every other meter type accumulates intermediate counts toward the point where the data is sent to the metrics backend.\n\nThe `MeterRegistry` interface contains methods for building gauges to observe numeric values, functions, collections, and maps:\n\n[source, java]\n----\nList<String> list = registry.gauge("listGauge", Collections.emptyList(), new ArrayList<>(), List::size); <1>\nList<String> list2 = registry.gaugeCollectionSize("listSize2", Tags.empty(), new ArrayList<>()); <2>\nMap<String, Integer> map = registry.gaugeMapSize("mapGauge", Tags.empty(), new HashMap<>());\n----\n<1> A slightly more common form of gauge is one that monitors some non-numeric object. The last argument establishes the function that is used to determine the value of the gauge when the gauge is observed.\n<2> A more convenient form of (1) for when you want to monitor collection size.\n\nAll of the different forms of creating a gauge maintain only a _weak reference_ to the object being observed, so as not to prevent garbage collection of the object.\n\n== Manually Incrementing or Decrementing a Gauge\n\nA gauge can be made to track any `java.lang.Number` subtype that is settable, such as `AtomicInteger` and `AtomicLong` found in `java.util.concurrent.atomic` and similar types, such as Guava\'s `AtomicDouble`:\n\n[source,java]\n----\n// maintain a reference to myGauge\nAtomicInteger myGauge = registry.gauge("numberGauge", new AtomicInteger(0));\n\n// ... elsewhere you can update the value it holds using the object reference\nmyGauge.set(27);\nmyGauge.set(11);\n----\n\nNote that, in this form, unlike other meter types, you do not get a reference to the `Gauge` when creating one. Rather, you get a reference to the thing being observed. This is because of the "`heisen-gauge`" principal: The gauge is self-sufficient once created, so you should never need to interact with it. This lets us give you back only the instrumented object, which allows for quick one-liners that both create the object to be observed and set up metrics around it.\n\nThis pattern should be less common than the `DoubleFunction` form. Remember that frequent setting of the observed `Number` results in a lot of intermediate values that never get published. Only the _instantaneous value_ of the gauge at publish time is ever sent to the monitoring system.\n\nWARNING: Attempting to construct a gauge with a primitive number or one of its `java.lang` object forms is always incorrect. These numbers are immutable. Thus, the gauge cannot ever be changed. Attempting to "`re-register`" the gauge with a different number does not work, as the registry maintains only one meter for each unique combination of name and tags.\n\n== Gauge Fluent Builder\n\nThe interface contains a fluent builder for gauges:\n\n[source, java]\n----\nGauge gauge = Gauge\n .builder("gauge", myObj, myObj::gaugeValue)\n .description("a description of what this gauge does") // optional\n .tags("region", "test") // optional\n .register(registry);\n----\n\nGenerally the returned `Gauge` instance is not useful except in testing, as the gauge is already set up to track a value automatically upon registration.\n\n== Why is My Gauge Reporting NaN or Disappearing?\n\nIt is your responsibility to hold a strong reference to the state object that you are measuring with a `Gauge`. Micrometer is careful to not create strong references to objects that would otherwise be garbage collected. Once the object being gauged is de-referenced and is garbage collected, Micrometer starts reporting a NaN or nothing for a gauge, depending on the registry implementation.\n\nIf you see your gauge reporting for a few minutes and then disappearing or reporting NaN, it almost certainly suggests that the underlying object being gauged has been garbage collected.\n\n== `TimeGauge`\n\n`TimeGauge` is a specialized gauge that tracks a time value, to be scaled to the base unit of time expected by each registry implementation.\n\n`TimeGauge` can be registered with `TimeUnit` as follows:\n\n[source, java]\n----\nAtomicInteger msTimeGauge = new AtomicInteger(4000);\nAtomicInteger usTimeGauge = new AtomicInteger(4000);\nTimeGauge.builder("my.gauge", msTimeGauge, TimeUnit.MILLISECONDS, AtomicInteger::get).register(registry);\nTimeGauge.builder("my.other.gauge", usTimeGauge, TimeUnit.MICROSECONDS, AtomicInteger::get).register(registry);\n----\n\nAnd for example, if the registry is Prometheus, they will be converted in seconds as follows:\n\n```\n# HELP my_gauge_seconds\n# TYPE my_gauge_seconds gauge\nmy_gauge_seconds 4.0\n# HELP my_other_gauge_seconds\n# TYPE my_other_gauge_seconds gauge\nmy_other_gauge_seconds 0.004\n```\n\n== Multi-gauge\n\nMicrometer supports one last special type of `Gauge`, called a `MultiGauge`, to help manage gauging a growing or shrinking list of criteria.\nThis feature lets you select a set of well-bounded but slightly changing set of criteria from something like an SQL query and report some metric for each row as a `Gauge`. The following example creates a `MultiGauge`:\n\n[source, java]\n----\n// SELECT count(*) from job group by status WHERE job = \'dirty\'\nMultiGauge statuses = MultiGauge.builder("statuses")\n .tag("job", "dirty")\n .description("The number of widgets in various statuses")\n .baseUnit("widgets")\n .register(registry);\n\n...\n\n// run this periodically whenever you re-run your query\nstatuses.register(\n resultSet.stream()\n .map(result -> Row.of(Tags.of("status", result.getAsString("status")), result.getAsInt("count")))\n .collect(toList())\n);\n----\n\n:leveloffset!:\n\n== Timers\n\n:leveloffset: +1\n\nTimers are intended for measuring short-duration latencies and the frequency of such events. All implementations of `Timer` report at least the total time and the count of events as separate time series. While you can use timers for other use cases, note that negative values are not supported, and recording many longer durations could cause overflow of the total time at `Long.MAX_VALUE` nanoseconds (292.3 years).\n\nAs an example, consider a graph showing request latency to a typical web server. The server can be expected to respond to many requests quickly, so the timer gets updated many times per second.\n\nThe appropriate base unit for timers varies by metrics backend, and for good reason. Micrometer is decidedly un-opinionated about this. However, because of the potential for confusion, Micrometer requires a `TimeUnit` when interacting with `Timer` implementations. Micrometer is aware of the preferences of each implementation and publishes your timing in the appropriate base unit based on the implementation. The following listing shows part of the `Timer` interface:\n\n[source,java]\n----\npublic interface Timer extends Meter {\n ...\n void record(long amount, TimeUnit unit);\n void record(Duration duration);\n double totalTime(TimeUnit unit);\n}\n----\n\nThe interface contains a fluent builder for timers:\n\n[source,java]\n----\nTimer timer = Timer\n .builder("my.timer")\n .description("a description of what this timer does") // optional\n .tags("region", "test") // optional\n .register(registry);\n----\n\nNOTE: The maximum statistical value for basic `Timer` implementations, such as `CumulativeTimer` and `StepTimer`, is a time window maximum (`TimeWindowMax`).\nIt means that its value is the maximum value during a time window.\nIf no new values are recorded for the time window length, the max is reset to 0 as a new time window starts.\nTime window size is the step size of the meter registry, unless expiry in `DistributionStatisticConfig` is explicitly set to other value.\nA time window maximum is used to capture maximum latency in a subsequent interval after heavy resource pressure triggers the latency and prevents metrics from being published.\nPercentiles are also time window percentiles (`TimeWindowPercentileHistogram`).\n\n== Recording Blocks of Code\n\nThe `Timer` interface exposes several convenience overloads for recording timings inline, including the following:\n\n[source,java]\n----\ntimer.record(() -> dontCareAboutReturnValue());\ntimer.recordCallable(() -> returnValue());\n\nRunnable r = timer.wrap(() -> dontCareAboutReturnValue()); <1>\nCallable c = timer.wrap(() -> returnValue());\n----\n<1> Wrap `Runnable` or `Callable` and return the instrumented version of it for use later.\n\nNOTE: A `Timer` is really a specialized distribution summary that is aware of how to scale durations to the base unit of time of each monitoring system and has an automatically\ndetermined base unit. In every case where you want to measure time, you should use a `Timer` rather than a `DistributionSummary`.\n\n== Storing Start State in `Timer.Sample`\n\nYou may also store start state in a sample instance that can be stopped later. The sample records a start time based on the registry\'s clock. After starting a sample, execute the code to be timed and finish the operation by calling `stop(Timer)` on the sample:\n\n[source, java]\n----\nTimer.Sample sample = Timer.start(registry);\n\n// do stuff\nResponse response = ...\n\nsample.stop(registry.timer("my.timer", "response", response.status()));\n----\n\nNote how we do not decide the timer to which to accumulate the sample until it is time to stop the sample. This lets us dynamically determine certain tags from the end state of the operation we are timing.\n\n== The `@Timed` annotation\n\nThe `micrometer-core` modules contains a `@Timed` annotation that frameworks can use to add timing support to either specific types of methods such as those serving web request endpoints or, more generally, to all methods.\n\nWARNING: Micrometer\'s Spring Boot configuration does _not_ recognize `@Timed` on arbitrary methods.\n\nAlso, an incubating AspectJ aspect is included in `micrometer-core`. You can use it in your application either through compile/load time AspectJ weaving or through framework facilities that interpret AspectJ aspects and proxy targeted methods in some other way, such as Spring AOP. Here is a sample Spring AOP configuration:\n\n[source,java]\n----\n@Configuration\npublic class TimedConfiguration {\n @Bean\n public TimedAspect timedAspect(MeterRegistry registry) {\n return new TimedAspect(registry);\n }\n}\n----\n\nApplying `TimedAspect` makes `@Timed` usable on any arbitrary method in an AspectJ proxied instance, as the following example shows:\n\n[source,java]\n----\n@Service\npublic class ExampleService {\n\n @Timed\n public void sync() {\n // @Timed will record the execution time of this method,\n // from the start and until it exits normally or exceptionally.\n ...\n }\n\n @Async\n @Timed\n public CompletableFuture<?> async() {\n // @Timed will record the execution time of this method,\n // from the start and until the returned CompletableFuture\n // completes normally or exceptionally.\n return CompletableFuture.supplyAsync(...);\n }\n\n}\n----\n\n=== @MeterTag on Method Parameters\n\nTo support `@MeterTag` annotation on method parameters you need to configure the `@TimedAspect` to add the `MeterTagAnnotationHandler`.\n\n[source,java,subs=+attributes]\n-----\nValueResolver valueResolver = parameter -> "Value from myCustomTagValueResolver [" + parameter + "]";\n\n// Example of a ValueExpressionResolver that uses Spring Expression Language\nValueExpressionResolver valueExpressionResolver = new SpelValueExpressionResolver();\n\n\n// Setting the handler on the aspect\ntimedAspect.setMeterTagAnnotationHandler(\n new MeterTagAnnotationHandler(aClass -> valueResolver, aClass -> valueExpressionResolver));\n-----\n\nLet\'s assume that we have the following interface.\n\n[source,java,subs=+attributes]\n-----\ninterface MeterTagClassInterface {\n\n @Timed\n void getAnnotationForTagValueResolver(@MeterTag(key = "test", resolver = ValueResolver.class) String test);\n\n @Timed\n void getAnnotationForTagValueExpression(\n @MeterTag(key = "test", expression = "\'hello\' + \' characters\'") String test);\n\n @Timed\n void getAnnotationForArgumentToString(@MeterTag("test") Long param);\n\n}\n-----\n\nWhen its implementations would be called with different arguments (remember that the implementation needs to be annotated with `@Timed` annotation too) the following timers would be created:\n\n[source,java,subs=+attributes]\n-----\n// Example for returning <toString()> on the parameter\nservice.getAnnotationForArgumentToString(15L);\n\nassertThat(registry.get("method.timed").tag("test", "15").timer().count()).isEqualTo(1);\n\n// Example for calling the provided <ValueResolver> on the parameter\nservice.getAnnotationForTagValueResolver("foo");\n\nassertThat(registry.get("method.timed")\n .tag("test", "Value from myCustomTagValueResolver [foo]")\n .timer()\n .count()).isEqualTo(1);\n\n// Example for calling the provided <ValueExpressionResolver>\nservice.getAnnotationForTagValueExpression("15L");\n\nassertThat(registry.get("method.timed").tag("test", "hello characters").timer().count()).isEqualTo(1);\n-----\n\n== Function-tracking Timers\n\nMicrometer also provides a more infrequently used timer pattern that tracks two monotonically increasing functions (a function that stays the same or increases over time but never decreases): a count function and a total time function. Some monitoring systems, such as Prometheus, push cumulative values for counters (which apply to both the count and total time functions in this case) to the backend, but others publish the rate at which a counter increments over the push interval. By employing this pattern, you let the Micrometer implementation for your monitoring system choose whether to rate normalize the timer, and your timer remains portable across different types of monitoring systems.\n\n[source, java]\n-----\nIMap<?, ?> cache = ...; // suppose we have a Hazelcast cache\nregistry.more().timer("cache.gets.latency", Tags.of("name", cache.getName()), cache,\n c -> c.getLocalMapStats().getGetOperationCount(), <1>\n c -> c.getLocalMapStats().getTotalGetLatency(),\n TimeUnit.NANOSECONDS <2>\n);\n-----\n\n<1> `getGetOperationCount()` is a monotonically increasing function incrementing with every cache get from the beginning of its life.\n<2> This represents the unit of time represented by `getTotalGetLatency()`. Each registry implementation specifies what its expected base unit of time is, and the total time reported will be scaled to this value.\n\nThe function-tracking timer, in concert with the monitoring system\'s rate normalizing functionality (whether this is an artifact of the query language or the way data is pushed to the system), adds a layer of richness to the cumulative value of the functions themselves. You can reason about the _rate_ of throughput and latency, whether that rate is within an acceptable bound, is increasing or decreasing over time, and so on.\n\nWARNING: Micrometer cannot guarantee the monotonicity of the count and total time functions for you. By using this signature, you are asserting their monotonicity based on what you know about their definitions.\n\nThere is also a fluent builder for function timers on the `FunctionTimer` interface itself, providing access to less frequently used options, such as base units and description. You can register the timer as the last step of its construction by calling `register(MeterRegistry)`:\n\n[source, java]\n----\nIMap<?, ?> cache = ...\n\nFunctionTimer.builder("cache.gets.latency", cache,\n c -> c.getLocalMapStats().getGetOperationCount(),\n c -> c.getLocalMapStats().getTotalGetLatency(),\n TimeUnit.NANOSECONDS)\n .tags("name", cache.getName())\n .description("Cache gets")\n .register(registry);\n----\n\n== Pause Detection\n\nMicrometer uses the `LatencyUtils` package to compensate for https://highscalability.com/blog/2015/10/5/your-load-generator-is-probably-lying-to-you-take-the-red-pi.html[coordinated omission] -- extra latency arising from system and VM pauses that skew your latency statistics downward. Distribution statistics, such as percentiles and SLO counts, are influenced by a pause detector implementation that adds additional latency here and there to compensate for pauses.\n\nMicrometer supports two pause detector implementations: a clock-drift based detector and a no-op detector. Before Micrometer 1.0.10/1.1.4/1.2.0, a clock-drift detector was configured by default to report as-accurate-as-possible metrics without further configuration. Since 1.0.10/1.1.4/1.2.0, the no-op detector is configured by default, but the clock-drift detector can be configured as shown in the next example.\n\nThe clock-drift based detector has a configurable sleep interval and pause threshold. CPU consumption is inversely proportional to `sleepInterval`, as is pause detection accuracy. 100ms for both values is a reasonable default to offer decent detection of long pause events while consuming a negligible amount of CPU time.\n\nYou can customize the pause detector as follows:\n\n[source,java]\n----\nregistry.config().pauseDetector(new ClockDriftPauseDetector(sleepInterval, pauseThreshold));\nregistry.config().pauseDetector(new NoPauseDetector());\n----\n\nIn the future, we may provide further detector implementations. Some pauses may be able to be inferred from GC logging in some circumstances, for example, without requiring a constant CPU load, however minimal. Also, a future JDK may provide direct access to pause events.\n\n== Memory Footprint Estimation\n\nTimers are the most memory-consuming meter, and their total footprint can vary dramatically, depending on which options you choose. The following table of memory consumption is based on the use of various features. These figures assume no tags and a ring buffer length of 3. Adding tags adds somewhat to the total, as does increasing the buffer length. Total storage can also vary somewhat depending on the registry implementation.\n\n* R = Ring buffer length. We assume the default of 3 in all examples. R is set with `Timer.Builder#distributionStatisticBufferLength`.\n* B = Total histogram buckets. Can be SLO boundaries or percentile histogram buckets. By default, timers are clamped to a minimum expected value of 1ms and a maximum expected value of 30 seconds, yielding 66 buckets for percentile histograms, when applicable.\n* I = Interval estimator for pause compensation. 1.7 kb.\n* M = Time-decaying max. 104 bytes.\n* Fb = Fixed boundary histogram. 8b * B * R.\n* Pp = Percentile precision. By default, it is 1. Generally in the range [0, 3]. Pp is set with `Timer.Builder#percentilePrecision`.\n* Hdr(Pp) = High dynamic range histogram.\n - When Pp = 0: 1.9kb * R + 0.8kb\n - When Pp = 1: 3.8kb * R + 1.1kb\n - When Pp = 2: 18.2kb * R + 4.7kb\n - When Pp = 3: 66kb * R + 33kb\n\n[width="80%",options="header"]\n|=========================================================\n|Pause detection |Client-side percentiles |Histogram and/or SLOs |Formula | Example\n\n|Yes |No |No |I + M| ~1.8kb\n|Yes |No |Yes |I + M + Fb|For default percentile histogram, ~7.7kb\n|Yes |Yes |Yes |I + M + Hdr(Pp)|For the addition of a 0.95 percentile with defaults otherwise, ~14.3kb\n|No |No |No |M| ~0.1kb\n|No |No |Yes |M + Fb|For default percentile histogram, ~6kb\n|No |Yes |Yes |M + Hdr(Pp)|For the addition of a 0.95 percentile with defaults otherwise, ~12.6kb\n|=========================================================\n\nNOTE: For Prometheus, specifically, R is _always_ equal to 1, regardless of how you attempt to configure it through `Timer.Builder`. This special case exists because Prometheus expects cumulative histogram data that never rolls over.\n\n:leveloffset!:\n\n== Distribution Summaries\n\n:leveloffset: +1\n\nA distribution summary tracks the distribution of events. It is similar to a timer structurally, but records values that do not represent a unit of time. For example, you could use a distribution summary to measure the payload sizes of requests hitting a server.\n\nThe following example creates a distribution summary:\n\n[source, java]\n----\nDistributionSummary summary = registry.summary("response.size");\n----\n\nThe interface contains a fluent builder for distribution summaries:\n\n[source, java]\n----\nDistributionSummary summary = DistributionSummary\n .builder("response.size")\n .description("a description of what this summary does") // optional\n .baseUnit("bytes") // optional <1>\n .tags("region", "test") // optional\n .scale(100) // optional <2>\n .register(registry);\n----\n\n<1> Add base units for maximum portability. Base units are part of the naming convention for some monitoring systems. Leaving it off and violating the naming convention has no adverse effect if you forget.\n<2> Optionally, you can provide a scaling factor by which each recorded sample is multiplied as it is recorded.\n\nNOTE: The maximum (which is named `max`) for basic `DistributionSummary` implementations, such as `CumulativeDistributionSummary` and `StepDistributionSummary`, is a time window maximum (`TimeWindowMax`).\nIt means that its value is the maximum value during a time window.\nIf no new values are recorded for the time window length, the maximum is reset to 0 as a new time window starts.\nTime window size is the step size of the meter registry, unless expiry in `DistributionStatisticConfig` is explicitly set to another value.\nA time window max is used to capture the maximum latency in a subsequent interval after heavy resource pressure triggers the latency and prevents metrics from being published.\nPercentiles are also time window percentiles (`TimeWindowPercentileHistogram`).\n\n== Scaling and Histograms\n\nMicrometer\'s preselected percentile histogram buckets are all integers from 1 to `Long.MAX_VALUE`. Currently, `minimumExpectedValue` and `maximumExpectedValue` serve to control the cardinality of the bucket set. If we try to detect that your min/max yields a small range and scale the preselected bucket domain to your summary\'s range, we do not have another lever to control bucket cardinality.\n\nInstead, if your summary\'s domain is more constrained, scale your summary\'s range by a fixed factor. The use case we have heard so far is for summaries of ratios whose domain is [0,1]. Given that scenario, we can use the following code to create values from 0 to 100:\n\n[source,java]\n----\nDistributionSummary.builder("my.ratio").scale(100).register(registry)\n----\n\nThis way, the ratio winds up in the range [0,100] and we can set `maximumExpectedValue` to 100. You can pair this with custom SLO boundaries if you care about particular ratios:\n\n[source,java]\n----\nDistributionSummary.builder("my.ratio")\n .scale(100)\n .serviceLevelObjectives(70, 80, 90)\n .register(registry)\n----\n\n\n== Memory Footprint Estimation\n\nThe total memory footprint of a distribution summary can vary dramatically, depending on which options you choose. The following table of memory consumption is based on the use of various features. These figures assume no tags and a ring buffer length of 3. Adding tags adds somewhat to the total, as does increasing the buffer length. Total storage can also vary somewhat depending on the registry implementation.\n\n* R = Ring buffer length. We assume the default of 3 in all examples. R is set with `DistributionSummary.Builder#distributionStatisticBufferLength`.\n* B = Total histogram buckets. It can be SLO boundaries or percentile histogram buckets. By default, summaries have NO minimum and maximum expected value, so we ship all 276 predetermined histogram buckets. You should always clamp distribution summaries with a `minimumExpectedValue` and `maximumExpectedValue` when you intend to ship percentile histograms.\n* M = Time-decaying max. 104 bytes.\n* Fb = Fixed boundary histogram. 8b * B * R.\n* Pp = Percentile precision. By default, it is 1. It is generally in the range of [0, 3]. Pp is set with `DistributionSummary.Builder#percentilePrecision`.\n* Hdr(Pp) = High dynamic range histogram.\n - When Pp = 0: 1.9kb * R + 0.8kb\n - When Pp = 1: 3.8kb * R + 1.1kb\n - When Pp = 2: 18.2kb * R + 4.7kb\n - When Pp = 3: 66kb * R + 33kb\n\n\n[width="80%",options="header"]\n|=========================================================\n|Client-side percentiles |Histogram and/or SLOs |Formula | Example\n\n|No |No |M| ~0.1kb\n|No |Yes |M + Fb|For percentile histogram clamped to 66 buckets, ~6kb\n|Yes |Yes |M + Hdr(Pp)|For the addition of a 0.95 percentile with defaults otherwise, ~12.6kb\n|=========================================================\n\nNOTE: For Prometheus, R is _always_ equal to 1, regardless of how you attempt to configure it through `DistributionSummary.Builder`. This special case exists for Prometheus because it expects cumulative histogram data that never rolls over.\n\n:leveloffset!:\n\n== Long Task Timers\n\n:leveloffset: +1\n\nThe long task timer is a special type of timer that lets you measure time while an event being measured is *still running*. A normal Timer only records the duration *after* the task is complete.\n\nLong task timers publish at least the following statistics:\n\n* Active task count\n* Total duration of active tasks\n* The maximum duration of active tasks\n\nUnlike a regular `Timer`, a long task timer does not publish statistics about completed tasks.\n\nConsider a background process to refresh metadata from a data store. For example, https://github.com/Netflix/edda[Edda] caches AWS resources, such as instances, volumes, auto-scaling groups, and others. Normally all data can be refreshed in a few minutes. If the AWS services have problems, it can take much longer. A long task timer can be used to track the active time for refreshing the metadata.\n\nFor example, in a Spring application, it is common for such long running processes to be implemented with `@Scheduled`. Micrometer provides a special `@Timed` annotation for instrumenting these processes with a long task timer:\n\n[source, java]\n----\n@Timed(value = "aws.scrape", longTask = true)\n@Scheduled(fixedDelay = 360000)\nvoid scrapeResources() {\n // find instances, volumes, auto-scaling groups, etc...\n}\n----\n\nIt is up to the application framework to make something happen with `@Timed`. If your framework of choice does not support it, you can still use the long task timer:\n\n[source, java]\n----\nLongTaskTimer scrapeTimer = registry.more().longTaskTimer("scrape");\nvoid scrapeResources() {\n scrapeTimer.record(() => {\n // find instances, volumes, auto-scaling groups, etc...\n });\n}\n----\n\nIf we wanted to alert when this process exceeds a threshold, with a long task timer, we receive that alert at the first reporting interval after we have exceeded the threshold. With a regular timer, we would not receive the alert until the first reporting interval after the process completed, over an hour later!\n\nThe interface contains a fluent builder for long task timers:\n\n[source, java]\n----\nLongTaskTimer longTaskTimer = LongTaskTimer\n .builder("long.task.timer")\n .description("a description of what this timer does") // optional\n .tags("region", "test") // optional\n .register(registry);\n----\n\n:leveloffset!:\n\n== Histograms and Percentiles\n\n:leveloffset: +1\n\nTimers and distribution summaries support collecting data to observe their percentile distributions. There are two main approaches to viewing percentiles:\n\n* *Percentile histograms*: Micrometer accumulates values to an underlying histogram and ships a predetermined set of buckets to the monitoring system. The monitoring system\'s query language is responsible for calculating percentiles off of this histogram. Currently, only Prometheus, Atlas, and Wavefront support histogram-based percentile approximations, through `histogram_quantile`, `:percentile`, and `hs()`, respectively. If you target Prometheus, Atlas, or Wavefront, prefer this approach, since you can aggregate the histograms across dimensions (by summing the values of the buckets across a set of dimensions) and derive an aggregable percentile from the histogram.\n* *Client-side percentiles*: Micrometer computes a percentile approximation for each meter ID (set of name and tags) and ships the percentile value to the monitoring system. This is not as flexible as a percentile histogram because it is not possible to aggregate percentile approximations across tags. Nevertheless, it provides some level of insight into percentile distributions for monitoring systems that do not support server-side percentile calculation based on a histogram.\n\nThe following example builds a timer with a histogram:\n\n[source,java]\n----\nTimer.builder("my.timer")\n .publishPercentiles(0.5, 0.95) // median and 95th percentile <1>\n .publishPercentileHistogram() // <2>\n .serviceLevelObjectives(Duration.ofMillis(100)) // <3>\n .minimumExpectedValue(Duration.ofMillis(1)) // <4>\n .maximumExpectedValue(Duration.ofSeconds(10))\n----\n\n<1> `publishPercentiles`: Used to publish percentile values computed in your application. These values are non-aggregable across dimensions.\n<2> `publishPercentileHistogram`: Used to publish a histogram suitable for computing aggregable (across dimensions) percentile approximations in Prometheus (by using `histogram_quantile`), Atlas (by using `:percentile`), and Wavefront (by using `hs()`). For Prometheus and Atlas, the buckets in the resulting histogram are preset by Micrometer based on a generator that has been determined empirically by Netflix to yield a reasonable error bound on most real world timers and distribution summaries. By default, the generator yields 276 buckets, but Micrometer includes only those that are within the range set by `minimumExpectedValue` and `maximumExpectedValue`, inclusive. Micrometer clamps timers by default to a range of 1 millisecond to 1 minute, yielding 73 histogram buckets per timer dimension. `publishPercentileHistogram` has no effect on systems that do not support aggregable percentile approximations. No histogram is shipped for these systems.\n<3> `serviceLevelObjectives`: Used to publish a cumulative histogram with buckets defined by your SLOs. When used in concert with `publishPercentileHistogram` on a monitoring system that supports aggregable percentiles, this setting adds additional buckets to the published histogram. When used on a system that does not support aggregable percentiles, this setting causes a histogram to be published with only these buckets.\n<4> `minimumExpectedValue`/`maximumExpectedValue`: Controls the number of buckets shipped by `publishPercentileHistogram` and controls the accuracy and memory footprint of the underlying HdrHistogram structure.\n\nSince shipping percentiles to the monitoring system generates additional time series, it is generally preferable to *not* configure them in core libraries that are included as dependencies in applications. Instead, applications can turn on this behavior for some set of timers and distribution summaries by using a meter filter.\n\nFor example, suppose we have a handful of timers in a common library. We have prefixed these timer names with `myservice`:\n\n[source,java]\n----\nregistry.timer("myservice.http.requests").record(..);\nregistry.timer("myservice.db.requests").record(..);\n----\n\nWe can turn on client-side percentiles for both timers by using a meter filter:\n\n[source,java]\n----\nregistry.config().meterFilter(\n new MeterFilter() {\n @Override\n public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) {\n if(id.getName().startsWith("myservice")) {\n return DistributionStatisticConfig.builder()\n .percentiles(0.95)\n .build()\n .merge(config);\n }\n return config;\n }\n });\n----\n\n:leveloffset!:\n'},function(e,t,n){"use strict";n.r(t),t.default=n.p+"439c0eea1918ef143002cf62a9393e2a.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"594dce115710525d7771ebe3ab82db19.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"5cdb40b089820639454d90a5e4874aee.png"},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\nMicrometer provides several binders for monitoring the JVM:\n\n[source, java]\n----\nnew ClassLoaderMetrics().bindTo(registry); <1>\nnew JvmMemoryMetrics().bindTo(registry); <2>\nnew JvmGcMetrics().bindTo(registry); <3>\nnew ProcessorMetrics().bindTo(registry); <4>\nnew JvmThreadMetrics().bindTo(registry); <5>\n----\n<1> Gauges loaded and unloaded classes.\n<2> Gauges buffer and memory pool utilization.\n<3> Gauges max and live data size, promotion and allocation rates, and times GC pauses (or concurrent phase time in the case of CMS).\n<4> Gauges current CPU total and load average.\n<5> Gauges thread peak, number of daemon threads, and live threads.\n\nMicrometer also provides a meter binder for `ExecutorService`. You can instrument your `ExecutorService` as follows:\n\n[source, java]\n----\nnew ExecutorServiceMetrics(executor, executorServiceName, tags).bindTo(registry);\n----\n\nMetrics created from the binder vary based on the type of `ExecutorService`.\n\nFor `ThreadPoolExecutor`, the following metrics are provided:\n\n* `executor.completed` (`FunctionCounter`): The approximate total number of tasks that have completed execution.\n* `executor.active` (`Gauge`): The approximate number of threads that are actively executing tasks.\n* `executor.queued` (`Gauge`): The approximate number of tasks that are queued for execution.\n* `executor.pool.size` (`Gauge`): The current number of threads in the pool.\n\nFor `ForkJoinPool`, the following metrics are provided:\n\n* `executor.steals` (`FunctionCounter`): Estimate of the total number of tasks stolen from one thread's work queue by\nanother. The reported value underestimates the actual total number of steals when the pool is not quiescent.\n* `executor.queued` (`Gauge`): An estimate of the total number of tasks currently held in queues by worker threads.\n* `executor.active` (`Gauge`): An estimate of the number of threads that are currently stealing or executing tasks.\n* `executor.running` (`Gauge`): An estimate of the number of worker threads that are not blocked but are waiting to join tasks or for other managed synchronization threads.\n"},function(e,t,n){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\nMicrometer supports binding metrics to a variety of different popular caching libraries. Each implementation supports basic features, such as cache hits versus misses, from which you can derive basic information about the cache hit ratio over a period of time. Micrometer uses a function tracking counter to monitor such things as hits and misses, giving you a notion not only of hits and misses over the total life of the cache (the basic metric exposed from Guava\'s `CacheStats`, for example) but hits and misses inside a given interval.\n\nTo demonstrate the features of cache monitoring, we start with a simple program that uses `reactor-netty` to read the entirety of Mary Shelley\'s _Frankenstein_ and put each word in the cache if it has not yet been seen:\n\n====\n[source,java]\n----\n// read all of Frankenstein\nHttpClient.create("www.gutenberg.org")\n .get("/cache/epub/84/pg84.txt")\n .flatMapMany(res -> res.addHandler(wordDecoder()).receive().asString())\n .delayElements(Duration.ofMillis(10)) // one word per 10 ms\n .filter(word -> !word.isEmpty())\n .doOnNext(word -> {\n if (cache.getIfPresent(word) == null)\n cache.put(word, 1);\n })\n .blockLast();\n----\n====\n\nThe following image shows the hits versus misses on a cache that has been tuned to hold a maximum of 10,000 entries:\n\n.Hits vs. misses, viewed in Prometheus\nimage::'+n(78)+"[Hits vs. misses,width=800]\n\n```\nrate(book_guava_requests_total[10s])\n```\n\nBy dividing the hits by the sum of all `get` operations (regardless of whether or not each one was a hit or a miss), we can arrive at a notion of the upper bound for the hit ratio for reading Frankenstein with only 10,000 words:\n\n.Hit ratio, viewed by Prometheus\nimage::"+n(79)+'[Hit ratio,width=800]\n\n```\nsum(rate(book_guava_requests_total{result="hit"}[1m])) / sum(rate(book_guava_requests_total[1m]))\n```\n\nIn a real-world scenario, we tune caches according to how we evaluate the tradeoff between storage and load efficiency. You could create an alert based on some upper bound for the rate at which misses occur or on a lower bound for the hit ratio. Setting an upper bound on miss ratio is better than a lower bound on hit ratio. For both ratios, an absence of any activity drops the value to 0.\nThe following image shows the miss ratio when it exceeds 10%:\n\n.Alerting when the miss ratio exceeds 10%\nimage::'+n(80)+"[Miss ratio (alerted),width=800]\n"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"fd12bde9dc50409da244eb7ba80f6548.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"aa70057042488eef46660369434e99d4.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"3c191f6ce81fefe9b7d1980fc9d5b4fe.png"},function(e,t){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\nMicrometer supports binding metrics to `OkHttpClient` through `EventListener`.\n\nYou can collect metrics from `OkHttpClient` by adding `OkHttpMetricsEventListener` as follows:\n\n[source,java]\n----\nOkHttpClient client = new OkHttpClient.Builder()\n .eventListener(OkHttpMetricsEventListener.builder(registry, "okhttp.requests")\n .tags(Tags.of("foo", "bar"))\n .build())\n .build();\n----\n\nNOTE: The `uri` tag is usually limited to URI patterns to mitigate tag cardinality explosion, but `OkHttpClient` does not\nprovide URI patterns. We provide `URI_PATTERN` header to support `uri` tag, or you can configure a URI mapper to provide\nyour own tag values for `uri` tag.\n\nTo configure a URI mapper, you can use `uriMapper()` as follows:\n\n[source,java]\n----\nOkHttpClient client = new OkHttpClient.Builder()\n .eventListener(OkHttpMetricsEventListener.builder(registry, "okhttp.requests")\n .uriMapper(req -> req.url().encodedPath())\n .tags(Tags.of("foo", "bar"))\n .build())\n .build();\n----\n\nWARNING: The sample might trigger tag cardinality explosion, as a URI path itself is being used for tag values.\n'},function(e,t){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\nMicrometer supports binding metrics to `Jetty` through `Connection.Listener`.\n\nYou can collect metrics from `Jetty` by adding `JettyConnectionMetrics` as follows:\n\n[source,java]\n----\n Server server = new Server(0);\n Connector connector = new ServerConnector(server);\n connector.addBean(new JettyConnectionMetrics(registry, connector, Tags.of("foo", "bar"));\n server.setConnectors(new Connector[] { connector });\n----\n\nMicrometer also supports binding metrics to `Jersey` through `ApplicationEventListener`.\n\nYou can collect metrics from `Jersey` by adding `MetricsApplicationEventListener` as follows:\n\n[source,java]\n----\nResourceConfig resourceConfig = new ResourceConfig();\nresourceConfig.register(new MetricsApplicationEventListener(\n registry,\n new DefaultJerseyTagsProvider(),\n "http.server.requests",\n true));\nServletContainer servletContainer = new ServletContainer(resourceConfig);\n----\n'},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\nMicrometer supports binding metrics to `Netty`.\n\nYou can collect metrics from `ByteBuf` allocators and from `EventLoopGroup` instances.\nInstrumentation can be done once at startup, if resources are already known:\n\n[source,java,subs=+attributes]\n-----\n// Create or get an existing resources\nDefaultEventLoopGroup eventExecutors = new DefaultEventLoopGroup();\nUnpooledByteBufAllocator unpooledByteBufAllocator = new UnpooledByteBufAllocator(false);\n// Use binders to instrument them\nnew NettyEventExecutorMetrics(eventExecutors).bindTo(this.registry);\nnew NettyAllocatorMetrics(unpooledByteBufAllocator).bindTo(this.registry);\n-----\n\nNetty infrastructure can be configured in many ways, so you can also instrument lazily at runtime as resources are used.\nIf you do so, you must ensure that you will not bind metrics for the same resource multiple times as this can have runtime drawbacks:\n\n[source,java,subs=+attributes]\n-----\n@Override\nprotected void initChannel(SocketChannel channel) throws Exception {\n EventLoop eventLoop = channel.eventLoop();\n if (!isEventLoopInstrumented(eventLoop)) {\n new NettyEventExecutorMetrics(eventLoop).bindTo(this.meterRegistry);\n }\n ByteBufAllocator allocator = channel.alloc();\n if (!isAllocatorInstrumented(allocator) && allocator instanceof ByteBufAllocatorMetricProvider) {\n ByteBufAllocatorMetricProvider allocatorMetric = (ByteBufAllocatorMetricProvider) allocator;\n new NettyAllocatorMetrics(allocatorMetric).bindTo(this.meterRegistry);\n }\n}\n-----\n"},function(e,t){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Passing through to Dropwizard\'s Console Reporter\n:toc:\n\nThis guide shows how to plug in less commonly used Dropwizard `Reporter` implementations -- in this case, the `ConsoleReporter`.\n\n[source,java]\n----\n @Bean\n public MetricRegistry dropwizardRegistry() {\n return new MetricRegistry();\n }\n\n @Bean\n public ConsoleReporter consoleReporter(MetricRegistry dropwizardRegistry) {\n ConsoleReporter reporter = ConsoleReporter.forRegistry(dropwizardRegistry)\n .convertRatesTo(TimeUnit.SECONDS)\n .convertDurationsTo(TimeUnit.MILLISECONDS)\n .build();\n reporter.start(1, TimeUnit.SECONDS);\n return reporter;\n }\n\n @Bean\n public MeterRegistry consoleLoggingRegistry(MetricRegistry dropwizardRegistry) {\n DropwizardConfig consoleConfig = new DropwizardConfig() {\n\n @Override\n public String prefix() {\n return "console";\n }\n\n @Override\n public String get(String key) {\n return null;\n }\n\n };\n\n return new DropwizardMeterRegistry(consoleConfig, dropwizardRegistry, HierarchicalNameMapper.DEFAULT, Clock.SYSTEM) {\n @Override\n protected Double nullGaugeValue() {\n return null;\n }\n };\n }\n----\n\nNote that, in a Spring environment, this registry is added to other implementations in a composite and is used for all metrics, both custom and\nauto-configured.\n\n[source,java]\n----\nclass MyComponent {\n private final MeterRegistry registry;\n\n public MyComponent(MeterRegistry registry) {\n this.registry = registry;\n }\n\n public void doSomeWork(String lowCardinalityInput) {\n registry.timer("my.latency", "input", lowCardinalityInput).record(() -> {\n // do work\n });\n }\n}\n----\n\nThe following listing shows typical output for this custom timer:\n\n[source,txt]\n----\n3/2/18 10:14:27 AM =============================================================\n\n-- Timers ----------------------------------------------------------------------\nmyLatency.lowCardinalityInput.INPUT\n count = 1\n mean rate = 1.02 calls/second\n 1-minute rate = 0.00 calls/second\n 5-minute rate = 0.00 calls/second\n 15-minute rate = 0.00 calls/second\n min = 100.00 milliseconds\n max = 100.00 milliseconds\n mean = 100.00 milliseconds\n stddev = 0.00 milliseconds\n median = 100.00 milliseconds\n 75% <= 100.00 milliseconds\n 95% <= 100.00 milliseconds\n 98% <= 100.00 milliseconds\n 99% <= 100.00 milliseconds\n 99.9% <= 100.00 milliseconds\n----\n'},function(e,t){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= HttpSender with Resilience4j Retry\n\n`HttpSender` is an interface for HTTP clients that are used in meter registries for HTTP-based metrics publication. There\nare two implementations:\n\n* `HttpUrlConnectionSender`: `HttpURLConnection`-based `HttpSender`\n* `OkHttpSender`: OkHttp-based `HttpSender`\n\nThere is no out-of-the-box support for retry, but you can decorate it with Resilience4j retry, as follows:\n\n[source,java]\n----\n @Bean\n public DatadogMeterRegistry datadogMeterRegistry(DatadogConfig datadogConfig, Clock clock) {\n return DatadogMeterRegistry.builder(datadogConfig)\n .clock(clock)\n .httpClient(new RetryHttpClient())\n .build();\n }\n\n private static class RetryHttpClient extends HttpUrlConnectionSender {\n\n private final RetryConfig retryConfig = RetryConfig.custom()\n .maxAttempts(2)\n .waitDuration(Duration.ofSeconds(5))\n .build();\n\n private final Retry retry = Retry.of("datadog-metrics", this.retryConfig);\n\n @Override\n public Response send(Request request) {\n CheckedFunction0<Response> retryableSupplier = Retry.decorateCheckedSupplier(\n this.retry,\n () -> super.send(request));\n return Try.of(retryableSupplier).get();\n }\n\n }\n----\n'},function(e,t){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Custom Meter Registry\n\nMicrometer supports popular meter registries out of the box, so you should check those first.\nFor an existing meter registry, if you think that your requirements are generally useful, consider creating an issue or PR against the Micrometer issue tracker.\nFor a non-existent meter registry, if it is widely-used, consider creating an issue or PR for it.\n\nIf you need to create your own custom meter registry, you can create it by extending one of the base classes for meter registries: `MeterRegistry`, `PushMeterRegistry`, or `StepMeterRegistry`.\n\nThe most common way is to extend `StepMeterRegistry`.\nYou can create your own custom `StepMeterRegistry`.\n\nFirst, define your own meter registry configuration by extending `StepRegistryConfig`, as follows:\n\n[source,java]\n----\npublic interface CustomRegistryConfig extends StepRegistryConfig {\n\n CustomRegistryConfig DEFAULT = k -> null;\n\n @Override\n default String prefix() {\n return "custom";\n }\n\n}\n----\n\nSecond, define your own meter registry by extending `StepMeterRegistry`, as follows:\n\n[source,java]\n----\npublic class CustomMeterRegistry extends StepMeterRegistry {\n\n public CustomMeterRegistry(CustomRegistryConfig config, Clock clock) {\n super(config, clock);\n\n start(new NamedThreadFactory("custom-metrics-publisher"));\n }\n\n @Override\n protected void publish() {\n getMeters().stream().forEach(meter -> System.out.println("Publishing " + meter.getId()));\n }\n\n @Override\n protected TimeUnit getBaseTimeUnit() {\n return TimeUnit.MILLISECONDS;\n }\n\n}\n----\n\nFinally, create the meter registry configuration and the meter registry.\nIf you use Spring Boot, you can do so as follows:\n\n[source,java]\n----\n@Configuration\npublic class MetricsConfig {\n\n @Bean\n public CustomRegistryConfig customRegistryConfig() {\n return CustomRegistryConfig.DEFAULT;\n }\n\n @Bean\n public CustomMeterRegistry customMeterRegistry(CustomRegistryConfig customRegistryConfig, Clock clock) {\n return new CustomMeterRegistry(customRegistryConfig, clock);\n }\n\n}\n----\n'},function(e,t){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Observation\n:toc:\n:sectnums:\n:dimensional: true\n\n== Purpose\n\nMicrometer Observation is part of the https://github.com/micrometer-metrics/micrometer[Micrometer] project and contains the Observation API. The main idea behind it is that you\n\n> Instrument code once, and get multiple benefits out of it\n\n== Installing\n\nMicrometer comes with a Bill of Materials (BOM) which is a project that manages all the project versions for consistency.\n\nThe following example shows the required dependency for Micrometer Observation in Gradle:\n\n[source,groovy,subs=+attributes]\n----\nimplementation platform(\'io.micrometer:micrometer-bom:latest.release\')\nimplementation \'io.micrometer:micrometer-observation\'\n----\n\nThe following example shows the required dependency in Maven:\n\n[source,xml,subs=+attributes]\n----\n<dependencyManagement>\n <dependencies>\n <dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-bom</artifactId>\n <version>${micrometer.version}</version>\n <type>pom</type>\n <scope>import</scope>\n </dependency>\n </dependencies>\n</dependencyManagement>\n\n<dependencies>\n <dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-observation</artifactId>\n </dependency>\n</dependencies>\n----\n\n== Introduction\n\n:leveloffset: +1\n\nFor any Observation to happen, you need to register `ObservationHandler` objects through an `ObservationRegistry`. An `ObservationHandler` reacts only to supported implementations of an `Observation.Context` and can create timers, spans, and logs by reacting to the lifecycle events of an Observation such as\n\n* `start` - Observation has been started. Happens when the `Observation#start()` method gets called.\n* `stop` - Observation has been stopped. Happens when the `Observation#stop()` method gets called.\n* `error` - An error occurred while observing. Happens when the `Observation#error(exception)` method gets called.\n* `event` - An event happened when observing. Happens when the `Observation#event(event)` method gets called.\n* `scope started` - Observation opens a Scope. The Scope must be closed when no longer used. Handlers can create thread local variables on start that are cleared upon closing of the scope. Happens when the `Observation#openScope()` method gets called.\n* `scope stopped` - Observation stops a Scope. Happens when the `Observation.Scope#close()` method gets called.\n\nWhenever any of these methods is called, an `ObservationHandler` method (such as `onStart(T extends Observation.Context ctx)`, `onStop(T extends Observation.Context ctx)`, and so on) is called. To pass state between the handler methods, you can use the `Observation.Context`.\n\nThis is how Observation state diagram looks like:\n\n[source]\n----\n Observation Observation\n Context Context\nCreated ----------\x3e Started ----------\x3e Stopped\n----\n\nThis is how Observation Scope state diagram looks like:\n\n[source]\n----\n Observation\n Context\nScope Started ----------\x3e Scope Finished\n----\n\nTo make it possible to debug production problems an Observation needs additional metadata such as key-value pairs (also known as tags). You can then query your metrics or distributed tracing backend by those tags to find the required data. Tags can be either of high or low cardinality.\n\nIMPORTANT: *High cardinality* means that a pair will have an unbounded number of possible values. An HTTP URL is a good\nexample of such a key value (e.g. `/foo/user1234`, `/foo/user2345` etc.). *Low cardinality* means that a key value will have a bounded number of possible values. A *templated* HTTP URL is a good example of such a key value (e.g. `/foo/{userId}`).\n\nTo separate Observation lifecycle operations from an Observation configuration (such as names and low and high cardinality tags), you can use the `ObservationConvention` that provides an easy way of overriding the default naming conventions.\n\nBelow you can find an example of using the Observation API.\n\n[source,java,subs=+attributes]\n-----\nstatic class Example {\n\n private final ObservationRegistry registry;\n\n Example(ObservationRegistry registry) {\n this.registry = registry;\n }\n\n void run() {\n Observation.createNotStarted("foo", registry)\n .lowCardinalityKeyValue("lowTag", "lowTagValue")\n .highCardinalityKeyValue("highTag", "highTagValue")\n .observe(() -> System.out.println("Hello"));\n }\n\n}\n-----\n\nTIP: Calling `observe(() -> ...)` leads to starting the Observation, putting it in scope, running the lambda, putting an error on the Observation if one took place, closing the scope and stopping the Observation.\n\n:leveloffset!:\n\n== ObservationHandler\n\n:leveloffset: +1\n\nA popular way to record them is storing the start state in a `Timer.Sample` instance and stopping it when the event has ended.\nRecording such measurements could look like this:\n\n[source,java,subs=+attributes]\n-----\nMeterRegistry registry = new SimpleMeterRegistry();\nTimer.Sample sample = Timer.start(registry);\ntry {\n // do some work here\n}\nfinally {\n sample.stop(Timer.builder("my.timer").register(registry));\n}\n-----\n\nIf you want to have more observation options (such as metrics and tracing out of the box plus anything else you will plug in) then you\'ll need to rewrite that code to use the `Observation` API.\n\n[source,java,subs=+attributes]\n-----\nObservationRegistry registry = ObservationRegistry.create();\nObservation.createNotStarted("my.operation", registry).observe(this::doSomeWorkHere);\n-----\n\nOne of the new features in Micrometer 1.10 is the ability to register "handlers" (`ObservationHandler`) that are notified about the lifecycle event of an observation (e.g.: you can run custom code when an observation is started/stopped).\nUsing this feature lets you add tracing capabilities to your existing metrics instrumentation (see: `DefaultTracingObservationHandler`). The implementation of these handlers does not need to be tracing related, it is completely up to you how you are going to implement them (e.g.: you can add logging capabilities) if you want.\n\n=== Observation.Context\n\nIn order to pass information between the instrumented code and the handler (or between handler methods, e.g.: `onStart` and `onStop`), you can utilize an `Observation.Context`. An `Observation.Context` is a `Map`-like container that can store values for you while your handler can access the data inside the context.\n\n=== ObservationHandler Example\n\nBased on this, we can implement a simple handler that lets the users know about its invocations by printing them out to `stdout`.\n\n[source,java,subs=+attributes]\n-----\nstatic class SimpleHandler implements ObservationHandler<Observation.Context> {\n\n @Override\n public void onStart(Observation.Context context) {\n System.out.println("START " + "data: " + context.get(String.class));\n }\n\n @Override\n public void onError(Observation.Context context) {\n System.out.println("ERROR " + "data: " + context.get(String.class) + ", error: " + context.getError());\n }\n\n @Override\n public void onEvent(Observation.Event event, Observation.Context context) {\n System.out.println("EVENT " + "event: " + event + " data: " + context.get(String.class));\n }\n\n @Override\n public void onStop(Observation.Context context) {\n System.out.println("STOP " + "data: " + context.get(String.class));\n }\n\n @Override\n public boolean supportsContext(Observation.Context handlerContext) {\n // you can decide if your handler should be invoked for this context object or\n // not\n return true;\n }\n\n}\n-----\n\nYou need to register the handler to the `ObservationRegistry`.\n\n[source,java,subs=+attributes]\n-----\nObservationRegistry registry = ObservationRegistry.create();\nregistry.observationConfig().observationHandler(new SimpleHandler());\n-----\n\nYou can use the `observe` method to instrument your codebase.\n\n[source,java,subs=+attributes]\n-----\nObservationRegistry registry = ObservationRegistry.create();\nObservation.Context context = new Observation.Context().put(String.class, "test");\n// using a context is optional, so you can call createNotStarted without it:\n// Observation.createNotStarted(name, registry)\nObservation.createNotStarted("my.operation", () -> context, registry).observe(this::doSomeWorkHere);\n-----\n\nYou can also take full control of the scoping mechanism.\n\n[source,java,subs=+attributes]\n-----\nObservationRegistry registry = ObservationRegistry.create();\nObservation.Context context = new Observation.Context().put(String.class, "test");\n// using a context is optional, so you can call start without it:\n// Observation.start(name, registry)\nObservation observation = Observation.start("my.operation", () -> context, registry);\ntry (Observation.Scope scope = observation.openScope()) {\n doSomeWorkHere();\n}\ncatch (Exception ex) {\n observation.error(ex); // and don\'t forget to handle exceptions\n throw ex;\n}\nfinally {\n observation.stop();\n}\n-----\n\n=== Signaling Errors and Arbitrary Events\n\nWhen **instrumenting** code we might want to signal that an error happened or signal that an arbitrary event happened. The observation API lets us do it via it `error` and `event` methods.\n\nOne use-case for signaling arbitrary event can be attaching annotations to `Span` for Distributed Tracing but you can also process them however you want in your own handler, e.g.: emit log events based on them.\n\n[source,java,subs=+attributes]\n-----\nObservationRegistry registry = ObservationRegistry.create();\nObservation observation = Observation.start("my.operation", registry);\ntry (Observation.Scope scope = observation.openScope()) {\n observation.event(Observation.Event.of("my.event", "look what happened"));\n doSomeWorkHere();\n}\ncatch (Exception exception) {\n observation.error(exception);\n throw exception;\n}\nfinally {\n observation.stop();\n}\n-----\n\n=== Observation.ObservationConvention Example\n\nWhen **instrumenting** code we want to provide sensible defaults for tags but also we want to allow users to easily change those defaults. An `ObservationConvention` interface is a description of what tags and name we should create for an `Observation.Context`. See the full usage example of an instrumentation together with overriding the default tags.\n\n[source,java,subs=+attributes]\n-----\n\n/**\n * A dedicated {@link Observation.Context} used for taxing.\n */\nclass TaxContext extends Observation.Context {\n\n private final String taxType;\n\n private final String userId;\n\n TaxContext(String taxType, String userId) {\n this.taxType = taxType;\n this.userId = userId;\n }\n\n String getTaxType() {\n return taxType;\n }\n\n String getUserId() {\n return userId;\n }\n\n}\n\n/**\n * An example of an {@link ObservationFilter} that will add the key-values to all\n * observations.\n */\nclass CloudObservationFilter implements ObservationFilter {\n\n @Override\n public Observation.Context map(Observation.Context context) {\n return context.addLowCardinalityKeyValue(KeyValue.of("cloud.zone", CloudUtils.getZone()))\n .addHighCardinalityKeyValue(KeyValue.of("cloud.instance.id", CloudUtils.getCloudInstanceId()));\n }\n\n}\n\n/**\n * An example of an {@link ObservationConvention} that renames the tax related\n * observations and adds cloud related tags to all contexts. When registered via the\n * `ObservationRegistry#observationConfig#observationConvention` will override the\n * default {@link TaxObservationConvention}. If the user provides a custom\n * implementation of the {@link TaxObservationConvention} and passes it to the\n * instrumentation, the custom implementation wins.\n *\n * In other words\n *\n * 1) Custom {@link ObservationConvention} has precedence 2) If no custom convention\n * was passed and there\'s a matching {@link GlobalObservationConvention} it will be\n * picked 3) If there\'s no custom, nor matching global convention, the default\n * {@link ObservationConvention} will be used\n *\n * If you need to add some key-values regardless of the used\n * {@link ObservationConvention} you should use an {@link ObservationFilter}.\n */\nclass GlobalTaxObservationConvention implements GlobalObservationConvention<TaxContext> {\n\n // this will be applicable for all tax contexts - it will rename all the tax\n // contexts\n @Override\n public boolean supportsContext(Observation.Context context) {\n return context instanceof TaxContext;\n }\n\n @Override\n public String getName() {\n return "global.tax.calculate";\n }\n\n}\n\n// Interface for an ObservationConvention related to calculating Tax\ninterface TaxObservationConvention extends ObservationConvention<TaxContext> {\n\n @Override\n default boolean supportsContext(Observation.Context context) {\n return context instanceof TaxContext;\n }\n\n}\n\n/**\n * Default convention of tags related to calculating tax. If no user one or global\n * convention will be provided then this one will be picked.\n */\nclass DefaultTaxObservationConvention implements TaxObservationConvention {\n\n @Override\n public KeyValues getLowCardinalityKeyValues(TaxContext context) {\n return KeyValues.of(TAX_TYPE.withValue(context.getTaxType()));\n }\n\n @Override\n public KeyValues getHighCardinalityKeyValues(TaxContext context) {\n return KeyValues.of(USER_ID.withValue(context.getUserId()));\n }\n\n @Override\n public String getName() {\n return "default.tax.name";\n }\n\n}\n\n/**\n * If micrometer-docs-generator is used, we will automatically generate documentation\n * for your observations. Check this URL\n * https://github.com/micrometer-metrics/micrometer-docs-generator#documentation for\n * setup example and read the {@link ObservationDocumentation} javadocs.\n */\nenum TaxObservationDocumentation implements ObservationDocumentation {\n\n CALCULATE {\n @Override\n public Class<? extends ObservationConvention<? extends Observation.Context>> getDefaultConvention() {\n return DefaultTaxObservationConvention.class;\n }\n\n @Override\n public String getContextualName() {\n return "calculate tax";\n }\n\n @Override\n public String getPrefix() {\n return "tax";\n }\n\n @Override\n public KeyName[] getLowCardinalityKeyNames() {\n return TaxLowCardinalityKeyNames.values();\n }\n\n @Override\n public KeyName[] getHighCardinalityKeyNames() {\n return TaxHighCardinalityKeyNames.values();\n }\n };\n\n enum TaxLowCardinalityKeyNames implements KeyName {\n\n TAX_TYPE {\n @Override\n public String asString() {\n return "tax.type";\n }\n }\n\n }\n\n enum TaxHighCardinalityKeyNames implements KeyName {\n\n USER_ID {\n @Override\n public String asString() {\n return "tax.user.id";\n }\n }\n\n }\n\n}\n\n/**\n * Our business logic that we want to observe.\n */\nclass TaxCalculator {\n\n private final ObservationRegistry observationRegistry;\n\n // If the user wants to override the default they can override this. Otherwise,\n // it will be {@code null}.\n @Nullable\n private final TaxObservationConvention observationConvention;\n\n TaxCalculator(ObservationRegistry observationRegistry,\n @Nullable TaxObservationConvention observationConvention) {\n this.observationRegistry = observationRegistry;\n this.observationConvention = observationConvention;\n }\n\n void calculateTax(String taxType, String userId) {\n // Create a new context\n TaxContext taxContext = new TaxContext(taxType, userId);\n // Create a new observation\n TaxObservationDocumentation.CALCULATE\n .observation(this.observationConvention, new DefaultTaxObservationConvention(), () -> taxContext,\n this.observationRegistry)\n // Run the actual logic you want to observe\n .observe(this::calculateInterest);\n }\n\n private void calculateInterest() {\n // do some work\n }\n\n}\n\n/**\n * Example of user changing the default conventions.\n */\nclass CustomTaxObservationConvention extends DefaultTaxObservationConvention {\n\n @Override\n public KeyValues getLowCardinalityKeyValues(TaxContext context) {\n return super.getLowCardinalityKeyValues(context)\n .and(KeyValue.of("additional.low.cardinality.tag", "value"));\n }\n\n @Override\n public KeyValues getHighCardinalityKeyValues(TaxContext context) {\n return KeyValues.of("this.would.override.the.default.high.cardinality.tags", "value");\n }\n\n @Override\n public String getName() {\n return "tax.calculate";\n }\n\n}\n\n/**\n * A utility class to set cloud related arguments.\n */\nstatic class CloudUtils {\n\n static String getZone() {\n return "...";\n }\n\n static String getCloudInstanceId() {\n return "...";\n }\n\n}\n-----\n\nBelow you can find an example of setting the whole code together.\n\n[source,java,subs=+attributes]\n-----\n// Registry setup\nObservationRegistry observationRegistry = ObservationRegistry.create();\n// add metrics\nSimpleMeterRegistry registry = new SimpleMeterRegistry();\nobservationRegistry.observationConfig().observationHandler(new DefaultMeterObservationHandler(registry));\nobservationRegistry.observationConfig().observationConvention(new GlobalTaxObservationConvention());\n// This will be applied to all observations\nobservationRegistry.observationConfig().observationFilter(new CloudObservationFilter());\n\n// In this case we\'re overriding the default convention by passing the custom one\nTaxCalculator taxCalculator = new TaxCalculator(observationRegistry, new CustomTaxObservationConvention());\n// run the logic you want to observe\ntaxCalculator.calculateTax("INCOME_TAX", "1234567890");\n-----\n\n=== Observation Predicates and Filters\n\nTo globally disable observations under given conditions you can use an `ObservationPredicate`. To mutate the `Observation.Context` you can use an `ObservationFilter`.\n\nTo set these just call `ObservationRegistry#observationConfig()#observationPredicate()` and `ObservationRegistry#observationConfig()#observationFilter()` methods respectively.\n\nBelow you can find an example of predicates and filters.\n\n[source,java,subs=+attributes]\n-----\n// Example using a metrics handler - we need a MeterRegistry\nMeterRegistry meterRegistry = new SimpleMeterRegistry();\n\n// Create an ObservationRegistry\nObservationRegistry registry = ObservationRegistry.create();\n// Add predicates and filter to the registry\nregistry.observationConfig()\n // ObservationPredicate can decide whether an observation should be\n // ignored or not\n .observationPredicate((observationName, context) -> {\n // Creates a noop observation if observation name is of given name\n if ("to.ignore".equals(observationName)) {\n // Will be ignored\n return false;\n }\n if (context instanceof MyContext) {\n // For the custom context will ignore a user with a given name\n return !"user to ignore".equals(((MyContext) context).getUsername());\n }\n // Will proceed for all other types of context\n return true;\n })\n // ObservationFilter can modify a context\n .observationFilter(context -> {\n // We\'re adding a low cardinality key to all contexts\n context.addLowCardinalityKeyValue(KeyValue.of("low.cardinality.key", "low cardinality value"));\n if (context instanceof MyContext) {\n // We\'re mutating a specific type of a context\n MyContext myContext = (MyContext) context;\n myContext.setUsername("some username");\n // We want to remove a high cardinality key value\n return myContext.removeHighCardinalityKeyValue("high.cardinality.key.to.ignore");\n }\n return context;\n })\n // Example of using metrics\n .observationHandler(new DefaultMeterObservationHandler(meterRegistry));\n\n// Observation will be ignored because of the name\nthen(Observation.start("to.ignore", () -> new MyContext("don\'t ignore"), registry)).isSameAs(Observation.NOOP);\n// Observation will be ignored because of the entries in MyContext\nthen(Observation.start("not.to.ignore", () -> new MyContext("user to ignore"), registry))\n .isSameAs(Observation.NOOP);\n\n// Observation will not be ignored...\nMyContext myContext = new MyContext("user not to ignore");\nmyContext.addHighCardinalityKeyValue(KeyValue.of("high.cardinality.key.to.ignore", "some value"));\nObservation.createNotStarted("not.to.ignore", () -> myContext, registry).observe(this::yourCodeToMeasure);\n// ...and will have the context mutated\nthen(myContext.getLowCardinalityKeyValue("low.cardinality.key").getValue()).isEqualTo("low cardinality value");\nthen(myContext.getUsername()).isEqualTo("some username");\nthen(myContext.getHighCardinalityKeyValues())\n .doesNotContain(KeyValue.of("high.cardinality.key.to.ignore", "some value"));\n-----\n\n=== Using Annotations With @Observed\n\nIf you have turned on Aspect Oriented Programming (e.g. via `org.aspectj:aspectjweaver`) you can use the `@Observed` annotation to create observations. You can put that annotation either on a method to observe it or a class to observe all methods in it. Let\'s look at the following example.\n\nHere you can see an `ObservedService` that has an annotation on a method.\n\n[source,java,subs=+attributes]\n-----\nstatic class ObservedService {\n\n @Observed(name = "test.call", contextualName = "test#call",\n lowCardinalityKeyValues = { "abc", "123", "test", "42" })\n void call() {\n System.out.println("call");\n }\n\n}\n-----\n\nThe following test asserts whether the proper observation gets created when a proxied `ObservedService` instance gets called.\n\n[source,java,subs=+attributes]\n-----\n// create a test registry\nTestObservationRegistry registry = TestObservationRegistry.create();\n// add a system out printing handler\nregistry.observationConfig().observationHandler(new ObservationTextPublisher());\n\n// create a proxy around the observed service\nAspectJProxyFactory pf = new AspectJProxyFactory(new ObservedService());\npf.addAspect(new ObservedAspect(registry));\n\n// make a call\nObservedService service = pf.getProxy();\nservice.call();\n\n// assert that observation has been properly created\nTestObservationRegistryAssert.assertThat(registry)\n .hasSingleObservationThat()\n .hasBeenStopped()\n .hasNameEqualTo("test.call")\n .hasContextualNameEqualTo("test#call")\n .hasLowCardinalityKeyValue("abc", "123")\n .hasLowCardinalityKeyValue("test", "42")\n .hasLowCardinalityKeyValue("class", ObservedService.class.getName())\n .hasLowCardinalityKeyValue("method", "call").doesNotHaveError();\n-----\n\n:leveloffset!:\n\n== Instrumenting\n\n:leveloffset: +1\n\nIn this section we will see some common examples of reusing existing Micrometer and Micrometer Tracing handlers and context types to do instrumentation.\n\nIMPORTANT: Before you decide to instrument a project yourself, please double-check whether it hasn\'t already been instrumented!\n\nTo better understand how you can do instrumentation we need to distinguish two concepts.\n\n- Context propagation\n- Creation of Observations\n\n*Context propagation* - we propagate existing context through threads or network. We\'re using the https://micrometer.io/docs/contextPropagation[Micrometer Context Propagation] library to define the context and to propagate it through threads. We\'re using dedicated `SenderContext` and `ReceiverContext` objects, together with Micrometer Tracing handlers, to create Observations that will propagate context over the wire.\n\n*Creation of Observations* - we want to wrap an operation in an Observation to get measurements. We need to know if there previously has been a parent Observation to maintain the parent-child relationship of Observations.\n\n[[instrumentation_of_thread_switching_components]]\n== Instrumentation of Thread Switching Components\n\nWe might want to create an Observation around a `Runnable` or `Callable` that we\'re submitting through an `Executor`. For that to work we need to know if in the parent thread there was an Observation that the new thread should continue, or for which a child Observation should be created.\n\nLet\'s look at the following example.\n\n[source,java,subs=+attributes]\n-----\n// Example of an Executor Service\nExecutorService executor = Executors.newCachedThreadPool();\n\n\n// This snippet shows an example of how to wrap in an observation code that would\n// be executed in a separate thread\n\n// Let\'s assume that we have a parent observation\nObservation parent = Observation.createNotStarted("parent", registry);\n// Observation is put in scope via the <observe()> method\nFuture<Boolean> child = parent.observe(() -> {\n // [Thread 1] Current Observation is the same as <parent>\n then(registry.getCurrentObservation()).isSameAs(parent);\n // [Thread 1] We\'re wrapping the executor in a Context Propagating version.\n // <ContextExecutorService> comes from Context Propagation library\n return ContextExecutorService.wrap(executor).submit(() -> {\n // [Thread 2] Current Observation is same as <parent> - context got\n // propagated\n then(registry.getCurrentObservation()).isSameAs(parent);\n // Wraps the code that should be run in a separate thread in an\n // observation\n return Observation.createNotStarted("child", registry).observe(this::yourCodeToMeasure);\n });\n});\n-----\n\n[[instrumentation_of_reactive_libraries]]\n== Instrumentation of Reactive Libraries\n\nIn this section we\'ll discuss how to wrap Reactive libraries in Observations and how to use Reactor Context to safely propagate Observations between threads.\n\n[[instrumentation_of_reactive_libraries_after_reactor_3_5_3]]\n=== For Reactor 3.5.3 and After\n\nIn Reactor 3.5.3 release (through this https://github.com/reactor/reactor-core/pull/3335[PR]) an option to turn on automated context propagation was added. To use this, please ensure that you\'re using the following projects at minimum in the following versions:\n\n- Reactor https://github.com/reactor/reactor-core/releases/tag/v3.5.7[3.5.7]\n- Micrometer Context-Propagation https://github.com/micrometer-metrics/context-propagation/releases/tag/v1.0.3[1.0.3]\n- Micrometer https://github.com/micrometer-metrics/micrometer/releases/tag/v1.10.8[1.10.8]\n- Micrometer Tracing https://github.com/micrometer-metrics/tracing/releases/tag/v1.0.7[1.0.7]\n\nTo use the feature call the new Reactor\'s Hook method (e.g. in your `public static void main` method) like this\n\n[source,java,subs=+attributes]\n-----\nHooks.enableAutomaticContextPropagation();\n-----\n\nThis will automatically wrap Reactor internal mechanisms to propagate context between operators, threads etc. Usage of `tap` and `handle` or Context Propagation API is not required.\n\nLet\'s look at the following example.\n\n[source,java,subs=+attributes]\n-----\n// This snippet shows an example of how to use the new Hook API with Reactor\nHooks.enableAutomaticContextPropagation();\n// Starting from Micrometer 1.10.8 you need to set your registry on this singleton\n// instance of OTLA\nObservationThreadLocalAccessor.getInstance().setObservationRegistry(registry);\n\n// Let\'s assume that we have a parent observation\nObservation parent = Observation.start("parent", registry);\n// Now we put it in thread local\nparent.scoped(() -> {\n\n // Example of propagating whatever there was in thread local\n Integer block = Mono.just(1).publishOn(Schedulers.boundedElastic()).doOnNext(integer -> {\n log.info("Context Propagation happens - the <parent> observation gets propagated ["\n + registry.getCurrentObservation() + "]");\n then(registry.getCurrentObservation()).isSameAs(parent);\n })\n .flatMap(integer -> Mono.just(integer).map(monoInteger -> monoInteger + 1))\n .transformDeferredContextual((integerMono, contextView) -> integerMono.doOnNext(integer -> {\n log.info("Context Propagation happens - the <parent> observation gets propagated ["\n + registry.getCurrentObservation() + "]");\n then(registry.getCurrentObservation()).isSameAs(parent);\n }))\n // Let\'s assume that we\'re modifying the context\n .contextWrite(context -> context.put("foo", "bar"))\n // Since we are NOT part of the Reactive Chain (e.g. this is not a\n // WebFlux application)\n // you MUST call <contextCapture> to capture all ThreadLocal values\n // and store them in a Reactor Context.\n // ----------------------\n // If you were part of the\n // Reactive Chain (e.g. returning Mono from endpoint)\n // there is NO NEED to call <contextCapture>. If you need to propagate\n // your e.g. Observation\n // to the Publisher you just created (e.g. Mono or Flux) please\n // consider adding it\n // to the Reactor Context directly instead of opening an Observation\n // scope and calling <contextCapture> (see example below).\n .contextCapture()\n .block();\n\n // We\'re still using <parent> as current observation\n then(registry.getCurrentObservation()).isSameAs(parent);\n\n then(block).isEqualTo(2);\n\n // Now, we want to create a child observation for a Reactor stream and put it\n // to Reactor Context\n // Automatically its parent will be <parent> observation since <parent> is in\n // Thread Local\n Observation child = Observation.start("child", registry);\n block = Mono.just(1).publishOn(Schedulers.boundedElastic()).doOnNext(integer -> {\n log.info(\n "Context Propagation happens - the <child> observation from Reactor Context takes precedence over thread local <parent> observation ["\n + registry.getCurrentObservation() + "]");\n then(registry.getCurrentObservation()).isSameAs(child);\n })\n .flatMap(integer -> Mono.just(integer).map(monoInteger -> monoInteger + 1))\n .transformDeferredContextual((integerMono, contextView) -> integerMono.doOnNext(integer -> {\n log.info(\n "Context Propagation happens - the <child> observation from Reactor Context takes precedence over thread local <parent> observation ["\n + registry.getCurrentObservation() + "]");\n then(registry.getCurrentObservation()).isSameAs(child);\n }))\n // Remember to stop the child Observation!\n .doFinally(signalType -> child.stop())\n // When using Reactor we ALWAYS search for\n // ObservationThreadLocalAccessor.KEY entry in the Reactor Context to\n // search for an Observation. You DON\'T have to use <contextCapture>\n // because\n // you have manually provided the ThreadLocalAccessor key\n .contextWrite(context -> context.put(ObservationThreadLocalAccessor.KEY, child))\n .block();\n\n // We\'re back to having <parent> as current observation\n then(registry.getCurrentObservation()).isSameAs(parent);\n\n then(block).isEqualTo(2);\n});\n\n// There should be no remaining observation\nthen(registry.getCurrentObservation()).isNull();\n\n// We need to stop the parent\nparent.stop();\n-----\n\nIf performance of this approach is not satisfactory, please verify whether disabling the hook and explicitly using `handle` or `tap` operators improves the performance.\n\n[[instrumentation_of_reactive_libraries_before_reactor_3_5_3]]\n=== Before Reactor 3.5.3\n\nThe preferred way of propagating elements through the Flux using Reactor is not via ``ThreadLocal``s but through Reactor Context. Reactor however gives you two operators, `tap()` and `handle()` where, if https://micrometer.io/docs/contextPropagation[Micrometer Context Propagation] library is on the classpath, it will set thread local values for you.\n\nLet\'s look at the following example.\n\n[source,java,subs=+attributes]\n-----\n// This snippet shows an example of how to wrap code that is using Reactor\n\n// Let\'s assume that we have a parent observation\nObservation parent = Observation.start("parent", registry);\n\n// We want to create a child observation for a Reactor stream\nObservation child = Observation.start("child", registry)\n // There\'s no thread local entry, so we will pass parent observation\n // manually. If we put the Observation in scope we could then call\n // <.contextCapture()> method from Reactor to capture all thread locals\n // and store them in Reactor Context.\n .parentObservation(parent);\nInteger block = Mono.just(1)\n // Example of not propagating context by default\n .doOnNext(integer -> {\n log.info(\n "No context propagation happens by default in Reactor - there will be no Observation in thread local here ["\n + registry.getCurrentObservation() + "]");\n then(registry.getCurrentObservation()).isNull();\n })\n // Example of having entries in thread local for <tap()> operator\n .tap(() -> new DefaultSignalListener<Integer>() {\n @Override\n public void doFirst() throws Throwable {\n log.info("We\'re using tap() -> there will be Observation in thread local here ["\n + registry.getCurrentObservation() + "]");\n then(registry.getCurrentObservation()).isNotNull();\n }\n })\n .flatMap(integer -> Mono.just(integer).map(monoInteger -> monoInteger + 1))\n // Example of retrieving ThreadLocal entries via ReactorContext\n .transformDeferredContextual((integerMono, contextView) -> integerMono.doOnNext(integer -> {\n try (ContextSnapshot.Scope scope = ContextSnapshot.setAllThreadLocalsFrom(contextView)) {\n log.info(\n "We\'re retrieving thread locals from Reactor Context - there will be Observation in thread local here ["\n + registry.getCurrentObservation() + "]");\n then(registry.getCurrentObservation()).isNotNull();\n }\n }))\n // Example of having entries in thread local for <handle()> operator\n .handle((BiConsumer<Integer, SynchronousSink<Integer>>) (integer, synchronousSink) -> {\n log.info("We\'re using handle() -> There will be Observation in thread local here ["\n + registry.getCurrentObservation() + "]");\n then(registry.getCurrentObservation()).isNotNull();\n synchronousSink.next(integer);\n })\n // Remember to stop the child Observation!\n .doFinally(signalType -> child.stop())\n // When using Reactor we ALWAYS search for\n // ObservationThreadLocalAccessor.KEY entry in the Reactor Context to\n // search for an Observation\n .contextWrite(context -> context.put(ObservationThreadLocalAccessor.KEY, child))\n // If there were ThreadLocal entries that are using Micrometer Context\n // Propagation they would be caught here. All implementations of\n // <ThreadLocalAccessor> will store their thread local entries under their\n // keys in Reactor Context\n .contextCapture()\n .block();\n\n// We didn\'t have any observations in thread local\nthen(registry.getCurrentObservation()).isNull();\n\n// We need to stop the parent\nparent.stop();\n\nthen(block).isEqualTo(2);\n-----\n\n[[instrumentation_of_http_communication]]\n== Instrumentation of HTTP Communication\n\nIn order to instrument an HTTP-based communication we need to use the `RequestReplySenderContext` and `RequestReplyReceiverContext` for the client and server side respectively.\n\nAs an example for the client side we will use a handler that instruments the HTTP request by adding a `foo:bar` header (if you have Micrometer Tracing on the classpath you could reuse the `PropagatingSenderTracingObservationHandler` and `PropagatingReceiverTracingObservationHandler` to propagate tracing context over the wire). Let\'s look at the example of such a handler.\n\n[source,java,subs=+attributes]\n-----\nstatic class HeaderPropagatingHandler implements ObservationHandler<SenderContext<Object>> {\n\n @Override\n public void onStart(SenderContext<Object> context) {\n context.getSetter().set(context.getCarrier(), "foo", "bar");\n }\n\n @Override\n public boolean supportsContext(Observation.Context context) {\n return context instanceof SenderContext;\n }\n\n}\n-----\n\nLet\'s look at the following of HTTP client side instrumentation that reuses the handler.\n\n[source,java,subs=+attributes]\n-----\n// This example can be combined with the idea of ObservationConvention to allow\n// users to easily customize the key values. Please read the rest of the\n// documentation on how to do it.\n\n// In Micrometer Tracing we would have predefined\n// PropagatingSenderTracingObservationHandler but for the sake of this demo we\n// create our own handler that puts "foo":"bar" headers into the request\nregistry.observationConfig().observationHandler(new HeaderPropagatingHandler());\n\n// We\'re using WireMock to stub the HTTP GET call to "/foo" with a response "OK"\nstubFor(get("/foo").willReturn(ok().withBody("OK")));\n\n// RequestReplySenderContext is a special type of context used for request-reply\n// communication. It requires to define what the Request type is and how we can\n// instrument it. It also needs to know what the Response type is\nRequestReplySenderContext<HttpUriRequestBase, ClassicHttpResponse> context = new RequestReplySenderContext<>(\n (carrier, key, value) -> Objects.requireNonNull(carrier).addHeader(key, value));\n\n// We\'re instrumenting the Apache HTTPClient\ntry (CloseableHttpClient httpclient = HttpClients.createDefault()) {\n // The HttpGet is our carrier (we can mutate it to instrument the headers)\n HttpGet httpget = new HttpGet(info.getHttpBaseUrl() + "/foo");\n // We must set the carrier BEFORE we run <Observation#start>\n context.setCarrier(httpget);\n // You can set the remote service address to provide more debugging\n // information\n context.setRemoteServiceAddress(info.getHttpBaseUrl());\n // Examples of setting key values from the request\n Observation observation = Observation.createNotStarted("http.client.requests", () -> context, registry)\n .contextualName("HTTP " + httpget.getMethod())\n .lowCardinalityKeyValue("http.url", info.getHttpBaseUrl() + "/{name}")\n .highCardinalityKeyValue("http.full-url", httpget.getRequestUri());\n observation.observeChecked(() -> {\n String response = httpclient.execute(httpget, classicHttpResponse -> {\n // We should set the response before we stop the observation\n context.setResponse(classicHttpResponse);\n // Example of setting key values from the response\n observation.highCardinalityKeyValue("http.content.length",\n String.valueOf(classicHttpResponse.getEntity().getContentLength()));\n return EntityUtils.toString(classicHttpResponse.getEntity());\n });\n\n then(response).isEqualTo("OK");\n });\n}\n\n// We want to be sure that we have successfully enriched the HTTP headers\nverify(getRequestedFor(urlEqualTo("/foo")).withHeader("foo", equalTo("bar")));\n-----\n\nAs an example for the server side we will use a handler that instruments the Observation by adding the `foo` low cardinality key with the value being the matched path from the HTTP request. Let\'s look at the example of such a handler.\n\n[source,java,subs=+attributes]\n-----\nstatic class HeaderReadingHandler implements ObservationHandler<ReceiverContext<Context>> {\n\n @Override\n public void onStart(ReceiverContext<Context> context) {\n String fooHeader = context.getGetter().get(context.getCarrier(), "foo");\n // We\'re setting the value of the <foo> header as a low cardinality key value\n context.addLowCardinalityKeyValue(KeyValue.of("foo", fooHeader));\n }\n\n @Override\n public boolean supportsContext(Observation.Context context) {\n return context instanceof ReceiverContext;\n }\n\n}\n-----\n\nLet\'s look at the following of HTTP server side instrumentation that reuses the handler.\n\n[source,java,subs=+attributes]\n-----\n// This example can be combined with the idea of ObservationConvention to allow\n// users to easily customize the key values. Please read the rest of the\n// documentation on how to do it.\n\n// In Micrometer Tracing we would have predefined\n// PropagatingReceiverTracingObservationHandler but for the sake of this demo we\n// create our own handler that will reuse the <foo> header from the request as a\n// low cardinality key value\nregistry.observationConfig().observationHandler(new HeaderReadingHandler());\n\ntry (Javalin javalin = Javalin.create().before("/hello/{name}", ctx -> {\n // We\'re creating the special RequestReplyReceiverContext that will reuse the\n // information from the HTTP headers\n RequestReplyReceiverContext<Context, Context> receiverContext = new RequestReplyReceiverContext<>(\n Context::header);\n // Remember to set the carrier!!!\n receiverContext.setCarrier(ctx);\n String remoteServiceAddress = ctx.scheme() + "://" + ctx.host();\n receiverContext.setRemoteServiceAddress(remoteServiceAddress);\n // We\'re starting an Observation with the context\n Observation observation = Observation\n .createNotStarted("http.server.requests", () -> receiverContext, registry)\n .contextualName("HTTP " + ctx.method() + " " + ctx.matchedPath())\n .lowCardinalityKeyValue("http.url", remoteServiceAddress + ctx.matchedPath())\n .highCardinalityKeyValue("http.full-url", remoteServiceAddress + ctx.path())\n .lowCardinalityKeyValue("http.method", ctx.method())\n .start();\n // Let\'s be consistent and always set the Observation related objects under\n // the same key\n ctx.attribute(ObservationThreadLocalAccessor.KEY, observation);\n}).get("/hello/{name}", ctx -> {\n // We need to be thread-safe - we\'re not using ThreadLocals, we\'re retrieving\n // information from the attributes\n Observation observation = ctx.attribute(ObservationThreadLocalAccessor.KEY);\n observation.scoped(() -> {\n // If we need thread locals (e.g. MDC entries) we can use <scoped()>\n log.info("We\'re using scoped - Observation in thread local here [" + registry.getCurrentObservation()\n + "]");\n then(registry.getCurrentObservation()).isNotNull();\n });\n // We\'re returning body\n ctx.result("Hello World [" + observation.getContext().getLowCardinalityKeyValue("foo").getValue() + "]");\n}).after("/hello/{name}", ctx -> {\n // After sending the response we want to stop the Observation\n Observation observation = ctx.attribute(ObservationThreadLocalAccessor.KEY);\n observation.stop();\n}).start(0)) {\n // We\'re sending an HTTP request with a <foo:bar> header. We\'re expecting that\n // it will be reused in the response\n String response = sendRequestToHelloEndpointWithHeader(javalin.port(), "foo", "bar");\n\n // The response must contain the value from the header\n then(response).isEqualTo("Hello World [bar]");\n}\n-----\n\n== Instrumentation of Messaging Communication\n\nTo instrument messaging components you should proceed in the same way as you would with <<instrumentation_of_http_communication,HTTP-based communication>>, however instead of `RequestReplySenderContext` and `RequestReplyReceiverContext` you would use `SenderContext` and `ReceiverContext`. You can also set the `remoteServiceName` on a context to suggest the name of the broker (e.g. `kafka` or `rabbitmq`).\n\n:leveloffset!:\n\n== Testing\n\n:leveloffset: +1\n\nMicrometer Observation comes with `micrometer-observation-test` module that allows you to unit-test your Observations.\n\n== Installing\n\nThe following example shows the required dependency in Gradle (assuming that Micrometer BOM has been added):\n\n[source,groovy,subs=+attributes]\n-----\ntestImplementation \'io.micrometer:micrometer-observation-test\'\n-----\n\nThe following example shows the required dependency in Maven (assuming that Micrometer BOM has been added):\n\n[source,xml,subs=+attributes]\n-----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-observation-test</artifactId>\n <scope>test</scope>\n</dependency>\n-----\n\n== Running Observation Unit Tests\n\nLet\'s say that you have the following production code. It will create an observation with 2 tags (low and high cardinality) and then call `observe` that will start the observation, put it in scope, close the scope and stop the observation.\n\n[source,java,subs=+attributes]\n-----\nstatic class Example {\n\n private final ObservationRegistry registry;\n\n Example(ObservationRegistry registry) {\n this.registry = registry;\n }\n\n void run() {\n Observation.createNotStarted("foo", registry)\n .lowCardinalityKeyValue("lowTag", "lowTagValue")\n .highCardinalityKeyValue("highTag", "highTagValue")\n .observe(() -> System.out.println("Hello"));\n }\n\n}\n-----\n\nTo unit-test this code you can use the `TestObservationRegistry` class.\n\n[source,java,subs=+attributes]\n-----\n@Test\nvoid should_assert_your_observation() {\n // create a test registry in your tests\n TestObservationRegistry registry = TestObservationRegistry.create();\n\n // run your production code with the TestObservationRegistry\n new Example(registry).run();\n\n // check your observation\n TestObservationRegistryAssert.assertThat(registry)\n .doesNotHaveAnyRemainingCurrentObservation()\n .hasObservationWithNameEqualTo("foo")\n .that()\n .hasHighCardinalityKeyValue("highTag", "highTagValue")\n .hasLowCardinalityKeyValue("lowTag", "lowTagValue")\n .hasBeenStarted()\n .hasBeenStopped();\n}\n-----\n\n:leveloffset!:\n\n== Documentation Generation\n\n:leveloffset: +1\n\n== Automated Documentation Generation\n\nBy using the https://github.com/micrometer-metrics/micrometer-docs-generator[Micrometer Docs Generator] project and by implementing the `ObservationDocumentation`, `SpanDocumentation` or `MeterDocumentation` interfaces as an `enum` we can scan your sources and generate Asciidoctor documentation. This allows you to maintain the docuemntation for your observability instrumentation in code, and as long as you use the `enum` implementation in your instrumentation, it will ensure that your documentation stays in-sync with the instrumentation.\n\nBelow you can find an example of a Maven `pom.xml` with the Micrometer Docs Generator project.\n\n.pom.xml\n[source,xml,subs=+attributes]\n-----\n<?xml version="1.0" encoding="UTF-8"?>\n<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n\t\t xmlns="http://maven.apache.org/POM/4.0.0"\n\t\t xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">\n\t<modelVersion>4.0.0</modelVersion>\n\t<groupId>com.example</groupId>\n\t<artifactId>micrometer-docs-generator-example</artifactId>\n\t<packaging>jar</packaging>\n\t<name>micrometer-docs-generator-example</name>\n\t<description>micrometer-docs-generator-example</description>\n\t<properties>\n\t\t<micrometer-docs-generator.version>1.0.0</micrometer-docs-generator.version>\n\t\t<micrometer-docs-generator.inputPath>${maven.multiModuleProjectDirectory}/folder-with-sources-to-scan/</micrometer-docs-generator.inputPath>\n\t\t<micrometer-docs-generator.inclusionPattern>.*</micrometer-docs-generator.inclusionPattern>\n\t\t<micrometer-docs-generator.outputPath>${maven.multiModuleProjectDirectory}/target/output-folder-with-adocs/\'</micrometer-docs-generator.outputPath>\n\t</properties>\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.codehaus.mojo</groupId>\n\t\t\t\t<artifactId>exec-maven-plugin</artifactId>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>generate-docs</id>\n\t\t\t\t\t\t<phase>prepare-package</phase>\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>java</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t\t<configuration>\n\t\t\t\t\t\t\t<mainClass>io.micrometer.docs.DocsGeneratorCommand</mainClass>\n\t\t\t\t\t\t\t<includePluginDependencies>true</includePluginDependencies>\n\t\t\t\t\t\t\t<arguments>\n\t\t\t\t\t\t\t\t<argument>${micrometer-docs-generator.inputPath}</argument>\n\t\t\t\t\t\t\t\t<argument>${micrometer-docs-generator.inclusionPattern}</argument>\n\t\t\t\t\t\t\t\t<argument>${micrometer-docs-generator.outputPath}</argument>\n\t\t\t\t\t\t\t</arguments>\n\t\t\t\t\t\t</configuration>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t\t<dependencies>\n\t\t\t\t\t<dependency>\n\t\t\t\t\t\t<groupId>io.micrometer</groupId>\n\t\t\t\t\t\t<artifactId>micrometer-docs-generator</artifactId>\n\t\t\t\t\t\t<version>${micrometer-docs-generator.version}</version>\n\t\t\t\t\t\t<type>jar</type>\n\t\t\t\t\t</dependency>\n\t\t\t\t</dependencies>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n\t<repositories>\n\t\t<repository>\n\t\t\t<id>spring-snapshots</id>\n\t\t\t<name>Spring Snapshots</name>\n\t\t\t<url>https://repo.spring.io/snapshot</url> \x3c!-- For Snapshots --\x3e\n\t\t\t<snapshots>\n\t\t\t\t<enabled>true</enabled>\n\t\t\t</snapshots>\n\t\t\t<releases>\n\t\t\t\t<enabled>false</enabled>\n\t\t\t</releases>\n\t\t</repository>\n\t\t<repository>\n\t\t\t<id>spring-milestones</id>\n\t\t\t<name>Spring Milestones</name>\n\t\t\t<url>https://repo.spring.io/milestone</url> \x3c!-- For Milestones --\x3e\n\t\t\t<snapshots>\n\t\t\t\t<enabled>false</enabled>\n\t\t\t</snapshots>\n\t\t</repository>\n\t</repositories>\n</project>\n-----\n\nBelow you can find an example of a Gradle `build.gradle` with the Micrometer Docs Generator project.\n\n.build.gradle\n[source,groovy,subs=+attributes]\n-----\nrepositories {\n\tmaven { url \'https://repo.spring.io/snapshot\' } // for snapshots\n\tmaven { url \'https://repo.spring.io/milestone\' } // for milestones\n\tmavenCentral() // for GA\n}\n\next {\n\tmicrometerDocsVersion="1.0.2"\n}\n\nconfigurations {\n\tadoc\n}\n\ndependencies {\n\tadoc "io.micrometer:micrometer-docs-generator:$micrometerDocsVersion"\n}\n\ntask generateObservabilityDocs(type: JavaExec) {\n\tmainClass = "io.micrometer.docs.DocsGeneratorCommand"\n\tclasspath configurations.adoc\n\t// input folder, inclusion pattern, output folder\n\targs project.rootDir.getAbsolutePath(), ".*", project.rootProject.buildDir.getAbsolutePath()\n}\n-----\n\nRunning these tasks would lead to generation of adoc files similar to these ones.\n\n._metrics.adoc\n[source,adoc,subs=+attributes]\n-----\n[[observability-metrics]]\n=== Observability - Metrics\n\nBelow you can find a list of all samples declared by this project.\n\n[[observability-metrics-task-runner-observation]]\n==== Task Runner Observation\n\n> Observation created when a task runner is executed.\n\n**Metric name** `spring.cloud.task.runner` (defined by convention class `org.springframework.cloud.task.configuration.observation.DefaultTaskObservationConvention`). **Type** `timer` and **base unit** `seconds`.\n\nFully qualified name of the enclosing class `org.springframework.cloud.task.configuration.observation.TaskDocumentedObservation`.\n\nIMPORTANT: All tags must be prefixed with `spring.cloud.task` prefix!\n\n.Low cardinality Keys\n|===\n|Name | Description\n|`spring.cloud.task.runner.bean-name`|Name of the bean that was executed by Spring Cloud Task.\n|===\n-----\n\n._spans.adoc\n[source,adoc,subs=+attributes]\n-----\n[[observability-spans]]\n=== Observability - Spans\n\nBelow you can find a list of all spans declared by this project.\n\n[[observability-spans-task-runner-observation]]\n==== Task Runner Observation Span\n\n> Observation created when a task runner is executed.\n\n**Span name** `spring.cloud.task.runner` (defined by convention class `org.springframework.cloud.task.configuration.observation.DefaultTaskObservationConvention`).\n\nFully qualified name of the enclosing class `org.springframework.cloud.task.configuration.observation.TaskDocumentedObservation`.\n\nIMPORTANT: All tags and event names must be prefixed with `spring.cloud.task` prefix!\n\n.Tag Keys\n|===\n|Name | Description\n|`spring.cloud.task.runner.bean-name`|Name of the bean that was executed by Spring Cloud Task.\n|===\n-----\n\n=== Options\n\nThe main entry class for the docs generation is `DocsGeneratorCommand` class.\nThis class takes following options.\n\n.Optional parameters\n[cols="1,1"]\n|===\n| `--metrics`\n| Generate metrics documentation.\n\n| `--spans`\n| Generate spans documentation.\n\n| `--conventions`\n| Generate observation conventions documentation.\n\n| `--metrics-template=<location>`\n| Handlebars template file location. This can be a path in the classpath or file system. +\ne.g. `templates/metrics.adoc.hbs`, `/home/foo/bar.hbs`\n\n| `--spans-template=<location>`\n| Handlebars template file location. This can be a path in the classpath or file system. +\ne.g. `templates/spans.adoc.hbs`, `/home/foo/bar.hbs`\n\n| `--conventions-template=<location>`\n| Handlebars template file location. This can be a path in the classpath or file system. +\ne.g. `templates/conventions.adoc.hbs`, `/home/foo/bar.hbs`\n\n| `--metrics-output=<location>`\n| Generated metrics doc file location. This can be an absolute path or relative path to the output directory. +\nDefault: `_metrics.adoc`\n\n| `--spans-output=<location>`\n| Generated spans doc file location. This can be an absolute path or relative path to the output directory. +\nDefault: `_spans.adoc`\n| `--conventions-output=<location>`\n| Generated observation convention doc file location. This can be an absolute path or relative path to the output directory. +\nDefault: `_conventions.adoc`\n|===\n\n:leveloffset!:\n\n== Existing Instrumentations\n\n:leveloffset: +1\n\nMicrometer Observation is used to instrument various projects. Below you can find a table of projects that are using Micrometer Observation to _"instrument once and have multiple benefits out of it"_.\n\n.External Project Instrumentations\n|===\n|Project Name |Link\n\n| Apache Camel | https://issues.apache.org/jira/browse/CAMEL-19023[Issue]\n| Apache CXF | https://github.com/apache/cxf/pull/1346#event-10091735987[PR]\n| Apache Dubbo | https://github.com/apache/dubbo/pull/11021[PR]\n| Apache HttpComponents | https://github.com/micrometer-metrics/micrometer/tree/main/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/httpcomponents[Repo]\n| Apache Skywalking | https://github.com/apache/skywalking-java/pull/401[PR], https://skywalking.apache.org/docs/skywalking-java/next/en/setup/service-agent/java-agent/application-toolkit-micrometer-1.10/[Docs]\n| Armeria | https://github.com/line/armeria/pull/4980[PR]\n| Appsmith | https://github.com/appsmithorg/appsmith/commit/5e46a2f4b7bf184aba03b4b93038edce8a615366[Commit]\n| gRPC | https://github.com/micrometer-metrics/micrometer/pull/3427[PR]\n| Halo | https://github.com/halo-dev/halo/commit/d192b8c956887e4701b94e3ed302fb88e4771583[Commit]\n| JDBC | https://github.com/jdbc-observations/datasource-micrometer[Repo]\n| JDK Http Client | https://github.com/micrometer-metrics/micrometer/blob/main/micrometer-core/src/main/java11/io/micrometer/core/instrument/binder/jdk/MicrometerHttpClient.java[Repo]\n| Jetty | https://github.com/micrometer-metrics/micrometer/pull/3416[PR]\n| Jersey | https://github.com/micrometer-metrics/micrometer/tree/main/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jersey/server[Repo]\n| JMS | https://github.com/micrometer-metrics/micrometer/blob/main/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jms/JmsInstrumentation.java[Repo]\n| Kotlin Coroutines | https://github.com/micrometer-metrics/micrometer/pull/3256[PR]\n| Lettuce | https://github.com/lettuce-io/lettuce-core/commit/6604fbe9e9cff476806c50716e17803e11d1e0ca[Commit]\n| Micronaut | https://github.com/micronaut-projects/micronaut-micrometer/issues/492[Issue]\n| OkHttp | https://github.com/micrometer-metrics/micrometer/tree/main/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/okhttp3[Repo]\n| OpenFeign | https://github.com/OpenFeign/feign/pull/1760[PR]\n| RabbitMQ | https://github.com/rabbitmq/rabbitmq-java-client/issues/952[Issue]\n| RabbitMQ Stream | https://github.com/rabbitmq/rabbitmq-stream-java-client/pull/384[PR]\n| Resilience4j | https://github.com/resilience4j/resilience4j/pull/1698[PR]\n| R2DBC | https://github.com/r2dbc/r2dbc-proxy/issues/122[Issue]\n| Reactor | https://micrometer.io/docs/observation#instrumentation_of_reactive_libraries[Docs]\n| Reactor Netty | https://projectreactor.io/docs/netty/release/reference/index.html#_tracing_3[Docs]\n| Redisson | https://github.com/redisson/redisson/issues/4976[Issue],\nhttps://github.com/redisson/redisson/wiki/16.-Observability#162-tracing[Docs]\n| RSocket | https://github.com/rsocket/rsocket-java/tree/master/rsocket-micrometer/src/main/java/io/rsocket/micrometer/observation[Repo]\n| Spring Amqp | https://docs.spring.io/spring-amqp/docs/current/reference/html/index.html#observation[Docs]\n| Spring Batch | https://docs.spring.io/spring-batch/docs/current/reference/html/monitoring-and-metrics.html#tracing[Docs]\n| Spring Cloud Config | https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#observability[Docs]\n| Spring Cloud CircuitBreaker | https://github.com/spring-cloud/spring-cloud-circuitbreaker/commit/4aa6883274a26b4c01b2c38e256d0b985978052e[Commit]\n| Spring Cloud Function | https://github.com/spring-cloud/spring-cloud-function/tree/main/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/observability[Repo]\n| Spring Cloud Gateway | https://github.com/spring-cloud/spring-cloud-gateway/tree/main/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/headers/observation[Repo]\n| Spring Cloud OpenFeign | https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/#micrometer-support[Docs]\n| Spring Cloud Task | https://docs.spring.io/spring-cloud-task/docs/current/reference/html/#enabling-observations-for-applicationrunner-and-commandlinerunner[Docs]\n| Spring Cloud Vault | https://github.com/spring-cloud/spring-cloud-vault/commit/1116f81971f16f9f9e42ad0994ee12a24404610e[Commit]\n| Spring Data Cassandra | https://docs.spring.io/spring-data/cassandra/docs/current/reference/html/#cassandra.observability[Docs]\n| Spring Data MongoDB | https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongodb.observability[Docs]\n| Spring Data Redis | https://docs.spring.io/spring-data-redis/docs/current/reference/html/#redis.observability[Docs]\n| Spring GraphQL | https://docs.spring.io/spring-graphql/docs/current/reference/html/#observability[Docs]\n| Spring Integration | https://docs.spring.io/spring-integration/reference/metrics.html#micrometer-observation[Docs]\n| Spring Kafka | https://docs.spring.io/spring-kafka/reference/html/#x30-obs[Docs]\n| Spring Security | https://docs.spring.io/spring-security/reference/reactive/integrations/observability.html[Docs]\n| Spring Modulith | https://docs.spring.io/spring-modulith/docs/current/reference/html/#observability[Docs]\n| Spring MVC | https://docs.spring.io/spring-framework/reference/integration/observability.html[Docs]\n| Spring Pulsar | https://docs.spring.io/spring-pulsar/docs/current/reference/html/#micrometer[Docs]\n| Spring WebFlux | https://docs.spring.io/spring-framework/reference/integration/observability.html[Docs]\n|===\n\nIf your project is instrumented using Micrometer Observation, and it\'s not listed in the table above, https://github.com/micrometer-metrics/micrometer-docs/edit/main/src/docs/observation/observation-projects.adoc[please file a PR] to our documentation! If you want to instrument your project and need our help just mention us in your issue - https://github.com/shakuzen/[@shakuzen], https://github.com/jonatan-ivanov/[@jonatan-ivanov], https://github.com/marcingrzejszczak/[@marcingrzejszczak].\n\n:leveloffset!:\n'},function(e,t,n){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Tracing support\n:toc:\n:sectnums:\n:dimensional: true\n\n== Purpose\n\nThe problem of tracing is not new.\nApplication developers have been creating ways to track the state of their applications for a long time.\nFor much of that time, developers had to create the necessary tracing framework themselves.\n\nIn 2016, the Spring Cloud team created a tracing library that could help a lot of developers.\nIt was called https://github.com/spring-cloud/spring-cloud-sleuth[Spring Cloud Sleuth].\nThe Spring team realized that tracing could be separated from Spring Cloud and created the Micrometer Tracing project, which is, essentially, a Spring-agnostic copy of Spring Cloud Sleuth.\nMicrometer Tracing had its 1.0.0 GA release in November 2022 and has been getting steadily better ever since.\n\nhttps://github.com/micrometer-metrics/tracing[Micrometer Tracing] provides a simple facade for the most popular tracer libraries, letting you instrument your JVM-based application code without vendor lock-in.\nIt is designed to add little to no overhead to your tracing collection activity while maximizing the portability of your tracing effort.\n\nIt also provides a tracing extension to Micrometer's `ObservationHandler` (from Micrometer 1.10.0).\nWhenever an `Observation` is used, a corresponding span will be created, started, stopped and reported.\n\n== Installing\n\nMicrometer Tracing comes with a Bill of Materials (BOM) which is a project that contains all the project versions for you.\n\nThe following example shows the required dependency in Gradle:\n\n[source,groovy,subs=+attributes]\n----\nimplementation platform('io.micrometer:micrometer-tracing-bom:latest.release')\nimplementation 'io.micrometer:micrometer-tracing'\n----\n\nThe following example shows the required dependency in Maven:\n\n[source,xml,subs=+attributes]\n----\n<dependencyManagement>\n <dependencies>\n <dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-tracing-bom</artifactId>\n <version>${micrometer-tracing.version}</version>\n <type>pom</type>\n <scope>import</scope>\n </dependency>\n </dependencies>\n</dependencyManagement>\n\n<dependencies>\n <dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-tracing</artifactId>\n </dependency>\n</dependencies>\n----\n\nYou should add a tracing bridge you want to use, such as `micrometer-tracing-bridge-brave` or `micrometer-tracing-bridge-otel` and span exporters / reporters.\nIn case of adding a bridge the `micrometer-tracing` library is added transitively.\n\n== Glossary\n\n:leveloffset: +1\n\nMicrometer Tracing contains a core module with an instrumentation https://en.wikipedia.org/wiki/Service_provider_interface[SPI], a set of modules containing bridges to various tracers, a set of modules containing dedicated span reporting mechanisms, and a test kit.\nYou need to understand the following definitions for distributed tracing:\n\nMicrometer Tracing borrows https://research.google.com/pubs/pub36356.html[Dapper's] terminology.\n\n*Span*: The basic unit of work.\nFor example, sending an RPC is a new span, as is sending a response to an RPC.\nSpans also have other data, such as descriptions, timestamped events, key-value annotations (tags), the ID of the span that caused them, and process IDs (normally IP addresses).\n\nSpans can be started and stopped, and they keep track of their timing information.\nOnce you create a span, you must stop it at some point in the future.\n\n*Trace*: A set of spans forming a tree-like structure.\nFor example, if you run a distributed big-data store, a trace might be formed by a `PUT` request.\n\n*Annotation/Event*: Used to record the existence of an event in time.\n\n*Tracer*: A library that handles the lifecycle of a span.\nIt can create, start, stop and report spans to an external system via reporters / exporters.\n\n*Tracing context*: For distributed tracing to work the tracing context (trace identifier, span identifier, etc.) must be propagated through the process (e.g. over threads) and over the network.\n\n*Log correlation*: Parts of the tracing context (e.g. trace identifier, span identifier) can be populated to the logs of a given application.\nOne can then collect all logs in a single storage and group them via trace id.\nThat way one can get all logs, for a single business operation (trace) from all services put in a chronological order.\n\n*Latency analysis tools*: A tool that collects exported spans and visualizes the whole trace.\nAllows easy latency analysis.\n\nThe following image shows how *Span* and *Trace* look in a system.\n\nimage::"+n(89)+"[Trace Info propagation]\n\nEach color of a note signifies a span (there are seven spans - from *A* to *G*).\nConsider the following note:\n\n[source]\n----\nTrace Id = X\nSpan Id = D\nClient Sent\n----\n\nThis note indicates that the current span has *Trace Id* set to *X* and *Span Id* set to *D*.\nAlso, from the RPC perspective, the `Client Sent` event took place.\n\nLet's consider more notes:\n\n[source]\n----\nTrace Id = X\nSpan Id = A\n(no custom span)\n\nTrace Id = X\nSpan Id = C\n(custom span)\n----\n\nYou can continue with a created span (example with `no custom span` indication) or you can create child spans manually (example with `custom span` indication).\n\nThe following image shows how parent-child relationships of spans look:\n\nimage::"+n(90)+'[Parent child relationship]\n\n:leveloffset!:\n\n== Supported Tracers\n\n:leveloffset: +1\n\nMicrometer Tracing supports the following Tracers.\n\n* https://github.com/openzipkin/brave[*OpenZipkin Brave*]\n* https://opentelemetry.io/[*OpenTelemetry*]\n\n== Installing\n\nThe following example shows the required dependency in Gradle (assuming that Micrometer Tracing BOM has been added):\n\n.Brave Tracer\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.micrometer:micrometer-tracing-bridge-brave\'\n----\n\n.OpenTelemetry Tracer\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.micrometer:micrometer-tracing-bridge-otel\'\n----\n\nThe following example shows the required dependency in Maven (assuming that Micrometer Tracing BOM has been added):\n\n.Brave Tracer\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-tracing-bridge-brave</artifactId>\n</dependency>\n----\n\n.OpenTelemetry Tracer\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-tracing-bridge-otel</artifactId>\n</dependency>\n----\n\nIMPORTANT: Remember to pick *only one* bridge.\nYou *shouldn\'t have* two bridges on the classpath.\n\n:leveloffset!:\n\n== Supported Reporters\n\n:leveloffset: +1\n\nMicrometer Tracing supports directly the following Reporters.\n\n* https://tanzu.vmware.com/observability[*Tanzu Observability by Wavefront*]\n* https://zipkin.io[*OpenZipkin Zipkin*]\n\n== Installing\n\nThe following example shows the required dependency in Gradle (assuming that Micrometer Tracing BOM has been added):\n\n.Tanzu Observability by Wavefront\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.micrometer:micrometer-tracing-reporter-wavefront\'\n----\n\n.OpenZipkin Zipkin with Brave\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.zipkin.reporter2:zipkin-reporter-brave\'\n----\n\n.OpenZipkin Zipkin with OpenTelemetry\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.opentelemetry:opentelemetry-exporter-zipkin\'\n----\n\n.An OpenZipkin URL sender dependency to send out spans to Zipkin via a `URLConnectionSender`\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.zipkin.reporter2:zipkin-sender-urlconnection\'\n----\n\nThe following example shows the required dependency in Maven (assuming that Micrometer Tracing BOM has been added):\n\n.Tanzu Observability by Wavefront\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-tracing-reporter-wavefront</artifactId>\n</dependency>\n----\n\n.OpenZipkin Zipkin with Brave\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.zipkin.reporter2</groupId>\n <artifactId>zipkin-reporter-brave</artifactId>\n</dependency>\n----\n\n.OpenZipkin Zipkin with OpenTelemetry\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.opentelemetry</groupId>\n <artifactId>opentelemetry-exporter-zipkin</artifactId>\n</dependency>\n----\n\n.An OpenZipkin URL sender dependency to send out spans to Zipkin via a `URLConnectionSender`\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.zipkin.reporter2</groupId>\n <artifactId>zipkin-sender-urlconnection</artifactId>\n</dependency>\n----\n\nIMPORTANT: Remember that Brave by default adds Zipkin as a dependency. If you want to use just Wavefront and you\'re using classpath dependant solutions such as Spring Boot, you might be required to exclude the transitive dependency on Zipkin when using Brave (e.g. via exlcuding the `io.zipkin.reporter2` group).\n\n:leveloffset!:\n\n== Using Micrometer Tracing Directly\n\n:leveloffset: +1\n\nIn this section we will describe how to use the Micrometer Tracing API directly to create and report spans.\n\n== Micrometer Tracing Examples\n\nBelow you can see basic operations on a span. Please read the comments in the snippet for details.\n\n[source,java,subs=+attributes]\n-----\n// Create a span. If there was a span present in this thread it will become\n// the `newSpan`\'s parent.\nSpan newSpan = this.tracer.nextSpan().name("calculateTax");\n// Start a span and put it in scope. Putting in scope means putting the span\n// in thread local\n// and, if configured, adjust the MDC to contain tracing information\ntry (Tracer.SpanInScope ws = this.tracer.withSpan(newSpan.start())) {\n // ...\n // You can tag a span - put a key value pair on it for better debugging\n newSpan.tag("taxValue", taxValue);\n // ...\n // You can log an event on a span - an event is an annotated timestamp\n newSpan.event("taxCalculated");\n}\nfinally {\n // Once done remember to end the span. This will allow collecting\n // the span to send it to a distributed tracing system e.g. Zipkin\n newSpan.end();\n}\n-----\n\nBelow you can see how to continue a span in a new thread, that was started in another thread.\n\n[source,java,subs=+attributes]\n-----\nSpan spanFromThreadX = this.tracer.nextSpan().name("calculateTax");\ntry (Tracer.SpanInScope ws = this.tracer.withSpan(spanFromThreadX.start())) {\n executorService.submit(() -> {\n // Pass the span from thread X\n Span continuedSpan = spanFromThreadX;\n // ...\n // You can tag a span\n continuedSpan.tag("taxValue", taxValue);\n // ...\n // You can log an event on a span\n continuedSpan.event("taxCalculated");\n }).get();\n}\nfinally {\n spanFromThreadX.end();\n}\n-----\n\nBelow you can see how to create a child span when explicitly knowing who the parent span is.\n\n[source,java,subs=+attributes]\n-----\n// let\'s assume that we\'re in a thread Y and we\'ve received\n// the `initialSpan` from thread X. `initialSpan` will be the parent\n// of the `newSpan`\nSpan newSpan = this.tracer.nextSpan(initialSpan).name("calculateCommission");\n// ...\n// You can tag a span\nnewSpan.tag("commissionValue", commissionValue);\n// ...\n// You can log an event on a span\nnewSpan.event("commissionCalculated");\n// Once done remember to end the span. This will allow collecting\n// the span to send it to e.g. Zipkin. The tags and events set on the\n// newSpan will not be present on the parent\nnewSpan.end();\n-----\n\n== Micrometer Tracing Brave Setup\n\nIn this subsection we will set up Micrometer Tracing with Brave.\n\nBelow you can see how to create a Micrometer Tracing `Tracer` using Brave components that would send completed spans to Zipkin.\n\n[source,java,subs=+attributes]\n-----\n// [Brave component] Example of using a SpanHandler. SpanHandler is a component\n// that gets called when a span is finished. Here we have an example of setting it\n// up with sending spans\n// in a Zipkin format to the provided location via the UrlConnectionSender\n// (through the <io.zipkin.reporter2:zipkin-sender-urlconnection> dependency)\n// Another option could be to use a TestSpanHandler for testing purposes.\nSpanHandler spanHandler = ZipkinSpanHandler\n .create(AsyncReporter.create(URLConnectionSender.create("http://localhost:9411/api/v2/spans")));\n\n// [Brave component] CurrentTraceContext is a Brave component that allows you to\n// retrieve the current TraceContext.\nThreadLocalCurrentTraceContext braveCurrentTraceContext = ThreadLocalCurrentTraceContext.newBuilder()\n .addScopeDecorator(MDCScopeDecorator.get()) // Example of Brave\'s\n // automatic MDC setup\n .build();\n\n// [Micrometer Tracing component] A Micrometer Tracing wrapper for Brave\'s\n// CurrentTraceContext\nCurrentTraceContext bridgeContext = new BraveCurrentTraceContext(this.braveCurrentTraceContext);\n\n// [Brave component] Tracing is the root component that allows to configure the\n// tracer, handlers, context propagation etc.\nTracing tracing = Tracing.newBuilder()\n .currentTraceContext(this.braveCurrentTraceContext)\n .supportsJoin(false)\n .traceId128Bit(true)\n // For Baggage to work you need to provide a list of fields to propagate\n .propagationFactory(BaggagePropagation.newFactoryBuilder(B3Propagation.FACTORY)\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create("from_span_in_scope 1")))\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create("from_span_in_scope 2")))\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create("from_span")))\n .build())\n .sampler(Sampler.ALWAYS_SAMPLE)\n .addSpanHandler(this.spanHandler)\n .build();\n\n\n// [Brave component] Tracer is a component that handles the life-cycle of a span\nbrave.Tracer braveTracer = this.tracing.tracer();\n\n// [Micrometer Tracing component] A Micrometer Tracing wrapper for Brave\'s Tracer\nTracer tracer = new BraveTracer(this.braveTracer, this.bridgeContext, new BraveBaggageManager());\n\n-----\n\n== Micrometer Tracing OpenTelemetry Setup\n\nIn this subsection we will set up Micrometer Tracing with OpenTelemetry (OTel).\n\nBelow you can see how to create a Micrometer Tracing `Tracer` using OTel components that would send completed spans to Zipkin.\n\n[source,java,subs=+attributes]\n-----\n// [OTel component] Example of using a SpanExporter. SpanExporter is a component\n// that gets called when a span is finished. Here we have an example of setting it\n// up with sending spans\n// in a Zipkin format to the provided location via the UrlConnectionSender\n// (through the <io.opentelemetry:opentelemetry-exporter-zipkin> and\n// <io.zipkin.reporter2:zipkin-sender-urlconnection> dependencies)\n// Another option could be to use an ArrayListSpanProcessor for testing purposes\nSpanExporter spanExporter = new ZipkinSpanExporterBuilder()\n .setSender(URLConnectionSender.create("http://localhost:9411/api/v2/spans"))\n .build();\n\n// [OTel component] SdkTracerProvider is an SDK implementation for TracerProvider\nSdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()\n .setSampler(alwaysOn())\n .addSpanProcessor(BatchSpanProcessor.builder(spanExporter).build())\n .build();\n\n// [OTel component] The SDK implementation of OpenTelemetry\nOpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder()\n .setTracerProvider(sdkTracerProvider)\n .setPropagators(ContextPropagators.create(B3Propagator.injectingSingleHeader()))\n .build();\n\n// [OTel component] Tracer is a component that handles the life-cycle of a span\nio.opentelemetry.api.trace.Tracer otelTracer = openTelemetrySdk.getTracerProvider()\n .get("io.micrometer.micrometer-tracing");\n\n// [Micrometer Tracing component] A Micrometer Tracing wrapper for OTel\nOtelCurrentTraceContext otelCurrentTraceContext = new OtelCurrentTraceContext();\n\n// [Micrometer Tracing component] A Micrometer Tracing listener for setting up MDC\nSlf4JEventListener slf4JEventListener = new Slf4JEventListener();\n\n// [Micrometer Tracing component] A Micrometer Tracing listener for setting\n// Baggage in MDC. Customizable\n// with correlation fields (currently we\'re setting empty list)\nSlf4JBaggageEventListener slf4JBaggageEventListener = new Slf4JBaggageEventListener(Collections.emptyList());\n\n// [Micrometer Tracing component] A Micrometer Tracing wrapper for OTel\'s Tracer.\n// You can consider\n// customizing the baggage manager with correlation and remote fields (currently\n// we\'re setting empty lists)\nOtelTracer tracer = new OtelTracer(otelTracer, otelCurrentTraceContext, event -> {\n slf4JEventListener.onEvent(event);\n slf4JBaggageEventListener.onEvent(event);\n}, new OtelBaggageManager(otelCurrentTraceContext, Collections.emptyList(), Collections.emptyList()));\n\n-----\n\n== Micrometer Tracing Baggage API\n\nTraces connect from service to service using header propagation. Besides trace identifiers, other properties (called `Baggage`) can also be passed along with the request.\n\nBelow you can find an example on how to use the Tracer API (version `1.0.x`) to create and extract baggage.\n\n[source,java,subs=+attributes]\n-----\n// ---------------------------------------------------------------------------\n// Example for Tracing 1.0.x\n// ---------------------------------------------------------------------------\nSpan span = tracer.nextSpan().name("parent").start();\n\n// Assuming that there\'s a span in scope...\ntry (Tracer.SpanInScope ws = tracer.withSpan(span)) {\n\n // Not passing a TraceContext explicitly will bind the baggage to the\n // current TraceContext\n // If you want to retrieve the baggage value you should make it current\n // first\n try (BaggageInScope baggage = tracer.createBaggage("from_span_in_scope 1", "value 1").makeCurrent()) {\n // This is how you retrieve the baggage\n String baggageValue = baggage.get();\n then(baggageValue).as("[In scope] Baggage 1").isEqualTo("value 1");\n\n String baggageValueViaTracer = tracer.getBaggage("from_span_in_scope 1").get();\n then(baggageValueViaTracer).as("[In scope] Baggage 1").isEqualTo("value 1");\n }\n\n try (BaggageInScope baggage = tracer.createBaggage("from_span_in_scope 2", "value 2").makeCurrent()) {\n then(baggage.get()).as("[In scope] Baggage 2").isEqualTo("value 2");\n then(tracer.getBaggage("from_span_in_scope 2").get()).as("[In scope] Baggage 2")\n .isEqualTo("value 2");\n }\n}\n\n// Assuming that you have a handle to the span\ntry (BaggageInScope baggage = tracer.createBaggage("from_span")\n .set(span.context(), "value 3")\n .makeCurrent()) {\n String baggageValueFromATraceContext = baggage.get(span.context());\n then(baggageValueFromATraceContext).as("[Span passed explicitly] Baggage 3").isEqualTo("value 3");\n\n String baggageValueFromATraceContextThroughTracer = tracer.getBaggage("from_span").get(span.context());\n then(baggageValueFromATraceContextThroughTracer).as("[Span passed explicitly] Baggage 3")\n .isEqualTo("value 3");\n}\n\n// Assuming that there\'s no span in scope\n// When there\'s no span in scope, there will never be any baggage - even if\n// you make it current\ntry (BaggageInScope baggage = tracer.createBaggage("from_span_in_scope 1", "value 1").makeCurrent()) {\n then(baggage.get()).as("[Out of span scope] Baggage 1").isNull();\n then(tracer.getBaggage("from_span_in_scope 1").get()).as("[Out of span scope] Baggage 1").isNull();\n}\nthen(tracer.getBaggage("from_span_in_scope 1").get()).as("[Out of scope] Baggage 1").isNull();\nthen(tracer.getBaggage("from_span_in_scope 2").get()).as("[Out of scope] Baggage 2").isNull();\nthen(tracer.getBaggage("from_span").get()).as("[Out of scope] Baggage 3").isNull();\nthen(tracer.getBaggage("from_span").get(span.context())).as("[Out of scope - with context] Baggage 3")\n .isNull();\n-----\n\nBelow you can find an example on how to use the Tracer API (version `1.1.x`) to create and extract baggage.\n\n[source,java,subs=+attributes]\n-----\n// ---------------------------------------------------------------------------\n// Example for Tracing 1.1.x\n// ---------------------------------------------------------------------------\n\nSpan span = tracer.nextSpan().name("parent").start();\n\n// Assuming that there\'s a span in scope...\ntry (Tracer.SpanInScope ws = tracer.withSpan(span)) {\n\n // Not passing a TraceContext explicitly will bind the baggage to the\n // current TraceContext\n try (BaggageInScope baggage = tracer.createBaggageInScope("from_span_in_scope 1", "value 1")) {\n // This is how you retrieve the baggage\n String baggageValue = baggage.get();\n then(baggageValue).as("[In scope] Baggage 1").isEqualTo("value 1");\n\n String baggageValueViaTracer = tracer.getBaggage("from_span_in_scope 1").get();\n then(baggageValueViaTracer).as("[In scope] Baggage 1").isEqualTo("value 1");\n }\n\n try (BaggageInScope baggage = tracer.createBaggageInScope("from_span_in_scope 2", "value 2")) {\n then(baggage.get()).as("[In scope] Baggage 2").isEqualTo("value 2");\n then(tracer.getBaggage("from_span_in_scope 2").get()).as("[In scope] Baggage 2")\n .isEqualTo("value 2");\n }\n}\n\n// Assuming that you have a handle to the span\ntry (BaggageInScope baggage = tracer.createBaggageInScope(span.context(), "from_span", "value 3")) {\n String baggageValueFromATraceContext = baggage.get(span.context());\n then(baggageValueFromATraceContext).as("[Span passed explicitly] Baggage 3").isEqualTo("value 3");\n\n String baggageValueFromATraceContextThroughTracer = tracer.getBaggage("from_span").get(span.context());\n then(baggageValueFromATraceContextThroughTracer).as("[Span passed explicitly] Baggage 3")\n .isEqualTo("value 3");\n}\n\n// Assuming that there\'s no span in scope\n// When there\'s no span in scope, there will never be any baggage - even if\n// you make it current\ntry (BaggageInScope baggage = tracer.createBaggageInScope("from_span_in_scope 1", "value 1")) {\n then(baggage.get()).as("[Out of span scope] Baggage 1").isNull();\n then(tracer.getBaggage("from_span_in_scope 1").get()).as("[Out of span scope] Baggage 1").isNull();\n}\nthen(tracer.getBaggage("from_span_in_scope 1").get()).as("[Out of scope] Baggage 1").isNull();\nthen(tracer.getBaggage("from_span_in_scope 2").get()).as("[Out of scope] Baggage 2").isNull();\nthen(tracer.getBaggage("from_span").get()).as("[Out of scope] Baggage 3").isNull();\nthen(tracer.getBaggage("from_span").get(span.context())).as("[Out of scope - with context] Baggage 3")\n .isNull();\n-----\n\nIMPORTANT: For Brave, remember to set up the `PropagationFactory` so that it contains the baggage fields that you will be using in your code. Check the example below for details.\n\n[source,java,subs=+attributes]\n-----\nTracing tracing = Tracing.newBuilder()\n .currentTraceContext(this.braveCurrentTraceContext)\n .supportsJoin(false)\n .traceId128Bit(true)\n // For Baggage to work you need to provide a list of fields to propagate\n .propagationFactory(BaggagePropagation.newFactoryBuilder(B3Propagation.FACTORY)\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create("from_span_in_scope 1")))\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create("from_span_in_scope 2")))\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create("from_span")))\n .build())\n .sampler(Sampler.ALWAYS_SAMPLE)\n .addSpanHandler(this.spanHandler)\n .build();\n\n-----\n\n== Aspect Oriented Programming (starting from Micrometer Tracing 1.1.0)\n\nIMPORTANT: This section is applicable from Micrometer Tracing 1.1.0.\n\nMicrometer Tracing contains a `@NewSpan`, `@ContinueSpan` and `@SpanTag` annotations that frameworks can use to create or customize spans for either specific types of methods such as those serving web request endpoints or, more generally, to all methods.\n\nWARNING: Micrometer\'s Spring Boot configuration does _not_ recognize these aspects on arbitrary methods.\n\nAn AspectJ aspect is included. You can use it in your application either through compile/load time AspectJ weaving or through framework facilities that interpret AspectJ aspects and proxy targeted methods in some other way, such as Spring AOP. Here is a sample Spring AOP configuration:\n\n[source,java,subs=+attributes]\n-----\n@Configuration\npublic class SpanAspectConfiguration {\n\n @Bean\n NewSpanParser newSpanParser() {\n return new DefaultNewSpanParser();\n }\n\n // You can provide your own resolvers - here we go with a noop example.\n @Bean\n ValueResolver valueResolver() {\n return new NoOpValueResolver();\n }\n\n // Example of a SpEL resolver\n @Bean\n ValueExpressionResolver valueExpressionResolver() {\n return new SpelTagValueExpressionResolver();\n }\n\n @Bean\n MethodInvocationProcessor methodInvocationProcessor(NewSpanParser newSpanParser, Tracer tracer,\n BeanFactory beanFactory) {\n return new ImperativeMethodInvocationProcessor(newSpanParser, tracer, beanFactory::getBean,\n beanFactory::getBean);\n }\n\n @Bean\n SpanAspect spanAspect(MethodInvocationProcessor methodInvocationProcessor) {\n return new SpanAspect(methodInvocationProcessor);\n }\n\n}\n\n// Example of using SpEL to resolve expressions in @SpanTag\nstatic class SpelTagValueExpressionResolver implements ValueExpressionResolver {\n\n private static final Log log = LogFactory.getLog(SpelTagValueExpressionResolver.class);\n\n @Override\n public String resolve(String expression, Object parameter) {\n try {\n SimpleEvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();\n ExpressionParser expressionParser = new SpelExpressionParser();\n Expression expressionToEvaluate = expressionParser.parseExpression(expression);\n return expressionToEvaluate.getValue(context, parameter, String.class);\n }\n catch (Exception ex) {\n log.error("Exception occurred while tying to evaluate the SpEL expression [" + expression + "]", ex);\n }\n return parameter.toString();\n }\n\n}\n-----\n\nApplying `SpanAspect` makes `@NewSpan` and `@ContinueSpan` usable on any arbitrary method in an AspectJ proxied instance, as the following example shows:\n\n[source,java,subs=+attributes]\n-----\n// In Sleuth @NewSpan and @ContinueSpan annotations would be taken into\n// consideration. In Micrometer Tracing due to limitations of @Aspect\n// we can\'t do that. The @SpanTag annotation will work well though.\nprotected interface TestBeanInterface {\n\n void testMethod2();\n\n void testMethod3();\n\n void testMethod10(@SpanTag("testTag10") String param);\n\n void testMethod10_v2(@SpanTag("testTag10") String param);\n\n}\n\n// Example of an implementation class\nprotected static class TestBean implements TestBeanInterface {\n\n @NewSpan\n @Override\n public void testMethod2() {\n }\n\n @NewSpan(name = "customNameOnTestMethod3")\n @Override\n public void testMethod3() {\n }\n\n @ContinueSpan(log = "customTest")\n @Override\n public void testMethod10(@SpanTag("customTestTag10") String param) {\n\n }\n\n @ContinueSpan(log = "customTest")\n @Override\n public void testMethod10_v2(String param) {\n\n }\n\n}\n\n// --------------------------\n// ----- USAGE EXAMPLE ------\n// --------------------------\n\n\n// Creates a new span with\ntestBean().testMethod2();\nthen(createdSpanViaAspect()).isEqualTo("test-method2");\n\n// Uses the name from the annotation\ntestBean().testMethod3();\nthen(createdSpanViaAspect()).isEqualTo("custom-name-on-test-method3");\n\n// Continues the previous span\nSpan span = this.tracer.nextSpan().name("foo");\ntry (Tracer.SpanInScope ws = this.tracer.withSpan(span.start())) {\n\n // Adds tags and events to an existing span\n testBean().testMethod10("tagValue");\n SimpleSpan continuedSpan = modifiedSpanViaAspect();\n then(continuedSpan.getName()).isEqualTo("foo");\n then(continuedSpan.getTags()).containsEntry("customTestTag10", "tagValue");\n then(continuedSpan.getEvents()).extracting("value").contains("customTest.before", "customTest.after");\n}\nspan.end();\n\n// Continues the previous span\nspan = this.tracer.nextSpan().name("foo");\ntry (Tracer.SpanInScope ws = this.tracer.withSpan(span.start())) {\n\n // Adds tags and events to an existing span (reusing setup from the parent\n // interface)\n testBean().testMethod10_v2("tagValue");\n SimpleSpan continuedSpan = modifiedSpanViaAspect();\n then(continuedSpan.getName()).isEqualTo("foo");\n then(continuedSpan.getTags()).containsEntry("testTag10", "tagValue");\n then(continuedSpan.getEvents()).extracting("value").contains("customTest.before", "customTest.after");\n}\nspan.end();\n\n\n-----\n\n\n:leveloffset!:\n\n== Configuring with Micrometer Observation\n\n:leveloffset: +1\n\n== Handler Configuration\n\n// TODO: We need to separately document that Micrometer provides a TimerObservationHandler\n\nFor Micrometer Tracing to work with Micrometer Observation, you need to add a tracing related `ObservationHandler`.\nCheck the example below for an example of adding and using a single `DefaultTracingObservationHandler`.\n\n[source,java,subs=+attributes]\n-----\nTracer tracer = Tracer.NOOP; // The real tracer will come from your tracer\n // implementation (Brave /\n// OTel)\nPropagator propagator = Propagator.NOOP; // The real propagator will come from\n // your tracer implementation (Brave /\n // OTel)\nMeterRegistry meterRegistry = new SimpleMeterRegistry();\n\nObservationRegistry registry = ObservationRegistry.create();\nregistry.observationConfig()\n // assuming that micrometer-core is on the classpath\n .observationHandler(new DefaultMeterObservationHandler(meterRegistry))\n // we set up a first matching handler that creates spans - it comes from\n // Micrometer\n // Tracing. We set up spans for sending and receiving data over the wire\n // and a default one\n .observationHandler(new ObservationHandler.FirstMatchingCompositeObservationHandler(\n new PropagatingSenderTracingObservationHandler<>(tracer, propagator),\n new PropagatingReceiverTracingObservationHandler<>(tracer, propagator),\n new DefaultTracingObservationHandler(tracer)));\n\n// Creating and starting a new observation\n// via the `DefaultTracingObservationHandler` that will create a new Span and\n// start it\nObservation observation = Observation.start("my.operation", registry)\n .contextualName("This name is more readable - we can reuse it for e.g. spans")\n .lowCardinalityKeyValue("this.tag", "will end up as a meter tag and a span tag")\n .highCardinalityKeyValue("but.this.tag", "will end up as a span tag only");\n\n// Put the observation in scope\n// This will result in making the previously created Span, the current Span - it\'s\n// in ThreadLocal\ntry (Observation.Scope scope = observation.openScope()) {\n // Run your code that you want to measure - still the attached Span is the\n // current one\n // This means that e.g. logging frameworks could inject to e.g. MDC tracing\n // information\n yourCodeToMeasure();\n}\nfinally {\n // The corresponding Span will no longer be in ThreadLocal due to\n // try-with-resources block (Observation.Scope is an AutoCloseable)\n // Stop the Observation\n // The corresponding Span will be stopped and reported to an external system\n observation.stop();\n}\n-----\n\nYou can also use a shorter version to perform measurements via the `observe` method.\n\n[source,java,subs=+attributes]\n-----\nObservationRegistry registry = ObservationRegistry.create();\n\nObservation.createNotStarted("my.operation", registry)\n .contextualName("This name is more readable - we can reuse it for e.g. spans")\n .lowCardinalityKeyValue("this.tag", "will end up as a meter tag and a span tag")\n .highCardinalityKeyValue("but.this.tag", "will end up as a span tag only")\n .observe(this::yourCodeToMeasure);\n-----\n\nThis will result in the following Micrometer Metrics:\n\n```\nGathered the following metrics\n Meter with name <my.operation> and type <TIMER> has the following measurements\n <[\n Measurement{statistic=\'COUNT\', value=1.0},\n Measurement{statistic=\'TOTAL_TIME\', value=1.011949454},\n Measurement{statistic=\'MAX\', value=1.011949454}\n ]>\n and has the following tags <[tag(this.tag=will end up as a meter tag and a span tag)]>\n```\n\nAnd the following trace view in e.g. Zipkin\n\nimage::'+n(91)+'[Trace Info propagation]\n\n=== Ordered Handler Configuration\n\nMicrometer Tracing comes with multiple `ObservationHandler` implementations.\nTo introduce ordering, you can use the `ObservationHandler.AllMatchingCompositeObservationHandler` to run logic for all ``ObservationHandler``s that are matching the given predicate and `ObservationHandler.FirstMatchingCompositeObservationHandler` to run logic only for the first `ObservationHandler` that matches the predicate.\nThe former can group handlers and the latter can be chosen to e.g. run only one matching `TracingObservationHandler`.\n\n== Context Propagation with Micrometer Tracing\n\nIn order to make https://micrometer.io/docs/contextPropagation[Context Propagation] work with Micrometer Tracing you need to manually register the proper `ThreadLocalAccessor` as presented below.\n\n[source,java,subs=+attributes]\n-----\nContextRegistry.getInstance().registerThreadLocalAccessor(new ObservationAwareSpanThreadLocalAccessor(tracer));\n-----\n\n== Exemplars\n\nTo add support for https://grafana.com/docs/grafana/latest/fundamentals/exemplars/[exemplars] instead of using the `DefaultMeterObservationHandler` you should use the `TracingAwareMeterObservationHandler` like presented below.\n\n[source,java,subs=+attributes]\n-----\nObservationRegistry registry = ObservationRegistry.create();\nregistry.observationConfig()\n // Don\'t register the DefaultMeterObservationHandler...\n // .observationHandler(new DefaultMeterObservationHandler(meterRegistry))\n // ...instead register the tracing aware version\n .observationHandler(new TracingAwareMeterObservationHandler<>(\n new DefaultMeterObservationHandler(meterRegistry), tracer));\n-----\n\n:leveloffset!:\n\n== Testing\n\n:leveloffset: +1\n\nMicrometer Tracing comes with `micrometer-tracing-test` and `micrometer-tracing-integration-test` modules.\n\nFor unit tests it provides a `SimpleTracer` that is a test implementation of a `Tracer`.\n\nFor the integration tests it provides a `SampleTestRunner` mechanism that you can hook into your samples.\nIt will\n\n* Configure an OpenZipkin Brave Tracer\n** Set it up with Tanzu Observability by Wavefront Reporter\n** Set it up with OpenZipkin Zipkin Reporter\n* Configure an OpenTelemetry Tracer\n** Set it up with Tanzu Observability by Wavefront Exporter\n** Set it up with OpenZipkin Zipkin Exporter\n* Run all the combinations above against the user code and running infrastructure\n\n== Installing\n\nThe following example shows the required dependency in Gradle (assuming that Micrometer Tracing BOM has been added):\n\n[source,groovy,subs=+attributes]\n-----\ntestImplementation \'io.micrometer:micrometer-tracing-test\' // for unit tests\ntestImplementation \'io.micrometer:micrometer-tracing-integration-test\' // for integration tests\n-----\n\nThe following example shows the required dependency in Maven (assuming that Micrometer Tracing BOM has been added):\n\n[source,xml,subs=+attributes]\n-----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-tracing-test</artifactId> \x3c!-- For unit tests --\x3e\n <scope>test</scope>\n</dependency>\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-tracing-integration-test</artifactId> \x3c!-- For integration tests --\x3e\n <scope>test</scope>\n</dependency>\n-----\n\n== Running Tracing Unit Tests\n\nTo run unit tests of your custom handler you may want to use the `SimpleTracer` test `Tracer` implementation. Let\'s assume the following custom `TracingObservationHandler`.\n\n[source,java,subs=+attributes]\n-----\nstatic class MyTracingObservationHandler implements TracingObservationHandler<CustomContext> {\n\n private final Tracer tracer;\n\n MyTracingObservationHandler(Tracer tracer) {\n this.tracer = tracer;\n }\n\n @Override\n public void onStart(CustomContext context) {\n String databaseName = context.getDatabaseName();\n Span.Builder builder = this.tracer.spanBuilder().kind(Span.Kind.CLIENT).remoteServiceName(databaseName);\n getTracingContext(context).setSpan(builder.start());\n }\n\n @Override\n public void onError(CustomContext context) {\n getTracingContext(context).getSpan().error(context.getError());\n }\n\n @Override\n public void onStop(CustomContext context) {\n Span span = getRequiredSpan(context);\n span.name(context.getContextualName() != null ? context.getContextualName() : context.getName());\n tagSpan(context, span);\n span.end();\n }\n\n @Override\n public boolean supportsContext(Observation.Context context) {\n return context instanceof CustomContext;\n }\n\n @Override\n public Tracer getTracer() {\n return this.tracer;\n }\n\n}\n-----\n\nTo verify whether the spans got properly created we can use the `SimpleTracer` as follows:\n\n[source,java,subs=+attributes]\n-----\nclass SomeComponentThatIsUsingMyTracingObservationHandlerTests {\n\n ObservationRegistry registry = ObservationRegistry.create();\n\n SomeComponent someComponent = new SomeComponent(registry);\n\n SimpleTracer simpleTracer = new SimpleTracer();\n\n MyTracingObservationHandler handler = new MyTracingObservationHandler(simpleTracer);\n\n @BeforeEach\n void setup() {\n registry.observationConfig().observationHandler(handler);\n }\n\n @Test\n void should_store_a_span() {\n // this code will call actual Observation API\n someComponent.doSthThatShouldCreateSpans();\n\n TracerAssert.assertThat(simpleTracer)\n .onlySpan()\n .hasNameEqualTo("insert user")\n .hasKindEqualTo(Span.Kind.CLIENT)\n .hasRemoteServiceNameEqualTo("mongodb-database")\n .hasTag("mongodb.command", "insert")\n .hasTag("mongodb.collection", "user")\n .hasTagWithKey("mongodb.cluster_id")\n .assertThatThrowable()\n .isInstanceOf(IllegalStateException.class)\n .backToSpan()\n .hasIpThatIsBlank()\n .hasPortThatIsNotSet();\n }\n\n}\n-----\n\n== Running integration tests\n\nThe following example shows how you can run your code to test your integrations\n\n* by asserting spans that were stored without emitting them to a reporting system\n* against running Tanzu Observability by Wavefront instance (this option turns on when you have passed the Wavefront related configuration in the constructor - otherwise the test will be disabled)\n* against running Zipkin instance (this option turns on when Zipkin is running - otherwise the test will be disabled)\n\n[source,java,subs=+attributes]\n-----\nclass ObservabilitySmokeTest extends SampleTestRunner {\n\n ObservabilitySmokeTest() {\n super(SampleRunnerConfig.builder().wavefrontApplicationName("my-app").wavefrontServiceName("my-service")\n .wavefrontToken("...")\n .wavefrontUrl("...")\n .zipkinUrl("...") // defaults to localhost:9411\n .build());\n }\n\n @Override\n public BiConsumer<BuildingBlocks, Deque<ObservationHandler<? extends Observation.Context>>> customizeObservationHandlers() {\n return (bb, handlers) -> {\n ObservationHandler defaultHandler = handlers.removeLast();\n handlers.addLast(new MyTracingObservationHandler(bb.getTracer()));\n handlers.addLast(defaultHandler);\n };\n }\n\n @Override\n public SampleTestRunnerConsumer yourCode() {\n return (bb, meterRegistry) -> {\n // here you would be running your code\n yourCode();\n\n SpansAssert.assertThat(bb.getFinishedSpans())\n .haveSameTraceId()\n .hasNumberOfSpansEqualTo(8)\n .hasNumberOfSpansWithNameEqualTo("handle", 4)\n .forAllSpansWithNameEqualTo("handle", span -> span.hasTagWithKey("rsocket.request-type"))\n .hasASpanWithNameIgnoreCase("request_stream")\n .thenASpanWithNameEqualToIgnoreCase("request_stream")\n .hasTag("rsocket.request-type", "REQUEST_STREAM")\n .backToSpans()\n .hasASpanWithNameIgnoreCase("request_channel")\n .thenASpanWithNameEqualToIgnoreCase("request_channel")\n .hasTag("rsocket.request-type", "REQUEST_CHANNEL")\n .backToSpans()\n .hasASpanWithNameIgnoreCase("request_fnf")\n .thenASpanWithNameEqualToIgnoreCase("request_fnf")\n .hasTag("rsocket.request-type", "REQUEST_FNF")\n .backToSpans()\n .hasASpanWithNameIgnoreCase("request_response")\n .thenASpanWithNameEqualToIgnoreCase("request_response")\n .hasTag("rsocket.request-type", "REQUEST_RESPONSE");\n\n MeterRegistryAssert.assertThat(meterRegistry)\n .hasTimerWithNameAndTags("rsocket.response", Tags.of(Tag.of("error", "none"), Tag.of("rsocket.request-type", "REQUEST_RESPONSE")))\n .hasTimerWithNameAndTags("rsocket.fnf", Tags.of(Tag.of("error", "none"), Tag.of("rsocket.request-type", "REQUEST_FNF")))\n .hasTimerWithNameAndTags("rsocket.request", Tags.of(Tag.of("error", "none"), Tag.of("rsocket.request-type", "REQUEST_RESPONSE")))\n .hasTimerWithNameAndTags("rsocket.channel", Tags.of(Tag.of("error", "none"), Tag.of("rsocket.request-type", "REQUEST_CHANNEL")))\n .hasTimerWithNameAndTags("rsocket.stream", Tags.of(Tag.of("error", "none"), Tag.of("rsocket.request-type", "REQUEST_STREAM")));\n };\n }\n\n}\n-----\n\n:leveloffset!:\n'},function(e,t,n){"use strict";n.r(t),t.default=n.p+"7043f6f1d0731de0cc0943e896c32fca.jpg"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"e4aa3da5f34dc789ae92d1f759a97b85.jpg"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"b8a4008ab6f119930854d422d6bd39b9.jpg"},function(e,t){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Context Propagation support\n:toc:\n:sectnums:\n:dimensional: true\n\n== Purpose\n\nhttps://github.com/micrometer-metrics/context-propagation[A library] that assists with context propagation across different types of context\nmechanisms such as `ThreadLocal`, Reactor https://projectreactor.io/docs/core/release/reference/#context[Context]\nand others.\n\nAbstractions:\n\n* `ThreadLocalAccessor` - contract to assist with access to a `ThreadLocal` value.\n* `ContextAccessor` - contract to assist with access to a `Map`-like context.\n* `ContextRegistry` - registry for instances of `ThreadLocalAccessor` and `ContextAccessor`.\n* `ContextSnapshot` - holder of contextual values, that provides methods to capture and to propagate.\n\nExample Scenarios:\n\n* In imperative code, e.g. Spring MVC controller, capture `ThreadLocal` values into a\n`ContextSnapshot`. After that use the snapshot to populate a Reactor `Context` with the\ncaptured values, or to wrap a task (e.g. `Runnable`, `Callable`, etc) or an `Executor`\nwith a decorator that restores `ThreadLocal` values when the task executes.\n* In reactive code, e.g. Spring WebFlux controller, create a `ContextSnapshot` from\nReactor `Context` values. After that use the snapshot to restore `ThreadLocal` values\nwithin a specific stage (operator) of the reactive chain.\n\nContext values can originate from any context mechanism and propagate to any other, any\nnumber of times. For example, a value in a `Reactor` context may originate as a\n`ThreadLocal`, and may yet become a `ThreadLocal` again, and so on.\n\nGenerally, imperative code should interact with `ThreadLocal` values as usual, and\nlikewise Reactor code should interact with the Reactor `Context` as usual. The Context\nPropagation library is not intended to replace those, but to assist with propagation when\ncrossing from one type of context to another, e.g. when imperative code invokes a Reactor\nchain, or when a Reactor chain invokes an imperative component that expects\n`ThreadLocal` values.\n\nThe library is not limited to context propagation from imperative to reactive. It can\nassist in asynchronous scenarios to propagate `ThreadLocal` values from one thread to\nanother. It can also propagate to any other type of context for which there is a\nregistered `ContextAccesor` instance.\n\n== Installing\n\nSnapshots are published to https://repo.spring.io/snapshot for every successful build on the `main` branch and maintenance branches.\n\nMilestone releases are published to https://repo.spring.io/milestone. Include that as a Maven repository in your build\nconfiguration to use milestone releases. Note that milestone releases are for testing purposes and are not intended for\nproduction use.\n\nThe following example shows the required dependency in Gradle:\n\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.micrometer:context-propagation:latest.integration\'\n----\n\nThe following example shows the required dependency in Maven:\n\n[source,xml,subs=+attributes]\n----\n<dependencies>\n <dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>context-propagation</artifactId>\n <version>${micrometer-context-propagation.version}</version>\n </dependency>\n</dependencies>\n----\n\n== Usage Examples\n\n:leveloffset: +1\n\n== `ThreadLocal` Population\n\nBelow you can find a holder for `ThreadLocal` values.\n\n.ObservationThreadLocalHolder\n[source,java,subs=+attributes]\n-----\n/**\n * Example of a wrapper around ThreadLocal values.\n */\npublic class ObservationThreadLocalHolder {\n\n private static final ThreadLocal<String> holder = new ThreadLocal<>();\n\n public static void setValue(String value) {\n holder.set(value);\n }\n\n public static String getValue() {\n return holder.get();\n }\n\n public static void reset() {\n holder.remove();\n }\n\n}\n-----\n\nBelow you can find a `ThreadLocalAccessor` that interacts with the holder.\n\n.ObservationThreadLocalAccessor\n[source,java,subs=+attributes]\n-----\n/**\n * Example {@link ThreadLocalAccessor} implementation.\n */\npublic class ObservationThreadLocalAccessor implements ThreadLocalAccessor<String> {\n\n public static final String KEY = "micrometer.observation";\n\n @Override\n public Object key() {\n return KEY;\n }\n\n @Override\n public String getValue() {\n return ObservationThreadLocalHolder.getValue();\n }\n\n @Override\n public void setValue(String value) {\n ObservationThreadLocalHolder.setValue(value);\n }\n\n @Override\n public void setValue() {\n ObservationThreadLocalHolder.reset();\n }\n\n}\n-----\n\nBelow you can find an example of how to store and restore thread local values via `ThreadLocalAccessor`, `ContextSnapshot` and `ContextRegistry`.\n\n[source,java,subs=+attributes]\n-----\n// Create a new Context Registry (you can use a global too)\nContextRegistry registry = new ContextRegistry();\n// Register thread local accessors (you can use SPI too)\nregistry.registerThreadLocalAccessor(new ObservationThreadLocalAccessor());\n\n// When you set a thread local value...\nObservationThreadLocalHolder.setValue("hello");\n// ... we can capture it using ContextSnapshot\nContextSnapshot snapshot = ContextSnapshotFactory.builder().contextRegistry(registry).build().captureAll();\n\n// After capturing if you change the thread local value again ContextSnapshot will\n// not see it\nObservationThreadLocalHolder.setValue("hola");\ntry {\n // We\'re populating the thread local values with what we had in\n // ContextSnapshot\n try (Scope scope = snapshot.setThreadLocals()) {\n // Within this scope you will see the stored thread local values\n then(ObservationThreadLocalHolder.getValue()).isEqualTo("hello");\n }\n // After the scope is closed we will come back to the previously present\n // values in thread local\n then(ObservationThreadLocalHolder.getValue()).isEqualTo("hola");\n}\nfinally {\n // We\'re clearing the thread local values so that we don\'t pollute the thread\n ObservationThreadLocalHolder.reset();\n}\n-----\n\n:leveloffset!:\n'},function(e,t,n){var r={"./appOptics.adoc":94,"./atlas.adoc":97,"./azure-monitor.adoc":101,"./cloudwatch.adoc":102,"./datadog.adoc":103,"./dynatrace.adoc":104,"./elastic.adoc":105,"./ganglia.adoc":106,"./graphite.adoc":108,"./hierarchical-name-mapping.adoc":110,"./humio.adoc":111,"./influx.adoc":113,"./install.adoc":114,"./instana.adoc":115,"./jmx.adoc":116,"./kairos.adoc":118,"./new-relic.adoc":119,"./otlp.adoc":124,"./prometheus.adoc":125,"./signalFx.adoc":131,"./stackdriver.adoc":137,"./statsD.adoc":138,"./wavefront.adoc":139};function a(e){var t=i(e);return n(t)}function i(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=i,e.exports=a,a.id=93},function(e,t,n){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer AppOptics\n:toc:\n:sectnums:\n:system: appoptics\n\nAppOptics is a dimensional time-series SaaS with built-in dashboarding.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThe following example configures an AppOptics instance:\n\n[source,java]\n----\nAppOpticsConfig appopticsConfig = new AppOpticsConfig() {\n @Override\n public String apiToken() {\n return MY_TOKEN;\n }\n\n @Override\n @Nullable\n public String get(String k) {\n return null;\n }\n};\nMeterRegistry registry = new AppOpticsMeterRegistry(appopticsConfig, Clock.SYSTEM);\n----\n\n`AppOpticsConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.appoptics` directly to the `AppOpticsConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.appoptics:\n api-token: YOURKEY\n\n # You will probably want disable AppOptics publishing in a local development profile.\n enabled: true\n\n # The interval at which metrics are sent to AppOptics. The default is 1 minute.\n step: 1m\n----\n\n== Graphing\n\nThis section serves as a quick start to rendering useful representations in AppOptics for metrics that originate in Micrometer.\n\n=== Timers\n\nThe AppOptics implementation of `Timer` produces three fields in AppOptics:\n\n* `sum`: Rate of calls per second.\n* `count`: Rate of total time per second.\n* `max`: A sliding window maximum amount recorded.\n\n.Dimensionally aggregable average in AppOptics.\nimage::"+n(95)+"[AppOptics timer average]\n\nAppOptics performs the `sum/count` division dimensionally to generate aggregable averages on your behalf.\n\n.Timer over a simulated service.\nimage::"+n(96)+"[AppOptics-rendered timer]\n"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"0592f647d85fc092e402fdfb77234e24.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"6bf5cf6071710d129ffaadb50d2b0874.png"},function(e,t,n){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Atlas\n:toc:\n:sectnums:\n:system: atlas\n\nAtlas is an in-memory dimensional time series database with built-in graphing, a custom stack-based query language, and advanced math operations. Atlas originated at Netflix, where it remains the operational metrics solution.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\n[source,java]\n----\nAtlasConfig atlasConfig = new AtlasConfig() {\n @Override\n public Duration step() {\n return Duration.ofSeconds(10);\n }\n\n @Override\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\nMeterRegistry registry = new AtlasMeterRegistry(atlasConfig, Clock.SYSTEM);\n----\n\nMicrometer uses Netflix's https://github.com/netflix/spectator[Spectator] as the underlying instrumentation library when recording metrics destined for Atlas. `AtlasConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties prefixed with `management.metrics.export.atlas` directly to the `AtlasConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.atlas:\n # The location of your Atlas server\n uri: http://localhost:7101/api/v1/publish\n\n # You will probably want to conditionally disable Atlas publishing in local development.\n enabled: true\n\n # The interval at which metrics are sent to Atlas. The default is 1 minute.\n step: 1m\n----\n\n== Graphing\n\nThis section serves as a quick start to rendering useful representations in Atlas for metrics originating in Micrometer. See the https://github.com/netflix/atlas/wiki[Atlas wiki] for a far more complete reference of what is possible in Atlas.\n\n=== Counters\n\nAtlas serves up graphs in the form of PNG images (and other https://github.com/Netflix/atlas/wiki/Output-Formats[output formats] as well).\n\nWe use the following query to visualize the counter from Atlas. Note that the value is rate-normalized over the step interval rather than monotonically increasing. Atlas always expects link:/docs/concepts#_client_side[rate-aggregated] data for counters from Micrometer.\n\n.Counter over a positive-biased random walk.\nimage::"+n(98)+'[Atlas-rendered counter]\n\n[source,http]\n----\nGET /api/v1/graph?\n q=\n name,counter,:eq,\n 2,:lw\n &tz=US/Central\n &s=e-15m <1>\n &w=400 <2>\n &l=0 <3>\nHost: localhost:7101\n----\n<1> The range of time we want to visualize along the x-axis. `e` represents the end time or "`now`". This graph\'s axis is from 15 minutes ago until now. Atlas automatically chooses the finest grained step interval available from the data that would render at least 1px wide on the resultant image.\n<2> The overall width of the PNG image returned should be 400px.\n<3> Set the y-axis lower limit to 0 so that random perturbation in the walk does not look so dramatic.\n\n=== Timers\n\nWhile reading directly from a `Timer` returns a `double`, the underlying value is\nstored in https://github.com/netflix/spectator[Spectator] as a nanosecond-precise `long`. What precision is lost by\nconverting to a `double` in the `Timer` interface does not affect a system like\nAtlas, because it has been configured to read measurements from the underlying\nSpectator `Timer` that Micrometer is hiding from you.\n\nThe Spectator Atlas `Timer` produces four time series, each with a different `statistic` tag:\n\n* `count`: Rate of calls per second.\n* `totalTime`: Rate of total time per second.\n* `totalOfSquares`: Rate of total time squared per second (useful for standard deviation).\n* `max`: The maximum amount recorded.\n\nTherefore, you can achieve a throughput (requests/second) line with the following query:\n\n```http\nname,timer,:eq,statistic,count,:eq,:and\n```\n\nNotice that `statistic` is just a dimension that can be drilled down and selected like any other.\n\nFurthermore, `totalTime/count` represents average latency and can be selected with a short-hand `:dist-avg` query, which selects the `totalTime` and `count` time series and performs the division for us:\n\n```http\nname,timer,:eq,:dist-avg\n```\n\nIn the preceding example, you can see these two lines plotted on a single dual-axis graph.\n\n.Timer over a simulated service.\nimage::'+n(99)+"[Atlas-rendered timer]\n\n\n=== Long task timers\n\nSuppose we had a task that took two minutes to complete when it was expected to complete in less than 70 seconds. A key benefit of long task timers is the ability to receive an alert at the first reporting interval after we have exceeded the threshold. With a regular timer, we would not receive an alert until the first reporting interval after the process completed. If we had a ten-second publishing interval, the regular timer alert would arrive almost a minute after the long task timer alert.\n\n.Simulated back-to-back long tasks.\nimage::"+n(100)+"[Atlas-rendered long task timer]\n\n[source, http]\n----\nGET /api/v1/graph?\n q=\n name,longTaskTimer,:eq,statistic,duration,:eq,:and, <1>\n :dup,\n 70,:gt,:vspan,f00,:color,40,:alpha,alerted,:legend, <2>\n 70,f00,:color,alert+threshold,:legend <3>\n &tz=US/Central\n &s=e-15m\n &w=400\n &l=0\n &title=Peaks+of+Long+Tasks\n &ylabel=time\nHost: localhost:7101\n----\n<1> A representation of long tasks that are happening back-to-back.\n<2> A vertical span that appears whenever the long task exceeds our threshold of 70 seconds. So that it does not overwhelm the graph, we also decrease the opacity of the vspan.\n<3> Plot the threshold of 70 seconds as a separate line.\n"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"b22351bea254b10bef1c26d3cc3ef397.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"4ce8699a76d05ed4311151acc1772b1f.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"1127e78d5d7524b0c0540de3d2a732b2.png"},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Azure Monitor\n:toc:\n:sectnums:\n:system: azure-monitor\n\nAzure Monitor is a dimensional time-series SaaS with built-in dashboarding.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThe following example configures a Micrometer Azure Monitor:\n\n[source,java]\n----\nAzureMonitorConfig azureMonitorConfig = new AzureMonitorConfig() {\n @Override\n public String instrumentationKey() {\n return MY_KEY;\n }\n\n @Override\n public String get(String key) {\n return null;\n }\n};\nMeterRegistry registry = new AzureMonitorMeterRegistry(azureMonitorConfig, Clock.SYSTEM);\n----\n\n`AzureMonitorConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.azure-monitor` directly to the `AzureMonitorConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.azure-monitor:\n instrumentation-key: YOURKEY\n\n # You will probably want disable Azure Monitor publishing in a local development profile.\n enabled: true\n\n # The interval at which metrics are sent to Azure Monitor. The default is 1 minute.\n step: 1m\n----\n"},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer CloudWatch\nTommy Ludwig <tludwig@vmware.com>\n:toc:\n:sectnums:\n:system: cloudwatch2\n\nhttps://aws.amazon.com/cloudwatch/[Amazon CloudWatch] is a dimensional time-series SaaS on Amazon's cloud.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\nNOTE: The `micrometer-registry-cloudwatch2` module uses AWS SDK v2. `micrometer-registry-cloudwatch` is for AWS SDK v1.\n\n== Configuring\n\nThe following example configures Micrometer CloudWatch:\n\n[source,java]\n----\nCloudWatchConfig cloudWatchConfig = new CloudWatchConfig() {\n @Override\n public String get(String s) {\n return null;\n }\n\n @Override\n public String namespace() {\n return \"mynamespace\";\n }\n};\nMeterRegistry meterRegistry = new CloudWatchMeterRegistry(cloudWatchConfig, Clock.SYSTEM, CloudWatchAsyncClient.create());\n----\n\nYou can provide your own `CloudWatchAsyncClient` to the constructor of the registry.\n\n`CloudWatchConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, https://docs.awspring.io/spring-cloud-aws/docs/current/reference/html/index.html#cloudwatch-metrics[Micrometer support in Spring Cloud AWS] binds properties prefixed with `management.metrics.export.cloudwatch` directly to the `CloudWatchConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.cloudwatch:\n namespace: YOURNAMESPACE\n\n # You will probably want to disable publishing in a local development profile.\n enabled: true\n\n # The interval at which metrics are sent to CloudWatch. The default is 1 minute.\n step: 1m\n----\n"},function(e,t){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Datadog\n:toc:\n:sectnums:\n:system: datadog\n\nDatadog is a dimensional time-series SaaS with built-in dashboarding and alerting.\n\n== Installation and Configuration\n\nMicrometer supports shipping metrics to Datadog directly by using its HTTP API or by using DogStatsD through the link:/docs/registry/statsD[StatsD registry].\nThe API approach is far more efficient if you need to choose between the two.\n\n=== Direct to Datadog API Approach\n\nFor Gradle, add the following implementation:\n\n[source,groovy]\n----\nimplementation \'io.micrometer:micrometer-registry-datadog:latest.release\'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-datadog</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\nMetrics are rate-aggregated and pushed to `datadoghq` on a periodic interval. Rate aggregation performed by the registry yields datasets that are similar to those produced by `dogstatsd`.\n\n[source, java]\n----\nDatadogConfig config = new DatadogConfig() {\n @Override\n public Duration step() {\n return Duration.ofSeconds(10);\n }\n\n @Override\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\nMeterRegistry registry = new DatadogMeterRegistry(config, Clock.SYSTEM);\n----\n\n`DatadogConfig` is an interface with a set of default methods.\nIf, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration through properties.\nFor example, Spring Boot\'s Micrometer support binds properties directly to the `DatadogConfig`.\nSee the https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.metrics.export.datadog[Datadog] section in the Spring Boot reference documentation.\n\n`DatadogConfig.hostTag()` specifies a tag key that is mapped to https://docs.datadoghq.com/api/v1/metrics/#submit-metrics[the `host` field] when shipping metrics to Datadog.\nFor example, if `DatadogConfig.hostTag()` returns `host`, the tag having `host` as its key is used.\nYou can set the tag by using common tags, as follows:\n\n[source,java]\n----\nregistry.config().commonTags("host", "my-host");\n----\n\n`uri` is an important property to configure.\nThe default value is `https://api.datadoghq.com`.\nDepending on the Datadog site (region), the api endpoint will be different.\nTo find your the correct `uri` for your account, do the following:\n\n1. Read about https://docs.datadoghq.com/getting_started/site/[Datadog site].\n2. Go to https://docs.datadoghq.com/api/latest/metrics/[Metrics API reference] and select your own option from the "DATADOG SITE" dropdown.\n3. Check any API request\'s endpoint.\n\nE.g. For `US5` site, the correct API endpoint is `https://api.us5.datadoghq.com` while for `US3` site, it is `https://api.us3.datadoghq.com/`.\n\n=== Through DogStatsD Approach\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.micrometer:micrometer-registry-statsd:latest.release\'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-statsd</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\nMetrics are immediately shipped to DogStatsD using Datadog\'s flavor of the StatsD line protocol. `java-dogstatsd-client` is _not_ needed on the classpath for this to work, as Micrometer uses its own implementation.\n\n[source,java]\n----\nStatsdConfig config = new StatsdConfig() {\n @Override\n public String get(String k) {\n return null;\n }\n\n @Override\n public StatsdFlavor flavor() {\n return StatsdFlavor.DATADOG;\n }\n};\n\nMeterRegistry registry = new StatsdMeterRegistry(config, Clock.SYSTEM);\n----\n\nMicrometer supports DogStatsD\'s https://docs.datadoghq.com/developers/dogstatsd/?tab=kubernetes#origin-detection-over-udp[origin detection over UDP] feature on Kubernetes if the `DD_ENTITY_ID` environment variable is properly set.\n\nMicrometer, by default, publishes `Timer` meters to DogStatsD as the StatsD "timing" metric type `ms`,\nwhich are sent to Datadog as https://docs.datadoghq.com/metrics/types/?tab=histogram#metric-types[histogram] type metrics.\nMicrometer publishes `DistributionSummary` meters as histogram type metrics by default, also.\n\nWhen `percentileHistogram` is enabled for the meter, Micrometer sends `Timer` and `DistributionSummary` meters as Datadog https://docs.datadoghq.com/metrics/distributions[Distributions] to DogStatsD.\nYou can make a `DistributionSummary` with `percentileHistogram` enabled as follows:\n\n[source,java]\n----\nDistributionSummary responseSizeSummary = DistributionSummary.builder("http.server.response.size")\n .baseUnit("bytes")\n .publishPercentileHistogram()\n .register(registry);\n----\n'},function(e,t){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Dynatrace\n:toc:\n:sectnums:\n:system: dynatrace\n\nhttps://www.dynatrace.com/[*Dynatrace*] is a Software Intelligence Platform featuring application performance monitoring (APM), artificial intelligence for operations (AIOps), IT infrastructure monitoring, digital experience management (DEM), and digital business analytics capabilities.\nIt can ingest multi-purpose dimensional time-series data and has built-in dashboarding.\nBoth SaaS and self-hosted (Managed) deployments are offered.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.micrometer:micrometer-registry-{system}:latest.release\'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nFor setting up new integrations with Dynatrace, it is recommended to use the latest version of the https://docs.dynatrace.com/docs/shortlink/api-metrics-v2[Dynatrace Metrics API] (v2).\nIf you are using Micrometer with Spring Boot, please also refer to the https://docs.dynatrace.com/docs/shortlink/micrometer-metrics-ingest[Dynatrace documentation] and/or the https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.metrics.export.dynatrace[Spring Boot documentation].\nDynatrace provides different ways of setting up integrations:\n\n=== Using Dynatrace auto-configuration (preferred) [[bookmark-auto-configuration]]\n\nDynatrace auto-configuration is available for hosts that are monitored by a OneAgent or by the Dynatrace Operator for Kubernetes.\n\nIf a Dynatrace OneAgent is installed on the host running Micrometer, metrics can be exported directly using the OneAgent without having to specify an endpoint URI or API token.\nIf running in Kubernetes with the Dynatrace operator installed, the registry will pick up your endpoint URI and API token from the operator instead.\nIn this case there is no need to configure anything, so you can use the following code in your project to export Micrometer metrics to Dynatrace:\n\n[source,java]\n----\nDynatraceConfig dynatraceConfig = new DynatraceConfig() {\n @Override\n @Nullable\n public String get(String k) {\n // This method of the interface is used by the other configuration methods and needs to be\n // implemented here. Returning null accepts the defaults for the other configuration items.\n return null;\n }\n};\nMeterRegistry registry = new DynatraceMeterRegistry(dynatraceConfig, Clock.SYSTEM);\n----\n\nIf you are using Micrometer 1.10.0 or above, you can also use the DEFAULT config to achieve the same with less code:\n\n[source,java]\n----\nMeterRegistry registry = new DynatraceMeterRegistry(DynatraceConfig.DEFAULT, Clock.SYSTEM);\n----\n\nIt is also possible to change other properties by creating an instance of the `DynatraceConfig` and overwriting the respective methods.\nFor example, you can specify the exporter version, which defaults to `v2` unless a deviceId is set:\n\n[source,java]\n----\nDynatraceConfig dynatraceConfig = new DynatraceConfig() {\n @Override\n public DynatraceApiVersion apiVersion() {\n return DynatraceApiVersion.V2;\n }\n\n @Override\n @Nullable\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\nMeterRegistry registry = new DynatraceMeterRegistry(dynatraceConfig, Clock.SYSTEM);\n----\n\n`DynatraceConfig` is an interface with a set of default methods.\nSpring Boot\'s Micrometer support binds properties prefixed with `management.dynatrace.metrics.export` directly to the `DynatraceConfig`.\n\nNOTE: Property names for binding attributes from Spring Boot have changed in Spring Boot version 3.0.0. If you use a Spring Boot version before 3.0.0, use `management.metrics.export.dynatrace` instead of `management.dynatrace.metrics.export`.\n\nUsing Spring Boot Micrometer support allows configuring the Dynatrace exporter by using <<bookmark-available-properties, the available properties>>.\nWhen using Micrometer with Spring Boot, you don\'t have to instantiate the `DynatraceMeterRegistry` manually as Spring Boot will do it automatically for you.\nAll configuration options that can be set by overwriting methods can also be set via Spring Boot properties, and adding a separate MeterRegistry can lead to metrics not being exported as auto-configuration might break.\n\nTo use the Dynatrace metrics exporter for Micrometer in your Spring Boot project, it is enough to include the `runtimeOnly \'io.micrometer:micrometer-registry-dynatrace\'` dependency.\nIn this default configuration, metrics will be exported to the local OneAgent or Kubernetes operator-provided endpoint.\n\n=== Using a custom endpoint\n\nIf auto-configuration is not available on the host, both the Dynatrace Metrics API v2 endpoint and an API token have to be specified.\nThe https://docs.dynatrace.com/docs/shortlink/api-authentication[Dynatrace API token documentation] contains more information on how to create an API token.\nThe \'Ingest metrics\' (`metrics.ingest`) permission is required on the token in order to ingest metrics.\nIt is recommended to limit scope to only this permission.\n\n[source,java]\n----\nDynatraceConfig dynatraceConfig = new DynatraceConfig() {\n @Override\n public DynatraceApiVersion apiVersion() {\n // not strictly required, but makes the code more clear/explicit\n return DynatraceApiVersion.V2;\n }\n\n @Override\n public String uri() {\n // The endpoint of the Dynatrace Metrics API v2 including path, e.g.:\n // "https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest"\n String endpoint = System.getenv("ENVVAR_METRICS_INGEST_URL");\n return endpoint != null ? endpoint : DynatraceConfig.super.uri();\n }\n\n @Override\n public String apiToken() {\n // should be read from a secure source\n String token = System.getenv("ENVVAR_METRICS_INGEST_TOKEN");\n return token != null ? token : "";\n }\n\n @Override\n @Nullable\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\nMeterRegistry registry = new DynatraceMeterRegistry(dynatraceConfig, Clock.SYSTEM);\n----\n\nThese properties can also be set via Spring Boot, using property or yaml files.\nIt is also possible to reference environment variables using the Spring property placeholders (e.g.: `management.dynatrace.metrics.export.uri: ${DT_METRICS_INGEST_URL}`).\n\nNOTE: `v2` is used as the default API version unless a `deviceId` is set (<<bookmark-apiv1, see below>>).\n\n[source,yml]\n----\n# For Spring Boot 3.0.0 and above:\nmanagement.dynatrace.metrics.export:\n# For Spring Boot versions below 3.0.0, use the line below instead of the line above:\n# management.metrics.export.dynatrace:\n # for SaaS: https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest\n # for managed deployments: https://{your-domain}/e/{your-environment-id}/api/v2/metrics/ingest\n uri: YOUR_METRICS_INGEST_URL\n\n # should be read from a secure source\n api-token: YOUR_METRICS_INGEST_TOKEN\n----\n\n=== Meter metadata\n\nStarting with Micrometer 1.12.0, the Dynatrace registry v2 exports meter metadata to Dynatrace.\nCurrently supported types of metadata are *unit* (called "base unit" in Micrometer) and *description*.\nNo changes are required to start exporting Metadata to Dynatrace - upgrading to version 1.12.0 or above is enough.\nFind more information about metrics metadata in the https://docs.dynatrace.com/docs/shortlink/metric-ingestion-protocol#metadata[Dynatrace documentation].\n\nThe export of metrics metadata can be disabled by setting the `exportMeterMetadata` property on the `DynatraceConfig` (see <<bookmark-available-properties, the section on available properties>> below) to `false`.\n\n== API Versions\n\n=== API v2 [[bookmark-apiv2]]\n\nWhen the API version is configured to `v2`, the registry will send data using the https://docs.dynatrace.com/docs/shortlink/api-metrics-v2[Metrics API v2].\nIn order to maintain backwards compatibility, when a `deviceId` is set (which is required for `v1` and not used in `v2`), `v1` is used as the default.\nOtherwise, the version defaults to `v2`, and does not have to be set explicitly.\nWith no endpoint URI and token set, metrics will be exported to the local OneAgent endpoint or, if running in Kubernetes with the Dynatrace operator installed, to the endpoint provided by the operator.\nIf no auto-configuration is desired, it is possible to specify endpoint and token explicitly, in order to export metrics to that specific endpoint.\nExplicitly specifying these will overwrite auto-configuration.\n\n*Minimal configuration with Dynatrace auto-configuration*\n\nIn the minimal configuration <<bookmark-auto-configuration, shown above>> (no URI or API token), the v2 registry will attempt to retrieve the endpoint provided by the Dynatrace Kubernetes operator.\nIf the operator is not set up or does not provide this information, the exporter will attempt to send metrics to the https://docs.dynatrace.com/docs/shortlink/local-api[local OneAgent metrics ingest endpoint].\nNote that this only works if a OneAgent is running on the host and the https://docs.dynatrace.com/docs/shortlink/local-api#enable-the-oneagent-metric-api[local OneAgent Metric API] is available.\nIf the ingestion port for the local OneAgent was changed to a custom one, the full endpoint URI has to be provided for the URI property (with API token left empty).\n\n*Configuration with URI and API token*\n\nIf no auto-configuration is available or the metrics should be sent to a different endpoint (e.g. a different tenant), the Dynatrace v2 exporter can be configured with an explicit endpoint URI and an https://docs.dynatrace.com/docs/shortlink/api-authentication[API token].\nThe https://docs.dynatrace.com/docs/shortlink/api-authentication[API token] must have the https://docs.dynatrace.com/docs/dynatrace-api/basics/dynatrace-api-authentication#token-scopes["Ingest metrics"] (`metrics.ingest`) permission set.\nIt is recommended to limit scope to only this permission.\n\nThe entire Metrics v2 API endpoint URI has to be specified including its path, i.e.: with the path `/api/v2/metrics/ingest` on SaaS and managed deployments, or `/metrics/ingest` for OneAgent endpoints as mentioned in the https://docs.dynatrace.com/docs/shortlink/api-metrics-v2-post-datapoints[documentation].\n\n*Properties available in the v2 exporter* [[bookmark-available-properties]]\n\nWhen using the https://docs.dynatrace.com/docs/shortlink/api-metrics-v2[Dynatrace metrics API v2], the following properties can be set:\n\n[source,java]\n----\nDynatraceConfig dynatraceConfig = new DynatraceConfig() {\n @Override\n public DynatraceApiVersion apiVersion() {\n return DynatraceApiVersion.V2;\n }\n\n @Override\n public String uri() {\n // The endpoint of the Dynatrace Metrics API v2 including path, e.g.:\n // "https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest".\n String endpoint = System.getenv("ENVVAR_METRICS_INGEST_URL");\n return endpoint != null ? endpoint : DynatraceConfig.super.uri();\n }\n\n @Override\n public String apiToken() {\n // should be read from a secure source\n String token = System.getenv("ENVVAR_METRICS_INGEST_TOKEN");\n return token != null ? token : "";\n }\n\n @Override\n public String metricKeyPrefix() {\n // will be prepended to all metric keys\n return "your.desired.prefix";\n }\n\n @Override\n public boolean enrichWithDynatraceMetadata() {\n return true;\n }\n\n @Override\n public Map<String, String> defaultDimensions() {\n // create and return a map containing the desired key-value pairs.\n Map<String, String> dims = new HashMap<>();\n dims.put("dimensionKey", "dimensionValue");\n return dims;\n }\n\n // Only available in Micrometer 1.9.0 and above\n @Override\n public boolean useDynatraceSummaryInstruments() {\n return false;\n }\n\n // Only available in Micrometer 1.12.0 and above\n @Override\n public boolean exportMeterMetadata() {\n return true;\n }\n\n @Override\n @Nullable\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\n----\n\nThese properties can also be set in Spring Boot configuration files:\n\n[source,yml]\n----\nmanagement.dynatrace.metrics.export:\n # Required only if not using the OneAgent endpoint\n # For SaaS: https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest\n # For managed deployments: https://{your-domain}/e/{your-environment-id}/api/v2/metrics/ingest\n uri: YOUR_METRICS_INGEST_URL\n\n # should be read from a secure source\n api-token: YOUR_METRICS_INGEST_TOKEN\n\n # These properties can only be used with the v2 exporter.\n v2:\n # Sets a prefix that is prepended to each exported metric key.\n metric-key-prefix: my.metric.key.prefix\n\n # If set to true and a local OneAgent or operator is running, retrieves metadata\n # and adds it as additional dimensions to all data points (default: true)\n enrich-with-dynatrace-metadata: true\n\n # Sets an arbitrary number of key-value pairs as default dimensions.\n # Micrometer tags will overwrite these dimensions, if they have the same key.\n # Each exported metric will contain these dimensions.\n default-dimensions:\n key1: "value1"\n key2: "value2"\n\n # (since 1.9.0) Whether or not to use the Dynatrace-specific summary instruments. (default: true)\n # This should only be disabled if problems with existing instrumentation are discovered after upgrading to 1.9.0.\n # Set to false, this will restore the previous (1.8.x) behavior for Timers and DistributionSummaries.\n use-dynatrace-summary-instruments: true\n\n # (since 1.12.0) Determines whether meter metadata (unit, description) should be exported.\n export-meter-metadata: true\n\n # The export interval in which metrics are sent to Dynatrace (default: 60s).\n step: 60s\n----\n\nFor more information about the metadata picked up by the Dynatrace metadata enrichment feature, see https://docs.dynatrace.com/docs/shortlink/enrichment-files[the Dynatrace documentation].\n\nIn Micrometer 1.9.0, Dynatrace-specific summary instruments (`DynatraceTimer` and `DynatraceDistributionSummary`) were introduced.\nThese specialized instruments are tailored to the Dynatrace metrics ingest, and prevent the creation of invalid metrics.\nThey are available from version 1.9.0 and are used as a drop-in replacement by default.\nNo action is needed from users upgrading to 1.9.0. If there is a discrepancy in the observed metrics, it is possible to return to the previous behavior by setting the `useDynatraceSummaryInstruments` toggle to `false`.\n\n=== API v1 (Legacy) [[bookmark-apiv1]]\n\nWhen the apiVersion is configured to `v1`, the registry will send data using the https://docs.dynatrace.com/docs/shortlink/api-custom-metrics[Dynatrace Timeseries API v1 for custom metrics].\nIf a `deviceId` is specified, it will default to `v1` for backwards compatibility with earlier setups.\nThe `device-id` property is required for `v1` and not used in `v2`.\nExisting setups will continue to work when updating to newer versions of Micrometer.\nThe reported metrics will be assigned to https://docs.dynatrace.com/docs/shortlink/api-custom-device-report-metric[custom devices] in Dynatrace.\n\nFor the v1 API, do not specify the ingest path, but only the base URL of your environment, e.g.: `uri: https://{your-environment-id}.live.dynatrace.com`\n\n[source,java]\n----\nDynatraceConfig dynatraceConfig = new DynatraceConfig() {\n @Override\n public String uri() {\n // The Dynatrace environment URI without any path, e.g.:\n // https://{your-environment-id}.live.dynatrace.com\n return MY_DYNATRACE_URI;\n }\n\n @Override\n public String apiToken() {\n // should be read from a secure source\n return MY_TOKEN;\n }\n\n @Override\n public String deviceId() {\n return MY_DEVICE_ID;\n }\n\n @Override\n @Nullable\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\nMeterRegistry registry = new DynatraceMeterRegistry(dynatraceConfig, Clock.SYSTEM);\n----\n\n[source,yml]\n----\nmanagement.dynatrace.metrics.export:\n # For v1 export, do not append a path to the endpoint URL, e.g.:\n # For SaaS: https://{your-environment-id}.live.dynatrace.com\n # For managed deployments: https://{your-domain}/e/{your-environment-id}\n uri: https://{your-environment-id}.live.dynatrace.com\n\n # should be read from a secure source\n api-token: MY_TOKEN\n\n # When setting the device id, metrics will be exported to the v1 timeseries endpoint\n # Using just device-id (without the v1 prefix) is deprecated, but will work to maintain backwards compatibility.\n v1:\n device-id: sample\n\n # To disable Dynatrace publishing, e.g. in a local development profile, use:\n # enabled: false\n\n # The interval at which metrics are sent to Dynatrace. The default is 1 minute.\n step: 1m\n----\n'},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Elastic\n:toc:\n:sectnums:\n:system: elastic\n\nElasticsearch is an open source search and analytics platform. Metrics stored in Elasticsearch can be visualized in Kibana.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThe following example configures an ElasticSearch instance:\n\n[source,java]\n----\nElasticConfig elasticConfig = new ElasticConfig() {\n @Override\n @Nullable\n public String get(String k) {\n return null;\n }\n};\nMeterRegistry registry = new ElasticMeterRegistry(elasticConfig, Clock.SYSTEM);\n----\n\n`ElasticConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.elastic` directly to the `ElasticConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.elastic:\n # You will probably want disable Elastic publishing in a local development profile.\n enabled: true\n\n # The interval at which metrics are sent to Elastic. The default is 1 minute.\n step: 1m\n\n # The index to store metrics in, defaults to \"micrometer-metrics\"\n index: micrometer-metrics\n----\n\n== Elastic APM agent integration\n\nIf you are using the Elastic APM agent, it can collect metrics from Micrometer `MeterRegistry` instances automatically. You can use the `SimpleMeterRegistry` if you only want metrics collected by the Elastic APM agent and not shipped anywhere else. See the https://www.elastic.co/guide/en/apm/agent/java/current/metrics.html#metrics-micrometer[Elastic docs] for more details.\n"},function(e,t,n){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Ganglia\n:toc:\n:sectnums:\n:system: ganglia\n\nGanglia is an aging hierarchical metrics system which enjoyed wide popularity in Linux system monitoring and is still in place in many organizations. It originated in the early 2000s at the University of California, Berkeley.\n\nNOTE: The `micrometer-registry-ganglia` module uses the https://github.com/ganglia/gmetric4j[gmetric4j] library, which contains classes generated by the LGPL licensed https://sourceforge.net/projects/remotetea/[remotetea project].\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThe following example configures a Ganglia instance:\n\n[source,java]\n----\nGangliaConfig gangliaConfig = new GangliaConfig() {\n @Override\n public String host() {\n return \"mygraphitehost\";\n }\n\n @Override\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\n\nMeterRegistry registry = new GangliaMeterRegistry(gangliaConfig, Clock.SYSTEM);\n----\n\nMicrometer uses Dropwizard Metrics as the underlying instrumentation library when recording metrics destined for Ganglia. `GangliaConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.ganglia` directly to the `GangliaConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.ganglia:\n # The location of your Ganglia server\n host: mygraphitehost\n\n # You will probably want to conditionally disable Ganglia publishing in local development.\n enabled: true\n\n # The interval at which metrics are sent to Ganglia. The default is 1 minute.\n step: 1m\n----\n\n== Hierarchical name mapping\n\nMicrometer provides a `HierarchicalNameMapper` interface that governs how a dimensional meter ID is mapped to flat hierarchical names.\n\nThe default (`HierarchicalNameMapper.DEFAULT`) sorts tags alphabetically by key and appends tag key/value pairs to the base meter name with '.' -- for example, `http_server_requests.method.GET.response.200`. The name and tag keys have the registry's naming convention applied to them first.\n\nIf there is something special about your naming scheme that you need to honor, you can provide your own `HierarchicalNameMapper` implementation. The most common cause of a custom mapper comes from a need to prefix something to the front of every metric (generally something like `app.<name>.http_server_requests.method.GET.response.200`).\n\n== Graphing\n\nThis section serves as a quick start to rendering useful representations in Ganglia for metrics originating in Micrometer.\n\n=== Counters\n\nGanglia counters measure mean throughput and one-, five-, and fifteen-minute exponentially-weighted moving average throughputs.\n\n.A Ganglia rendered graph of the random walk counter.\nimage::"+n(107)+"[Ganglia-rendered counter]\n"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"80865a7f65d47863b3b264a9ed09629a.png"},function(e,t,n){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Graphite\n:toc:\n:sectnums:\n:system: graphite\n\nGraphite is one of the most popular current hierarchical metrics systems backed by a fixed-size database, similar in design and purpose to RRDtool. It originated at Orbitz in 2006 and was open sourced in 2008.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.micrometer:micrometer-registry-{system}:latest.release\'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThe following example configures a Graphite instance:\n\n[source,java]\n----\nGraphiteConfig graphiteConfig = new GraphiteConfig() {\n @Override\n public String host() {\n return "mygraphitehost";\n }\n\n @Override\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\n\nMeterRegistry registry = new GraphiteMeterRegistry(graphiteConfig, Clock.SYSTEM, HierarchicalNameMapper.DEFAULT);\n----\n\nMicrometer uses Dropwizard Metrics as the underlying instrumentation library when recording metrics destined for Graphite. `GraphiteConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer\'s Spring Boot support binds properties that are prefixed with `management.metrics.export.graphite` directly to the `GraphiteConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.graphite:\n # The location of your Graphite server\n host: mygraphitehost\n\n # You will probably want to conditionally disable Graphite publishing in local development.\n enabled: true\n\n # The interval at which metrics are sent to Graphite. The default is 1 minute.\n step: 1m\n----\n\n== Graphite Tag Support\n\nAs of Micrometer version 1.4.0, Micrometer supports exporting Graphite metrics by using tags instead of the traditional hierarchical format. By default, metrics are exported by using the tag format, unless any `tagsAsPrefix` values are configured.\nhttps://graphite.readthedocs.io/en/latest/tags.html[Tag support] was added to Graphite in the 1.1.0 Graphite release.\nIf you wish to revert to the traditional hierarchical format, ensure that the `graphiteTagsEnabled` config value is set to `false`.\nThe following documentation sections on hierarchical name mapping and metrics prefixing are only applicable if tag support is disabled.\n\n== Hierarchical name mapping\n\nMicrometer provides a `HierarchicalNameMapper` interface that governs how a dimensional meter ID is mapped to flat hierarchical names.\n\nThe default (`HierarchicalNameMapper.DEFAULT`) sorts tags alphabetically by key and appends tag key/value pairs to the base meter name with \'.\' -- for example, `http_server_requests.method.GET.response.200`. The name and tag keys have the registry\'s naming convention applied to them first.\n\nIf there is something special about your naming scheme that you need to honor, you can provide your own `HierarchicalNameMapper` implementation. The most common cause of a custom mapper comes from a need to prefix something to the front of every metric (generally something like `app.<name>.http_server_requests.method.GET.response.200`).\n\n== Prefixing your metrics\n\nTo add a prefix to all metrics that go to graphite, use the `GraphiteConfig#tagsAsPrefix` configuration option. This option applies the tag value of a set of common tags as a prefix. For example, if `tagsAsPrefix` contains `application`, and a meter named `myTimer` is created with a tag of `application=APPNAME`, it appears in Graphite as `APPNAME.myTimer`.\n\nGenerally, when you use `tagsAsPrefix`, you should add common tags to the registry so that the tags are present on all meters that belong to that registry:\n\n[source,java]\n----\n@Bean\npublic MeterRegistryCustomizer<MeterRegistry> commonTags() {\n return r -> r.config().commonTags("application", "APPNAME");\n}\n----\n\nWe do it this way because, generally, a tag prefix in Graphite is correlated to a common tag elsewhere. Prefixes tend to be something like app name or host. By applying those values as common tags, you make your metrics more portable (that is, if you ever switch to a dimensional monitoring system, you are set).\n\nYou can use this when the order of the prefix matters. Micrometer always sorts tags, but the order of tag keys in `tagsAsPrefix` is preserved, so adding `host` and `application` to `tagsAsPrefix` results in a prefixed metric, such as `HOST.APP.myCounter`.\n\nTo meet your specific naming needs, you can also provide a custom hierarchical name mapper when creating `GraphiteMeterRegistry`, as follows:\n\n[source,java]\n----\nGraphiteMeterRegistry r = new GraphiteMeterRegistry(\n GraphiteConfig.DEFAULT,\n Clock.SYSTEM,\n (id, convention) -> "prefix." + HierarchicalNameMapper.DEFAULT.toHierarchicalName(id, convention));\n----\n\nNOTE: If you use a custom `HierarchicalNameMapper`, `tagsAsPrefix` is ignored.\n\n== Further Customizing the `GraphiteReporter`\n\nWe give you the option to configure `GraphiteReporter` yourself if you need further customization. To do so, use this constructor and provide your own `GraphiteReporter`:\n\n[source,java]\n----\nGraphiteMeterRegistry(GraphiteConfig config, Clock clock, HierarchicalNameMapper nameMapper,\n MetricRegistry metricRegistry, GraphiteReporter reporter)\n----\n\n== Graphing\n\nThis section serves as a quick start to rendering useful representations in Graphite for metrics originating in Micrometer.\n\n=== Counters\n\nGraphite counters measure mean throughput and one-, five-, and fifteen-minute exponentially-weighted moving average throughputs.\n\n.A Graphite rendered graph of the random walk counter.\nimage::'+n(109)+"[Graphite-rendered counter]\n"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"cd6b0314737fa94a81e42689517fd7fb.png"},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n== Hierarchical name mapping\n\nMicrometer provides a `HierarchicalNameMapper` interface that governs how a dimensional meter ID is mapped to flat hierarchical names.\n\nThe default (`HierarchicalNameMapper.DEFAULT`) sorts tags alphabetically by key and appends tag key/value pairs to the base meter name with '.' -- for example, `http_server_requests.method.GET.response.200`. The name and tag keys have the registry's naming convention applied to them first.\n\nIf there is something special about your naming scheme that you need to honor, you can provide your own `HierarchicalNameMapper` implementation. The most common cause of a custom mapper comes from a need to prefix something to the front of every metric (generally something like `app.<name>.http_server_requests.method.GET.response.200`).\n"},function(e,t,n){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Humio\n:toc:\n:sectnums:\n:system: humio\n\nHumio is a dimensional time-series SaaS with built-in dashboarding.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThe following example configures a Humio instance:\n\n[source,java]\n----\nHumioConfig humioConfig = new HumioConfig() {\n @Override\n public String apiToken() {\n return MY_TOKEN;\n }\n\n @Override\n @Nullable\n public String get(String k) {\n return null;\n }\n};\nMeterRegistry registry = new HumioMeterRegistry(humioConfig, Clock.SYSTEM);\n----\n\n`HumioConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.humio` directly to the `HumioConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.humio:\n api-token: YOURKEY\n\n # You will probably want disable Humio publishing in a local development profile.\n enabled: true\n\n # The interval at which metrics are sent to Humio. The default is 1 minute.\n step: 1m\n\n # The cluster Micrometer will send metrics to. The default is \"https://cloud.humio.com\"\n uri: https://myhumiohost\n----\n\n== Graphing\n\nThis section serves as a quick start to rendering useful representations in Humio for metrics originating in Micrometer.\n\n=== Timers\n\nThe Humio implementation of `Timer` produces four fields in Humio:\n\n* `sum`: Rate of calls per second.\n* `count`: Rate of total time per second.\n* `max`: A sliding window maximum amount recorded.\n* `avg`: A non-aggregable average for only this set of tag values.\n\nThe following query constructs a dimensionally aggregable average latency per URI:\n\n[source, text]\n----\nname = http_server_requests\n| timechart(uri, function=max(avg))\n----\n\n.Timer over a simulated service.\nimage::"+n(112)+"[Humio-rendered timer]\n"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"6584fae5a94c66dd29f69056b031d7e3.png"},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Influx\n:toc:\n:sectnums:\n:system: influx\n\nThe InfluxData suite of tools supports real-time stream processing and storage of time-series data. It supports downsampling, automatically expiring and deleting unwanted data, as well as backup and restore.\n\nThe InfluxMeterRegistry supports the 1.x InfluxDB API as well as the v2 API.\n\n== Configuring\n\nMicrometer supports shipping metrics to InfluxDB directly or through Telegraf through the StatsD registry.\n\n=== Direct to InfluxDB\n\nThe following example adds the required library in Gradle:\n\n[source,groovy]\n----\nimplementation 'io.micrometer:micrometer-registry-influx:latest.release'\n----\n\nThe following example adds the required library in Maven:\n\n[source,xml]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-influx</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\nMetrics are rate-aggregated and pushed to InfluxDB on a periodic interval. Rate aggregation performed by the registry yields datasets that are quite similar to those produced by Telegraf. The following example configures a meter registry for InfluxDB:\n\n.InfluxDB 1.x configuration example\n[source, java]\n----\nInfluxConfig config = new InfluxConfig() {\n @Override\n public Duration step() {\n return Duration.ofSeconds(10);\n }\n\n @Override\n public String db() {\n return \"mydb\";\n }\n\n @Override\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\nMeterRegistry registry = new InfluxMeterRegistry(config, Clock.SYSTEM);\n----\n\nTo ship metrics to InfluxDB 2.x, make sure to configure the `org` and `bucket` to which to write the metrics, as well as the authentication `token`.\n\n.InfluxDB v2 configuration example\n[source, java]\n----\nInfluxConfig config = new InfluxConfig() {\n\n @Override\n public String org() {\n return \"myorg\";\n }\n\n @Override\n public String bucket() {\n return \"app-metrics\";\n }\n\n @Override\n public String token() {\n return \"auth_token_here\"; // FIXME: This should be securely bound rather than hard-coded, of course.\n }\n\n @Override\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\nMeterRegistry registry = new InfluxMeterRegistry(config, Clock.SYSTEM);\n----\n\n`InfluxConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.influx` directly to the `InfluxConfig`:\n\n[source, yaml]\n----\nmanagement.metrics.export.influx:\n api-version: v2 # API version of InfluxDB to use. Defaults to 'v1' unless an org is configured. If an org is configured, defaults to 'v2'.\n auto-create-db: true # Whether to create the InfluxDB database if it does not exist before attempting to publish metrics to it. InfluxDB v1 only. (Default: true)\n batch-size: 10000 # Number of measurements per request to use for this backend. If more measurements are found, then multiple requests will be made. (Default: 10000)\n bucket: mybucket # Bucket for metrics. Use either the bucket name or ID. Defaults to the value of the db property if not set. InfluxDB v2 only.\n compressed: true # Whether to enable GZIP compression of metrics batches published to InfluxDB. (Default: true)\n connect-timeout: 1s # Connection timeout for requests to this backend. (Default: 1s)\n consistency: one # Write consistency for each point. (Default: one)\n db: mydb # Database to send metrics to. InfluxDB v1 only. (Default: mydb)\n enabled: true # Whether exporting of metrics to this backend is enabled. (Default: true)\n num-threads: 2 # Number of threads to use with the metrics publishing scheduler. (Default: 2)\n org: myorg # Org to write metrics to. InfluxDB v2 only.\n password: mysecret # Login password of the InfluxDB server. InfluxDB v1 only.\n read-timeout: 10s # Read timeout for requests to this backend. (Default: 10s)\n retention-policy: my_rp # Retention policy to use (InfluxDB writes to the DEFAULT retention policy if one is not specified). InfluxDB v1 only.\n step: 1m # Step size (i.e. reporting frequency) to use. (Default: 1m)\n token: AUTH_TOKEN_HERE # Authentication token to use with calls to the InfluxDB backend. For InfluxDB v1, the Bearer scheme is used. For v2, the Token scheme is used.\n uri: http://localhost:8086 # URI of the InfluxDB server. (Default: http://localhost:8086)\n user-name: myusername # Login user of the InfluxDB server. InfluxDB v1 only.\n----\n\n=== Through Telegraf\n\nTelegraf is a StatsD agent that expects a modified flavor of the StatsD line protocol.\n\nThe following listing adds the relevant library in Gradle:\n\n[source,groovy]\n----\nimplementation 'io.micrometer:micrometer-registry-statsd:latest.release'\n----\n\nThe following listing adds the relevant library in Maven:\n\n[source,xml]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-statsd</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\nMetrics are shipped immediately over UDP to Telegraf by using Telegraf's flavor of the StatsD line protocol.\n\n[source,java]\n----\nStatsdConfig config = new StatsdConfig() {\n @Override\n public String get(String k) {\n return null;\n }\n\n @Override\n public StatsdFlavor flavor() {\n return StatsdFlavor.Telegraf;\n }\n};\n\nMeterRegistry registry = new StatsdMeterRegistry(config, Clock.SYSTEM);\n----\n"},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n"},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Instana\nFabian Lange <fabian.lange@instana.com>\n:toc:\n:sectnums:\n:system: instana\n\nInstana is an automatic application performance management and infrastructure monitoring system.\n\n== Installation and Configuration\n\nInstana automatically detects and reports all metrics without the need of any additional dependency or configuration.\nIt does so by detecting all instances of `io.micrometer.core.instrument.MeterRegistry` and collecting all registered `io.micrometer.core.instrument.Meter` instances from them.\n\nYou can run the Instana agent alongside your application by using Micrometer, and the Instana agent automatically monitors it.\n\n== Supported Metrics\n\n* **Timer**: The total time of recorded events, scaled to milliseconds.\n* **Counter**: The cumulative count since this counter was created.\n* **Gauge**: The current value.\n* **DistributionSummary**: The total number of all recorded events.\n* **LongTaskTimer**: The current number of tasks being executed.\n* **FunctionCounter**: The cumulative count since this counter was created.\n* **FunctionTimer**: The total time of all occurrences of the timed event.\n* **TimeGauge**: The current value, scaled to the appropriate base unit.\n\nThe metrics show up on the Java Virtual Machine dashboard in Instana. You can configure alerting based on these metrics.\n"},function(e,t,n){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer JMX\n:toc:\n:sectnums:\n:system: jmx\n\nMicrometer provides a hierarchical mapping to JMX, primarily as a cheap and portable way to view metrics locally. Where JMX exporting is found in production, the same metrics are generally exported to another, more purpose-fit monitoring system.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\nMicrometer also sometimes scrapes data from JMX beans for use in reporting metrics. This registry implementation is not needed for these uses. Rather, this module is strictly used to _export_ data to JMX.\n\n== Hierarchical name mapping\n\nMicrometer provides a `HierarchicalNameMapper` interface that governs how a dimensional meter ID is mapped to flat hierarchical names.\n\nThe default (`HierarchicalNameMapper.DEFAULT`) sorts tags alphabetically by key and appends tag key/value pairs to the base meter name with '.' -- for example, `http_server_requests.method.GET.response.200`. The name and tag keys have the registry's naming convention applied to them first.\n\nIf there is something special about your naming scheme that you need to honor, you can provide your own `HierarchicalNameMapper` implementation. The most common cause of a custom mapper comes from a need to prefix something to the front of every metric (generally something like `app.<name>.http_server_requests.method.GET.response.200`).\n\n== Counters\n\nJMX counters measure mean throughput and one-, five-, and fifteen-minute exponentially-weighted moving average throughputs.\n\n.The JMX rendered values of the random walk counter.\nimage::"+n(117)+"[JMX-rendered counter]\n"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"8077bd6e31e279e04a38e631b2d61a1e.png"},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer KairosDB\n:toc:\n:sectnums:\n:system: kairos\n\nKairosDB is a dimensional time-series database built on top of Cassandra. Charting can be accomplished in Grafana by using a link:https://docs.grafana.org/v4.0/datasources/kairosdb/[Kairos datasource].\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThe following example configures KairosDB:\n\n[source,java]\n----\nKairosConfig kairosConfig = new KairosConfig() {\n @Override\n @Nullable\n public String get(String k) {\n return null;\n }\n};\nMeterRegistry registry = new KairosMeterRegistry(kairosConfig, Clock.SYSTEM);\n----\n\n`KairosConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.kairos` directly to the `KairosConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.kairos:\n # You will probably want disable Kairos publishing in a local development profile.\n enabled: true\n\n # The interval at which metrics are sent to Kairos. The default is 1 minute.\n step: 1m\n\n # Authentication may be required, depending on how you have Kairos configured\n user-name: MYUSER\n password: MYPASSWORD\n----\n"},function(e,t,n){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer New Relic\n:toc:\n:sectnums:\n:system: new-relic\n\nNew Relic offers a dimensional monitoring system product called Insights. It includes a full UI and a query language called NRQL. New Relic Insights operates on a push model. Some features of NRQL assume that Insights receives a distinct event payload for every timing, count, and so on. Micrometer instead ships aggregates at a prescribed interval, letting your app's throughput scale without concern for event propagation to Insights becoming a bottleneck.\n\nNOTE: New Relic provides its own Micrometer `MeterRegistry` implementation based on dimensional metrics.\nIt intends to supersede Micrometer's `NewRelicMeterRegistry` (which uses custom events in New Relic), because New Relic's dimensional metrics are a better fit for metrics than custom events.\nYou can find more details in https://github.com/newrelic/micrometer-registry-newrelic[its GitHub repository].\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThe following example configures New Relic:\n\n[source,java]\n----\nNewRelicConfig newRelicConfig = new NewRelicConfig() {\n @Override\n public String accountId() {\n return \"MYACCOUNT\";\n }\n\n @Override\n public String apiKey() {\n return \"MY_INSIGHTS_API_KEY\";\n }\n\n @Override\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\n\nMeterRegistry registry = new NewRelicMeterRegistry(newRelicConfig, Clock.SYSTEM);\n----\n\nThere are two distinct sources of API keys in New Relic.\n\n`NewRelicConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.newrelic` directly to the `NewRelicConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.newrelic:\n account-id: MYACCOUNT\n api-key: MY_INSIGHTS_API_KEY\n\n # The interval at which metrics are sent to New Relic. See Duration.parse for the expected format.\n # The default is 1 minute.\n step: 1m\n----\n\n== Graphing\n\nThis section serves as a quick start to rendering useful representations in New Relic for metrics originating in Micrometer. See the https://docs.newrelic.com/docs/insights/nrql-new-relic-query-language/using-nrql/introduction-nrql[New Relic NRQL docs] for a far more complete reference of what is possible in New Relic.\n\n=== Timers\n\nAt each publishing interval, the New Relic `Timer` produces a single event with the timer's name and several attributes:\n\n* `avg`: A mean latency for the publishing interval.\n* `count`: Throughput per second over the publishing interval.\n* `totalTime`: Total time per second over the publishing interval (used with `count`) to create aggregable means.\n\nAdditionally, if any percentiles or SLO buckets are defined on the timer, additional events are produced:\n\n* `${name}.percentiles`: Micrometer calculated percentiles for the publishing interval. One event is produced for each percentile, with a tag of `phi` in the range of [0,1].\n* `${name}.histogram`: One event is produced for each SLO boundary with a tag of 'le', indicating that it represents a cumulative count of events less than or equal to SLO boundaries over the publishing interval.\n\nTo generate an aggregable view of latency in New Relic, divide `totalTime` by `count`:\n\n[source,sql]\n----\nSELECT sum(totalTime)/sum(count) as 'Average Latency', max(max) as 'Max' FROM timer since 30 minutes ago TIMESERIES auto\n----\n\n.Timer latency.\nimage::"+n(120)+"[New Relic-rendered timer]\n\nTo generate a throughput chart:\n\n[source,sql]\n----\nSELECT average(count) as 'Average Throughput' FROM timer since 30 minutes ago TIMESERIES auto\n----\n\n.Timer throughput.\nimage::"+n(121)+"[New Relic-rendered timer throughput]\n\nTo generate a plot of client-side percentiles:\n\n[source,sql]\n----\nSELECT latest(value) from timerPercentile FACET phi since 30 minutes ago TIMESERIES auto\n----\n\n.Timer Percentiles.\nimage::"+n(122)+"[New Relic-rendered percentiles]\n\nNote how these percentiles are _not aggregable_. We have selected the `latest(value)` function to display this chart (it isn't correct to `average(value)` on a percentile value). The more dimensions you add to a timer, the less useful these values become.\n\nFinally, if you define SLO boundaries with the fluent builder for `Timer`, you can view throughput below certain SLO boundaries. In this example, we set SLO boundaries at 275 (yellow), 300 (red), and 500 (blue) milliseconds for a simulated `Timer` that is recording samples normally distributed around 250 ms. These counts represent the rate/second of samples less than or equal to each SLO boundary.\n\n[source,sql]\n----\nSELECT sum(value) from timerHistogram FACET le since 30 minutes ago TIMESERIES auto\n----\n\n.Timer SLO boundaries.\nimage::"+n(123)+"[New Relic-rendered SLO boundaries]\n\nWhere the lines converge at various points, it is evident that no sample exceeded the 275 ms SLO boundary.\n"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"4d25b7833c033d6e2380ec4ecc988d66.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"02f1215f99df0a7a03ac1d5986ace874.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"03797aa9d08a216ed90efab2b59e0114.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"e1fdf4994baf8640b183e76694d53390.png"},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer OTLP\n:toc:\n:sectnums:\n:system: otlp\n\nOpenTelemetry is a CNCF incubating project for providing standards for telemetry data. OpenTelemetry protocol (OTLP) is a vendor neutral protocol that can be used to send data to various backends which support it. You can read the corresponding docs on how the metrics are ingested and can be visualized in the respective vendor docs.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\nThe following example configures an OTLP registry:\n\n[source,java]\n----\nOtlpConfig otlpConfig = new OtlpConfig() {\n @Override\n public String get(final String key) {\n return null;\n }\n};\n\nMeterRegistry registry = new OtlpMeterRegistry(otlpConfig, Clock.SYSTEM);\n----\n\n`OtlpConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source (e.g.: a simple `Map` can work), you can override the default configuration through properties. For example, Micrometer's Spring Boot support binds properties prefixed with `management.otlp.metrics.export` directly to the `OtlpConfig`:\n\n[source, yaml]\n----\nmanagement:\n otlp:\n metrics:\n export:\n # Supported configs\n url: \"https://otlp.example.com:4318/v1/metrics\"\n aggregationTemporality: \"cumulative\"\n headers:\n header1: value1\n resourceAttributes:\n key1: value1\n----\n\n1. `url` - The URL to which data will be reported. Defaults to `http://localhost:4318/v1/metrics`\n2. `aggregationTemporality` - https://opentelemetry.io/docs/specs/otel/metrics/data-model/#temporality[Aggregation temporality, window=_blank] determines how the additive quantities are expressed, in relation to time. The supported values are `cumulative` or `delta`. Defaults to `cumulative`. +\n*Note*: This config was introduced in version 1.11.0.\n3. `headers` - Additional headers to send with exported metrics. This can be used for authorization headers. By default, headers will be loaded from the config. If that is not set, they can be taken from the environment variables `OTEL_EXPORTER_OTLP_HEADERS` and `OTEL_EXPORTER_OTLP_METRICS_HEADERS`. If a header is set in both the environmental variables, the header in the latter will override the former.\n4. `resourceAttributes` - https://opentelemetry.io/docs/specs/otel/resource/semantic_conventions/#service[Resource attributes, window=_blank] that will be used for all metrics published. By default, Micrometer adds the following resource attributes:\n\n[%autowidth]\n|===\n|Key | Default value\n\n|telemetry.sdk.name\n|io.micrometer\n\n|telemetry.sdk.language\n|java\n\n|telemetry.sdk.version\n|<micrometer-core-version> (e.g.: 1.11.0)\n\n|service.name\n|unknown_service\n|===\n\nIf this config is empty, then resource attributes will be loaded from the environmental variable `OTEL_RESOURCE_ATTRIBUTES`. `service.name` can be overridden by the environmental variable `OTEL_SERVICE_NAME` and this takes precedence over other configs.\n\n== Supported metrics\nhttps://opentelemetry.io/docs/specs/otel/metrics/data-model/#metric-points[Metric points, window=_blank] define the different data points that are supported in OTLP. Micrometer supports exporting the below data points in OTLP format,\n\n1. https://opentelemetry.io/docs/specs/otel/metrics/data-model/#sums[Sums, window=_blank]\n2. https://opentelemetry.io/docs/specs/otel/metrics/data-model/#gauge[Gauge, window=_blank]\n3. https://opentelemetry.io/docs/specs/otel/metrics/data-model/#histogram[Histogram, window=_blank]\n4. https://opentelemetry.io/docs/specs/otel/metrics/data-model/#summary-legacy[Summary, window=_blank]\n\nThe below table maps OTLP data points and the Micrometer meters:\n\n[%autowidth]\n|===\n|OTLP data point | Micrometer meter type\n\n|Sums\n|Counter, FunctionCounter\n\n|Gauge\n|Gauge, TimeGauge, MultiGauge\n\n|Histogram\n|Timer, DistributionSummary, LongTaskTimer, FunctionTimer (only sum and count are set)\n\n|Summary\n|Timer, DistributionSummary, LongTaskTimer\n|===\n\n*Note*:\n\n1. `max` on Histogram data point is only supported in delta aggregation temporality. This is because the values represented by cumulative min and max will stabilize as more events are recorded and are less useful when recorded over application's lifecycle.\n2. Currently, Micrometer only exports metadata for type `Meter` to OTLP.\n\n== Histograms and Percentiles\nMicrometer `Timer` and `DistributionSummary` support configuring link:/docs/concepts#_histograms_and_percentiles[client-side percentiles and percentile histograms]. OTLP specification terms Summary data point (client-side percentiles) as legacy and not recommended for new applications. Summary data point also cannot have min/max associated with it. Due to these reasons Micrometer prefers exporting Timers and DistributionSummary as Histogram data point. By default, a Timer/DistributionSummary without any additional percentile/histogram config will be exported as Histogram data point. However, by configuring the timer to generate only client-side percentiles using `publishPercentiles` this can be changed to a Summary data point exporting pre-calculated percentiles. When both `publishPercentiles` and (`publishPercentileHistogram` or `serviceLevelObjectives`) are configured, Histogram data point is preferred and pre-calculated percentiles *will not* be generated. See the below table on which data point will be used with different configurations:\n\n[%autowidth]\n|===\n|Configuration | OTLP data point\n\n| publishPercentiles\n| Summary\n\n| publishPercentileHistogram\n| Histogram\n\n| serviceLevelObjectives\n| Histogram\n\n| publishPercentiles and (publishPercentileHistogram/serviceLevelObjectives)\n| Histogram\n|===\n\nAlternatively, if you are using Spring Boot, you can use the https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.metrics.customizing.per-meter-properties[per-meter properties, window=_blank] to configure this behaviour.\n\nIf you want to generate Histogram data point for a Timer with name `test.timer` and default buckets generated by Micrometer, use:\n\n[source,properties]\n----\nmanagement.metrics.distribution.percentiles-histogram.test.timer=true\n----\n\nand for buckets with customized SLO, use:\n\n[source,properties]\n----\nmanagement.metrics.distribution.slo.test.timer=10.0,100.0,500.0,1000.0\n----\n\nAlternatively, if you want to generate Summary data point for a timer with name `test.timer` and 90th and 99th percentiles, you can use the below config:\n\n[source,properties]\n----\nmanagement.metrics.distribution.percentiles.test.timer=0.9,0.99\n----\n"},function(e,t,n){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Prometheus\n:toc:\n:sectnums:\n:system: prometheus\n\nPrometheus is a dimensional time series database with a built-in UI, a custom query language, and math operations.\nPrometheus is designed to operate on a pull model, periodically scraping metrics from application instances, based on service discovery.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nPrometheus expects to scrape or poll individual application instances for metrics.\nIn addition to creating a Prometheus registry, you also need to expose an HTTP endpoint to Prometheus' scraper.\nIn a Spring Boot application, a https://docs.spring.io/spring-boot/docs/current/actuator-api/htmlsingle/#prometheus[Prometheus actuator endpoint] is auto-configured in the presence of Spring Boot Actuator.\nOtherwise, you can use any JVM-based HTTP server implementation to expose scrape data to Prometheus.\n\nThe following example uses the JDK's `com.sun.net.httpserver.HttpServer` to expose a scrape endpoint:\n\n[source,java]\n----\nPrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);\n\ntry {\n HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);\n server.createContext(\"/prometheus\", httpExchange -> {\n String response = prometheusRegistry.scrape(); <1>\n httpExchange.sendResponseHeaders(200, response.getBytes().length);\n try (OutputStream os = httpExchange.getResponseBody()) {\n os.write(response.getBytes());\n }\n });\n\n new Thread(server::start).start();\n} catch (IOException e) {\n throw new RuntimeException(e);\n}\n----\n<1> The `PrometheusMeterRegistry` has a `scrape()` function that knows how to supply the String data necessary for the scrape. All you have to do is wire it to an endpoint.\n\nYou can alternatively use `io.prometheus.client.exporter.HTTPServer` that you can find in `io.prometheus:simpleclient_httpserver`:\n[source,java]\n----\nPrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);\n// you can set the daemon flag to false if you want the server to block\nnew HTTPServer(new InetSocketAddress(8080), prometheusRegistry.getPrometheusRegistry(), true);\n----\n\nAnother alternative can be `io.prometheus.client.exporter.MetricsServlet` that you can find in `io.prometheus:simpleclient_servlet` in case your app is running in a servlet container (e.g.: Tomcat):\n[source,java]\n----\nPrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);\nHttpServlet metricsServlet = new MetricsServlet(prometheusRegistry.getPrometheusRegistry());\n----\n\n=== Scrape format\n\nBy default, the https://prometheus.io/docs/instrumenting/exposition_formats/#text-based-format[Prometheus text format] is returned from the `PrometheusMeterRegistry` `scrape()` method.\n\nThe https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md[OpenMetrics] format can also be produced.\nTo specify the format to be returned, you can pass a content type to the `scrape` method.\nFor example, to get the OpenMetrics 1.0.0 format scrape, you could use the Prometheus Java client constant for it, as follows:\n\n[source,java]\n----\nString openMetricsScrape = registry.scrape(TextFormat.CONTENT_TYPE_OPENMETRICS_100);\n----\n\nIn Spring Boot applications, the https://docs.spring.io/spring-boot/docs/current/actuator-api/htmlsingle/#prometheus[Prometheus Actuator endpoint] supports scraping in either format, defaulting to the Prometheus text format in absence of a specific `Accept` header.\n\n=== The Prometheus Rename Filter\n\nIn some cases, Micrometer provides instrumentation that overlaps with commonly used Prometheus simple client modules but has chosen a different naming scheme for consistency and portability.\nIf you wish to use the Prometheus \"standard\" names, add the following filter:\n\n[source,java]\n----\nprometheusRegistry.config().meterFilter(new PrometheusRenameFilter());\n----\n\n== Graphing\n\nThis section serves as a quick start to rendering useful representations in Prometheus for metrics originating in Micrometer.\nSee the https://prometheus.io/docs/querying/basics[Prometheus docs] for a far more complete reference of what is possible in Prometheus.\n\n=== Grafana Dashboard\n\nA publicly available Grafana dashboard for Micrometer-sourced JVM and Tomcat metrics is available https://grafana.com/grafana/dashboards/4701-jvm-micrometer/[here].\n\nimage::"+n(126)+'[Grafana dashboard for JVM and Tomcat binders]\n\nThe dashboard features:\n\n* JVM memory\n* Process memory (provided by https://github.com/mweirauch/micrometer-jvm-extras[micrometer-jvm-extras])\n* CPU-Usage, Load, Threads, File Descriptors, and Log Events\n* JVM Memory Pools (Heap, Non-Heap)\n* Garbage Collection\n* Classloading\n* Direct/Mapped buffer sizes\n\nInstead of using the `job` tag to distinguish different applications, this dashboard makes use of a common tag called `application`, which is applied to every metric.\nYou can apply the common tag as follows:\n\n[source,java]\n----\nregistry.config().commonTags("application", "MYAPPNAME");\n----\n\nIn Spring Boot applications, you can use the https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.metrics.customizing.common-tags[property support for common tags]:\n\n[source,properties]\n----\nmanagement.metrics.tags.application=MYAPPNAME\n----\n\n=== Counters\n\nThe query that generates a graph for the random-walk counter is\n`rate(counter[10s])`.\n\n.A Grafana rendered graph of the random walk counter.\nimage::'+n(127)+"[Grafana-rendered Prometheus counter]\n\nRepresenting a counter without rate normalization over some time window is rarely useful, as the representation is a function of both the rapidity with which the counter is incremented and the longevity of the service. It is generally most useful to rate-normalize these time series to reason about them. Since Prometheus keeps track of discrete events across all time, it has the advantage of allowing for the selection of an arbitrary time window across which to normalize at query time (for example, `rate(counter[10s])` provides a notion of requests per second over 10 second windows). The rate-normalized graph in the preceding image would return back to a value around 55 as soon as the new instance (say on a production deployment) was in service.\n\n.Counter over the same random walk, no rate normalization.\nimage::"+n(128)+"[Grafana-rendered Prometheus counter (no rate)]\n\nIn contrast, without rate normalization, the counter drops back to zero on service restart, and the count increases without bound for the duration of the service's uptime.\n\n=== Timers\n\nThe Prometheus `Timer` produces two counter time series with different names:\n\n* `${name}_count`: Total number of all calls.\n* `${name}_sum`: Total time of all calls.\n\nRepresenting a counter without rate normalization over some time window is rarely useful, as the representation is a function of both the rapidity with which the counter is incremented and the longevity of the service.\n\nUsing the following Prometheus queries, we can graph the most commonly used statistics about timers:\n\n* Average latency: `rate(timer_sum[10s])/rate(timer_count[10s])`\n* Throughput (requests per second): `rate(timer_count[10s])`\n\n.Timer over a simulated service.\nimage::"+n(129)+"[Grafana-rendered Prometheus timer]\n\n=== Long task timers\n\nThe Prometheus query to plot the duration of a long task timer for a serial task is `long_task_timer_sum`. In Grafana, we can set an alert threshold at some fixed point.\n\n.Simulated back-to-back long tasks with a fixed alert threshold.\nimage::"+n(130)+"[Grafana-rendered Prometheus long task timer]\n"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"39fa40459993be394ab40488bf8c6a8f.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"594dce115710525d7771ebe3ab82db19.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"439c0eea1918ef143002cf62a9393e2a.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"fc8d290e3f5356fad7d93f76c6abe188.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"fb6c59cc88b85301c5bbb890afc71593.png"},function(e,t,n){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer SignalFx\n:toc:\n:sectnums:\n:system: signalfx\n\nSignalFx is a dimensional monitoring system SaaS with a full UI that operates on a push model. It has a rich set of alert \"`detectors`\".\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThe following example configures SignalFx:\n\n[source,java]\n----\nSignalFxConfig signalFxConfig = new SignalFxConfig() {\n @Override\n public String accessToken() {\n return \"MYTOKEN\";\n }\n\n @Override\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\n\nMeterRegistry registry = new SignalFxMeterRegistry(signalFxConfig, Clock.SYSTEM);\n----\n\nThere are two distinct sources of API keys in SignalFx.\n\n`SignalFxConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.signalfx` directly to the `SignalFxConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.signalfx:\n access-token: MYTOKEN\n\n # The interval at which metrics are sent to Ganglia. See Duration.parse for the expected format.\n # The default is 1 minute.\n step: 1m\n----\n\n== Graphing\n\nThis section serves as a quick start to rendering useful representations in SignalFx for metrics originating in Micrometer. See the https://docs.signalfx.com/en/latest/charts/index.html[SignalFx docs] for a far more complete reference of what is possible in SignalFx.\n\n=== Timers\n\nAt each publishing interval, the SignalFx `Timer` produces several time series in SignalFx:\n\n* `${name}.avg`: A mean latency for the publishing interval.\n* `${name}.count`: Throughput per second over the publishing interval.\n* `${name}.totalTime`: Total time per second over the publishing interval (used with `count`) to create aggregable means.\n* `${name}.percentiles`: Micrometer calculated percentiles for the publishing interval. One time series is produced for each percentile, with a tag of `phi` in the range of [0,1].\n* `${name}.histogram`: One event is produced for each SLO boundary with a tag of 'le', indicating that it represents a cumulative count of events less than or equal to SLO boundaries over the publishing interval.\n\nTo generate an aggregable view of latency in SignalFx, divide `totalTime` by `count`:\n\nimage::"+n(132)+"[SignalFx-aggregable latency query]\n\nThis is accomplished by adding signals for `${name}.totalTime` and `${name}.count`, adding a formula that divides them, and hiding the inputs to the formula.\n\n.Timer latency.\nimage::"+n(133)+"[SignalFx-rendered timer]\n\nTo generate a throughput chart, use the `${name}.count` signal:\n\n.Timer throughput.\nimage::"+n(134)+"[SignalFx-rendered timer throughput]\n\nTo generate a plot of client-side percentiles, use the `${name}.percentiles` signal:\n\n.Timer Percentiles.\nimage::"+n(135)+"[SignalFx-rendered percentiles]\n\nNote that these percentiles are _not aggregable_. The more dimensions you add to a timer, the less useful these values become.\n\nFinally, if you define SLO boundaries with the fluent builder for `Timer`, you can view throughput below certain SLO boundaries by using the `${name}.histogram` signal. In this example, we set SLO boundaries at 275 (green), 300 (blue), and 500 (purple) milliseconds for a simulated `Timer` that is recording samples normally distributed around 250 ms. These counts represent the rate/second of samples less than or equal to each SLO boundary.\n\n.Timer SLO boundaries.\nimage::"+n(136)+"[SignalFx-rendered SLO boundaries]\n\nWhere the lines converge at various points it is evident that no sample exceeded the 275 ms SLO boundary.\n"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"d77cd7a4fea8c37d7dc37e7bbe069b5e.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"beec842accba1a667e0e288745191070.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"02141ef2139e0de5d180b5b76dff1982.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"a165f31f4506fa9b07f0f2319dd58aa0.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"b19ccbd241a3bfd9377d4066961b1620.png"},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Stackdriver Monitoring\nRay Tsang <saturnism@gmail.com>\n:toc:\n:sectnums:\n:system: stackdriver\n\nStackdriver Monitoring is a dimensional time-series SaaS with built-in dashboarding.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThe following example configures Stackdriver:\n\n[source,java]\n----\nStackdriverConfig stackdriverConfig = new StackdriverConfig() {\n @Override\n public String projectId() {\n return MY_PROJECT_ID;\n }\n\n @Override\n public String get(String key) {\n return null;\n }\n}\n\nMeterRegistry registry = StackdriverMeterRegistry.builder(stackdriverConfig).build();\n----\n\n`StackdriverConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.stackdriver` directly to the `StackdriverConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.stackdriver:\n project-id: MY_PROJECT_ID\n resource-type: global\n\n # You will probably want to disable Stackdriver Monitoring publishing in a local development profile.\n enabled: true\n\n # The interval at which metrics are sent to Stackdriver Monitoring. The default is 1 minute.\n step: 1m\n----\n\nFor most environments, you need to create and configure credentials to push metrics to Stackdriver Monitoring.\nIn most cases, you should create a service account with Stackdriver Monitoring permissions and configure a\n`GOOGLE_APPLICATION_CREDENTIALS` environmental variable to the path of the service account key file.\nThe following example shows how to do so:\n\n[source]\n----\nexport PROJECT_ID=MY_PROJECT_ID\nexport APP_NAME=MY_APP\n\n# Create a service account\ngcloud iam service-accounts create $APP_NAME\n\n# Grant the service account Stackdriver Monitoring writer permission\ngcloud projects add-iam-policy-binding $PROJECT_ID \\\n --member serviceAccount:$APP_NAME@$PROJECT_ID.iam.gserviceaccount.com \\\n --role roles/monitoring.metricWriter\n\n# Create a key JSON file\ngcloud iam service-accounts keys create $HOME/$APP_NAME-key.json \\\n --iam-account $APP_NAME@$PROJECT_ID.iam.gserviceaccount.com\n\n# Configure GOOGLE_APPLICATION_CREDENTIALS env var\nexport GOOGLE_APPLICATION_CREDENTIALS=$HOME/$APP_NAME-key.json\n----\n\nWhen running in managed environments (such as Google App Engine, Google Cloud Run, Google Cloud Function)\nyou need not configure this environmental variable. In those environments, a service account is\nautomatically associated with the application instance. The underlying Stackdriver Monitoring client\nlibrary can automatically detect and use those credentials.\n\n== Stackdriver Labels\n\nMicrometer metrics tags are mapped to https://cloud.google.com/monitoring/api/v3/metrics-details#intro-time-series[Stackdriver metrics labels]. With tags and labels, you can further filter or group\nby the tag or label. See link:/docs/concepts#_tag_naming[Micrometer Concepts] for more information on tags.\nThe following example filters by tags:\n\n[source,java]\n----\nMeterRegistry registry = StackdriverMeterRegistry.builder(stackdriverConfig).build();\nregistry.config().commonTags(\"application\", \"my-application\");\n----\n\nYou can also configure resource labels with the `StackdriverConfig` method `resourceLabels`. Depending on the configured `resourceType`, there will be required resource labels. See the documentation on https://cloud.google.com/monitoring/custom-metrics/creating-metrics#which-resource[choosing a monitored resource type].\n\nIMPORTANT: When using Micrometer across multiple applications/instances, it is necessary that Stackdriver labels are unique per application/instance. Otherwise, you will see errors like `One or more TimeSeries could not be written: One or more points were written more frequently than the maximum sampling period configured`. If using a resource type other than `global`, the resource labels may already make metrics unique per application instance. If not, a common tag with the hostname or platform-provided instance ID may be a good candidate for achieving this.\n\n== Spring Boot\n\nSpring Boot provides auto-configuration for Micrometer's StackdriverMeterRegistry. For more information, see the https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready-metrics-export-stackdriver[Spring Boot documentation].\n\nYou can manually configure or register the `StackdriverMeterRegistry`.\nIn addition to using Spring Boot Actuator, make sure you create the `StackdriverMeterRegistry` bean:\n\n[source,java]\n----\n@Bean\nStackdriverConfig stackdriverConfig() {\n return new StackdriverConfig() {\n @Override\n public String projectId() {\n return MY_PROJECT_ID;\n }\n\n @Override\n public String get(String key) {\n return null;\n }\n }\n}\n\n@Bean\nStackdriverMeterRegistry meterRegistry(StackdriverConfig stackdriverConfig) {\n return StackdriverMeterRegistry.builder(stackdriverConfig).build();\n}\n----\n\nYou can also use https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-metrics-common-tags[Spring Boot Actuator Common Tags configuration] to configure common tags:\n\n[source]\n----\nspring.application.name=my-application\nmanagement.metrics.tags.application=${spring.application.name}\n----\n\n== GraalVM native image compilation\n\nTo compile an application using `micrometer-registry-stackdriver` to a https://www.graalvm.org/reference-manual/native-image/[native image using GraalVM], add the https://github.com/GoogleCloudPlatform/native-image-support-java[native-image-support-java] library as a dependency. This will ensure the correct native image configuration is available and avoid errors like `Classes that should be initialized at run time got initialized during image building`.\n"},function(e,t){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer StatsD\n:toc:\n:sectnums:\n:system: statsd\n\nStatsD is a UDP-based sidecar-driven metrics collection system. The maintainer of the original StatsD line protocol specification is Etsy. Datadog\'s DogStatsD and Influx\'s Telegraf each accept a modified version of the line protocol, having each enriched the original specification with dimensionality in different ways.\n\nIf you intend to use the Datadog or Telegraf flavors, see the documentation for Micrometer\'s link:/docs/registry/datadog[Datadog] or link:/docs/registry/influx[Influx] support.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.micrometer:micrometer-registry-{system}:latest.release\'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThis configuration is used to ship metrics to a StatsD agent that is compatible with the original Etsy protocol. Metrics are shipped immediately over UDP to the agent.\n\n[source,java]\n----\nStatsdConfig config = new StatsdConfig() {\n @Override\n public String get(String k) {\n return null;\n }\n\n\n @Override\n public StatsdFlavor flavor() {\n return StatsdFlavor.Etsy;\n }\n};\n\nMeterRegistry registry = new StatsdMeterRegistry(config, Clock.SYSTEM);\n----\n\nNOTE: You can also configure Telegraf to accept the dogstatsd format. If you use Telegraf, configuring Micrometer to ship Telegraf-formatted StatsD lines eases the requirements of your Telegraf configuration.\n\n`StatsdConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer\'s Spring Boot support binds properties that are prefixed with `management.metrics.export.statsd` directly to the `StatsdConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.statsd:\n flavor: etsy\n\n # You will probably want to conditionally disable StatsD publishing in local development.\n enabled: true\n\n # The interval at which metrics are sent to StatsD. The default is 1 minute.\n step: 1m\n----\n\n== Customizing the Metrics Sink\n\nBy default, Micrometer publishes StatsD line protocol over UDP, as the vast majority of existing StatsD agents are UDP servers. It is possible to fully customize how the line protocol is shipped by modifying the builder for `StatsdMeterRegistry`:\n\n[source,java]\n----\nConsumer<String> lineLogger = line -> logger.info(line); <1>\n\nMeterRegistry registry = StatsdMeterRegistry.builder(StatsdConfig.DEFAULT) <2>\n .clock(clock)\n .lineSink(lineLogger)\n .build();\n----\n<1> Define what to do with lines.\n<2> The flavor configuration option determines the structure of the line for the default line builder. It has no effect if you override the line builder with a customization.\n\n=== Using Apache Kafka for Line Sink\n\nYou can also use Apache Kafka for line sink, as follows:\n\n[source,java]\n----\nProperties properties = new Properties();\nproperties.setProperty(BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");\nproperties.setProperty(KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());\nproperties.setProperty(VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());\n\nProducer<String, String> producer = new KafkaProducer<>(properties);\n\nStatsdMeterRegistry.builder(statsdConfig)\n .lineSink((line) -> producer.send(new ProducerRecord<>("my-metrics", line)))\n .build();\n----\n\nNow Micrometer produces lines for metrics to the `my-metrics` topic and you can consume the lines on the topic.\n\n== Customizing the Line Format\n\nThe built-in Etsy, dogstatsd, and Telegraf flavors cover most known public StatsD agents, but you can completely customize the line format to satisfy closed, proprietary agents. Again, we use the `StatsdMeterRegistry` builder to establish a line builder for each ID. Providing an instance of the builder _per ID_ offers you the opportunity to eagerly cache the serialization of the ID\'s name and tags to optimize the serialization of a StatsD line based on that ID as samples are recorded. The following listing defines a fictional format:\n\n[source,java]\n----\nFunction<Meter.Id, StatsdLineBuilder> nameAndUnits = id -> new StatsdLineBuilder() {\n String name = id.getName() + "/" + (id.getBaseUnit() == null ? "unknown" : id.getBaseUnit());\n\n @Override\n public String count(long amount, Statistic stat) {\n return name + ":" + amount + "|c";\n }\n\n ... // implement gauge, histogram, and timing similarly\n}\n\nMeterRegistry registry = StatsdMeterRegistry.builder(StatsdConfig.DEFAULT) <1>\n .clock(clock)\n .lineBuilder(nameAndUnits)\n .build();\n----\n<1> Because you have taken control of line building, the flavor is ignored.\n'},function(e,t,n){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Wavefront\n:toc:\n:sectnums:\n:system: wavefront\n\nWavefront is a dimensional monitoring system offered as a SaaS with a full UI, custom query language, and advanced math operations. Wavefront operates on a push model. Metrics may either be pushed through a sidecar process running on the same host (called the Wavefront proxy) or directly to the Wavefront API.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.micrometer:micrometer-registry-{system}:latest.release\'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThis section describes how to configure Wavefront when you send data:\n\n* <<configuring-directly-to-wavefront>>\n* <<configuring-through-a-wavefront-proxy-sidecar>>\n\n[[configuring-directly-to-wavefront]]\n=== Directly to Wavefront\n\nThe following example configures sending directly to Wavefront:\n\n[source,java]\n----\nWavefrontConfig config = new WavefrontConfig() {\n @Override\n public String uri() {\n return "https://longboard.wavefront.com"; <1>\n }\n\n @Override\n public String apiToken() {\n return "MYAPIKEY"; <2>\n }\n\n @Override\n public String get(String key) {\n return null; <3>\n }\n};\nMeterRegistry registry = new WavefrontMeterRegistry(config, Clock.SYSTEM);\n----\n<1> `longboard` is the name of the co-tenant instance on which most organizations start. Once you reach a sufficient scale, Wavefront may move you\nto a dedicated host.\n<2> This is required when pushing directly to Wavefront\'s API.\n<3> Accept the rest of the defaults.\n\n[[configuring-through-a-wavefront-proxy-sidecar]]\n=== Through a Wavefront Proxy Sidecar\n\nThe following example configures sending through a Wavefront proxy sidecar:\n\n[source,java]\n----\nMeterRegistry registry = new WavefrontMeterRegistry(WavefrontConfig.DEFAULT_PROXY, Clock.SYSTEM);\n----\n\nThe default proxy configuration pushs metrics and histogram distributions to a Wavefront proxy sitting on `localhost:2878`.\n\nNOTE: If publishing metrics to a Wavefront proxy, the URI must be expressed in the form of `proxy://HOST:PORT`.\n\n== Graphing\n\nThis section serves as a quick start to rendering useful representations in Wavefront for metrics originating in Micrometer. See the https://docs.wavefront.com/query_language_getting_started.html[Wavefront docs] for a far more complete reference of what is possible in Wavefront.\n\n=== Counters\n\nThe query that generates a graph for a random-walk counter is `rate(ts(counter))`.\n\n.A Wavefront rendered graph of the random walk counter.\nimage::'+n(140)+"[Wavefront-rendered counter]\n\nRepresenting a counter without rate normalization over some time window is rarely useful, as the\nrepresentation is a function of both the rapidity with which the counter is incremented and the\nlongevity of the service. It is generally most useful to rate-normalize these time series to\nreason about them.\n\nBecause Wavefront keeps track of cumulative counts across all time, it has the\nadvantage of allowing for the selection of a particular time function at query time (for example,\n`rate(ts(counter))` to compute the per-second rate of change).\n\n=== Timers\n\nThe Wavefront `Timer` produces different time series depending on whether or not\n`publishPercentileHistogram` is enabled.\n\nIf `publishPercentileHistogram` is enabled, the Wavefront `Timer` produces histogram distributions\nthat let you query for the latency at any percentile using `hs()` queries. For example, you can\nvisualize latency at the 95th percentile (`percentile(95, hs(timer.m))`) or the 99.9th percentile\n(`percentile(99.9, hs(timer.m))`). For more information on histogram distributions, see\n<<wavefront-histograms>>, later in this section.\n\nIf `publishPercentileHistogram` is disabled, the Wavefront `Timer` produces several\ntime series:\n\n* `${name}.avg`: Mean latency across all calls.\n* `${name}.count`: Total number of all calls.\n* `${name}.sum`: Total time of all calls.\n* `${name}.max`: Max latency over the publishing interval.\n* `${name}.percentiles`: Micrometer-calculated percentiles for the publishing interval. These\ncannot be aggregated across dimensions.\n\nYou can use these time series to generate a quick view of latency in Wavefront:\n\n.Timer latency.\nimage::"+n(141)+'[Wavefront-rendered timer]\n\nThe preceding chart shows the average latency (`rate(ts(timer.sum))/rate(ts(timer.count))` in\ngreen), 95th percentile (`ts(timer.percentile, phi="0.95")` in orange), and max (`ts(timer.max)`\nin blue).\n\nAdditionally, `rate(ts(timer.count))` represents a rate/second throughput of events being timed:\n\n.Timer throughput.\nimage::'+n(142)+"[Wavefront-rendered timer throughput]\n\n[[wavefront-histograms]]\n=== Wavefront Histograms\n\nWavefront's histogram implementation stores an actual distribution of metrics, as opposed to single metrics. This lets you apply any percentile and aggregation function on the distribution at query time without having to specify specific percentiles and metrics to keep during metric collection.\n\nWavefront histogram distributions are collected and reported for any `Timer` or `DistributionSummary` that has `publishPercentileHistogram` enabled.\n\nBy default, distributions that are reported to Wavefront get aggregated by the minute, providing you with a histogram distribution for each minute. You also have the option of aggregating by hour or day. You can customize this with the following configuration options:\n\n* `reportMinuteDistribution`: Boolean specifying whether to aggregate by minute. Enabled by default. Metric name in Wavefront has `.m` suffix.\n* `reportHourDistribution`: Boolean specifying whether to aggregate by hour. Disabled by default. Metric name in Wavefront has `.h` suffix.\n* `reportDayDistribution`: Boolean specifying whether to aggregate by day. Disabled by default. Metric name in Wavefront has `.d` suffix.\n\nIf you are sending to a Wavefront proxy, by default, both metrics and histogram distributions are published to the same port: 2878 in the default proxy configuration. If your proxy is configured to listen for histogram distributions on a different port, you can specify the port to which to publish by using the `distributionPort` configuration option.\n\nYou can query histogram distributions in Wavefront by using `hs()` queries. For example, `percentile(98, hs(${name}.m))` returns the 98th percentile for a particular histogram aggregated over each minute. Each histogram metric name has a suffix (`.m`, `.h`, or `.d`), depending on the histogram's aggregation interval.\n\nSee the https://docs.wavefront.com/proxies_histograms.html[Wavefront Histograms documentation] for more information.\n"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"105c9d351e5cabcc4504a9b863032ca3.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"10ee7658d93746e240978c7ca9b3467b.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"9cc263d6b012a89bad0374b418540a31.png"},function(e,t,n){},,function(e,t,n){},function(e,t,n){"use strict";n.r(t);var r=n(1),a=n(18),i=n.n(a),o=n(156),s=n(155),c=n(36),l=n(154),u=n(28),d=n.p+"static/media/logo.e2f91fdb.svg",m=(n(43),n(44),n(152)),g=n(151),p=n(0);function h(){return Object(p.jsxs)(m.a,{collapseOnSelect:!0,expand:"lg",bg:"dark",variant:"dark",style:{borderTop:"8px solid #1ba89c"},children:[Object(p.jsx)(m.a.Brand,{href:"/",children:Object(p.jsx)("img",{src:d,className:"img-fluid",style:{maxHeight:80},alt:"Micrometer"})}),Object(p.jsx)(m.a.Toggle,{"aria-controls":"responsive-navbar-nav"}),Object(p.jsx)(m.a.Collapse,{id:"responsive-navbar-nav",children:Object(p.jsxs)(g.a,{className:"ml-auto mt-2 mt-lg-0",children:[Object(p.jsx)(g.a.Item,{href:"/docs",children:Object(p.jsxs)(g.a.Link,{as:u.a,to:"/docs",children:[Object(p.jsx)("i",{className:"fa fa-lg fa-book"})," Documentation"]})}),Object(p.jsx)(g.a.Item,{children:Object(p.jsxs)(g.a.Link,{href:"https://github.com/micrometer-metrics/micrometer",children:[Object(p.jsx)("i",{className:"fa fa-lg fa-github-alt"})," GitHub"]})}),Object(p.jsx)(g.a.Item,{children:Object(p.jsxs)(g.a.Link,{href:"https://twitter.com/micrometerio",children:[Object(p.jsx)("i",{className:"fa fa-lg fa-twitter"})," Twitter"]})}),Object(p.jsx)(g.a.Item,{children:Object(p.jsxs)(g.a.Link,{href:"https://slack.micrometer.io",children:[Object(p.jsx)("i",{className:"fa fa-lg fa-slack"})," Slack"]})})]})})]})}function f(){return Object(p.jsx)("div",{className:"bg-dark text-center",children:Object(p.jsx)("div",{className:"col-12",style:{padding:10,color:"white"},children:Object(p.jsxs)("p",{children:['Copyright \xa9 2005 - 2023 Broadcom. All Rights Reserved. The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. See ',Object(p.jsx)("a",{href:"https://www.vmware.com/help/legal.html",children:"Terms of Use"})," and ",Object(p.jsx)("a",{href:"https://www.vmware.com/help/privacy.html",children:"Privacy Policy"}),"."]})})})}var b=n(149);n(50);function y(){return Object(p.jsxs)("div",{className:"container-fluid mt-4",style:{paddingRight:30,paddingLeft:30},children:[Object(p.jsx)("h1",{children:"Micrometer Documentation"}),Object(p.jsx)("p",{children:"Micrometer provides a simple facade over the instrumentation clients for the most popular observability systems, allowing you to instrument your JVM-based application code without vendor lock-in. Think SLF4J, but for application observability! Data recorded by Micrometer are intended to be used to observe, alert, and react to the current/recent operational state of your environment."}),Object(p.jsxs)("p",{children:["Join the discussion with any comments and feature requests on Micrometer's public ",Object(p.jsxs)("a",{href:"https://slack.micrometer.io",children:[Object(p.jsx)("i",{className:"fa fa-lg fa-slack"})," Slack Workspace"]}),"."]}),Object(p.jsxs)("ol",{children:[Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/installing",children:"Installing"}),". Where to get the latest release and snapshot builds."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/concepts",children:"Concepts"}),". An introduction to the abstraction provided by Micrometer."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)("span",{className:"doc-section",children:"Setup"}),". Instructions for how to configure Micrometer for use with different monitoring systems. As a facade over multiple monitoring systems, the point of Micrometer is to allow you to instrument your code in the same way and be able to visualize the results in your monitoring system of choice.",Object(p.jsxs)("ul",{children:[Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/registry/appOptics",children:"AppOptics"}),". AppOptics is a dimensional time-series SAAS with built-in dashboarding. Micrometer supports shipping metrics to AppOptics directly via its API."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/registry/atlas",children:"Atlas"}),". An in-memory dimensional time series database with built-in graphing, a custom stack-based query language, and advanced math operations. Atlas originated at Netflix, where it remains the operational metrics solution."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/registry/cloudwatch",children:"CloudWatch"}),". CloudWatch is a dimensional time-series SaaS on Amazon's cloud."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/registry/datadog",children:"Datadog"}),". Datadog is a dimensional time-series SAAS with built-in dashboarding and alerting. Micrometer supports shipping metrics to Datadog directly via its API or through Dogstatsd via the StatsD registry."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/registry/dynatrace",children:"Dynatrace"}),". Dynatrace is a Software Intelligence Platform featuring application performance monitoring (APM), artificial intelligence for operations (AIOps), IT infrastructure monitoring, digital experience management (DEM), and digital business analytics capabilities. Micrometer supports shipping metrics to Dynatrace directly via its API."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/registry/elastic",children:"Elastic"}),". Elasticsearch is an open source search and analytics platform. Metrics stored in Elasticsearch can be visualized in Kibana."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/registry/ganglia",children:"Ganglia"}),". An aging hierarchical metrics system which enjoyed wide popularity in Linux system monitoring and is still in place in many organizations. It originated in the early 2000s at the University of California, Berkeley."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/registry/graphite",children:"Graphite"}),". One of the most popular current hierarchical metrics systems backed by a fixed-size database, similar in design and purpose to RRD. It originated at Orbitz in 2006 and was open sourced in 2008."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/registry/humio",children:"Humio"}),". Humio is a dimensional time-series SAAS with built-in dashboarding. Micrometer supports shipping metrics to Humio directly via its API."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/registry/influx",children:"Influx"}),". The InfluxData suite of tools supports real-time stream processing and storage of time-series data. It supports downsampling, automatically expiring and deleting unwanted data, as well as backup and restore. Analysis of data is done via a SQL-like query language."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/registry/instana",children:"Instana"}),". Instana is an automatic application performance management and infrastructure monitoring system."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/registry/jmx",children:"JMX"}),". Micrometer provides a hierarchical mapping to JMX, primarily as a cheap and portable way to view metrics locally. Where JMX exporting is found in production, the same metrics are generally exported to another, more purpose-fit monitoring system."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/registry/kairos",children:"KairosDB"}),". KairosDB is a dimensional time-series database built on top of Cassandra. Charting can be accomplished in Grafana."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/registry/new-relic",children:"New Relic"}),". Micrometer publishes to New Relic Insights, a SaaS offering with a full UI and a query language called NRQL. New Relic Insights operates on a push model."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/registry/otlp",children:"OpenTelemetry Protocol (OTLP)"}),". OpenTelemetry is a CNCF incubating project for providing standards for telemetry data. Micrometer can publish metrics using the OpenTelemetry protocol (OTLP) to the backends that support it."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/registry/prometheus",children:"Prometheus"}),". An in-memory dimensional time series database with a simple built-in UI, a custom query language, and math operations. Prometheus is designed to operate on a pull model, scraping metrics from application instances periodically based on service discovery."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/registry/signalFx",children:"SignalFx"}),'. SignalFx is a dimensional monitoring system SaaS with a full UI operating on a push model. It has a rich set of alert "detectors".']}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/registry/stackdriver",children:"Stackdriver"}),". Stackdriver Monitoring is a dimensional time-series SAAS with built-in dashboarding and alerting. Micrometer supports shipping metrics to Stackdriver directly via its API using a push model. Alternatively, you can export Micrometer metrics via Prometheus and use a Prometheus to Stackdriver sidecar."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/registry/statsD",children:"StatsD"}),". Micrometer supports three flavors of StatsD: the original Etsy format plus the Datadog and Telegraf (Influx) extensions of StatsD that add dimensional support. Use this registry if you prefer to publish metrics to a StatsD agent. Also use this registry with Datadog flavor to publish metrics to Splunk."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/registry/wavefront",children:"Wavefront"}),". Wavefront is a SaaS-based metrics monitoring and analytics platform that lets you visualize, query, and alert over data from across your entire stack (infrastructure, network, custom app metrics, business KPIs, etc.)"]})]})]}),Object(p.jsxs)("li",{children:[Object(p.jsx)("span",{className:"doc-section",children:"Reference"}),". Detailed list of out-of-the-box instrumentation provided by Micrometer.",Object(p.jsxs)("ul",{children:[Object(p.jsxs)("li",{children:[Object(p.jsx)("a",{className:"doc-section",href:"https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready-metrics",children:"Spring Boot"}),". Micrometer is the instrumentation library powering the delivery of application metrics from Spring."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/ref/jvm",children:"JVM"}),". Metrics on classloaders, memory, garbage collection, threads, etc."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/ref/cache",children:"Cache"}),". Instrumentation for the most popular caching frameworks."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/ref/okhttpclient",children:"OkHttpClient"}),". Instrumentation for OkHttpClient."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/ref/jetty",children:"Jetty and Jersey"}),". Instrumentation for Jetty and Jersey."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/ref/netty",children:"Netty"}),". Instrumentation for Netty."]})]})]}),Object(p.jsxs)("li",{children:[Object(p.jsx)("span",{className:"doc-section",children:"Guides"}),".",Object(p.jsx)("ul",{children:Object(p.jsx)("li",{children:Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/guide/consoleReporter",children:"Passing through to Dropwizard's console reporter"})})}),Object(p.jsx)("ul",{children:Object(p.jsx)("li",{children:Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/guide/httpSenderResilience4jRetry",children:"HttpSender with Resilience4j retry"})})}),Object(p.jsx)("ul",{children:Object(p.jsx)("li",{children:Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/guide/customMeterRegistry",children:"Custom meter registry"})})})]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/observation",children:"Micrometer Observation"}),". An introduction to the Micrometer Observation API."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/tracing",children:"Micrometer Tracing"}),". An introduction to the abstraction provided by Micrometer Tracing."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)(b.a,{className:"doc-section",to:"/docs/contextPropagation",children:"Micrometer Context Propagation"}),". An introduction to the abstraction provided by Micrometer Context Propagation."]}),Object(p.jsxs)("li",{children:[Object(p.jsx)("a",{className:"doc-section",href:"/support",children:"Support policy"}),". Micrometer's support policy for releases."]})]})]})}var v=n(32),w=n(33),T=n(24),x=n(37),S=n(35),O=(n(52),n(34)),C=n.n(O),M=(n(61),n(62)());M.Extensions.register((function(){this.treeProcessor((function(){this.process((function(e){return e.findBy({context:"image"}).forEach((function(e){var t=e.getAttribute("alt");e.setAttribute("alt",t+'" class="img-fluid',!0)})),e}))}))}));var I=function(e){Object(x.a)(n,e);var t=Object(S.a)(n);function n(e){var r;return Object(v.a)(this,n),(r=t.call(this,e)).highlightCode=r.highlightCode.bind(Object(T.a)(r)),r}return Object(w.a)(n,[{key:"componentDidMount",value:function(){this.highlightCode()}},{key:"componentDidUpdate",value:function(){this.highlightCode()}},{key:"highlightCode",value:function(){this.root.querySelectorAll("pre code").forEach((function(e){return C.a.highlightBlock(e)}))}},{key:"render",value:function(){var e=this,t=M.convert(this.props.source,{attributes:this.props.attrs,safe:"safe"});return Object(p.jsx)("div",{ref:function(t){e.root=t},dangerouslySetInnerHTML:{__html:t}})}}]),n}(r.Component);n(70);function k(e){var t=e.title,n=e.content,r=e.attrs;return Object(p.jsxs)("div",{className:"container-fluid mt-4 ml-3 mr-3",children:[Object(p.jsx)("h1",{children:t}),Object(p.jsx)("hr",{}),Object(p.jsx)(I,{source:n,attrs:r})]})}k.defaultProps={attrs:{}};var E=n(71),R=n(72),A=n(76),D=n(77),N=n(81),j=n(82),P=n(83),_=n(84),L=n(85),B=n(86),H=n(87),F=n(88),G=n(92),q=["appOptics","atlas","azure-monitor","cloudwatch","datadog","dynatrace","elastic","ganglia","graphite","humio","influx","instana","jmx","kairos","new-relic","otlp","prometheus","signalFx","stackdriver","statsD","wavefront"],W={};function U(){return Object(p.jsxs)("div",{children:[Object(p.jsx)(c.a,{exact:!0,path:"/docs",component:y}),Object(p.jsx)(c.a,{path:"/docs/installing",render:function(){return Object(p.jsx)(k,{title:"Installing",content:E})}}),Object(p.jsx)(c.a,{exact:!0,path:"/docs/concepts",render:function(){return Object(p.jsx)(k,{title:"Concepts",content:R})}}),Object(p.jsx)(c.a,{path:"/docs/registry/:system",render:function(e){var t=e.match.params.system;return q.includes(t)?Object(p.jsx)(k,{title:"Micrometer ".concat(t.split("-").map((function(e){return e[0].toUpperCase()+e.slice(1)})).join(" ")),content:W[t]}):Object(p.jsx)(l.a,{to:"/docs"})}}),Object(p.jsx)(c.a,{path:"/docs/ref/jvm",render:function(){return Object(p.jsx)(k,{title:"JVM and System Metrics",content:A})}}),Object(p.jsx)(c.a,{path:"/docs/ref/cache",render:function(){return Object(p.jsx)(k,{title:"Cache Metrics",content:D})}}),Object(p.jsx)(c.a,{path:"/docs/ref/okhttpclient",render:function(){return Object(p.jsx)(k,{title:"OkHttpClient Metrics",content:N})}}),Object(p.jsx)(c.a,{path:"/docs/ref/jetty",render:function(){return Object(p.jsx)(k,{title:"Jetty and Jersey Metrics",content:j})}}),Object(p.jsx)(c.a,{path:"/docs/ref/netty",render:function(){return Object(p.jsx)(k,{title:"Netty Metrics",content:P})}}),Object(p.jsx)(c.a,{path:"/docs/guide/consoleReporter",render:function(){return Object(p.jsx)(k,{title:"Passing through to Dropwizard's console reporter",content:_})}}),Object(p.jsx)(c.a,{path:"/docs/guide/httpSenderResilience4jRetry",render:function(){return Object(p.jsx)(k,{title:"HttpSender with Resilience4j retry",content:L})}}),Object(p.jsx)(c.a,{path:"/docs/guide/customMeterRegistry",render:function(){return Object(p.jsx)(k,{title:"Custom meter registry",content:B})}}),Object(p.jsx)(c.a,{path:"/docs/observation",render:function(){return Object(p.jsx)(k,{title:"Observation",content:H})}}),Object(p.jsx)(c.a,{path:"/docs/tracing",render:function(){return Object(p.jsx)(k,{title:"Tracing",content:F})}}),Object(p.jsx)(c.a,{path:"/docs/contextPropagation",render:function(){return Object(p.jsx)(k,{title:"Context Propagation",content:G})}})]})}q.forEach((function(e){return W[e]=n(93)("./".concat(e,".adoc"))}));var V=n(153),z=n(150);n(143);function Y(){return Object(p.jsx)(m.a,{sticky:"top",className:"d-flex align-items-center justify-content-center text-center",children:Object(p.jsxs)(V.a,{variant:"warning",children:[Object(p.jsx)(V.a.Heading,{children:"New Documentation Site"}),Object(p.jsx)(z.a,{variant:"secondary",href:"https://docs.micrometer.io/micrometer/reference/",children:"Go to the new docs"}),Object(p.jsx)("br",{}),"This is an archive to keep links alive."]})})}function K(){return Object(p.jsxs)("div",{children:[Object(p.jsx)(h,{}),Object(p.jsx)(Y,{}),Object(p.jsxs)(s.a,{children:[Object(p.jsx)(c.a,{exact:!0,path:"/docs",component:y}),Object(p.jsx)(c.a,{exact:!0,path:"/docs/support",component:function(){return window.location.replace("/support"),null}}),Object(p.jsx)(U,{}),Object(p.jsx)(c.a,{path:"**",render:function(){return Object(p.jsx)(l.a,{to:"/docs"})}})]}),Object(p.jsx)("div",{className:"container-fluid",style:{paddingRight:0,paddingLeft:0},children:Object(p.jsx)(f,{className:"row"})})]})}Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));var $=n(12),J=(n(144),n(145),Object($.a)());i.a.render(Object(p.jsx)(o.a,{history:J,children:Object(p.jsx)(K,{})}),document.getElementById("root")),"serviceWorker"in navigator&&navigator.serviceWorker.ready.then((function(e){e.unregister()})).catch((function(e){console.error(e.message)}))}]),[[146,1,2]]]); +//# sourceMappingURL=main.30543131.chunk.js.map \ No newline at end of file diff --git a/static/js/main.30543131.chunk.js.map b/static/js/main.30543131.chunk.js.map new file mode 100644 index 00000000..93eadd73 --- /dev/null +++ b/static/js/main.30543131.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["components/Asciidoc/highlight/index.js","components/Asciidoc/highlight/highlight.js","components/Asciidoc/highlight/languages/gradle.js","components/Asciidoc/highlight/languages/groovy.js","components/Asciidoc/highlight/languages/http.js","components/Asciidoc/highlight/languages/java.js","components/Asciidoc/highlight/languages/xml.js","components/Asciidoc/highlight/languages/yaml.js","components/Asciidoc/highlight/languages/json.js","generated-docs/installing/index.adoc","generated-docs/concepts/index.adoc","generated-docs/concepts/img/prometheus-counter-norate.png","generated-docs/concepts/img/prometheus-counter.png","generated-docs/concepts/img/rate-normalizing.png","generated-docs/jvm/index.adoc","generated-docs/cache/index.adoc","generated-docs/cache/img/prometheus-guava-cache.png","generated-docs/cache/img/prometheus-guava-cache-ratio.png","generated-docs/cache/img/grafana-guava-miss-ratio.png","generated-docs/okhttpclient/index.adoc","generated-docs/jetty/index.adoc","generated-docs/netty/index.adoc","generated-docs/guide/console-reporter.adoc","generated-docs/guide/http-sender-resilience4j-retry.adoc","generated-docs/guide/custom-meter-registry.adoc","generated-docs/observation/index.adoc","generated-docs/tracing/index.adoc","generated-docs/tracing/img/trace-id.jpg","generated-docs/tracing/img/parents.jpg","generated-docs/tracing/img/zipkin.jpg","generated-docs/contextpropagation/index.adoc","../ /^/.//.*/.adoc$","generated-docs/implementations/appOptics.adoc","generated-docs/implementations/img/appoptics-timer-average.png","generated-docs/implementations/img/appoptics-timer.png","generated-docs/implementations/atlas.adoc","generated-docs/implementations/img/atlas-counter.png","generated-docs/implementations/img/atlas-timer.png","generated-docs/implementations/img/atlas-long-task-timer.png","generated-docs/implementations/azure-monitor.adoc","generated-docs/implementations/cloudwatch.adoc","generated-docs/implementations/datadog.adoc","generated-docs/implementations/dynatrace.adoc","generated-docs/implementations/elastic.adoc","generated-docs/implementations/ganglia.adoc","generated-docs/implementations/img/ganglia-counter.png","generated-docs/implementations/graphite.adoc","generated-docs/implementations/img/graphite-counter.png","generated-docs/implementations/hierarchical-name-mapping.adoc","generated-docs/implementations/humio.adoc","generated-docs/implementations/img/humio-timer.png","generated-docs/implementations/influx.adoc","generated-docs/implementations/install.adoc","generated-docs/implementations/instana.adoc","generated-docs/implementations/jmx.adoc","generated-docs/implementations/img/jmx-counter.png","generated-docs/implementations/kairos.adoc","generated-docs/implementations/new-relic.adoc","generated-docs/implementations/img/new-relic-timer-latency.png","generated-docs/implementations/img/new-relic-timer-throughput.png","generated-docs/implementations/img/new-relic-timer-percentiles.png","generated-docs/implementations/img/new-relic-timer-sla.png","generated-docs/implementations/otlp.adoc","generated-docs/implementations/prometheus.adoc","generated-docs/implementations/img/prometheus-dashboard.png","generated-docs/implementations/img/prometheus-counter.png","generated-docs/implementations/img/prometheus-counter-norate.png","generated-docs/implementations/img/prometheus-timer.png","generated-docs/implementations/img/prometheus-long-task-timer.png","generated-docs/implementations/signalFx.adoc","generated-docs/implementations/img/signalfx-timer-latency-query.png","generated-docs/implementations/img/signalfx-timer-latency.png","generated-docs/implementations/img/signalfx-timer-throughput.png","generated-docs/implementations/img/signalfx-timer-percentiles.png","generated-docs/implementations/img/signalfx-timer-sla.png","generated-docs/implementations/stackdriver.adoc","generated-docs/implementations/statsD.adoc","generated-docs/implementations/wavefront.adoc","generated-docs/implementations/img/wavefront-counter-rate.png","generated-docs/implementations/img/wavefront-timer-latency.png","generated-docs/implementations/img/wavefront-timer-throughput.png","img/logo.svg","components/MyNavbar/index.js","components/Footer/index.js","components/DocRoot/index.js","components/Asciidoc/index.js","components/DocSection/index.js","components/DocRoutes/index.js","components/MigrationAlert/index.js","components/App/App.js","registerServiceWorker.js","index.js"],"names":["hljs","require","registerLanguage","module","exports","factory","window","self","ArrayProto","objectKeys","Object","keys","languages","aliases","noHighlightRe","languagePrefixRe","fixMarkupRe","spanEndTag","options","classPrefix","tabReplace","useBR","undefined","escape","value","replace","tag","node","nodeName","toLowerCase","testRe","re","lexeme","match","exec","index","isNotHighlighted","language","test","blockLanguage","block","i","length","_class","classes","className","parentNode","getLanguage","split","inherit","parent","key","result","objects","Array","prototype","slice","call","arguments","forEach","obj","nodeStream","_nodeStream","offset","child","firstChild","nextSibling","nodeType","nodeValue","push","event","mergeStreams","original","highlighted","processed","nodeStack","selectStream","open","attr_str","a","map","attributes","join","close","render","stream","substring","reverse","splice","pop","substr","expand_mode","mode","variants","cached_variants","variant","endsWithParent","compileLanguage","reStr","source","langRe","global","RegExp","case_insensitive","compileMode","compiled","keywords","beginKeywords","compiled_keywords","flatten","str","kw","pair","Number","lexemesRe","lexemes","begin","beginRe","end","endRe","terminator_end","illegal","illegalRe","relevance","contains","concat","apply","c","starts","terminators","filter","Boolean","highlight","name","ignore_illegals","continuation","subMode","endOfMode","endsParent","isIllegal","keywordMatch","match_str","hasOwnProperty","buildSpan","classname","insideSpan","leaveOpen","noPrefix","openSpan","processKeywords","keyword_match","last_index","top","mode_buffer","lastIndex","processSubLanguage","explicit","subLanguage","continuations","highlightAuto","processBuffer","startNewMode","create","processLexeme","buffer","new_mode","skip","excludeBegin","returnBegin","end_mode","origin","returnEnd","excludeEnd","Error","current","count","e","message","indexOf","text","languageSubset","second_best","fixMarkup","p1","buildClassName","prevClassName","currentLang","resultLang","trim","highlightBlock","originalStream","resultNode","document","createElementNS","innerHTML","textContent","configure","user_options","initHighlighting","called","blocks","querySelectorAll","initHighlightingOnLoad","addEventListener","lang","alias","listLanguages","IDENT_RE","UNDERSCORE_IDENT_RE","NUMBER_RE","C_NUMBER_RE","BINARY_NUMBER_RE","RE_STARTERS_RE","BACKSLASH_ESCAPE","APOS_STRING_MODE","QUOTE_STRING_MODE","PHRASAL_WORDS_MODE","COMMENT","inherits","C_LINE_COMMENT_MODE","C_BLOCK_COMMENT_MODE","HASH_COMMENT_MODE","NUMBER_MODE","C_NUMBER_MODE","BINARY_NUMBER_MODE","CSS_NUMBER_MODE","REGEXP_MODE","TITLE_MODE","UNDERSCORE_TITLE_MODE","METHOD_GUARD","keyword","literal","VERSION","KEYWORDS","JAVA_NUMBER_MODE","TAG_INTERNALS","LITERALS","keyPrefix","keyName","KEY","STRING","TYPES","VALUE_CONTAINER","OBJECT","ARRAY","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","code","resolve","MyNavbar","Navbar","collapseOnSelect","expand","bg","style","borderTop","Brand","href","src","logo","maxHeight","alt","Toggle","Collapse","Nav","Item","Link","as","to","Footer","padding","color","DocRoot","paddingRight","paddingLeft","NavLink","asciidoctor","Extensions","register","this","treeProcessor","process","doc","findBy","img","getAttribute","setAttribute","Asciidoc","props","highlightCode","bind","root","converted","convert","attrs","safe","ref","dangerouslySetInnerHTML","__html","Component","DocSection","title","content","defaultProps","docsInstalling","docsConcepts","docsJvm","docsCache","docsOkHttpClient","docsJetty","docsNetty","docsConsoleReporter","docsHttpSenderResilience4jRetry","docsCustomMeterRegistry","docsObservation","docsTracing","docsContextPropagation","systems","docsBySystem","DocRoutes","Route","exact","path","component","system","params","includes","part","toUpperCase","Redirect","sys","MigrationAlert","sticky","Alert","Heading","Button","App","Switch","location","hostname","history","createBrowserHistory","ReactDOM","Router","getElementById","navigator","serviceWorker","ready","then","registration","unregister","catch","error","console"],"mappings":"0HAAA,IAAIA,EAAOC,EAAQ,IAEnBD,EAAKE,iBAAiB,SAAUD,EAAQ,KACxCD,EAAKE,iBAAiB,SAAUD,EAAQ,KACxCD,EAAKE,iBAAiB,OAAQD,EAAQ,KACtCD,EAAKE,iBAAiB,OAAQD,EAAQ,KACtCD,EAAKE,iBAAiB,MAAOD,EAAQ,KACrCD,EAAKE,iBAAiB,OAAQD,EAAQ,KACtCD,EAAKE,iBAAiB,OAAQD,EAAQ,KAEtCE,EAAOC,QAAUJ,C,uECAhB,SAASK,GAG6B,kBAAXC,QAAuBA,QACd,kBAATC,MAAqBA,MAmB/C,SAASP,GAET,IAAIQ,EAAa,GACbC,EAAaC,OAAOC,KAGpBC,EAAY,CAAC,EACbC,EAAY,CAAC,EAGbC,EAAmB,gCACnBC,EAAmB,8BACnBC,EAAmB,+BAEnBC,EAAa,UAIbC,EAAU,CACZC,YAAa,QACbC,WAAY,KACZC,OAAO,EACPT,eAAWU,GAMb,SAASC,EAAOC,GACd,OAAOA,EAAMC,QAAQ,KAAM,SAASA,QAAQ,KAAM,QAAQA,QAAQ,KAAM,OACzE,CAED,SAASC,EAAIC,GACX,OAAOA,EAAKC,SAASC,aACtB,CAED,SAASC,EAAOC,EAAIC,GAClB,IAAIC,EAAQF,GAAMA,EAAGG,KAAKF,GAC1B,OAAOC,GAAyB,IAAhBA,EAAME,KACvB,CAED,SAASC,EAAiBC,GACxB,OAAOvB,EAAcwB,KAAKD,EAC3B,CAED,SAASE,EAAcC,GACrB,IAAIC,EAAGR,EAAOS,EAAQC,EAClBC,EAAUJ,EAAMK,UAAY,IAMhC,GAJAD,GAAWJ,EAAMM,WAAaN,EAAMM,WAAWD,UAAY,GAG3DZ,EAAQlB,EAAiBmB,KAAKU,GAE5B,OAAOG,EAAYd,EAAM,IAAMA,EAAM,GAAK,eAK5C,IAAKQ,EAAI,EAAGC,GAFZE,EAAUA,EAAQI,MAAM,QAEKN,OAAQD,EAAIC,EAAQD,IAG/C,GAAIL,EAFJO,EAASC,EAAQH,KAEeM,EAAYJ,GAC1C,OAAOA,CAGZ,CAED,SAASM,EAAQC,GACf,IAAIC,EACAC,EAAS,CAAC,EACVC,EAAUC,MAAMC,UAAUC,MAAMC,KAAKC,UAAW,GAEpD,IAAKP,KAAOD,EACVE,EAAOD,GAAOD,EAAOC,GAKvB,OAJAE,EAAQM,SAAQ,SAASC,GACvB,IAAKT,KAAOS,EACVR,EAAOD,GAAOS,EAAIT,EACrB,IACMC,CACR,CAID,SAASS,EAAWlC,GAClB,IAAIyB,EAAS,GA0Bb,OAzBA,SAAUU,EAAYnC,EAAMoC,GAC1B,IAAK,IAAIC,EAAQrC,EAAKsC,WAAYD,EAAOA,EAAQA,EAAME,YAC9B,IAAnBF,EAAMG,SACRJ,GAAUC,EAAMI,UAAU1B,OACA,IAAnBsB,EAAMG,WACbf,EAAOiB,KAAK,CACVC,MAAO,QACPP,OAAQA,EACRpC,KAAMqC,IAERD,EAASD,EAAYE,EAAOD,GAIvBrC,EAAIsC,GAAO/B,MAAM,oBACpBmB,EAAOiB,KAAK,CACVC,MAAO,OACPP,OAAQA,EACRpC,KAAMqC,KAKd,OAAOD,CAvBT,EAwBGpC,EAAM,GACFyB,CACR,CAED,SAASmB,EAAaC,EAAUC,EAAajD,GAC3C,IAAIkD,EAAY,EACZtB,EAAS,GACTuB,EAAY,GAEhB,SAASC,IACP,OAAKJ,EAAS9B,QAAW+B,EAAY/B,OAGjC8B,EAAS,GAAGT,SAAWU,EAAY,GAAGV,OAChCS,EAAS,GAAGT,OAASU,EAAY,GAAGV,OAAUS,EAAWC,EAkBnC,UAAzBA,EAAY,GAAGH,MAAoBE,EAAWC,EArB5CD,EAAS9B,OAAS8B,EAAWC,CAsBvC,CAED,SAASI,EAAKlD,GACZ,SAASmD,EAASC,GAAI,MAAO,IAAMA,EAAEnD,SAAW,KAAOL,EAAOwD,EAAEvD,OAAOC,QAAQ,IAAK,UAAY,GAAK,CACrG2B,GAAU,IAAM1B,EAAIC,GAAQnB,EAAWwE,IAAIvB,KAAK9B,EAAKsD,WAAYH,GAAUI,KAAK,IAAM,GACvF,CAED,SAASC,EAAMxD,GACbyB,GAAU,KAAO1B,EAAIC,GAAQ,GAC9B,CAED,SAASyD,EAAOd,IACG,UAAhBA,EAAMA,MAAoBO,EAAOM,GAAOb,EAAM3C,KAChD,CAED,KAAO6C,EAAS9B,QAAU+B,EAAY/B,QAAQ,CAC5C,IAAI2C,EAAST,IAGb,GAFAxB,GAAU7B,EAAOC,EAAM8D,UAAUZ,EAAWW,EAAO,GAAGtB,SACtDW,EAAYW,EAAO,GAAGtB,OAClBsB,IAAWb,EAAU,CAOvBG,EAAUY,UAAU5B,QAAQwB,GAC5B,GACEC,EAAOC,EAAOG,OAAO,EAAG,GAAG,IAC3BH,EAAST,UACFS,IAAWb,GAAYa,EAAO3C,QAAU2C,EAAO,GAAGtB,SAAWW,GACtEC,EAAUY,UAAU5B,QAAQkB,EAC7B,KACyB,UAApBQ,EAAO,GAAGf,MACZK,EAAUN,KAAKgB,EAAO,GAAG1D,MAEzBgD,EAAUc,MAEZL,EAAOC,EAAOG,OAAO,EAAG,GAAG,GAE9B,CACD,OAAOpC,EAAS7B,EAAOC,EAAMkE,OAAOhB,GACrC,CAID,SAASiB,EAAYC,GAMnB,OALIA,EAAKC,WAAaD,EAAKE,kBACzBF,EAAKE,gBAAkBF,EAAKC,SAASb,KAAI,SAASe,GAChD,OAAO9C,EAAQ2C,EAAM,CAACC,SAAU,MAAOE,EACxC,KAEIH,EAAKE,iBAAoBF,EAAKI,gBAAkB,CAAC/C,EAAQ2C,KAAW,CAACA,EAC7E,CAED,SAASK,EAAgB5D,GAEvB,SAAS6D,EAAMnE,GACX,OAAQA,GAAMA,EAAGoE,QAAWpE,CAC/B,CAED,SAASqE,EAAO5E,EAAO6E,GACrB,OAAO,IAAIC,OACTJ,EAAM1E,GACN,KAAOa,EAASkE,iBAAmB,IAAM,KAAOF,EAAS,IAAM,IAElE,CAED,SAASG,EAAYZ,EAAM1C,GACzB,IAAI0C,EAAKa,SAAT,CAKA,GAHAb,EAAKa,UAAW,EAEhBb,EAAKc,SAAWd,EAAKc,UAAYd,EAAKe,cAClCf,EAAKc,SAAU,CACjB,IAAIE,EAAoB,CAAC,EAErBC,EAAU,SAAShE,EAAWiE,GAC5BzE,EAASkE,mBACXO,EAAMA,EAAIjF,eAEZiF,EAAI9D,MAAM,KAAKW,SAAQ,SAASoD,GAC9B,IAAIC,EAAOD,EAAG/D,MAAM,KACpB4D,EAAkBI,EAAK,IAAM,CAACnE,EAAWmE,EAAK,GAAKC,OAAOD,EAAK,IAAM,EACtE,GACF,EAE4B,kBAAlBpB,EAAKc,SACdG,EAAQ,UAAWjB,EAAKc,UAExBjG,EAAWmF,EAAKc,UAAU/C,SAAQ,SAAUd,GAC1CgE,EAAQhE,EAAW+C,EAAKc,SAAS7D,GAClC,IAEH+C,EAAKc,SAAWE,CACjB,CACDhB,EAAKsB,UAAYd,EAAOR,EAAKuB,SAAW,OAAO,GAE3CjE,IACE0C,EAAKe,gBACPf,EAAKwB,MAAQ,OAASxB,EAAKe,cAAc3D,MAAM,KAAKkC,KAAK,KAAO,QAE7DU,EAAKwB,QACRxB,EAAKwB,MAAQ,SACfxB,EAAKyB,QAAUjB,EAAOR,EAAKwB,OACtBxB,EAAK0B,KAAQ1B,EAAKI,iBACrBJ,EAAK0B,IAAM,SACT1B,EAAK0B,MACP1B,EAAK2B,MAAQnB,EAAOR,EAAK0B,MAC3B1B,EAAK4B,eAAiBtB,EAAMN,EAAK0B,MAAQ,GACrC1B,EAAKI,gBAAkB9C,EAAOsE,iBAChC5B,EAAK4B,iBAAmB5B,EAAK0B,IAAM,IAAM,IAAMpE,EAAOsE,iBAEtD5B,EAAK6B,UACP7B,EAAK8B,UAAYtB,EAAOR,EAAK6B,UACT,MAAlB7B,EAAK+B,YACP/B,EAAK+B,UAAY,GACd/B,EAAKgC,WACRhC,EAAKgC,SAAW,IAElBhC,EAAKgC,SAAWtE,MAAMC,UAAUsE,OAAOC,MAAM,GAAIlC,EAAKgC,SAAS5C,KAAI,SAAS+C,GAC1E,OAAOpC,EAAkB,SAANoC,EAAenC,EAAOmC,EAC1C,KACDnC,EAAKgC,SAASjE,SAAQ,SAASoE,GAAIvB,EAAYuB,EAAGnC,EAAO,IAErDA,EAAKoC,QACPxB,EAAYZ,EAAKoC,OAAQ9E,GAG3B,IAAI+E,EACFrC,EAAKgC,SAAS5C,KAAI,SAAS+C,GACzB,OAAOA,EAAEpB,cAAgB,QAAUoB,EAAEX,MAAQ,QAAUW,EAAEX,KAC1D,IACAS,OAAO,CAACjC,EAAK4B,eAAgB5B,EAAK6B,UAClCzC,IAAIkB,GACJgC,OAAOC,SACVvC,EAAKqC,YAAcA,EAAYvF,OAAS0D,EAAO6B,EAAY/C,KAAK,MAAM,GAAQ,CAAChD,KAAM,WAAiB,OAAO,IAAM,EAlE3G,CAmET,CAEDsE,EAAYnE,EACb,CAWD,SAAS+F,EAAUC,EAAM7G,EAAO8G,EAAiBC,GAE/C,SAASC,EAAQxG,EAAQ4D,GACvB,IAAInD,EAAGC,EAEP,IAAKD,EAAI,EAAGC,EAASkD,EAAKgC,SAASlF,OAAQD,EAAIC,EAAQD,IACrD,GAAIX,EAAO8D,EAAKgC,SAASnF,GAAG4E,QAASrF,GACnC,OAAO4D,EAAKgC,SAASnF,EAG1B,CAED,SAASgG,EAAU7C,EAAM5D,GACvB,GAAIF,EAAO8D,EAAK2B,MAAOvF,GAAS,CAC9B,KAAO4D,EAAK8C,YAAc9C,EAAK1C,QAC7B0C,EAAOA,EAAK1C,OAEd,OAAO0C,CACR,CACD,GAAIA,EAAKI,eACP,OAAOyC,EAAU7C,EAAK1C,OAAQlB,EAEjC,CAED,SAAS2G,EAAU3G,EAAQ4D,GACzB,OAAQ0C,GAAmBxG,EAAO8D,EAAK8B,UAAW1F,EACnD,CAED,SAAS4G,EAAahD,EAAM3D,GAC1B,IAAI4G,EAAYxG,EAASkE,iBAAmBtE,EAAM,GAAGJ,cAAgBI,EAAM,GAC3E,OAAO2D,EAAKc,SAASoC,eAAeD,IAAcjD,EAAKc,SAASmC,EACjE,CAED,SAASE,EAAUC,EAAWC,EAAYC,EAAWC,GACnD,IACIC,EAAc,iBADAD,EAAW,GAAKjI,EAAQC,aAM1C,OAFAiI,GAAYJ,EAAY,MAENC,GAJAC,EAAY,GAAKjI,EAKpC,CAED,SAASoI,IACP,IAAIC,EAAeC,EAAYtH,EAAOmB,EAEtC,IAAKoG,EAAI9C,SACP,OAAOnF,EAAOkI,GAOhB,IALArG,EAAS,GACTmG,EAAa,EACbC,EAAItC,UAAUwC,UAAY,EAC1BzH,EAAQuH,EAAItC,UAAUhF,KAAKuH,GAEpBxH,GACLmB,GAAU7B,EAAOkI,EAAYnE,UAAUiE,EAAYtH,EAAME,SACzDmH,EAAgBV,EAAaY,EAAKvH,KAEhC0F,GAAa2B,EAAc,GAC3BlG,GAAU2F,EAAUO,EAAc,GAAI/H,EAAOU,EAAM,MAEnDmB,GAAU7B,EAAOU,EAAM,IAEzBsH,EAAaC,EAAItC,UAAUwC,UAC3BzH,EAAQuH,EAAItC,UAAUhF,KAAKuH,GAE7B,OAAOrG,EAAS7B,EAAOkI,EAAY/D,OAAO6D,GAC3C,CAED,SAASI,IACP,IAAIC,EAAsC,kBAApBJ,EAAIK,YAC1B,GAAID,IAAahJ,EAAU4I,EAAIK,aAC7B,OAAOtI,EAAOkI,GAGhB,IAAIrG,EAASwG,EACAxB,EAAUoB,EAAIK,YAAaJ,GAAa,EAAMK,EAAcN,EAAIK,cAChEE,EAAcN,EAAaD,EAAIK,YAAYnH,OAAS8G,EAAIK,iBAAcvI,GAYnF,OANIkI,EAAI7B,UAAY,IAClBA,GAAavE,EAAOuE,WAElBiC,IACFE,EAAcN,EAAIK,aAAezG,EAAOoG,KAEnCT,EAAU3F,EAAOf,SAAUe,EAAO5B,OAAO,GAAO,EACxD,CAED,SAASwI,IACP5G,GAA8B,MAAnBoG,EAAIK,YAAsBF,IAAuBN,IAC5DI,EAAc,EACf,CAED,SAASQ,EAAarE,GACpBxC,GAAUwC,EAAK/C,UAAWkG,EAAUnD,EAAK/C,UAAW,IAAI,GAAO,GAC/D2G,EAAM9I,OAAOwJ,OAAOtE,EAAM,CAAC1C,OAAQ,CAAC1B,MAAOgI,IAC5C,CAED,SAASW,EAAcC,EAAQpI,GAI7B,GAFAyH,GAAeW,EAED,MAAVpI,EAEF,OADAgI,IACO,EAGT,IAAIK,EAAW7B,EAAQxG,EAAQwH,GAC/B,GAAIa,EAaF,OAZIA,EAASC,KACXb,GAAezH,GAEXqI,EAASE,eACXd,GAAezH,GAEjBgI,IACKK,EAASG,aAAgBH,EAASE,eACrCd,EAAczH,IAGlBiI,EAAaI,EAAUrI,GAChBqI,EAASG,YAAc,EAAIxI,EAAOU,OAG3C,IAAI+H,EAAWhC,EAAUe,EAAKxH,GAC9B,GAAIyI,EAAU,CACZ,IAAIC,EAASlB,EACTkB,EAAOJ,KACTb,GAAezH,GAET0I,EAAOC,WAAaD,EAAOE,aAC/BnB,GAAezH,GAEjBgI,IACIU,EAAOE,aACTnB,EAAczH,IAGlB,GACMwH,EAAI3G,YACNO,GAAUnC,GAEPuI,EAAIc,MAASd,EAAIK,cACpBlC,GAAa6B,EAAI7B,WAEnB6B,EAAMA,EAAItG,aACHsG,IAAQiB,EAASvH,QAI1B,OAHIuH,EAASzC,QACXiC,EAAaQ,EAASzC,OAAQ,IAEzB0C,EAAOC,UAAY,EAAI3I,EAAOU,MACtC,CAED,GAAIiG,EAAU3G,EAAQwH,GACpB,MAAM,IAAIqB,MAAM,mBAAqB7I,EAAS,gBAAkBwH,EAAI3G,WAAa,aAAe,KAQlG,OADA4G,GAAezH,EACRA,EAAOU,QAAU,CACzB,CAED,IAAIL,EAAWU,EAAYsF,GAC3B,IAAKhG,EACH,MAAM,IAAIwI,MAAM,sBAAwBxC,EAAO,KAGjDpC,EAAgB5D,GAChB,IAEiByI,EAFbtB,EAAMjB,GAAgBlG,EACtByH,EAAgB,CAAC,EACjB1G,EAAS,GACb,IAAI0H,EAAUtB,EAAKsB,IAAYzI,EAAUyI,EAAUA,EAAQ5H,OACrD4H,EAAQjI,YACVO,EAAS2F,EAAU+B,EAAQjI,UAAW,IAAI,GAAQO,GAGtD,IAAIqG,EAAc,GACd9B,EAAY,EAChB,IAEE,IADA,IAAI1F,EAAO8I,EAAO5I,EAAQ,EAExBqH,EAAIvB,YAAYyB,UAAYvH,EAC5BF,EAAQuH,EAAIvB,YAAY/F,KAAKV,IAG7BuJ,EAAQZ,EAAc3I,EAAM8D,UAAUnD,EAAOF,EAAME,OAAQF,EAAM,IACjEE,EAAQF,EAAME,MAAQ4I,EAGxB,IADAZ,EAAc3I,EAAMkE,OAAOvD,IACvB2I,EAAUtB,EAAKsB,EAAQ5H,OAAQ4H,EAAUA,EAAQ5H,OAC/C4H,EAAQjI,YACVO,GAAUnC,GAGd,MAAO,CACL0G,UAAWA,EACXnG,MAAO4B,EACPf,SAAUgG,EACVmB,IAAKA,EAWR,CATC,MAAOwB,GACP,GAAIA,EAAEC,UAA6C,IAAlCD,EAAEC,QAAQC,QAAQ,WACjC,MAAO,CACLvD,UAAW,EACXnG,MAAOD,EAAOC,IAGhB,MAAMwJ,CAET,CACF,CAaD,SAASjB,EAAcoB,EAAMC,GAC3BA,EAAiBA,GAAkBlK,EAAQN,WAAaH,EAAWG,GACnE,IAAIwC,EAAS,CACXuE,UAAW,EACXnG,MAAOD,EAAO4J,IAEZE,EAAcjI,EAelB,OAdAgI,EAAelD,OAAOnF,GAAaY,SAAQ,SAAS0E,GAClD,IAAIyC,EAAU1C,EAAUC,EAAM8C,GAAM,GACpCL,EAAQzI,SAAWgG,EACfyC,EAAQnD,UAAY0D,EAAY1D,YAClC0D,EAAcP,GAEZA,EAAQnD,UAAYvE,EAAOuE,YAC7B0D,EAAcjI,EACdA,EAAS0H,EAEZ,IACGO,EAAYhJ,WACde,EAAOiI,YAAcA,GAEhBjI,CACR,CASD,SAASkI,EAAU9J,GACjB,OAASN,EAAQE,YAAcF,EAAQG,MAEnCG,EAAMC,QAAQT,GAAa,SAASiB,EAAOsJ,GACzC,OAAIrK,EAAQG,OAAmB,OAAVY,EACZ,OACEf,EAAQE,WACVmK,EAAG9J,QAAQ,MAAOP,EAAQE,YAE5B,EACV,IARCI,CASL,CAED,SAASgK,EAAeC,EAAeC,EAAaC,GAClD,IAAItJ,EAAWqJ,EAAc7K,EAAQ6K,GAAeC,EAChDvI,EAAW,CAACqI,EAAcG,QAU9B,OARKH,EAAcxJ,MAAM,aACvBmB,EAAOiB,KAAK,SAG2B,IAArCoH,EAAcP,QAAQ7I,IACxBe,EAAOiB,KAAKhC,GAGPe,EAAO8B,KAAK,KAAK0G,MACzB,CAMD,SAASC,EAAerJ,GACtB,IAAIb,EAAMmK,EAAgB1I,EAAQ2I,EAAYZ,EAC1C9I,EAAWE,EAAcC,GAEzBJ,EAAiBC,KAGjBnB,EAAQG,OACVM,EAAOqK,SAASC,gBAAgB,+BAAgC,QAC3DC,UAAY1J,EAAM0J,UAAUzK,QAAQ,MAAO,IAAIA,QAAQ,cAAe,MAE3EE,EAAOa,EAET2I,EAAOxJ,EAAKwK,YACZ/I,EAASf,EAAW+F,EAAU/F,EAAU8I,GAAM,GAAQpB,EAAcoB,IAEpEW,EAAiBjI,EAAWlC,IACTe,UACjBqJ,EAAaC,SAASC,gBAAgB,+BAAgC,QAC3DC,UAAY9I,EAAO5B,MAC9B4B,EAAO5B,MAAQ+C,EAAauH,EAAgBjI,EAAWkI,GAAaZ,IAEtE/H,EAAO5B,MAAQ8J,EAAUlI,EAAO5B,OAEhCgB,EAAM0J,UAAY9I,EAAO5B,MACzBgB,EAAMK,UAAY2I,EAAehJ,EAAMK,UAAWR,EAAUe,EAAOf,UACnEG,EAAMY,OAAS,CACbf,SAAUe,EAAOf,SACjBN,GAAIqB,EAAOuE,WAETvE,EAAOiI,cACT7I,EAAM6I,YAAc,CAClBhJ,SAAUe,EAAOiI,YAAYhJ,SAC7BN,GAAIqB,EAAOiI,YAAY1D,YAG5B,CAKD,SAASyE,EAAUC,GACjBnL,EAAU+B,EAAQ/B,EAASmL,EAC5B,CAKD,SAASC,IACP,IAAIA,EAAiBC,OAArB,CAEAD,EAAiBC,QAAS,EAE1B,IAAIC,EAASR,SAASS,iBAAiB,YACvCjM,EAAWmD,QAAQF,KAAK+I,EAAQX,EAJxB,CAKT,CAKD,SAASa,IACPC,iBAAiB,mBAAoBL,GAAkB,GACvDK,iBAAiB,OAAQL,GAAkB,EAC5C,CAED,SAASpM,EAAiBmI,EAAMhG,GAC9B,IAAIuK,EAAOhM,EAAUyH,GAAQhG,EAASrC,GAClC4M,EAAK/L,SACP+L,EAAK/L,QAAQ8C,SAAQ,SAASkJ,GAAQhM,EAAQgM,GAASxE,CAAM,GAEhE,CAED,SAASyE,IACP,OAAOrM,EAAWG,EACnB,CAED,SAASmC,EAAYsF,GAEnB,OADAA,GAAQA,GAAQ,IAAIxG,cACbjB,EAAUyH,IAASzH,EAAUC,EAAQwH,GAC7C,CAIDrI,EAAKoI,UAAYA,EACjBpI,EAAK+J,cAAgBA,EACrB/J,EAAKsL,UAAYA,EACjBtL,EAAK6L,eAAiBA,EACtB7L,EAAKoM,UAAYA,EACjBpM,EAAKsM,iBAAmBA,EACxBtM,EAAK0M,uBAAyBA,EAC9B1M,EAAKE,iBAAmBA,EACxBF,EAAK8M,cAAgBA,EACrB9M,EAAK+C,YAAcA,EACnB/C,EAAKiD,QAAUA,EAGfjD,EAAK+M,SAAW,eAChB/M,EAAKgN,oBAAsB,gBAC3BhN,EAAKiN,UAAY,oBACjBjN,EAAKkN,YAAc,yEACnBlN,EAAKmN,iBAAmB,eACxBnN,EAAKoN,eAAiB,+IAGtBpN,EAAKqN,iBAAmB,CACtBjG,MAAO,eAAgBO,UAAW,GAEpC3H,EAAKsN,iBAAmB,CACtBzK,UAAW,SACXuE,MAAO,IAAME,IAAK,IAClBG,QAAS,MACTG,SAAU,CAAC5H,EAAKqN,mBAElBrN,EAAKuN,kBAAoB,CACvB1K,UAAW,SACXuE,MAAO,IAAKE,IAAK,IACjBG,QAAS,MACTG,SAAU,CAAC5H,EAAKqN,mBAElBrN,EAAKwN,mBAAqB,CACxBpG,MAAO,8IAETpH,EAAKyN,QAAU,SAAUrG,EAAOE,EAAKoG,GACnC,IAAI9H,EAAO5F,EAAKiD,QACd,CACEJ,UAAW,UACXuE,MAAOA,EAAOE,IAAKA,EACnBM,SAAU,IAEZ8F,GAAY,CAAC,GAQf,OANA9H,EAAKgC,SAASvD,KAAKrE,EAAKwN,oBACxB5H,EAAKgC,SAASvD,KAAK,CACjBxB,UAAW,SACXuE,MAAO,+BACPO,UAAW,IAEN/B,CACR,EACD5F,EAAK2N,oBAAsB3N,EAAKyN,QAAQ,KAAM,KAC9CzN,EAAK4N,qBAAuB5N,EAAKyN,QAAQ,OAAQ,QACjDzN,EAAK6N,kBAAoB7N,EAAKyN,QAAQ,IAAK,KAC3CzN,EAAK8N,YAAc,CACjBjL,UAAW,SACXuE,MAAOpH,EAAKiN,UACZtF,UAAW,GAEb3H,EAAK+N,cAAgB,CACnBlL,UAAW,SACXuE,MAAOpH,EAAKkN,YACZvF,UAAW,GAEb3H,EAAKgO,mBAAqB,CACxBnL,UAAW,SACXuE,MAAOpH,EAAKmN,iBACZxF,UAAW,GAEb3H,EAAKiO,gBAAkB,CACrBpL,UAAW,SACXuE,MAAOpH,EAAKiN,UAALjN,kGASP2H,UAAW,GAEb3H,EAAKkO,YAAc,CACjBrL,UAAW,SACXuE,MAAO,KAAME,IAAK,aAClBG,QAAS,KACTG,SAAU,CACR5H,EAAKqN,iBACL,CACEjG,MAAO,KAAME,IAAK,KAClBK,UAAW,EACXC,SAAU,CAAC5H,EAAKqN,qBAItBrN,EAAKmO,WAAa,CAChBtL,UAAW,QACXuE,MAAOpH,EAAK+M,SACZpF,UAAW,GAEb3H,EAAKoO,sBAAwB,CAC3BvL,UAAW,QACXuE,MAAOpH,EAAKgN,oBACZrF,UAAW,GAEb3H,EAAKqO,aAAe,CAElBjH,MAAO,UAAYpH,EAAKgN,oBACxBrF,UAAW,EAId,EAjyBGtH,CAAQD,EATX,G,gBCVDD,EAAOC,QAAU,SAASJ,GACxB,MAAO,CACLuG,kBAAkB,EAClBG,SAAU,CACR4H,QACE,mxCAkBJ1G,SAAU,CACR5H,EAAK2N,oBACL3N,EAAK4N,qBACL5N,EAAKsN,iBACLtN,EAAKuN,kBACLvN,EAAK8N,YACL9N,EAAKkO,aAIV,C,gBC/BD/N,EAAOC,QAAU,SAASJ,GACtB,MAAO,CACH0G,SAAU,CACN6H,QAAU,kBACVD,QACA,wUASJ1G,SAAU,CACN5H,EAAKyN,QACD,UACA,OACA,CACI9F,UAAY,EACZC,SAAW,CACT,CAEIR,MAAO,OAAQO,UAAW,GAE9B,CACI9E,UAAY,SACZuE,MAAQ,iBAKtBpH,EAAK2N,oBACL3N,EAAK4N,qBACL,CACI/K,UAAW,SACXuE,MAAO,MAAOE,IAAK,OAEvB,CACIzE,UAAW,SACXuE,MAAO,MAAOE,IAAK,OAEvB,CACIzE,UAAW,SACXuE,MAAO,OAAQE,IAAK,OACpBK,UAAW,IAEf3H,EAAKsN,iBACL,CACIzK,UAAW,SACXuE,MAAO,iBACPQ,SAAU,CACN5H,EAAKqN,mBAGbrN,EAAKuN,kBACL,CACI1K,UAAW,OACXuE,MAAO,kBAAmBE,IAAK,IAC/BG,QAAS,MAEbzH,EAAKgO,mBACL,CACInL,UAAW,QACX8D,cAAe,6BAA8BW,IAAK,IAClDG,QAAS,IACTG,SAAU,CACN,CAACjB,cAAe,sBAChB3G,EAAKoO,wBAGbpO,EAAK+N,cACL,CACIlL,UAAW,OAAQuE,MAAO,cAE9B,CAEIvE,UAAW,SAAUuE,MAAO,6BAEhC,CAGIA,MAAO,KAAME,IAAK,MAEtB,CAEIzE,UAAW,SAAUuE,MAAO,uBAC5BO,UAAW,IAGnBF,QAAS,QAEhB,C,gBC9FDtH,EAAOC,QAAU,SAASJ,GACxB,IAAIwO,EAAU,iBACd,MAAO,CACL3N,QAAS,CAAC,SACV4G,QAAS,MACTG,SAAU,CACR,CACER,MAAO,IAAMoH,EAASlH,IAAK,IAC3BM,SAAU,CAAC,CAAC/E,UAAW,SAAUuE,MAAO,kBAE1C,CACEA,MAAO,iBAAmBoH,EAAU,IAAKhE,aAAa,EAAMlD,IAAK,IACjEM,SAAU,CACR,CACE/E,UAAW,SACXuE,MAAO,IAAKE,IAAK,IACjBiD,cAAc,EAAMK,YAAY,GAElC,CACExD,MAAOoH,GAET,CACE3L,UAAW,UACXuE,MAAO,YAIb,CACEvE,UAAW,YACXuE,MAAO,OAAQE,IAAK,KAAMsD,YAAY,EACtCnD,QAAS,YACTO,OAAQ,CAACV,IAAK,IAAKK,UAAW,IAEhC,CACEP,MAAO,SACPY,OAAQ,CAAC6B,YAAa,GAAI7D,gBAAgB,KAIjD,C,gBCrCD7F,EAAOC,QAAU,SAASJ,GACxB,IAEIyO,EACF,6VAqBEC,EAAmB,CACrB7L,UAAW,SACXuE,MAhBmB,uNAiBnBO,UAAW,GAGb,MAAO,CACL9G,QAAS,CAAC,OACV6F,SAAU+H,EACVhH,QAAS,QACTG,SAAU,CACR5H,EAAKyN,QACH,UACA,OACA,CACE9F,UAAY,EACZC,SAAW,CACT,CAEER,MAAO,OAAQO,UAAW,GAE5B,CACE9E,UAAY,SACZuE,MAAQ,iBAKhBpH,EAAK2N,oBACL3N,EAAK4N,qBACL5N,EAAKsN,iBACLtN,EAAKuN,kBACL,CACE1K,UAAW,QACX8D,cAAe,kBAAmBW,IAAK,QAASsD,YAAY,EAC5DlE,SAAU,kBACVe,QAAS,WACTG,SAAU,CACR,CAACjB,cAAe,sBAChB3G,EAAKoO,wBAGT,CAGEzH,cAAe,wBACfgB,UAAW,GAEb,CACE9E,UAAW,WACXuE,MAAO,qKAAoCpH,EAAKgN,oBAAsB,UAAWxC,aAAa,EAAMlD,IAAK,QACzGsD,YAAY,EACZlE,SAAU+H,EACV7G,SAAU,CACR,CACER,MAAOpH,EAAKgN,oBAAsB,UAAWxC,aAAa,EAC1D7C,UAAW,EACXC,SAAU,CAAC5H,EAAKoO,wBAElB,CACEvL,UAAW,SACXuE,MAAO,KAAME,IAAK,KAClBZ,SAAU+H,EACV9G,UAAW,EACXC,SAAU,CACR5H,EAAKsN,iBACLtN,EAAKuN,kBACLvN,EAAK+N,cACL/N,EAAK4N,uBAGT5N,EAAK2N,oBACL3N,EAAK4N,uBAGTc,EACA,CACE7L,UAAW,OAAQuE,MAAO,eAIjC,C,gBC1GDjH,EAAOC,QAAU,SAASJ,GACxB,IACI2O,EAAgB,CAClB3I,gBAAgB,EAChByB,QAAS,IACTE,UAAW,EACXC,SAAU,CACR,CACE/E,UAAW,OACXuE,MARa,qBASbO,UAAW,GAEb,CACEP,MAAO,OACPO,UAAW,EACXC,SAAU,CACR,CACE/E,UAAW,SACX6F,YAAY,EACZ7C,SAAU,CACR,CAACuB,MAAO,IAAKE,IAAK,KAClB,CAACF,MAAO,IAAKE,IAAK,KAClB,CAACF,MAAO,sBAOpB,MAAO,CACLvG,QAAS,CAAC,OAAQ,QAAS,MAAO,OAAQ,MAAO,MAAO,MAAO,SAC/D0F,kBAAkB,EAClBqB,SAAU,CACR,CACE/E,UAAW,OACXuE,MAAO,YAAaE,IAAK,IACzBK,UAAW,GACXC,SAAU,CAAC,CAACR,MAAO,MAAOE,IAAK,SAEjCtH,EAAKyN,QACH,UACA,SACA,CACE9F,UAAW,KAGf,CACEP,MAAO,kBAAmBE,IAAK,UAC/BK,UAAW,IAEb,CACE9E,UAAW,OACXuE,MAAO,SAAUE,IAAK,MAAOK,UAAW,IAE1C,CACEP,MAAO,YAAaE,IAAK,MACzBuC,YAAa,MACbjC,SAAU,CAAC,CAACR,MAAO,OAAQE,IAAK,OAAQgD,MAAM,KAEhD,CACEzH,UAAW,MAOXuE,MAAO,oBAAqBE,IAAK,IACjCZ,SAAU,CAAC2B,KAAM,SACjBT,SAAU,CAAC+G,GACX3G,OAAQ,CACNV,IAAK,WAAYqD,WAAW,EAC5Bd,YAAa,CAAC,MAAO,SAGzB,CACEhH,UAAW,MAEXuE,MAAO,qBAAsBE,IAAK,IAClCZ,SAAU,CAAC2B,KAAM,UACjBT,SAAU,CAAC+G,GACX3G,OAAQ,CACNV,IAAK,aAAgBqD,WAAW,EAChCd,YAAa,CAAC,eAAgB,aAAc,aAAc,SAG9D,CACEhH,UAAW,MACXuE,MAAO,MAAOE,IAAK,MACnBM,SAAU,CACR,CACE/E,UAAW,OAAQuE,MAAO,aAAcO,UAAW,GAErDgH,KAKT,C,gBCjGDxO,EAAOC,QAAU,SAASJ,GACxB,IAAI4O,EAAW,yBAEXC,EAAY,WACZC,EAAW,qBACXC,EAAM,CACRlM,UAAW,OACXgD,SAAU,CACR,CAAEuB,MAAOyH,EAAYC,EAAU,KAC/B,CAAE1H,MAAOyH,YAAkBC,EAAlBD,MACT,CAAEzH,MAAOyH,YAAkBC,EAAlBD,QAWTG,EAAS,CACXnM,UAAW,SACX8E,UAAW,EACX9B,SAAU,CACR,CAACuB,MAAO,IAAKE,IAAK,KAClB,CAACF,MAAO,IAAKE,IAAK,KAClB,CAACF,MAAO,QAEVQ,SAAU,CACR5H,EAAKqN,iBAhBgB,CACvBxK,UAAW,oBACXgD,SAAU,CACR,CAAEuB,MAAO,KAAQE,IAAK,MACtB,CAAEF,MAAO,KAAOE,IAAK,SAiBzB,MAAO,CACLf,kBAAkB,EAClB1F,QAAS,CAAC,MAAO,OAAQ,QACzB+G,SAAU,CACRmH,EACA,CACElM,UAAW,OACXuE,MAAO,UACPO,UAAW,IAEb,CACE9E,UAAW,SACXuE,MAAO,YACPuD,WAAW,EACX/C,SAAUoH,EAAOpH,SAEjBN,IAAKyH,EAAIlJ,SAAS,GAAGuB,OAEvB,CACEvE,UAAW,OACXuE,MAAO,KAAOpH,EAAKgN,qBAErB,CACEnK,UAAW,OACXuE,MAAO,IAAMpH,EAAKgN,oBAAsB,KAE1C,CACEnK,UAAW,OACXuE,MAAO,MAAQpH,EAAKgN,oBAAsB,KAE5C,CACEnK,UAAW,SACXuE,MAAO,OACPO,UAAW,GAEb3H,EAAK6N,kBACL,CACElH,cAAeiI,EACflI,SAAU,CAAC6H,QAASK,IAEtB5O,EAAK+N,cACLiB,GAGL,C,gBClFD7O,EAAOC,QAAU,SAASJ,GACxB,IAAI4O,EAAW,CAACL,QAAS,mBACrBU,EAAQ,CACVjP,EAAKuN,kBACLvN,EAAK+N,eAEHmB,EAAkB,CACpB5H,IAAK,IAAKtB,gBAAgB,EAAM4E,YAAY,EAC5ChD,SAAUqH,EACVvI,SAAUkI,GAERO,EAAS,CACX/H,MAAO,IAAKE,IAAK,IACjBM,SAAU,CACR,CACE/E,UAAW,OACXuE,MAAO,IAAKE,IAAK,IACjBM,SAAU,CAAC5H,EAAKqN,kBAChB5F,QAAS,OAEXzH,EAAKiD,QAAQiM,EAAiB,CAAC9H,MAAO,OAExCK,QAAS,OAEP2H,EAAQ,CACVhI,MAAO,MAAOE,IAAK,MACnBM,SAAU,CAAC5H,EAAKiD,QAAQiM,IACxBzH,QAAS,OAGX,OADAwH,EAAMzJ,OAAOyJ,EAAMvM,OAAQ,EAAGyM,EAAQC,GAC/B,CACLxH,SAAUqH,EACVvI,SAAUkI,EACVnH,QAAS,MAEZ,C,4DCnCDtH,EAAOC,QAAU,mrE,kBCAjBD,EAAOC,QAAU,w0pBAA05pB,EAAQ,IAAsD,6dAA+d,EAAQ,IAA+C,26CAA+6C,EAAQ,IAA6C,y9uC,+BCAn+tB,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,gBCAzCD,EAAOC,QAAU,owE,kBCAjBD,EAAOC,QAAU,yiDAA6iD,EAAQ,IAAmD,qWAAuW,EAAQ,IAAyD,uoBAA2oB,EAAQ,IAAqD,oC,+BCAzuF,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,gBCAzCD,EAAOC,QAAU,o0C,gBCAjBD,EAAOC,QAAU,2oC,gBCAjBD,EAAOC,QAAU,8sD,gBCAjBD,EAAOC,QAAU,68F,gBCAjBD,EAAOC,QAAU,0iD,gBCAjBD,EAAOC,QAAU,g0E,gBCAjBD,EAAOC,QAAU,i+3D,kBCAjBD,EAAOC,QAAU,6wJAA+wJ,EAAQ,IAAqC,2vBAA6vB,EAAQ,IAAoC,s22BAA6j3B,EAAQ,IAAmC,wpT,+BCA9tiC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,gBCAzCD,EAAOC,QAAU,guM,kBCAjB,IAAI4E,EAAM,CACT,mBAAoB,GACpB,eAAgB,GAChB,uBAAwB,IACxB,oBAAqB,IACrB,iBAAkB,IAClB,mBAAoB,IACpB,iBAAkB,IAClB,iBAAkB,IAClB,kBAAmB,IACnB,mCAAoC,IACpC,eAAgB,IAChB,gBAAiB,IACjB,iBAAkB,IAClB,iBAAkB,IAClB,aAAc,IACd,gBAAiB,IACjB,mBAAoB,IACpB,cAAe,IACf,oBAAqB,IACrB,kBAAmB,IACnB,qBAAsB,IACtB,gBAAiB,IACjB,mBAAoB,KAIrB,SAASqK,EAAeC,GACvB,IAAIC,EAAKC,EAAsBF,GAC/B,OAAOG,EAAoBF,EAC5B,CACA,SAASC,EAAsBF,GAC9B,IAAIG,EAAoBC,EAAE1K,EAAKsK,GAAM,CACpC,IAAItE,EAAI,IAAIH,MAAM,uBAAyByE,EAAM,KAEjD,MADAtE,EAAE2E,KAAO,mBACH3E,CACP,CACA,OAAOhG,EAAIsK,EACZ,CACAD,EAAe1O,KAAO,WACrB,OAAOD,OAAOC,KAAKqE,EACpB,EACAqK,EAAeO,QAAUJ,EACzBrP,EAAOC,QAAUiP,EACjBA,EAAeE,GAAK,E,kBC5CpBpP,EAAOC,QAAU,8wEAAgxE,EAAQ,IAAoD,sLAAwL,EAAQ,IAA4C,8B,+BCAzkF,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,kBCAzCD,EAAOC,QAAU,m3FAAq3F,EAAQ,IAA0C,miEAAsiE,EAAQ,IAAwC,ylBAA2lB,EAAQ,KAAkD,ouB,+BCAnqL,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,gBCAzCD,EAAOC,QAAU,05D,gBCAjBD,EAAOC,QAAU,owE,gBCAjBD,EAAOC,QAAU,ooK,gBCAjBD,EAAOC,QAAU,67iB,gBCAjBD,EAAOC,QAAU,0xE,kBCAjBD,EAAOC,QAAU,whHAA0hH,EAAQ,KAA4C,8B,+BCA/lH,OAAe,cAA0B,sC,kBCAzCD,EAAOC,QAAU,6oMAAipM,EAAQ,KAA6C,+B,+BCAvtM,OAAe,cAA0B,sC,gBCAzCD,EAAOC,QAAU,09B,kBCAjBD,EAAOC,QAAU,2iFAA6iF,EAAQ,KAAwC,0B,+BCA9mF,OAAe,cAA0B,sC,gBCAzCD,EAAOC,QAAU,m4L,gBCAjBD,EAAOC,QAAU,inB,gBCAjBD,EAAOC,QAAU,8/C,kBCAjBD,EAAOC,QAAU,mmEAAqmE,EAAQ,KAAwC,0B,+BCAtqE,OAAe,cAA0B,sC,gBCAzCD,EAAOC,QAAU,y8D,kBCAjBD,EAAOC,QAAU,+sIAAitI,EAAQ,KAAoD,0NAA4N,EAAQ,KAAuD,gPAAkP,EAAQ,KAAwD,80BAAg1B,EAAQ,KAAgD,qJ,+BCAnvL,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,gBCAzCD,EAAOC,QAAU,2pO,kBCAjBD,EAAOC,QAAU,g/JAAk/J,EAAQ,KAAiD,gmCAAsmC,EAAQ,KAA+C,q2BAAu2B,EAAQ,KAAsD,i5BAAm5B,EAAQ,KAA6C,wTAA0T,EAAQ,KAAuD,iD,+BCA/7Q,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,kBCAzCD,EAAOC,QAAU,kiGAAoiG,EAAQ,KAAyD,mOAAqO,EAAQ,KAAmD,8HAAgI,EAAQ,KAAsD,+JAAiK,EAAQ,KAAuD,qoBAAuoB,EAAQ,KAA+C,mJ,+BCAl/I,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,gBCAzCD,EAAOC,QAAU,khN,gBCAjBD,EAAOC,QAAU,0qK,kBCAjBD,EAAOC,QAAU,u+FAA0+F,EAAQ,KAAmD,irDAAmrD,EAAQ,KAAoD,8WAAkX,EAAQ,KAAuD,0/D,+BCAttK,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,+BCAzC,OAAe,cAA0B,sC,kJCA1B,MAA0B,iC,uCCO1B,SAASyP,IACtB,OACE,eAACC,EAAA,EAAD,CAAQC,kBAAgB,EAACC,OAAO,KAAKC,GAAG,OAAOlK,QAAQ,OAAOmK,MAAO,CAAEC,UAAW,qBAAlF,UACE,cAACL,EAAA,EAAOM,MAAR,CAAcC,KAAK,IAAnB,SACE,qBAAKC,IAAKC,EAAM1N,UAAU,YAAYqN,MAAO,CAAEM,UAAW,IAAMC,IAAI,iBAEtE,cAACX,EAAA,EAAOY,OAAR,CAAe,gBAAc,0BAC7B,cAACZ,EAAA,EAAOa,SAAR,CAAiBpB,GAAG,wBAApB,SACE,eAACqB,EAAA,EAAD,CAAK/N,UAAU,uBAAf,UACE,cAAC+N,EAAA,EAAIC,KAAL,CAAUR,KAAK,QAAf,SACE,eAACO,EAAA,EAAIE,KAAL,CAAUC,GAAID,IAAME,GAAG,QAAvB,UAA+B,mBAAGnO,UAAU,qBAA5C,sBAEF,cAAC+N,EAAA,EAAIC,KAAL,UACE,eAACD,EAAA,EAAIE,KAAL,CAAUT,KAAK,mDAAf,UAAkE,mBAAGxN,UAAU,2BAA/E,eAEF,cAAC+N,EAAA,EAAIC,KAAL,UACE,eAACD,EAAA,EAAIE,KAAL,CAAUT,KAAK,mCAAf,UAAkD,mBAAGxN,UAAU,wBAA/D,gBAEF,cAAC+N,EAAA,EAAIC,KAAL,UACE,eAACD,EAAA,EAAIE,KAAL,CAAUT,KAAK,8BAAf,UAA6C,mBAAGxN,UAAU,sBAA1D,qBAMX,CC9Bc,SAASoO,IACtB,OACE,qBAAKpO,UAAU,sBAAf,SACE,qBAAKA,UAAU,SAASqN,MAAO,CAACgB,QAAS,GAAIC,MAAO,SAApD,SACE,oKAAmI,mBAAGd,KAAK,yCAAR,0BAAnI,QAAyM,mBAAGA,KAAK,2CAAR,4BAAzM,UAIP,C,mBCLc,SAASe,IACtB,OACE,sBAAKvO,UAAU,uBAAuBqN,MAAO,CAAEmB,aAAc,GAAIC,YAAa,IAA9E,UACE,0DAEA,kaAOA,mHAES,oBAAGjB,KAAK,8BAAR,UAAsC,mBAAGxN,UAAU,sBAAnD,sBAFT,OAKA,+BACE,+BAAI,cAAC0O,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,mBAApC,wBAAJ,4DAGA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,iBAApC,sBAAJ,kEAGA,+BAAI,sBAAMnO,UAAU,cAAhB,mBAAJ,oSAIE,+BACE,+BAAI,cAAC0O,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,2BAApC,uBAAJ,uJAKA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,uBAApC,mBAAJ,gOAMA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,4BAApC,wBAAJ,uEAIA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,yBAApC,qBAAJ,6MAKA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,2BAApC,uBAAJ,iVAOA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,yBAApC,qBAAJ,mIAIA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,yBAApC,qBAAJ,8NAKA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,0BAApC,sBAAJ,yMAKA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,uBAApC,mBAAJ,+IAKA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,wBAApC,oBAAJ,+QAMA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,yBAApC,qBAAJ,wGAIA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,qBAApC,iBAAJ,6PAMA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,wBAApC,sBAAJ,0HAIA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,2BAApC,uBAAJ,iKAKA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,sBAApC,2CAAJ,sMAIA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,4BAApC,wBAAJ,sQAMA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,0BAApC,sBAAJ,0IAKA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,6BAApC,yBAAJ,mTAMA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,wBAApC,oBAAJ,sTAMA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,2BAApC,uBAAJ,sOAOJ,+BAAI,sBAAMnO,UAAU,cAAhB,uBAAJ,4EAEE,+BACE,+BAAI,mBAAGA,UAAU,cACVwN,KAAK,iGADR,yBAAJ,2GAIA,+BAAI,cAACkB,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,gBAApC,iBAAJ,0EAGA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,kBAApC,mBAAJ,gEAGA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,yBAApC,0BAAJ,yCAEA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,kBAApC,8BAAJ,6CAEA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,kBAApC,mBAAJ,wCAIJ,+BAAI,sBAAMnO,UAAU,cAAhB,oBAAJ,IACE,6BACE,6BAAI,cAAC0O,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,8BAApC,kEAEN,6BACE,6BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,0CAApC,oDAEN,6BACE,6BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,kCAApC,0CAGR,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,oBAApC,oCAAJ,0DAGA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,gBAApC,gCAAJ,0EAGA,+BAAI,cAACO,EAAA,EAAD,CAAS1O,UAAU,cAAcmO,GAAG,2BAApC,4CAAJ,sFAGA,+BACE,mBAAGnO,UAAU,cAAcwN,KAAK,WAAhC,4BADF,sDAMP,C,qEC/KGmB,G,MAAcvR,EAAQ,GAARA,IAElBuR,EAAYC,WAAWC,UAAS,WAC9BC,KAAKC,eAAc,WACND,KACNE,SAAQ,SAAUC,GAMrB,OALAA,EAAIC,OAAO,CAAC,QAAW,UAAUpO,SAAQ,SAASqO,GAEhD,IAAIvB,EAAMuB,EAAIC,aAAa,OAC3BD,EAAIE,aAAa,MAAOzB,EAAM,sBAAsB,EACrD,IACMqB,CACR,GACF,GACF,I,IAEoBK,E,kDACnB,WAAYC,GAAQ,IAAD,8BACjB,cAAMA,IACDC,cAAgB,EAAKA,cAAcC,KAAnB,gBAFJ,CAGlB,C,qDAED,WACEX,KAAKU,eACN,G,gCAED,WACEV,KAAKU,eACN,G,2BAED,WACEV,KAAKY,KAAK9F,iBAAiB,YAAY9I,SAAQ,SAAAhC,GAAI,OAAI3B,IAAK6L,eAAelK,EAAxB,GACpD,G,oBAED,WAAU,IAAD,OACH6Q,EAAYhB,EAAYiB,QAAQd,KAAKS,MAAMjM,OAAQ,CAAElB,WAAY0M,KAAKS,MAAMM,MAAOC,KAAM,SAE7F,OACE,qBACEC,IAAK,SAACL,GAAW,EAAKA,KAAOA,CAAO,EACpCM,wBAAyB,CAAEC,OAAQN,IAExC,K,GA1BmCO,a,MCrBvB,SAASC,EAAT,GAAgD,IAA1BC,EAAyB,EAAzBA,MAAOC,EAAkB,EAAlBA,QAASR,EAAS,EAATA,MACnD,OACE,sBAAK7P,UAAU,iCAAf,UACE,6BAAKoQ,IACL,uBACA,cAAC,EAAD,CACE9M,OAAQ+M,EACRR,MAAOA,MAGd,CAEDM,EAAWG,aAAe,CACxBT,MAAO,CAAC,GCZV,IAAIU,EAAiBnT,EAAQ,IACzBoT,EAAepT,EAAQ,IACvBqT,EAAUrT,EAAQ,IAClBsT,EAAYtT,EAAQ,IACpBuT,EAAmBvT,EAAQ,IAC3BwT,EAAYxT,EAAQ,IACpByT,EAAYzT,EAAQ,IACpB0T,EAAsB1T,EAAQ,IAC9B2T,EAAkC3T,EAAQ,IAC1C4T,EAA0B5T,EAAQ,IAClC6T,EAAkB7T,EAAQ,IAC1B8T,EAAc9T,EAAQ,IACtB+T,EAAyB/T,EAAQ,IAE/BgU,EAAU,CAAC,YAAa,QAAS,gBAAiB,aAAc,UAAW,YAAa,UAAW,UAAW,WAAY,QAAS,SAAU,UAAW,MAAO,SAAU,YAAa,OAAQ,aAAc,WAAY,cAAe,SAAU,aAEnPC,EAAe,CAAC,EAGL,SAASC,IACtB,OACE,gCACE,cAACC,EAAA,EAAD,CAAOC,OAAK,EAACC,KAAK,QAAQC,UAAWnD,IAErC,cAACgD,EAAA,EAAD,CAAOE,KAAK,mBAAmBlP,OAAQ,kBACrC,cAAC4N,EAAD,CAAYC,MAAM,aAAaC,QAASE,GADH,IAIvC,cAACgB,EAAA,EAAD,CAAOC,OAAK,EAACC,KAAK,iBAAiBlP,OAAQ,kBACzC,cAAC4N,EAAD,CAAYC,MAAM,WAAWC,QAASG,GADG,IAG3C,cAACe,EAAA,EAAD,CAAOE,KAAK,yBAAyBlP,OAAQ,YAAgB,IACvDoP,EADsD,EAAZvS,MAC3BwS,OAAOD,OAC1B,OAAOP,EAAQS,SAASF,GACtB,cAACxB,EAAD,CAAYC,MAAK,qBAAgBuB,EAAOxR,MAAM,KAAKgC,KAAI,SAAA2P,GAAI,OAAIA,EAAK,GAAGC,cAAgBD,EAAKnR,MAAM,EAAvC,IAA2C0B,KAAK,MAC/FgO,QAASgB,EAAaM,KAClC,cAACK,EAAA,EAAD,CAAU7D,GAAG,SAChB,IAED,cAACoD,EAAA,EAAD,CAAOE,KAAK,gBAAgBlP,OAAQ,kBAClC,cAAC4N,EAAD,CAAYC,MAAM,yBAAyBC,QAASI,GADlB,IAIpC,cAACc,EAAA,EAAD,CAAOE,KAAK,kBAAkBlP,OAAQ,kBACpC,cAAC4N,EAAD,CAAYC,MAAM,gBAAgBC,QAASK,GADP,IAItC,cAACa,EAAA,EAAD,CAAOE,KAAK,yBAAyBlP,OAAQ,kBAC3C,cAAC4N,EAAD,CAAYC,MAAM,uBAAuBC,QAASM,GADP,IAI7C,cAACY,EAAA,EAAD,CAAOE,KAAK,kBAAkBlP,OAAQ,kBACpC,cAAC4N,EAAD,CAAYC,MAAM,2BAA2BC,QAASO,GADlB,IAItC,cAACW,EAAA,EAAD,CAAOE,KAAK,kBAAkBlP,OAAQ,kBACpC,cAAC4N,EAAD,CAAYC,MAAM,gBAAgBC,QAASQ,GADP,IAItC,cAACU,EAAA,EAAD,CAAOE,KAAK,8BAA8BlP,OAAQ,kBAChD,cAAC4N,EAAD,CAAYC,MAAM,mDAAmDC,QAASS,GAD9B,IAIlD,cAACS,EAAA,EAAD,CAAOE,KAAK,0CAA0ClP,OAAQ,kBAC5D,cAAC4N,EAAD,CAAYC,MAAM,qCAAqCC,QAASU,GADJ,IAI9D,cAACQ,EAAA,EAAD,CAAOE,KAAK,kCAAkClP,OAAQ,kBACpD,cAAC4N,EAAD,CAAYC,MAAM,wBAAwBC,QAASW,GADC,IAItD,cAACO,EAAA,EAAD,CAAOE,KAAK,oBAAoBlP,OAAQ,kBACtC,cAAC4N,EAAD,CAAYC,MAAM,cAAcC,QAASY,GADH,IAIxC,cAACM,EAAA,EAAD,CAAOE,KAAK,gBAAgBlP,OAAQ,kBAClC,cAAC4N,EAAD,CAAYC,MAAM,UAAUC,QAASa,GADH,IAIpC,cAACK,EAAA,EAAD,CAAOE,KAAK,2BAA2BlP,OAAQ,kBAC7C,cAAC4N,EAAD,CAAYC,MAAM,sBAAsBC,QAASc,GADJ,MAKpD,CAnEDC,EAAQtQ,SAAQ,SAAAmR,GAAG,OAAIZ,EAAaY,GAAO7U,MAAQ,YAAyD6U,EAA1D,SAA/B,I,6BCpBJ,SAASC,IACpB,OACI,cAACjF,EAAA,EAAD,CAAQkF,OAAO,MAAMnS,UAAU,+DAA/B,SACI,eAACoS,EAAA,EAAD,CAAOlP,QAAQ,UAAf,UACI,cAACkP,EAAA,EAAMC,QAAP,qCACA,cAACC,EAAA,EAAD,CAAQpP,QAAQ,YAAYsK,KAAK,mDAAjC,gCACA,uBAHJ,8CAQX,CCPc,SAAS+E,IACtB,OACE,gCACE,cAACvF,EAAD,IAEA,cAACkF,EAAD,IAEA,eAACM,EAAA,EAAD,WACE,cAACjB,EAAA,EAAD,CAAOC,OAAK,EAACC,KAAK,QAAQC,UAAWnD,IAEnC,cAACgD,EAAA,EAAD,CAAOC,OAAK,EAACC,KAAK,gBAAgBC,UAAW,WAEzC,OADAjU,OAAOgV,SAAS7T,QAAQ,YACjB,IACV,IAGH,cAAC0S,EAAD,IAEA,cAACC,EAAA,EAAD,CAAOE,KAAK,KAAKlP,OAAQ,kBAAM,cAACyP,EAAA,EAAD,CAAU7D,GAAG,SAAnB,OAG3B,qBAAKnO,UAAU,kBAAkBqN,MAAO,CAAEmB,aAAc,EAAGC,YAAa,GAAxE,SACE,cAACL,EAAD,CAAQpO,UAAU,YAIzB,CCtBmBsF,QACW,cAA7B7H,OAAOgV,SAASC,UAEe,UAA7BjV,OAAOgV,SAASC,UAEhBjV,OAAOgV,SAASC,SAAStT,MAAM,2D,YCH7BuT,G,cAAUC,eAEhBC,IAAStQ,OAAO,cAACuQ,EAAA,EAAD,CAAQH,QAASA,EAAjB,SAA0B,cAACJ,EAAD,MAAiBpJ,SAAS4J,eAAe,SD+G7E,kBAAmBC,WACrBA,UAAUC,cAAcC,MACrBC,MAAK,SAACC,GACLA,EAAaC,YACd,IACAC,OAAM,SAACC,GACNC,QAAQD,MAAMA,EAAMnL,QACrB,G","file":"static/js/main.30543131.chunk.js","sourcesContent":["var hljs = require('./highlight');\n\nhljs.registerLanguage('gradle', require('./languages/gradle'));\nhljs.registerLanguage('groovy', require('./languages/groovy'));\nhljs.registerLanguage('http', require('./languages/http'));\nhljs.registerLanguage('java', require('./languages/java'));\nhljs.registerLanguage('xml', require('./languages/xml'));\nhljs.registerLanguage('yaml', require('./languages/yaml'));\nhljs.registerLanguage('json', require('./languages/json'));\n\nmodule.exports = hljs;","/*\nSyntax highlighting with language autodetection.\nhttps://highlightjs.org/\n*/\n\n/* eslint no-restricted-globals: off */\n/* eslint no-undef: off */\n/* eslint no-mixed-operators: off */\n/* eslint no-useless-escape: off */\n\n(function(factory) {\n\n // Find the global object for export to both the browser and web workers.\n var globalObject = typeof window === 'object' && window ||\n typeof self === 'object' && self;\n\n // Setup highlight.js for different environments. First is Node.js or\n // CommonJS.\n if(typeof exports !== 'undefined') {\n factory(exports);\n } else if(globalObject) {\n // Export hljs globally even when using AMD for cases when this script\n // is loaded with others that may still expect a global hljs.\n globalObject.hljs = factory({});\n\n // Finally register the global hljs with AMD.\n if(typeof define === 'function' && define.amd) {\n define([], function() {\n return globalObject.hljs;\n });\n }\n }\n\n}(function(hljs) {\n // Convenience variables for build-in objects\n var ArrayProto = [],\n objectKeys = Object.keys;\n\n // Global internal variables used within the highlight.js library.\n var languages = {},\n aliases = {};\n\n // Regular expressions used throughout the highlight.js library.\n var noHighlightRe = /^(no-?highlight|plain|text)$/i,\n languagePrefixRe = /\\blang(?:uage)?-([\\w-]+)\\b/i,\n fixMarkupRe = /((^(<[^>]+>|\\t|)+|(?:\\n)))/gm;\n\n var spanEndTag = '</span>';\n\n // Global options used when within external APIs. This is modified when\n // calling the `hljs.configure` function.\n var options = {\n classPrefix: 'hljs-',\n tabReplace: null,\n useBR: false,\n languages: undefined\n };\n\n\n /* Utility functions */\n\n function escape(value) {\n return value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n }\n\n function tag(node) {\n return node.nodeName.toLowerCase();\n }\n\n function testRe(re, lexeme) {\n var match = re && re.exec(lexeme);\n return match && match.index === 0;\n }\n\n function isNotHighlighted(language) {\n return noHighlightRe.test(language);\n }\n\n function blockLanguage(block) {\n var i, match, length, _class;\n var classes = block.className + ' ';\n\n classes += block.parentNode ? block.parentNode.className : '';\n\n // language-* takes precedence over non-prefixed class names.\n match = languagePrefixRe.exec(classes);\n if (match) {\n return getLanguage(match[1]) ? match[1] : 'no-highlight';\n }\n\n classes = classes.split(/\\s+/);\n\n for (i = 0, length = classes.length; i < length; i++) {\n _class = classes[i]\n\n if (isNotHighlighted(_class) || getLanguage(_class)) {\n return _class;\n }\n }\n }\n\n function inherit(parent) { // inherit(parent, override_obj, override_obj, ...)\n var key;\n var result = {};\n var objects = Array.prototype.slice.call(arguments, 1);\n\n for (key in parent)\n result[key] = parent[key];\n objects.forEach(function(obj) {\n for (key in obj)\n result[key] = obj[key];\n });\n return result;\n }\n\n /* Stream merging */\n\n function nodeStream(node) {\n var result = [];\n (function _nodeStream(node, offset) {\n for (var child = node.firstChild; child; child = child.nextSibling) {\n if (child.nodeType === 3)\n offset += child.nodeValue.length;\n else if (child.nodeType === 1) {\n result.push({\n event: 'start',\n offset: offset,\n node: child\n });\n offset = _nodeStream(child, offset);\n // Prevent void elements from having an end tag that would actually\n // double them in the output. There are more void elements in HTML\n // but we list only those realistically expected in code display.\n if (!tag(child).match(/br|hr|img|input/)) {\n result.push({\n event: 'stop',\n offset: offset,\n node: child\n });\n }\n }\n }\n return offset;\n })(node, 0);\n return result;\n }\n\n function mergeStreams(original, highlighted, value) {\n var processed = 0;\n var result = '';\n var nodeStack = [];\n\n function selectStream() {\n if (!original.length || !highlighted.length) {\n return original.length ? original : highlighted;\n }\n if (original[0].offset !== highlighted[0].offset) {\n return (original[0].offset < highlighted[0].offset) ? original : highlighted;\n }\n\n /*\n To avoid starting the stream just before it should stop the order is\n ensured that original always starts first and closes last:\n\n if (event1 == 'start' && event2 == 'start')\n return original;\n if (event1 == 'start' && event2 == 'stop')\n return highlighted;\n if (event1 == 'stop' && event2 == 'start')\n return original;\n if (event1 == 'stop' && event2 == 'stop')\n return highlighted;\n\n ... which is collapsed to:\n */\n return highlighted[0].event === 'start' ? original : highlighted;\n }\n\n function open(node) {\n function attr_str(a) {return ' ' + a.nodeName + '=\"' + escape(a.value).replace('\"', '"') + '\"';}\n result += '<' + tag(node) + ArrayProto.map.call(node.attributes, attr_str).join('') + '>';\n }\n\n function close(node) {\n result += '</' + tag(node) + '>';\n }\n\n function render(event) {\n (event.event === 'start' ? open : close)(event.node);\n }\n\n while (original.length || highlighted.length) {\n var stream = selectStream();\n result += escape(value.substring(processed, stream[0].offset));\n processed = stream[0].offset;\n if (stream === original) {\n /*\n On any opening or closing tag of the original markup we first close\n the entire highlighted node stack, then render the original tag along\n with all the following original tags at the same offset and then\n reopen all the tags on the highlighted stack.\n */\n nodeStack.reverse().forEach(close);\n do {\n render(stream.splice(0, 1)[0]);\n stream = selectStream();\n } while (stream === original && stream.length && stream[0].offset === processed);\n nodeStack.reverse().forEach(open);\n } else {\n if (stream[0].event === 'start') {\n nodeStack.push(stream[0].node);\n } else {\n nodeStack.pop();\n }\n render(stream.splice(0, 1)[0]);\n }\n }\n return result + escape(value.substr(processed));\n }\n\n /* Initialization */\n\n function expand_mode(mode) {\n if (mode.variants && !mode.cached_variants) {\n mode.cached_variants = mode.variants.map(function(variant) {\n return inherit(mode, {variants: null}, variant);\n });\n }\n return mode.cached_variants || (mode.endsWithParent && [inherit(mode)]) || [mode];\n }\n\n function compileLanguage(language) {\n\n function reStr(re) {\n return (re && re.source) || re;\n }\n\n function langRe(value, global) {\n return new RegExp(\n reStr(value),\n 'm' + (language.case_insensitive ? 'i' : '') + (global ? 'g' : '')\n );\n }\n\n function compileMode(mode, parent) {\n if (mode.compiled)\n return;\n mode.compiled = true;\n\n mode.keywords = mode.keywords || mode.beginKeywords;\n if (mode.keywords) {\n var compiled_keywords = {};\n\n var flatten = function(className, str) {\n if (language.case_insensitive) {\n str = str.toLowerCase();\n }\n str.split(' ').forEach(function(kw) {\n var pair = kw.split('|');\n compiled_keywords[pair[0]] = [className, pair[1] ? Number(pair[1]) : 1];\n });\n };\n\n if (typeof mode.keywords === 'string') { // string\n flatten('keyword', mode.keywords);\n } else {\n objectKeys(mode.keywords).forEach(function (className) {\n flatten(className, mode.keywords[className]);\n });\n }\n mode.keywords = compiled_keywords;\n }\n mode.lexemesRe = langRe(mode.lexemes || /\\w+/, true);\n\n if (parent) {\n if (mode.beginKeywords) {\n mode.begin = '\\\\b(' + mode.beginKeywords.split(' ').join('|') + ')\\\\b';\n }\n if (!mode.begin)\n mode.begin = /\\B|\\b/;\n mode.beginRe = langRe(mode.begin);\n if (!mode.end && !mode.endsWithParent)\n mode.end = /\\B|\\b/;\n if (mode.end)\n mode.endRe = langRe(mode.end);\n mode.terminator_end = reStr(mode.end) || '';\n if (mode.endsWithParent && parent.terminator_end)\n mode.terminator_end += (mode.end ? '|' : '') + parent.terminator_end;\n }\n if (mode.illegal)\n mode.illegalRe = langRe(mode.illegal);\n if (mode.relevance == null)\n mode.relevance = 1;\n if (!mode.contains) {\n mode.contains = [];\n }\n mode.contains = Array.prototype.concat.apply([], mode.contains.map(function(c) {\n return expand_mode(c === 'self' ? mode : c)\n }));\n mode.contains.forEach(function(c) {compileMode(c, mode);});\n\n if (mode.starts) {\n compileMode(mode.starts, parent);\n }\n\n var terminators =\n mode.contains.map(function(c) {\n return c.beginKeywords ? '\\\\.?(' + c.begin + ')\\\\.?' : c.begin;\n })\n .concat([mode.terminator_end, mode.illegal])\n .map(reStr)\n .filter(Boolean);\n mode.terminators = terminators.length ? langRe(terminators.join('|'), true) : {exec: function(/*s*/) {return null;}};\n }\n\n compileMode(language);\n }\n\n /*\n Core highlighting function. Accepts a language name, or an alias, and a\n string with the code to highlight. Returns an object with the following\n properties:\n\n - relevance (int)\n - value (an HTML string with highlighting markup)\n\n */\n function highlight(name, value, ignore_illegals, continuation) {\n\n function subMode(lexeme, mode) {\n var i, length;\n\n for (i = 0, length = mode.contains.length; i < length; i++) {\n if (testRe(mode.contains[i].beginRe, lexeme)) {\n return mode.contains[i];\n }\n }\n }\n\n function endOfMode(mode, lexeme) {\n if (testRe(mode.endRe, lexeme)) {\n while (mode.endsParent && mode.parent) {\n mode = mode.parent;\n }\n return mode;\n }\n if (mode.endsWithParent) {\n return endOfMode(mode.parent, lexeme);\n }\n }\n\n function isIllegal(lexeme, mode) {\n return !ignore_illegals && testRe(mode.illegalRe, lexeme);\n }\n\n function keywordMatch(mode, match) {\n var match_str = language.case_insensitive ? match[0].toLowerCase() : match[0];\n return mode.keywords.hasOwnProperty(match_str) && mode.keywords[match_str];\n }\n\n function buildSpan(classname, insideSpan, leaveOpen, noPrefix) {\n var classPrefix = noPrefix ? '' : options.classPrefix,\n openSpan = '<span class=\"' + classPrefix,\n closeSpan = leaveOpen ? '' : spanEndTag\n\n openSpan += classname + '\">';\n\n return openSpan + insideSpan + closeSpan;\n }\n\n function processKeywords() {\n var keyword_match, last_index, match, result;\n\n if (!top.keywords)\n return escape(mode_buffer);\n\n result = '';\n last_index = 0;\n top.lexemesRe.lastIndex = 0;\n match = top.lexemesRe.exec(mode_buffer);\n\n while (match) {\n result += escape(mode_buffer.substring(last_index, match.index));\n keyword_match = keywordMatch(top, match);\n if (keyword_match) {\n relevance += keyword_match[1];\n result += buildSpan(keyword_match[0], escape(match[0]));\n } else {\n result += escape(match[0]);\n }\n last_index = top.lexemesRe.lastIndex;\n match = top.lexemesRe.exec(mode_buffer);\n }\n return result + escape(mode_buffer.substr(last_index));\n }\n\n function processSubLanguage() {\n var explicit = typeof top.subLanguage === 'string';\n if (explicit && !languages[top.subLanguage]) {\n return escape(mode_buffer);\n }\n\n var result = explicit ?\n highlight(top.subLanguage, mode_buffer, true, continuations[top.subLanguage]) :\n highlightAuto(mode_buffer, top.subLanguage.length ? top.subLanguage : undefined);\n\n // Counting embedded language score towards the host language may be disabled\n // with zeroing the containing mode relevance. Usecase in point is Markdown that\n // allows XML everywhere and makes every XML snippet to have a much larger Markdown\n // score.\n if (top.relevance > 0) {\n relevance += result.relevance;\n }\n if (explicit) {\n continuations[top.subLanguage] = result.top;\n }\n return buildSpan(result.language, result.value, false, true);\n }\n\n function processBuffer() {\n result += (top.subLanguage != null ? processSubLanguage() : processKeywords());\n mode_buffer = '';\n }\n\n function startNewMode(mode) {\n result += mode.className? buildSpan(mode.className, '', true): '';\n top = Object.create(mode, {parent: {value: top}});\n }\n\n function processLexeme(buffer, lexeme) {\n\n mode_buffer += buffer;\n\n if (lexeme == null) {\n processBuffer();\n return 0;\n }\n\n var new_mode = subMode(lexeme, top);\n if (new_mode) {\n if (new_mode.skip) {\n mode_buffer += lexeme;\n } else {\n if (new_mode.excludeBegin) {\n mode_buffer += lexeme;\n }\n processBuffer();\n if (!new_mode.returnBegin && !new_mode.excludeBegin) {\n mode_buffer = lexeme;\n }\n }\n startNewMode(new_mode, lexeme);\n return new_mode.returnBegin ? 0 : lexeme.length;\n }\n\n var end_mode = endOfMode(top, lexeme);\n if (end_mode) {\n var origin = top;\n if (origin.skip) {\n mode_buffer += lexeme;\n } else {\n if (!(origin.returnEnd || origin.excludeEnd)) {\n mode_buffer += lexeme;\n }\n processBuffer();\n if (origin.excludeEnd) {\n mode_buffer = lexeme;\n }\n }\n do {\n if (top.className) {\n result += spanEndTag;\n }\n if (!top.skip && !top.subLanguage) {\n relevance += top.relevance;\n }\n top = top.parent;\n } while (top !== end_mode.parent);\n if (end_mode.starts) {\n startNewMode(end_mode.starts, '');\n }\n return origin.returnEnd ? 0 : lexeme.length;\n }\n\n if (isIllegal(lexeme, top))\n throw new Error('Illegal lexeme \"' + lexeme + '\" for mode \"' + (top.className || '<unnamed>') + '\"');\n\n /*\n Parser should not reach this point as all types of lexemes should be caught\n earlier, but if it does due to some bug make sure it advances at least one\n character forward to prevent infinite looping.\n */\n mode_buffer += lexeme;\n return lexeme.length || 1;\n }\n\n var language = getLanguage(name);\n if (!language) {\n throw new Error('Unknown language: \"' + name + '\"');\n }\n\n compileLanguage(language);\n var top = continuation || language;\n var continuations = {}; // keep continuations for sub-languages\n var result = '', current;\n for(current = top; current !== language; current = current.parent) {\n if (current.className) {\n result = buildSpan(current.className, '', true) + result;\n }\n }\n var mode_buffer = '';\n var relevance = 0;\n try {\n var match, count, index = 0;\n while (true) {\n top.terminators.lastIndex = index;\n match = top.terminators.exec(value);\n if (!match)\n break;\n count = processLexeme(value.substring(index, match.index), match[0]);\n index = match.index + count;\n }\n processLexeme(value.substr(index));\n for(current = top; current.parent; current = current.parent) { // close dangling modes\n if (current.className) {\n result += spanEndTag;\n }\n }\n return {\n relevance: relevance,\n value: result,\n language: name,\n top: top\n };\n } catch (e) {\n if (e.message && e.message.indexOf('Illegal') !== -1) {\n return {\n relevance: 0,\n value: escape(value)\n };\n } else {\n throw e;\n }\n }\n }\n\n /*\n Highlighting with language detection. Accepts a string with the code to\n highlight. Returns an object with the following properties:\n\n - language (detected language)\n - relevance (int)\n - value (an HTML string with highlighting markup)\n - second_best (object with the same structure for second-best heuristically\n detected language, may be absent)\n\n */\n function highlightAuto(text, languageSubset) {\n languageSubset = languageSubset || options.languages || objectKeys(languages);\n var result = {\n relevance: 0,\n value: escape(text)\n };\n var second_best = result;\n languageSubset.filter(getLanguage).forEach(function(name) {\n var current = highlight(name, text, false);\n current.language = name;\n if (current.relevance > second_best.relevance) {\n second_best = current;\n }\n if (current.relevance > result.relevance) {\n second_best = result;\n result = current;\n }\n });\n if (second_best.language) {\n result.second_best = second_best;\n }\n return result;\n }\n\n /*\n Post-processing of the highlighted markup:\n\n - replace TABs with something more useful\n - replace real line-breaks with '<br>' for non-pre containers\n\n */\n function fixMarkup(value) {\n return !(options.tabReplace || options.useBR)\n ? value\n : value.replace(fixMarkupRe, function(match, p1) {\n if (options.useBR && match === '\\n') {\n return '<br>';\n } else if (options.tabReplace) {\n return p1.replace(/\\t/g, options.tabReplace);\n }\n return '';\n });\n }\n\n function buildClassName(prevClassName, currentLang, resultLang) {\n var language = currentLang ? aliases[currentLang] : resultLang,\n result = [prevClassName.trim()];\n\n if (!prevClassName.match(/\\bhljs\\b/)) {\n result.push('hljs');\n }\n\n if (prevClassName.indexOf(language) === -1) {\n result.push(language);\n }\n\n return result.join(' ').trim();\n }\n\n /*\n Applies highlighting to a DOM node containing code. Accepts a DOM node and\n two optional parameters for fixMarkup.\n */\n function highlightBlock(block) {\n var node, originalStream, result, resultNode, text;\n var language = blockLanguage(block);\n\n if (isNotHighlighted(language))\n return;\n\n if (options.useBR) {\n node = document.createElementNS('http://www.w3.org/1999/xhtml', 'div');\n node.innerHTML = block.innerHTML.replace(/\\n/g, '').replace(/<br[ \\/]*>/g, '\\n');\n } else {\n node = block;\n }\n text = node.textContent;\n result = language ? highlight(language, text, true) : highlightAuto(text);\n\n originalStream = nodeStream(node);\n if (originalStream.length) {\n resultNode = document.createElementNS('http://www.w3.org/1999/xhtml', 'div');\n resultNode.innerHTML = result.value;\n result.value = mergeStreams(originalStream, nodeStream(resultNode), text);\n }\n result.value = fixMarkup(result.value);\n\n block.innerHTML = result.value;\n block.className = buildClassName(block.className, language, result.language);\n block.result = {\n language: result.language,\n re: result.relevance\n };\n if (result.second_best) {\n block.second_best = {\n language: result.second_best.language,\n re: result.second_best.relevance\n };\n }\n }\n\n /*\n Updates highlight.js global options with values passed in the form of an object.\n */\n function configure(user_options) {\n options = inherit(options, user_options);\n }\n\n /*\n Applies highlighting to all <pre><code>..</code></pre> blocks on a page.\n */\n function initHighlighting() {\n if (initHighlighting.called)\n return;\n initHighlighting.called = true;\n\n var blocks = document.querySelectorAll('pre code');\n ArrayProto.forEach.call(blocks, highlightBlock);\n }\n\n /*\n Attaches highlighting to the page load event.\n */\n function initHighlightingOnLoad() {\n addEventListener('DOMContentLoaded', initHighlighting, false);\n addEventListener('load', initHighlighting, false);\n }\n\n function registerLanguage(name, language) {\n var lang = languages[name] = language(hljs);\n if (lang.aliases) {\n lang.aliases.forEach(function(alias) {aliases[alias] = name;});\n }\n }\n\n function listLanguages() {\n return objectKeys(languages);\n }\n\n function getLanguage(name) {\n name = (name || '').toLowerCase();\n return languages[name] || languages[aliases[name]];\n }\n\n /* Interface definition */\n\n hljs.highlight = highlight;\n hljs.highlightAuto = highlightAuto;\n hljs.fixMarkup = fixMarkup;\n hljs.highlightBlock = highlightBlock;\n hljs.configure = configure;\n hljs.initHighlighting = initHighlighting;\n hljs.initHighlightingOnLoad = initHighlightingOnLoad;\n hljs.registerLanguage = registerLanguage;\n hljs.listLanguages = listLanguages;\n hljs.getLanguage = getLanguage;\n hljs.inherit = inherit;\n\n // Common regexps\n hljs.IDENT_RE = '[a-zA-Z]\\\\w*';\n hljs.UNDERSCORE_IDENT_RE = '[a-zA-Z_]\\\\w*';\n hljs.NUMBER_RE = '\\\\b\\\\d+(\\\\.\\\\d+)?';\n hljs.C_NUMBER_RE = '(-?)(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)'; // 0x..., 0..., decimal, float\n hljs.BINARY_NUMBER_RE = '\\\\b(0b[01]+)'; // 0b...\n hljs.RE_STARTERS_RE = '!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~';\n\n // Common modes\n hljs.BACKSLASH_ESCAPE = {\n begin: '\\\\\\\\[\\\\s\\\\S]', relevance: 0\n };\n hljs.APOS_STRING_MODE = {\n className: 'string',\n begin: '\\'', end: '\\'',\n illegal: '\\\\n',\n contains: [hljs.BACKSLASH_ESCAPE]\n };\n hljs.QUOTE_STRING_MODE = {\n className: 'string',\n begin: '\"', end: '\"',\n illegal: '\\\\n',\n contains: [hljs.BACKSLASH_ESCAPE]\n };\n hljs.PHRASAL_WORDS_MODE = {\n 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/\n };\n hljs.COMMENT = function (begin, end, inherits) {\n var mode = hljs.inherit(\n {\n className: 'comment',\n begin: begin, end: end,\n contains: []\n },\n inherits || {}\n );\n mode.contains.push(hljs.PHRASAL_WORDS_MODE);\n mode.contains.push({\n className: 'doctag',\n begin: '(?:TODO|FIXME|NOTE|BUG|XXX):',\n relevance: 0\n });\n return mode;\n };\n hljs.C_LINE_COMMENT_MODE = hljs.COMMENT('//', '$');\n hljs.C_BLOCK_COMMENT_MODE = hljs.COMMENT('/\\\\*', '\\\\*/');\n hljs.HASH_COMMENT_MODE = hljs.COMMENT('#', '$');\n hljs.NUMBER_MODE = {\n className: 'number',\n begin: hljs.NUMBER_RE,\n relevance: 0\n };\n hljs.C_NUMBER_MODE = {\n className: 'number',\n begin: hljs.C_NUMBER_RE,\n relevance: 0\n };\n hljs.BINARY_NUMBER_MODE = {\n className: 'number',\n begin: hljs.BINARY_NUMBER_RE,\n relevance: 0\n };\n hljs.CSS_NUMBER_MODE = {\n className: 'number',\n begin: hljs.NUMBER_RE + '(' +\n '%|em|ex|ch|rem' +\n '|vw|vh|vmin|vmax' +\n '|cm|mm|in|pt|pc|px' +\n '|deg|grad|rad|turn' +\n '|s|ms' +\n '|Hz|kHz' +\n '|dpi|dpcm|dppx' +\n ')?',\n relevance: 0\n };\n hljs.REGEXP_MODE = {\n className: 'regexp',\n begin: /\\//, end: /\\/[gimuy]*/,\n illegal: /\\n/,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n {\n begin: /\\[/, end: /\\]/,\n relevance: 0,\n contains: [hljs.BACKSLASH_ESCAPE]\n }\n ]\n };\n hljs.TITLE_MODE = {\n className: 'title',\n begin: hljs.IDENT_RE,\n relevance: 0\n };\n hljs.UNDERSCORE_TITLE_MODE = {\n className: 'title',\n begin: hljs.UNDERSCORE_IDENT_RE,\n relevance: 0\n };\n hljs.METHOD_GUARD = {\n // excludes method names from keyword processing\n begin: '\\\\.\\\\s*' + hljs.UNDERSCORE_IDENT_RE,\n relevance: 0\n };\n\n return hljs;\n}));\n\n","module.exports = function(hljs) {\n return {\n case_insensitive: true,\n keywords: {\n keyword:\n 'task project allprojects subprojects artifacts buildscript configurations ' +\n 'dependencies repositories sourceSets description delete from into include ' +\n 'exclude source classpath destinationDir includes options sourceCompatibility ' +\n 'targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant ' +\n 'def abstract break case catch continue default do else extends final finally ' +\n 'for if implements instanceof native new private protected public return static ' +\n 'switch synchronized throw throws transient try volatile while strictfp package ' +\n 'import false null super this true antlrtask checkstyle codenarc copy boolean ' +\n 'byte char class double float int interface long short void compile runTime ' +\n 'file fileTree abs any append asList asWritable call collect compareTo count ' +\n 'div dump each eachByte eachFile eachLine every find findAll flatten getAt ' +\n 'getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods ' +\n 'isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter ' +\n 'newReader newWriter next plus pop power previous print println push putAt read ' +\n 'readBytes readLines reverse reverseEach round size sort splitEachLine step subMap ' +\n 'times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader ' +\n 'withStream withWriter withWriterAppend write writeLine'\n },\n contains: [\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE,\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n hljs.NUMBER_MODE,\n hljs.REGEXP_MODE\n\n ]\n }\n};","/* eslint no-useless-escape: off */\n\nmodule.exports = function(hljs) {\n return {\n keywords: {\n literal : 'true false null',\n keyword:\n 'byte short char int long boolean float double void ' +\n // groovy specific keywords\n 'def as in assert trait ' +\n // common keywords with Java\n 'super this abstract static volatile transient public private protected synchronized final ' +\n 'class interface enum if else for while switch case break default continue ' +\n 'throw throws try catch finally implements extends new import package return instanceof'\n },\n\n contains: [\n hljs.COMMENT(\n '/\\\\*\\\\*',\n '\\\\*/',\n {\n relevance : 0,\n contains : [\n {\n // eat up @'s in emails to prevent them to be recognized as doctags\n begin: /\\w+@/, relevance: 0\n },\n {\n className : 'doctag',\n begin : '@[A-Za-z]+'\n }\n ]\n }\n ),\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE,\n {\n className: 'string',\n begin: '\"\"\"', end: '\"\"\"'\n },\n {\n className: 'string',\n begin: \"'''\", end: \"'''\"\n },\n {\n className: 'string',\n begin: \"\\\\$/\", end: \"/\\\\$\",\n relevance: 10\n },\n hljs.APOS_STRING_MODE,\n {\n className: 'regexp',\n begin: /~?\\/[^\\/\\n]+\\//,\n contains: [\n hljs.BACKSLASH_ESCAPE\n ]\n },\n hljs.QUOTE_STRING_MODE,\n {\n className: 'meta',\n begin: \"^#!/usr/bin/env\", end: '$',\n illegal: '\\n'\n },\n hljs.BINARY_NUMBER_MODE,\n {\n className: 'class',\n beginKeywords: 'class interface trait enum', end: '{',\n illegal: ':',\n contains: [\n {beginKeywords: 'extends implements'},\n hljs.UNDERSCORE_TITLE_MODE\n ]\n },\n hljs.C_NUMBER_MODE,\n {\n className: 'meta', begin: '@[A-Za-z]+'\n },\n {\n // highlight map keys and named parameters as strings\n className: 'string', begin: /[^\\?]{0}[A-Za-z0-9_$]+ *:/\n },\n {\n // catch middle element of the ternary operator\n // to avoid highlight it as a label, named parameter, or map key\n begin: /\\?/, end: /\\:/\n },\n {\n // highlight labeled statements\n className: 'symbol', begin: '^\\\\s*[A-Za-z0-9_$]+:',\n relevance: 0\n }\n ],\n illegal: /#|<\\//\n }\n};","module.exports = function(hljs) {\n var VERSION = 'HTTP/[0-9\\\\.]+';\n return {\n aliases: ['https'],\n illegal: '\\\\S',\n contains: [\n {\n begin: '^' + VERSION, end: '$',\n contains: [{className: 'number', begin: '\\\\b\\\\d{3}\\\\b'}]\n },\n {\n begin: '^[A-Z]+ (.*?) ' + VERSION + '$', returnBegin: true, end: '$',\n contains: [\n {\n className: 'string',\n begin: ' ', end: ' ',\n excludeBegin: true, excludeEnd: true\n },\n {\n begin: VERSION\n },\n {\n className: 'keyword',\n begin: '[A-Z]+'\n }\n ]\n },\n {\n className: 'attribute',\n begin: '^\\\\w', end: ': ', excludeEnd: true,\n illegal: '\\\\n|\\\\s|=',\n starts: {end: '$', relevance: 0}\n },\n {\n begin: '\\\\n\\\\n',\n starts: {subLanguage: [], endsWithParent: true}\n }\n ]\n };\n};","/* eslint no-useless-escape: off */\n\nmodule.exports = function(hljs) {\n var JAVA_IDENT_RE = '[\\u00C0-\\u02B8a-zA-Z_$][\\u00C0-\\u02B8a-zA-Z_$0-9]*';\n var GENERIC_IDENT_RE = JAVA_IDENT_RE + '(<' + JAVA_IDENT_RE + '(\\\\s*,\\\\s*' + JAVA_IDENT_RE + ')*>)?';\n var KEYWORDS =\n 'false synchronized int abstract float private char boolean static null if const ' +\n 'for true while long strictfp finally protected import native final void ' +\n 'enum else break transient catch instanceof byte super volatile case assert short ' +\n 'package default double public try this switch continue throws protected public private ' +\n 'module requires exports do';\n\n // https://docs.oracle.com/javase/7/docs/technotes/guides/language/underscores-literals.html\n var JAVA_NUMBER_RE = '\\\\b' +\n '(' +\n '0[bB]([01]+[01_]+[01]+|[01]+)' + // 0b...\n '|' +\n '0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)' + // 0x...\n '|' +\n '(' +\n '([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+)(\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))?' +\n '|' +\n '\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+)' +\n ')' +\n '([eE][-+]?\\\\d+)?' + // octal, decimal, float\n ')' +\n '[lLfF]?';\n var JAVA_NUMBER_MODE = {\n className: 'number',\n begin: JAVA_NUMBER_RE,\n relevance: 0\n };\n\n return {\n aliases: ['jsp'],\n keywords: KEYWORDS,\n illegal: /<\\/|#/,\n contains: [\n hljs.COMMENT(\n '/\\\\*\\\\*',\n '\\\\*/',\n {\n relevance : 0,\n contains : [\n {\n // eat up @'s in emails to prevent them to be recognized as doctags\n begin: /\\w+@/, relevance: 0\n },\n {\n className : 'doctag',\n begin : '@[A-Za-z]+'\n }\n ]\n }\n ),\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE,\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n {\n className: 'class',\n beginKeywords: 'class interface', end: /[{;=]/, excludeEnd: true,\n keywords: 'class interface',\n illegal: /[:\"\\[\\]]/,\n contains: [\n {beginKeywords: 'extends implements'},\n hljs.UNDERSCORE_TITLE_MODE\n ]\n },\n {\n // Expression keywords prevent 'keyword Name(...)' from being\n // recognized as a function definition\n beginKeywords: 'new throw return else',\n relevance: 0\n },\n {\n className: 'function',\n begin: '(' + GENERIC_IDENT_RE + '\\\\s+)+' + hljs.UNDERSCORE_IDENT_RE + '\\\\s*\\\\(', returnBegin: true, end: /[{;=]/,\n excludeEnd: true,\n keywords: KEYWORDS,\n contains: [\n {\n begin: hljs.UNDERSCORE_IDENT_RE + '\\\\s*\\\\(', returnBegin: true,\n relevance: 0,\n contains: [hljs.UNDERSCORE_TITLE_MODE]\n },\n {\n className: 'params',\n begin: /\\(/, end: /\\)/,\n keywords: KEYWORDS,\n relevance: 0,\n contains: [\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n hljs.C_NUMBER_MODE,\n hljs.C_BLOCK_COMMENT_MODE\n ]\n },\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE\n ]\n },\n JAVA_NUMBER_MODE,\n {\n className: 'meta', begin: '@[A-Za-z]+'\n }\n ]\n };\n};","/* eslint no-useless-escape: off */\n\nmodule.exports = function(hljs) {\n var XML_IDENT_RE = '[A-Za-z0-9\\\\._:-]+';\n var TAG_INTERNALS = {\n endsWithParent: true,\n illegal: /</,\n relevance: 0,\n contains: [\n {\n className: 'attr',\n begin: XML_IDENT_RE,\n relevance: 0\n },\n {\n begin: /=\\s*/,\n relevance: 0,\n contains: [\n {\n className: 'string',\n endsParent: true,\n variants: [\n {begin: /\"/, end: /\"/},\n {begin: /'/, end: /'/},\n {begin: /[^\\s\"'=<>`]+/}\n ]\n }\n ]\n }\n ]\n };\n return {\n aliases: ['html', 'xhtml', 'rss', 'atom', 'xjb', 'xsd', 'xsl', 'plist'],\n case_insensitive: true,\n contains: [\n {\n className: 'meta',\n begin: '<!DOCTYPE', end: '>',\n relevance: 10,\n contains: [{begin: '\\\\[', end: '\\\\]'}]\n },\n hljs.COMMENT(\n '<!--',\n '-->',\n {\n relevance: 10\n }\n ),\n {\n begin: '<\\\\!\\\\[CDATA\\\\[', end: '\\\\]\\\\]>',\n relevance: 10\n },\n {\n className: 'meta',\n begin: /<\\?xml/, end: /\\?>/, relevance: 10\n },\n {\n begin: /<\\?(php)?/, end: /\\?>/,\n subLanguage: 'php',\n contains: [{begin: '/\\\\*', end: '\\\\*/', skip: true}]\n },\n {\n className: 'tag',\n /*\n The lookahead pattern (?=...) ensures that 'begin' only matches\n '<style' as a single word, followed by a whitespace or an\n ending braket. The '$' is needed for the lexeme to be recognized\n by hljs.subMode() that tests lexemes outside the stream.\n */\n begin: '<style(?=\\\\s|>|$)', end: '>',\n keywords: {name: 'style'},\n contains: [TAG_INTERNALS],\n starts: {\n end: '</style>', returnEnd: true,\n subLanguage: ['css', 'xml']\n }\n },\n {\n className: 'tag',\n // See the comment in the <style tag about the lookahead pattern\n begin: '<script(?=\\\\s|>|$)', end: '>',\n keywords: {name: 'script'},\n contains: [TAG_INTERNALS],\n starts: {\n end: '\\<\\/script\\>', returnEnd: true,\n subLanguage: ['actionscript', 'javascript', 'handlebars', 'xml']\n }\n },\n {\n className: 'tag',\n begin: '</?', end: '/?>',\n contains: [\n {\n className: 'name', begin: /[^\\/><\\s]+/, relevance: 0\n },\n TAG_INTERNALS\n ]\n }\n ]\n };\n};","/* eslint no-useless-escape: off */\n/* eslint no-useless-concat: off */\n\nmodule.exports = function(hljs) {\n var LITERALS = 'true false yes no null';\n\n var keyPrefix = '^[ \\\\-]*';\n var keyName = '[a-zA-Z_][\\\\w\\\\-]*';\n var KEY = {\n className: 'attr',\n variants: [\n { begin: keyPrefix + keyName + \":\"},\n { begin: keyPrefix + '\"' + keyName + '\"' + \":\"},\n { begin: keyPrefix + \"'\" + keyName + \"'\" + \":\"}\n ]\n };\n\n var TEMPLATE_VARIABLES = {\n className: 'template-variable',\n variants: [\n { begin: '\\{\\{', end: '\\}\\}' }, // jinja templates Ansible\n { begin: '%\\{', end: '\\}' } // Ruby i18n\n ]\n };\n var STRING = {\n className: 'string',\n relevance: 0,\n variants: [\n {begin: /'/, end: /'/},\n {begin: /\"/, end: /\"/},\n {begin: /\\S+/}\n ],\n contains: [\n hljs.BACKSLASH_ESCAPE,\n TEMPLATE_VARIABLES\n ]\n };\n\n return {\n case_insensitive: true,\n aliases: ['yml', 'YAML', 'yaml'],\n contains: [\n KEY,\n {\n className: 'meta',\n begin: '^---\\s*$',\n relevance: 10\n },\n { // multi line string\n className: 'string',\n begin: '[\\\\|>] *$',\n returnEnd: true,\n contains: STRING.contains,\n // very simple termination: next hash key\n end: KEY.variants[0].begin\n },\n { // data type\n className: 'type',\n begin: '!!' + hljs.UNDERSCORE_IDENT_RE,\n },\n { // fragment id &ref\n className: 'meta',\n begin: '&' + hljs.UNDERSCORE_IDENT_RE + '$',\n },\n { // fragment reference *ref\n className: 'meta',\n begin: '\\\\*' + hljs.UNDERSCORE_IDENT_RE + '$'\n },\n { // array listing\n className: 'bullet',\n begin: '^ *-',\n relevance: 0\n },\n hljs.HASH_COMMENT_MODE,\n {\n beginKeywords: LITERALS,\n keywords: {literal: LITERALS}\n },\n hljs.C_NUMBER_MODE,\n STRING\n ]\n };\n};","module.exports = function(hljs) {\n var LITERALS = {literal: 'true false null'};\n var TYPES = [\n hljs.QUOTE_STRING_MODE,\n hljs.C_NUMBER_MODE\n ];\n var VALUE_CONTAINER = {\n end: ',', endsWithParent: true, excludeEnd: true,\n contains: TYPES,\n keywords: LITERALS\n };\n var OBJECT = {\n begin: '{', end: '}',\n contains: [\n {\n className: 'attr',\n begin: /\"/, end: /\"/,\n contains: [hljs.BACKSLASH_ESCAPE],\n illegal: '\\\\n',\n },\n hljs.inherit(VALUE_CONTAINER, {begin: /:/})\n ],\n illegal: '\\\\S'\n };\n var ARRAY = {\n begin: '\\\\[', end: '\\\\]',\n contains: [hljs.inherit(VALUE_CONTAINER)], // inherit is a workaround for a bug that makes shared modes with endsWithParent compile only the ending of one of the parents\n illegal: '\\\\S'\n };\n TYPES.splice(TYPES.length, 0, OBJECT, ARRAY);\n return {\n contains: TYPES,\n keywords: LITERALS,\n illegal: '\\\\S'\n };\n};","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\nMicrometer contains a core library with the instrumentation SPI and an in-memory implementation that does not export data anywhere, a series of modules with implementations for various monitoring systems, and a test module.\\n\\nTo use Micrometer, add the dependency for your monitoring system.\\n\\nThe following example adds Prometheus in Gradle:\\n\\n[source,groovy]\\n----\\nimplementation 'io.micrometer:micrometer-registry-prometheus:latest.release'\\n----\\n\\nThe following example adds Prometheus in Maven:\\n\\n[source,xml]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-prometheus</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\nThrough Micrometer's composite meter registry (described in greater detail in link:/docs/concepts#_composite_registries[\\\"Concepts\\\"]), you may configure more than one registry implementation if you intend to publish metrics to more than one monitoring system.\\n\\nIf you have not decided on a monitoring system yet and want only to try out the instrumentation SPI, you can add a dependency on `micrometer-core` instead and configure the `SimpleMeterRegistry`.\\n\\n== Snapshots\\n\\nEvery successful https://app.circleci.com/pipelines/github/micrometer-metrics/micrometer[build] of Micrometer's `main` and maintenance branches (for example, `1.7.x`) results in the publication of a new snapshot version. You can use the latest snapshot by adding the Maven repository `https://repo.spring.io/snapshot` to your build and using the corresponding snapshot version -- for example, `1.8.0-SNAPSHOT`.\\n\\n== Milestones\\n\\nMilestone releases are made available for early testing purposes and are not intended for production use.\\nMilestone releases are published to https://repo.spring.io/milestone.\\nInclude that as a Maven repository in your build configuration to use milestone releases.\\nMilestones are marked as \\\"`pre-releases`\\\" on GitHub, and the version has a suffix, such as `-M1` or `-RC1` (milestone 1 or release candidate 1, respectively).\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Concepts\\n:toc:\\n:sectnums:\\n:dimensional: true\\n\\n== Purpose\\n\\nMicrometer is a metrics instrumentation library for JVM-based applications. It provides a simple facade over the instrumentation clients for the most popular monitoring systems, letting you instrument your JVM-based application code without vendor lock-in. It is designed to add little to no overhead to your metrics collection activity while maximizing the portability of your metrics effort.\\n\\nStarting from Micrometer 1.10, Micrometer provides the link:../docs/observation[Observation API] and a plugin mechanism that allows you to add capabilities including the tracing features. You can read more about this in the link:../docs/tracing[Micrometer Tracing documentation].\\n\\nFor better understanding the differences among these different types of systems (Metrics, Distributed Tracing, and Logging) we recommend Adrian Cole's talk, titled https://www.dotconferences.com/2017/04/adrian-cole-observability-3-ways-logging-metrics-tracing[Observability\\n3 Ways]. To learn more about Micrometer Observation API we recommend Tommy Ludwig's and Marcin Grzejszczak's talk, titled https://www.youtube.com/watch?v=fh3VbrPvAjg[Observability of Your Application].\\n\\n== Dependencies\\n\\nThe `micrometer-core` module aims to have minimal dependencies. It does not require any third-party (non-Micrometer) dependencies on the classpath at compile time for applications using Micrometer.\\n\\nUse of the link:#_pause_detection[pause detection] feature requires the https://github.com/LatencyUtils/LatencyUtils[LatencyUtils] dependency to be available on the classpath at runtime. If your application does not use the pause detection feature, you can exclude LatencyUtils from your runtime classpath.\\n\\nhttps://github.com/HdrHistogram/HdrHistogram[HdrHistogram] is needed on the classpath at runtime if you use link:#_histograms_and_percentiles[client-side percentiles]. If you are not using client-side percentiles, you may exclude HdrHistogram from your application's runtime classpath.\\n\\n== Supported Monitoring Systems\\n\\n:leveloffset: +1\\n\\nMicrometer contains a core module with an instrumentation https://en.wikipedia.org/wiki/Service_provider_interface[SPI], a set of modules containing implementations for various monitoring systems (each is called a registry), and a test kit. You need to understand three important characteristics of monitoring systems:\\n\\n* *Dimensionality*. Whether the system supports metric names to be enriched with tag key/value pairs. If a system is not _dimensional_, it is _hierarchical_, which means it supports only a flat metric name. When publishing metrics to hierarchical systems, Micrometer flattens the set of tag key/value pairs and adds them to the name.\\n\\n[cols=2*,options=\\\"header\\\"]\\n|===\\n|Dimensional\\n|Hierarchical\\n\\n|AppOptics, Atlas, Azure Monitor, Cloudwatch, Datadog, Datadog StatsD, Dynatrace, Elastic, Humio, Influx, KairosDB, New Relic, Prometheus, SignalFx, Sysdig StatsD, Telegraf StatsD, Wavefront\\n|Graphite, Ganglia, JMX, Etsy StatsD\\n|===\\n\\n\\n* *<<rate-aggregation>>*. In this context, we mean aggregation of a set of samples over a prescribed time interval. Some monitoring systems expect some types of discrete samples (such as counts) to be converted to a rate by the application prior to being published. Other systems expect cumulative values to always be sent. Still others have no opinion on it either way.\\n\\n[cols=2*,options=\\\"header\\\"]\\n|===\\n|Client-side\\n|Server-side\\n\\n|AppOptics, Atlas, Azure Monitor, Datadog, Dynatrace, Elastic, Graphite, Ganglia, Humio, Influx, JMX, Kairos, New Relic, all StatsD flavors, SignalFx\\n|Prometheus, Wavefront footnote:[As of 1.2.0, Micrometer sends cumulative values to Wavefront.]\\n|===\\n\\n* *Publishing*. Some systems expect to poll applications for metrics at their leisure, while others expect metrics to be pushed to them on a regular interval.\\n\\n[cols=2*,options=\\\"header\\\"]\\n|===\\n|Client pushes\\n|Server polls\\n\\n|AppOptics, Atlas, Azure Monitor, Datadog, Dynatrace, Elastic, Graphite, Ganglia, Humio, Influx, JMX, Kairos, New Relic, SignalFx, Wavefront\\n|Prometheus, all StatsD flavors\\n|===\\n\\nThere are other, more minor, variations in expectations from one monitoring system to another, such as their conception of base units of measurement (particularly time) and the canonical naming convention for metrics. Micrometer customizes your metrics to meet these demands on a per-registry basis.\\n\\n:leveloffset!:\\n\\n== Registry\\n\\n:leveloffset: +1\\n\\nA `Meter` is the interface for collecting a set of measurements (which we individually call metrics) about your application. Meters in Micrometer are created from and held in a `MeterRegistry`. Each supported monitoring system has an implementation of `MeterRegistry`. How a registry is created varies for each implementation.\\n\\nMicrometer includes a `SimpleMeterRegistry` that holds the latest value of each meter in memory and does not export the data anywhere. If you do not yet have a preferred monitoring system, you can get started playing with metrics by using the simple registry:\\n\\n====\\n[source,java]\\n----\\nMeterRegistry registry = new SimpleMeterRegistry();\\n----\\n====\\n\\nNOTE: A `SimpleMeterRegistry` is autowired for you in Spring-based applications.\\n\\n== Composite Registries\\n\\nMicrometer provides a `CompositeMeterRegistry` to which you can add multiple registries, letting you publish metrics to more than one monitoring system simultaneously:\\n\\n====\\n[source,java]\\n----\\nCompositeMeterRegistry composite = new CompositeMeterRegistry();\\n\\nCounter compositeCounter = composite.counter(\\\"counter\\\");\\ncompositeCounter.increment(); <1>\\n\\nSimpleMeterRegistry simple = new SimpleMeterRegistry();\\ncomposite.add(simple); <2>\\n\\ncompositeCounter.increment(); <3>\\n----\\n\\n1. Increments are NOOP'd until there is a registry in the composite. The counter's count still yields 0 at this point.\\n2. A counter named `counter` is registered to the simple registry.\\n3. The simple registry counter is incremented, along with counters for any other registries in the composite.\\n====\\n\\n== Global Registry\\n\\nMicrometer provides a static global registry `Metrics.globalRegistry` and a set of static builders for generating meters based on this registry (note that `globalRegistry` is a composite registry):\\n\\n====\\n[source,java]\\n----\\nclass MyComponent {\\n Counter featureCounter = Metrics.counter(\\\"feature\\\", \\\"region\\\", \\\"test\\\"); <1>\\n\\n void feature() {\\n featureCounter.increment();\\n }\\n\\n void feature2(String type) {\\n Metrics.counter(\\\"feature.2\\\", \\\"type\\\", type).increment(); <2>\\n }\\n}\\n\\nclass MyApplication {\\n void start() {\\n // wire your monitoring system to global static state\\n Metrics.addRegistry(new SimpleMeterRegistry()); <3>\\n }\\n}\\n----\\n\\n1. Wherever possible (and especially where instrumentation performance is critical), store `Meter` instances in fields to avoid a lookup on their name or tags on each use.\\n2. When tags need to be determined from local context, you have no choice but to construct or lookup the Meter inside your method body. The lookup cost is just a single hash lookup, so it is acceptable for most use cases.\\n3. It is OK to add registries _after_ meters have been created with code like `Metrics.counter(...)`. These meters are added to each registry, as it is bound to the global composite.\\n====\\n\\n:leveloffset!:\\n\\n== Meters\\n\\n:leveloffset: +1\\n\\nMicrometer supports a set of `Meter` primitives, including `Timer`, `Counter`, `Gauge`, `DistributionSummary`, `LongTaskTimer`, `FunctionCounter`, `FunctionTimer`, and `TimeGauge`. Different meter types result in a different number of time series metrics. For example, while there is a single metric that represents a `Gauge`, a `Timer` measures both the count of timed events and the total time of all timed events.\\n\\nA meter is uniquely identified by its name and dimensions. We use the terms, \\\"`dimensions`\\\" and \\\"`tags,`\\\" interchangeably, and the Micrometer interface is `Tag` simply because it is shorter. As a general rule, it should be possible to use the name as a pivot. Dimensions let a particular named metric be sliced to drill down and reason about the data. This means that, if only the name is selected, you can drill down by using other dimensions and reason about the value being shown.\\n\\n:leveloffset!:\\n\\n== Naming Meters\\n\\n:leveloffset: +1\\n\\nMicrometer employs a naming convention that separates lowercase words with a `.` (dot) character. Different monitoring systems have different recommendations regarding naming convention, and some naming conventions may be incompatible between one system and another. Each Micrometer implementation for a monitoring system comes with a naming convention that transforms lowercase dot notation names to the monitoring system's recommended naming convention. Additionally, this naming convention implementation removes special characters that are disallowed by the monitoring system from the metric names and tags. You can override the default naming convention for a registry by implementing `NamingConvention` and setting it on the registry:\\n\\n====\\n[source,java]\\n----\\nregistry.config().namingConvention(myCustomNamingConvention);\\n----\\n====\\n\\nWith naming conventions in place, the following timer registered in Micrometer looks good natively in a wide variety of monitoring systems:\\n\\n====\\n[source,java]\\n----\\nregistry.timer(\\\"http.server.requests\\\");\\n----\\n====\\n\\n. Prometheus - `http_server_requests_duration_seconds`\\n. Atlas - `httpServerRequests`\\n. Graphite - `http.server.requests`\\n. InfluxDB - `http_server_requests`\\n\\nBy adhering to Micrometer's lowercase dot notation convention, you guarantee the maximum degree of portability for your metric names across monitoring systems.\\n\\n== Tag Naming\\n\\nTIP: We recommend that you follow the same lowercase dot notation described for meter names when naming tags. Using this consistent naming convention for tags allows for better translation into the respective monitoring system's idiomatic naming schemes.\\n\\nSuppose we are trying to measure the number of http requests and the number of database calls.\\n\\n*Recommended Approach*\\n\\n====\\n[source,java]\\n----\\nregistry.counter(\\\"database.calls\\\", \\\"db\\\", \\\"users\\\")\\nregistry.counter(\\\"http.requests\\\", \\\"uri\\\", \\\"/api/users\\\")\\n----\\n====\\n\\nThis variant provides enough context so that, if only the name is selected, the value can be reasoned about and is at least potentially meaningful. For example if we select `database.calls`, we can see the total number of calls to all databases. Then we can group by or select by `db` to drill down further or perform comparative analysis on the contribution of calls to each database.\\n\\n*Bad Approach*\\n\\n====\\n[source,java]\\n----\\nregistry.counter(\\\"calls\\\",\\n \\\"class\\\", \\\"database\\\",\\n \\\"db\\\", \\\"users\\\");\\n\\nregistry.counter(\\\"calls\\\",\\n \\\"class\\\", \\\"http\\\",\\n \\\"uri\\\", \\\"/api/users\\\");\\n----\\n====\\n\\nIn this approach, if we select `calls`, we get a value that is an aggregate of the number of calls to the database and to our API endpoint. This time series is not useful without further dimensional drill-down.\\n\\n== Common Tags\\n\\nYou can define common tags at the registry level and add them to every metric reported to the monitoring system. This is generally used for dimensional drill-down on the operating environment, such as host, instance, region, stack, and others:\\n\\n====\\n[source,java]\\n----\\nregistry.config().commonTags(\\\"stack\\\", \\\"prod\\\", \\\"region\\\", \\\"us-east-1\\\");\\nregistry.config().commonTags(Arrays.asList(Tag.of(\\\"stack\\\", \\\"prod\\\"), Tag.of(\\\"region\\\", \\\"us-east-1\\\"))); // equivalently\\n----\\n====\\n\\nCalls to `commonTags` append additional common tags.\\n\\n[IMPORTANT]\\n====\\nCommon tags generally have to be added to the registry _before_ any (possibly autoconfigured) meter binders. Depending on your environment, there are different ways to achieve this.\\n\\nIf you use Spring Boot, you have two options:\\n\\n* Add your common tags with https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.metrics.customizing.common-tags[configuration properties]\\n* If you need more flexibility (for example, you have to add common tags to a registry defined in a shared library), register a `MeterRegistryCustomizer` callback interface as a bean to add your common tags. See the\\nhttps://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.metrics.getting-started[Spring Boot Reference Documentation] for more information.\\n====\\n\\n== Tag Values\\n\\nTag values must be non-null.\\n\\nWARNING: Beware of the potential for tag values coming from user-supplied sources to blow up the cardinality of a metric. You should always carefully normalize and add bounds to user-supplied input. Sometimes, the cause is sneaky. Consider the URI tag for recording HTTP requests on service endpoints. If we do not constrain 404's to a value like NOT_FOUND, the dimensionality of the metric would grow with each resource that cannot be found.\\n\\n:leveloffset!:\\n\\n== Meter Filters\\n\\n:leveloffset: +1\\n\\nYou can configure each registry with meter filters, which give you greater control over how and when meters are registered and what kinds of statistics they emit. Meter filters serve three basic functions:\\n\\n1. **Deny** (or **Accept**) meters being registered.\\n2. **Transform** meter IDs (for example, changing the name, adding or removing tags, and changing description or base units).\\n3. **Configure** distribution statistics for some meter types.\\n\\nImplementations of `MeterFilter` are added to the registry programmatically:\\n\\n====\\n[source, java]\\n----\\nregistry.config()\\n .meterFilter(MeterFilter.ignoreTags(\\\"too.much.information\\\"))\\n .meterFilter(MeterFilter.denyNameStartsWith(\\\"jvm\\\"));\\n----\\n====\\n\\nMeter filters are applied in order, and the results of transforming or configuring a meter are chained.\\n\\n== Deny or Accept Meters\\n\\nThe verbose form of an accept or deny filter is:\\n\\n====\\n[source, java]\\n----\\nnew MeterFilter() {\\n @Override\\n public MeterFilterReply accept(Meter.Id id) {\\n if(id.getName().contains(\\\"test\\\")) {\\n return MeterFilterReply.DENY;\\n }\\n return MeterFilterReply.NEUTRAL;\\n }\\n}\\n----\\n====\\n\\n`MeterFilterReply` has three possible states:\\n\\n* `DENY`: Do not let this meter be registered. When you try to register a meter against a registry and the filter returns `DENY`, the registry returns a NOOP version of that meter (for example, `NoopCounter` or `NoopTimer`). Your code can continue to interact with the NOOP meter, but anything recorded to it is discarded immediately with minimal overhead.\\n* `NEUTRAL`: If no other meter filter has returned `DENY`, registration of meters proceeds normally.\\n* `ACCEPT`: If a filter returns `ACCEPT`, the meter is immediately registered without interrogating the accept methods of any further filters.\\n\\n=== Convenience Methods\\n\\n`MeterFilter` provides several convenience static builders for deny and accept type filters:\\n\\n* `accept()`: Accept every meter, overriding the decisions of any filters that follow.\\n* `accept(Predicate<Meter.Id>)`: Accept any meter matching the predicate.\\n* `acceptNameStartsWith(String)`: Accept every meter with a matching prefix.\\n* `deny()`: Deny every meter, overriding the decisions of any filters that follow.\\n* `denyNameStartsWith(String)`: Deny every meter with a matching prefix. All `MeterBinder` implementations provided by Micrometer have names with common prefixes to allow for easy grouping visualization in UIs but also to make them easy to disable or enable as a group with a prefix. For example, you can deny all JVM metrics with `MeterFilter.denyNameStartsWith(\\\"jvm\\\")`.\\n* `deny(Predicate<Meter.Id>)`: Deny any meter that matches the predicate.\\n* `maximumAllowableMetrics(int)`: Deny any meter after the registry has reached a certain number of meters.\\n* `maximumAllowableTags(String meterNamePrefix, String tagKey, int maximumTagValues, MeterFilter onMaxReached)`: Places an upper bound on the number of tags produced by matching series.\\n\\n**Whitelisting** only a certain group of metrics is a particularly common case for monitoring systems that are _expensive_. This can be achieved with a static call:\\n\\n* `denyUnless(Predicate<Meter.Id>)`: Deny all meters that _do not_ match the predicate.\\n\\n=== Chaining Deny Accept Meters\\n\\nMeter filters are applied in the order in which they are configured on the registry, so it is possible to stack deny and accept filters to achieve more complex rules:\\n\\n====\\n[source, java]\\n----\\nregistry.config()\\n .meterFilter(MeterFilter.acceptNameStartsWith(\\\"http\\\"))\\n .meterFilter(MeterFilter.deny()); <1>\\n----\\n====\\n\\nThis achieves another form of whitelisting by stacking two filters together. Only `http` metrics are allowed to exist in this registry.\\n\\n== Transforming metrics\\n\\nThe following example shows a transform filter:\\n\\n====\\n[source, java]\\n----\\nnew MeterFilter() {\\n @Override\\n public Meter.Id map(Meter.Id id) {\\n if(id.getName().startsWith(\\\"test\\\")) {\\n return id.withName(\\\"extra.\\\" + id.getName()).withTag(\\\"extra.tag\\\", \\\"value\\\");\\n }\\n return id;\\n }\\n}\\n----\\n====\\n\\nThis filter adds a name prefix and an additional tag conditionally to meters starting with a name of `test`.\\n\\n`MeterFilter` provides convenience builders for many common transformation cases:\\n\\n* `commonTags(Iterable<Tag>)`: Adds a set of tags to all metrics. Adding common tags for application name, host, region, and others is a highly recommended practice.\\n* `ignoreTags(String...)`: Drops matching tag keys from every meter. This is particularly useful when a tag provably comes to have\\ntoo high cardinality and starts stressing your monitoring system or costing too much but you cannot change all the instrumentation points quickly.\\n* `replaceTagValues(String tagKey, Function<String, String> replacement, String... exceptions)`: Replace tag values according to the provided mapping for all matching tag keys. You can use this to reduce the total cardinality of a tag by mapping some portion of tag values to something else.\\n* `renameTag(String meterNamePrefix, String fromTagKey, String toTagKey)`: Rename a tag key for every metric that begins with a given prefix.\\n\\n== Configuring Distribution Statistics\\n\\n`Timer` and `DistributionSummary` contain a set of optional distribution statistics (in addition to the basics of count, total, and max) that you can configure through filters. These distribution statistics include pre-computed percentiles, SLOs, and histograms.\\n\\n====\\n[source, java]\\n----\\nnew MeterFilter() {\\n @Override\\n public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) {\\n if (id.getName().startsWith(prefix)) {\\n return DistributionStatisticConfig.builder()\\n .publishPercentiles(0.9, 0.95)\\n .build()\\n .merge(config);\\n }\\n return config;\\n }\\n};\\n----\\n====\\n\\nGenerally, you should create a new `DistributionStatisticConfig` with only the pieces you wish to configure and then `merge` it with the input configuration. This lets you drop down on registry-provided defaults for distribution statistics and to chain multiple filters together, each configuring some part of the distribution statistics (for example, you might want a 100ms SLO for all HTTP requests but only percentile histograms on a few critical endpoints).\\n\\n`MeterFilter` provides convenience builders for:\\n\\n* `maxExpected(Duration/long)`: Governs the upper bound of percentile histogram buckets shipped from a timer or summary.\\n* `minExpected(Duration/long)`: Governs the lower bound of percentile histogram buckets shipped from a timer or summary.\\n\\nSpring Boot offers property-based filters for configuring SLOs, percentiles, and percentile histograms by name prefix.\\n\\n:leveloffset!:\\n\\n[[rate-aggregation]]\\n== Rate Aggregation\\n\\n:leveloffset: +1\\n\\nMicrometer is aware of whether a particular monitoring system expects rate aggregation to happen client-side before metrics are published or ad-hoc as part of the query on the server. It accumulates metrics according to which style the monitoring system expects.\\n\\nNot all measurements are reported or best viewed as a rate. For example, gauge values and the active task count long task timers are not rates.\\n\\n== Server-side\\n\\nMonitoring systems that perform server-side rate math expect absolute values to be reported at each publishing interval. For example, the absolute count of all increments to a counter since the beginning of the application is sent on each publishing interval.\\n\\nSuppose we have a slightly positively biased random walk that chooses to increment a counter once every 10 milliseconds. If we view the raw counter value in a system like Prometheus, we see a step-wise monotonically increasing function (the width of the step is the interval at which Prometheus is polling or scraping for data).\\n\\nimage::\" + require(\"!file-loader!./img/prometheus-counter-norate.png\") + \"[Absolute counter value]\\n\\nRepresenting a counter without rate aggregation over some time window is rarely useful, as the representation is a function of both the rapidity with which the counter is incremented and the longevity of the service. In the preceding example, the counter drops back to zero on service restart. The rate-aggregated graph would return back to a value around 55 as soon as the new instance (say on a production deployment) was in service.\\n\\nimage::\" + require(\"!file-loader!./img/prometheus-counter.png\") + \"[Rate-aggregated counter]\\n\\nIf you have achieved zero-downtime deployments (for example, through red-black deployments), you should be able to comfortably set _minimum_ alert thresholds on the rate-aggregated graph without service restarts causing dips in the counter value.\\n\\nIMPORTANT: For most production purposes, whether it be alerting, automated canary analysis, or other use cases, base your automation off of rate-aggregated data.\\n\\n== Client-side\\n\\nTwo other classes of monitoring system either:\\n\\n. Expect rate-aggregated data. Given the key insight that for most production purposes, we should be basing our decisions off of rates rather than absolute values, such systems benefit from having to do less math to satisfy queries.\\n. Have relatively little or no math operations that would let us rate-aggregate data through our queries. For these systems, publishing pre-aggregated data is the only way to build meaningful representations.\\n\\nMicrometer efficiently maintains rate data by means of a step value that accumulates data for the current publishing interval. When the step value is polled (when publishing, for example), if the step value detects that the current interval has elapsed, it moves current data to \\\"`previous`\\\" state. This previous state is what is reported until the next time current data overwrites it. The following image shows the interaction of current and previous state, along with polling:\\n\\nimage::\" + require(\"!file-loader!./img/rate-normalizing.png\") + \"[Behavior of a step value,width=1200]\\n\\nThe value returned by the poll function is always _rate per second * interval_. If the step value shown in the preceding image represents the values of a counter, we could say that the counter saw \\\"`0.3 increments per second`\\\" in the first interval, which is reportable to the backend at any time during the second interval.\\n\\nMicrometer timers track at least a count and the total time as separate measurements. Suppose we configure publishing at 10-second intervals and we saw 20 requests that each took 100ms. Then, for the first interval:\\n\\n. `count` = 10 seconds * (20 requests / 10 seconds) = 20 requests\\n. `totalTime` = 10 seconds * (20 * 100 ms / 10 seconds) = 2 seconds\\n\\nThe `count` statistic is meaningful by itself: It is a measure of _throughput_. `totalTime` represents the total latency of all requests in the interval. Additionally:\\n\\n`totalTime / count` = 2 seconds / 20 requests = 0.1 seconds / request = 100 ms / request\\n\\nThis is a useful measure of _average latency_. When the same idea is applied to the `totalAmount` and `count` emanating from distribution summaries, the measure is called a _distribution average_. Average latency is just the distribution average for a distribution summary measured in time (a timer). Some monitoring systems (such as Atlas) provide facilities for computing the distribution average from these statistics, and Micrometer includes `totalTime` and `count` as separate statistics. Others, (such as Datadog) do not have this kind of operation built-in, and Micrometer calculates the distribution average client-side and ships that.\\n\\nShipping the rate for the publishing interval is sufficient to reason about the rate over any time window greater than or equal to the publishing interval. In our example, if a service continues to receive 20 requests that each take 100ms for every 10 second interval in a given minute, we could say:\\n\\n. Micrometer reported \\\"`20 requests`\\\" for `count` on every 10 second interval. The monitoring system sums these six 10 second intervals and arrives at the conclusion that there are 120 requests / minute. Note that it is the monitoring system doing this summation, not Micrometer.\\n. Micrometer reported \\\"`2 seconds`\\\" of `totalTime` on every 10 second interval. The monitoring system can sum all total time statistics over the minute to yield \\\"`12 seconds`\\\" of total time in the minute interval. Then, the average latency is as we expect: 12 seconds / 120 requests = 100 ms / request.\\n\\n:leveloffset!:\\n\\n== Counters\\n\\n:leveloffset: +1\\n\\nCounters report a single metric: a count. The `Counter` interface lets you increment by a fixed amount, which must be positive.\\n\\nTIP: Never count something you can time with a `Timer` or summarize with a `DistributionSummary`! Both `Timer` and `DistributionSummary` always publish a count of events in addition to other measurements.\\n\\nWhen building graphs and alerts off of counters, you should generally be most interested in measuring the rate at which some event occurs over a given time interval. Consider a simple queue. You could use counters to measure various things, such as the rate at which items are being inserted and removed.\\n\\nIt is tempting, at first, to conceive of visualizing absolute counts rather than a rate, but the absolute count is usually both a function of the rapidity with which something is used *and* the longevity of the application instance under instrumentation. Building dashboards and alerts of the rate of a counter per some interval of time disregards the longevity of the app, letting you see aberrant behavior long after the application has started.\\n\\nNOTE: Be sure to read through the timer section before jumping into using counters, as timers record a count of timed events as part of the suite of metrics that go into timing. For those pieces of code you intend to time, you do NOT need to add a separate counter.\\n\\nThe following code simulates a real counter whose rate exhibits some perturbation over a short time window:\\n\\n[source,java]\\n----\\nNormal rand = ...; // a random generator\\n\\nMeterRegistry registry = ...\\nCounter counter = registry.counter(\\\"counter\\\"); <1>\\n\\nFlux.interval(Duration.ofMillis(10))\\n .doOnEach(d -> {\\n if (rand.nextDouble() + 0.1 > 0) { <2>\\n counter.increment(); <3>\\n }\\n })\\n .blockLast();\\n----\\n<1> Most counters can be created off of the registry itself with a name and, optionally, a set of tags.\\n<2> A slightly positively biased random walk.\\n<3> This is how you interact with a counter. You could also call `counter.increment(n)` to increment by more than one in a single operation.\\n\\nA fluent builder for counters on the `Counter` interface itself provides access to less frequently used options, such as\\nbase units and description. You can register the counter as the last step of its construction by calling `register`:\\n\\n[source, java]\\n----\\nCounter counter = Counter\\n .builder(\\\"counter\\\")\\n .baseUnit(\\\"beans\\\") // optional\\n .description(\\\"a description of what this counter does\\\") // optional\\n .tags(\\\"region\\\", \\\"test\\\") // optional\\n .register(registry);\\n----\\n\\n== Function-tracking Counters\\n\\nMicrometer also provides a more infrequently used counter pattern that tracks a monotonically increasing function (a function that stays the same or increases over time but never decreases). Some monitoring systems, such as Prometheus, push cumulative values for counters to the backend, but others publish the rate at which a counter is incrementing over the push interval. By employing this pattern, you let the Micrometer implementation for your monitoring system choose whether to rate-normalize the counter, and your counter remains portable across different types of monitoring systems.\\n\\n[source, java]\\n-----\\nCache cache = ...; // suppose we have a Guava cache with stats recording on\\nregistry.more().counter(\\\"evictions\\\", tags, cache, c -> c.stats().evictionCount()); <1>\\n-----\\n\\n<1> `evictionCount()` is a monotonically increasing function that increments with every cache eviction from the beginning of its life.\\n\\nThe function-tracking counter, in concert with the monitoring system's rate normalizing functionality (whether this is an artifact of the query language or the way data is pushed to the system), adds a layer of richness on top of the cumulative value of the function itself. You can reason about the _rate_ at which the value is increasing, whether that rate is within an acceptable bound, is increasing or decreasing over time, and so on.\\n\\nWARNING: Micrometer cannot guarantee the monotonicity of the function for you. By using this signature, you are asserting its monotonicity based on what you know about its definition.\\n\\nA fluent builder for function counters on the `FunctionCounter` interface itself provides access to less frequently used options, such as base units and description. You can register the counter as the last step of its construction by calling `register(MeterRegistry)`.\\n\\n[source, java]\\n----\\nMyCounterState state = ...;\\n\\nFunctionCounter counter = FunctionCounter\\n .builder(\\\"counter\\\", state, state -> state.count())\\n .baseUnit(\\\"beans\\\") // optional\\n .description(\\\"a description of what this counter does\\\") // optional\\n .tags(\\\"region\\\", \\\"test\\\") // optional\\n .register(registry);\\n----\\n\\n:leveloffset!:\\n\\n== Gauges\\n\\n:leveloffset: +1\\n\\nA gauge is a handle to get the current value. Typical examples for gauges would be the size of a collection or map or number of threads in a running state.\\n\\nTIP: Gauges are useful for monitoring things with natural upper bounds. We do not recommend using a gauge to monitor things like request count, as they can grow without bound for the duration of an application instance's life.\\n\\nTIP: Never gauge something you can count with a `Counter`!\\n\\nMicrometer takes the stance that gauges should be sampled and not be set, so there is no information about what might have occurred between samples. Any intermediate values set on a gauge are lost by the time the gauge value is reported to a metrics backend, so there is little value in setting those intermediate values in the first place.\\n\\nThink of a `Gauge` as a \\\"`heisen-gauge`\\\": a meter that changes only when it is observed. Every other meter type accumulates intermediate counts toward the point where the data is sent to the metrics backend.\\n\\nThe `MeterRegistry` interface contains methods for building gauges to observe numeric values, functions, collections, and maps:\\n\\n[source, java]\\n----\\nList<String> list = registry.gauge(\\\"listGauge\\\", Collections.emptyList(), new ArrayList<>(), List::size); <1>\\nList<String> list2 = registry.gaugeCollectionSize(\\\"listSize2\\\", Tags.empty(), new ArrayList<>()); <2>\\nMap<String, Integer> map = registry.gaugeMapSize(\\\"mapGauge\\\", Tags.empty(), new HashMap<>());\\n----\\n<1> A slightly more common form of gauge is one that monitors some non-numeric object. The last argument establishes the function that is used to determine the value of the gauge when the gauge is observed.\\n<2> A more convenient form of (1) for when you want to monitor collection size.\\n\\nAll of the different forms of creating a gauge maintain only a _weak reference_ to the object being observed, so as not to prevent garbage collection of the object.\\n\\n== Manually Incrementing or Decrementing a Gauge\\n\\nA gauge can be made to track any `java.lang.Number` subtype that is settable, such as `AtomicInteger` and `AtomicLong` found in `java.util.concurrent.atomic` and similar types, such as Guava's `AtomicDouble`:\\n\\n[source,java]\\n----\\n// maintain a reference to myGauge\\nAtomicInteger myGauge = registry.gauge(\\\"numberGauge\\\", new AtomicInteger(0));\\n\\n// ... elsewhere you can update the value it holds using the object reference\\nmyGauge.set(27);\\nmyGauge.set(11);\\n----\\n\\nNote that, in this form, unlike other meter types, you do not get a reference to the `Gauge` when creating one. Rather, you get a reference to the thing being observed. This is because of the \\\"`heisen-gauge`\\\" principal: The gauge is self-sufficient once created, so you should never need to interact with it. This lets us give you back only the instrumented object, which allows for quick one-liners that both create the object to be observed and set up metrics around it.\\n\\nThis pattern should be less common than the `DoubleFunction` form. Remember that frequent setting of the observed `Number` results in a lot of intermediate values that never get published. Only the _instantaneous value_ of the gauge at publish time is ever sent to the monitoring system.\\n\\nWARNING: Attempting to construct a gauge with a primitive number or one of its `java.lang` object forms is always incorrect. These numbers are immutable. Thus, the gauge cannot ever be changed. Attempting to \\\"`re-register`\\\" the gauge with a different number does not work, as the registry maintains only one meter for each unique combination of name and tags.\\n\\n== Gauge Fluent Builder\\n\\nThe interface contains a fluent builder for gauges:\\n\\n[source, java]\\n----\\nGauge gauge = Gauge\\n .builder(\\\"gauge\\\", myObj, myObj::gaugeValue)\\n .description(\\\"a description of what this gauge does\\\") // optional\\n .tags(\\\"region\\\", \\\"test\\\") // optional\\n .register(registry);\\n----\\n\\nGenerally the returned `Gauge` instance is not useful except in testing, as the gauge is already set up to track a value automatically upon registration.\\n\\n== Why is My Gauge Reporting NaN or Disappearing?\\n\\nIt is your responsibility to hold a strong reference to the state object that you are measuring with a `Gauge`. Micrometer is careful to not create strong references to objects that would otherwise be garbage collected. Once the object being gauged is de-referenced and is garbage collected, Micrometer starts reporting a NaN or nothing for a gauge, depending on the registry implementation.\\n\\nIf you see your gauge reporting for a few minutes and then disappearing or reporting NaN, it almost certainly suggests that the underlying object being gauged has been garbage collected.\\n\\n== `TimeGauge`\\n\\n`TimeGauge` is a specialized gauge that tracks a time value, to be scaled to the base unit of time expected by each registry implementation.\\n\\n`TimeGauge` can be registered with `TimeUnit` as follows:\\n\\n[source, java]\\n----\\nAtomicInteger msTimeGauge = new AtomicInteger(4000);\\nAtomicInteger usTimeGauge = new AtomicInteger(4000);\\nTimeGauge.builder(\\\"my.gauge\\\", msTimeGauge, TimeUnit.MILLISECONDS, AtomicInteger::get).register(registry);\\nTimeGauge.builder(\\\"my.other.gauge\\\", usTimeGauge, TimeUnit.MICROSECONDS, AtomicInteger::get).register(registry);\\n----\\n\\nAnd for example, if the registry is Prometheus, they will be converted in seconds as follows:\\n\\n```\\n# HELP my_gauge_seconds\\n# TYPE my_gauge_seconds gauge\\nmy_gauge_seconds 4.0\\n# HELP my_other_gauge_seconds\\n# TYPE my_other_gauge_seconds gauge\\nmy_other_gauge_seconds 0.004\\n```\\n\\n== Multi-gauge\\n\\nMicrometer supports one last special type of `Gauge`, called a `MultiGauge`, to help manage gauging a growing or shrinking list of criteria.\\nThis feature lets you select a set of well-bounded but slightly changing set of criteria from something like an SQL query and report some metric for each row as a `Gauge`. The following example creates a `MultiGauge`:\\n\\n[source, java]\\n----\\n// SELECT count(*) from job group by status WHERE job = 'dirty'\\nMultiGauge statuses = MultiGauge.builder(\\\"statuses\\\")\\n .tag(\\\"job\\\", \\\"dirty\\\")\\n .description(\\\"The number of widgets in various statuses\\\")\\n .baseUnit(\\\"widgets\\\")\\n .register(registry);\\n\\n...\\n\\n// run this periodically whenever you re-run your query\\nstatuses.register(\\n resultSet.stream()\\n .map(result -> Row.of(Tags.of(\\\"status\\\", result.getAsString(\\\"status\\\")), result.getAsInt(\\\"count\\\")))\\n .collect(toList())\\n);\\n----\\n\\n:leveloffset!:\\n\\n== Timers\\n\\n:leveloffset: +1\\n\\nTimers are intended for measuring short-duration latencies and the frequency of such events. All implementations of `Timer` report at least the total time and the count of events as separate time series. While you can use timers for other use cases, note that negative values are not supported, and recording many longer durations could cause overflow of the total time at `Long.MAX_VALUE` nanoseconds (292.3 years).\\n\\nAs an example, consider a graph showing request latency to a typical web server. The server can be expected to respond to many requests quickly, so the timer gets updated many times per second.\\n\\nThe appropriate base unit for timers varies by metrics backend, and for good reason. Micrometer is decidedly un-opinionated about this. However, because of the potential for confusion, Micrometer requires a `TimeUnit` when interacting with `Timer` implementations. Micrometer is aware of the preferences of each implementation and publishes your timing in the appropriate base unit based on the implementation. The following listing shows part of the `Timer` interface:\\n\\n[source,java]\\n----\\npublic interface Timer extends Meter {\\n ...\\n void record(long amount, TimeUnit unit);\\n void record(Duration duration);\\n double totalTime(TimeUnit unit);\\n}\\n----\\n\\nThe interface contains a fluent builder for timers:\\n\\n[source,java]\\n----\\nTimer timer = Timer\\n .builder(\\\"my.timer\\\")\\n .description(\\\"a description of what this timer does\\\") // optional\\n .tags(\\\"region\\\", \\\"test\\\") // optional\\n .register(registry);\\n----\\n\\nNOTE: The maximum statistical value for basic `Timer` implementations, such as `CumulativeTimer` and `StepTimer`, is a time window maximum (`TimeWindowMax`).\\nIt means that its value is the maximum value during a time window.\\nIf no new values are recorded for the time window length, the max is reset to 0 as a new time window starts.\\nTime window size is the step size of the meter registry, unless expiry in `DistributionStatisticConfig` is explicitly set to other value.\\nA time window maximum is used to capture maximum latency in a subsequent interval after heavy resource pressure triggers the latency and prevents metrics from being published.\\nPercentiles are also time window percentiles (`TimeWindowPercentileHistogram`).\\n\\n== Recording Blocks of Code\\n\\nThe `Timer` interface exposes several convenience overloads for recording timings inline, including the following:\\n\\n[source,java]\\n----\\ntimer.record(() -> dontCareAboutReturnValue());\\ntimer.recordCallable(() -> returnValue());\\n\\nRunnable r = timer.wrap(() -> dontCareAboutReturnValue()); <1>\\nCallable c = timer.wrap(() -> returnValue());\\n----\\n<1> Wrap `Runnable` or `Callable` and return the instrumented version of it for use later.\\n\\nNOTE: A `Timer` is really a specialized distribution summary that is aware of how to scale durations to the base unit of time of each monitoring system and has an automatically\\ndetermined base unit. In every case where you want to measure time, you should use a `Timer` rather than a `DistributionSummary`.\\n\\n== Storing Start State in `Timer.Sample`\\n\\nYou may also store start state in a sample instance that can be stopped later. The sample records a start time based on the registry's clock. After starting a sample, execute the code to be timed and finish the operation by calling `stop(Timer)` on the sample:\\n\\n[source, java]\\n----\\nTimer.Sample sample = Timer.start(registry);\\n\\n// do stuff\\nResponse response = ...\\n\\nsample.stop(registry.timer(\\\"my.timer\\\", \\\"response\\\", response.status()));\\n----\\n\\nNote how we do not decide the timer to which to accumulate the sample until it is time to stop the sample. This lets us dynamically determine certain tags from the end state of the operation we are timing.\\n\\n== The `@Timed` annotation\\n\\nThe `micrometer-core` modules contains a `@Timed` annotation that frameworks can use to add timing support to either specific types of methods such as those serving web request endpoints or, more generally, to all methods.\\n\\nWARNING: Micrometer's Spring Boot configuration does _not_ recognize `@Timed` on arbitrary methods.\\n\\nAlso, an incubating AspectJ aspect is included in `micrometer-core`. You can use it in your application either through compile/load time AspectJ weaving or through framework facilities that interpret AspectJ aspects and proxy targeted methods in some other way, such as Spring AOP. Here is a sample Spring AOP configuration:\\n\\n[source,java]\\n----\\n@Configuration\\npublic class TimedConfiguration {\\n @Bean\\n public TimedAspect timedAspect(MeterRegistry registry) {\\n return new TimedAspect(registry);\\n }\\n}\\n----\\n\\nApplying `TimedAspect` makes `@Timed` usable on any arbitrary method in an AspectJ proxied instance, as the following example shows:\\n\\n[source,java]\\n----\\n@Service\\npublic class ExampleService {\\n\\n @Timed\\n public void sync() {\\n // @Timed will record the execution time of this method,\\n // from the start and until it exits normally or exceptionally.\\n ...\\n }\\n\\n @Async\\n @Timed\\n public CompletableFuture<?> async() {\\n // @Timed will record the execution time of this method,\\n // from the start and until the returned CompletableFuture\\n // completes normally or exceptionally.\\n return CompletableFuture.supplyAsync(...);\\n }\\n\\n}\\n----\\n\\n=== @MeterTag on Method Parameters\\n\\nTo support `@MeterTag` annotation on method parameters you need to configure the `@TimedAspect` to add the `MeterTagAnnotationHandler`.\\n\\n[source,java,subs=+attributes]\\n-----\\nValueResolver valueResolver = parameter -> \\\"Value from myCustomTagValueResolver [\\\" + parameter + \\\"]\\\";\\n\\n// Example of a ValueExpressionResolver that uses Spring Expression Language\\nValueExpressionResolver valueExpressionResolver = new SpelValueExpressionResolver();\\n\\n\\n// Setting the handler on the aspect\\ntimedAspect.setMeterTagAnnotationHandler(\\n new MeterTagAnnotationHandler(aClass -> valueResolver, aClass -> valueExpressionResolver));\\n-----\\n\\nLet's assume that we have the following interface.\\n\\n[source,java,subs=+attributes]\\n-----\\ninterface MeterTagClassInterface {\\n\\n @Timed\\n void getAnnotationForTagValueResolver(@MeterTag(key = \\\"test\\\", resolver = ValueResolver.class) String test);\\n\\n @Timed\\n void getAnnotationForTagValueExpression(\\n @MeterTag(key = \\\"test\\\", expression = \\\"'hello' + ' characters'\\\") String test);\\n\\n @Timed\\n void getAnnotationForArgumentToString(@MeterTag(\\\"test\\\") Long param);\\n\\n}\\n-----\\n\\nWhen its implementations would be called with different arguments (remember that the implementation needs to be annotated with `@Timed` annotation too) the following timers would be created:\\n\\n[source,java,subs=+attributes]\\n-----\\n// Example for returning <toString()> on the parameter\\nservice.getAnnotationForArgumentToString(15L);\\n\\nassertThat(registry.get(\\\"method.timed\\\").tag(\\\"test\\\", \\\"15\\\").timer().count()).isEqualTo(1);\\n\\n// Example for calling the provided <ValueResolver> on the parameter\\nservice.getAnnotationForTagValueResolver(\\\"foo\\\");\\n\\nassertThat(registry.get(\\\"method.timed\\\")\\n .tag(\\\"test\\\", \\\"Value from myCustomTagValueResolver [foo]\\\")\\n .timer()\\n .count()).isEqualTo(1);\\n\\n// Example for calling the provided <ValueExpressionResolver>\\nservice.getAnnotationForTagValueExpression(\\\"15L\\\");\\n\\nassertThat(registry.get(\\\"method.timed\\\").tag(\\\"test\\\", \\\"hello characters\\\").timer().count()).isEqualTo(1);\\n-----\\n\\n== Function-tracking Timers\\n\\nMicrometer also provides a more infrequently used timer pattern that tracks two monotonically increasing functions (a function that stays the same or increases over time but never decreases): a count function and a total time function. Some monitoring systems, such as Prometheus, push cumulative values for counters (which apply to both the count and total time functions in this case) to the backend, but others publish the rate at which a counter increments over the push interval. By employing this pattern, you let the Micrometer implementation for your monitoring system choose whether to rate normalize the timer, and your timer remains portable across different types of monitoring systems.\\n\\n[source, java]\\n-----\\nIMap<?, ?> cache = ...; // suppose we have a Hazelcast cache\\nregistry.more().timer(\\\"cache.gets.latency\\\", Tags.of(\\\"name\\\", cache.getName()), cache,\\n c -> c.getLocalMapStats().getGetOperationCount(), <1>\\n c -> c.getLocalMapStats().getTotalGetLatency(),\\n TimeUnit.NANOSECONDS <2>\\n);\\n-----\\n\\n<1> `getGetOperationCount()` is a monotonically increasing function incrementing with every cache get from the beginning of its life.\\n<2> This represents the unit of time represented by `getTotalGetLatency()`. Each registry implementation specifies what its expected base unit of time is, and the total time reported will be scaled to this value.\\n\\nThe function-tracking timer, in concert with the monitoring system's rate normalizing functionality (whether this is an artifact of the query language or the way data is pushed to the system), adds a layer of richness to the cumulative value of the functions themselves. You can reason about the _rate_ of throughput and latency, whether that rate is within an acceptable bound, is increasing or decreasing over time, and so on.\\n\\nWARNING: Micrometer cannot guarantee the monotonicity of the count and total time functions for you. By using this signature, you are asserting their monotonicity based on what you know about their definitions.\\n\\nThere is also a fluent builder for function timers on the `FunctionTimer` interface itself, providing access to less frequently used options, such as base units and description. You can register the timer as the last step of its construction by calling `register(MeterRegistry)`:\\n\\n[source, java]\\n----\\nIMap<?, ?> cache = ...\\n\\nFunctionTimer.builder(\\\"cache.gets.latency\\\", cache,\\n c -> c.getLocalMapStats().getGetOperationCount(),\\n c -> c.getLocalMapStats().getTotalGetLatency(),\\n TimeUnit.NANOSECONDS)\\n .tags(\\\"name\\\", cache.getName())\\n .description(\\\"Cache gets\\\")\\n .register(registry);\\n----\\n\\n== Pause Detection\\n\\nMicrometer uses the `LatencyUtils` package to compensate for https://highscalability.com/blog/2015/10/5/your-load-generator-is-probably-lying-to-you-take-the-red-pi.html[coordinated omission] -- extra latency arising from system and VM pauses that skew your latency statistics downward. Distribution statistics, such as percentiles and SLO counts, are influenced by a pause detector implementation that adds additional latency here and there to compensate for pauses.\\n\\nMicrometer supports two pause detector implementations: a clock-drift based detector and a no-op detector. Before Micrometer 1.0.10/1.1.4/1.2.0, a clock-drift detector was configured by default to report as-accurate-as-possible metrics without further configuration. Since 1.0.10/1.1.4/1.2.0, the no-op detector is configured by default, but the clock-drift detector can be configured as shown in the next example.\\n\\nThe clock-drift based detector has a configurable sleep interval and pause threshold. CPU consumption is inversely proportional to `sleepInterval`, as is pause detection accuracy. 100ms for both values is a reasonable default to offer decent detection of long pause events while consuming a negligible amount of CPU time.\\n\\nYou can customize the pause detector as follows:\\n\\n[source,java]\\n----\\nregistry.config().pauseDetector(new ClockDriftPauseDetector(sleepInterval, pauseThreshold));\\nregistry.config().pauseDetector(new NoPauseDetector());\\n----\\n\\nIn the future, we may provide further detector implementations. Some pauses may be able to be inferred from GC logging in some circumstances, for example, without requiring a constant CPU load, however minimal. Also, a future JDK may provide direct access to pause events.\\n\\n== Memory Footprint Estimation\\n\\nTimers are the most memory-consuming meter, and their total footprint can vary dramatically, depending on which options you choose. The following table of memory consumption is based on the use of various features. These figures assume no tags and a ring buffer length of 3. Adding tags adds somewhat to the total, as does increasing the buffer length. Total storage can also vary somewhat depending on the registry implementation.\\n\\n* R = Ring buffer length. We assume the default of 3 in all examples. R is set with `Timer.Builder#distributionStatisticBufferLength`.\\n* B = Total histogram buckets. Can be SLO boundaries or percentile histogram buckets. By default, timers are clamped to a minimum expected value of 1ms and a maximum expected value of 30 seconds, yielding 66 buckets for percentile histograms, when applicable.\\n* I = Interval estimator for pause compensation. 1.7 kb.\\n* M = Time-decaying max. 104 bytes.\\n* Fb = Fixed boundary histogram. 8b * B * R.\\n* Pp = Percentile precision. By default, it is 1. Generally in the range [0, 3]. Pp is set with `Timer.Builder#percentilePrecision`.\\n* Hdr(Pp) = High dynamic range histogram.\\n - When Pp = 0: 1.9kb * R + 0.8kb\\n - When Pp = 1: 3.8kb * R + 1.1kb\\n - When Pp = 2: 18.2kb * R + 4.7kb\\n - When Pp = 3: 66kb * R + 33kb\\n\\n[width=\\\"80%\\\",options=\\\"header\\\"]\\n|=========================================================\\n|Pause detection |Client-side percentiles |Histogram and/or SLOs |Formula | Example\\n\\n|Yes |No |No |I + M| ~1.8kb\\n|Yes |No |Yes |I + M + Fb|For default percentile histogram, ~7.7kb\\n|Yes |Yes |Yes |I + M + Hdr(Pp)|For the addition of a 0.95 percentile with defaults otherwise, ~14.3kb\\n|No |No |No |M| ~0.1kb\\n|No |No |Yes |M + Fb|For default percentile histogram, ~6kb\\n|No |Yes |Yes |M + Hdr(Pp)|For the addition of a 0.95 percentile with defaults otherwise, ~12.6kb\\n|=========================================================\\n\\nNOTE: For Prometheus, specifically, R is _always_ equal to 1, regardless of how you attempt to configure it through `Timer.Builder`. This special case exists because Prometheus expects cumulative histogram data that never rolls over.\\n\\n:leveloffset!:\\n\\n== Distribution Summaries\\n\\n:leveloffset: +1\\n\\nA distribution summary tracks the distribution of events. It is similar to a timer structurally, but records values that do not represent a unit of time. For example, you could use a distribution summary to measure the payload sizes of requests hitting a server.\\n\\nThe following example creates a distribution summary:\\n\\n[source, java]\\n----\\nDistributionSummary summary = registry.summary(\\\"response.size\\\");\\n----\\n\\nThe interface contains a fluent builder for distribution summaries:\\n\\n[source, java]\\n----\\nDistributionSummary summary = DistributionSummary\\n .builder(\\\"response.size\\\")\\n .description(\\\"a description of what this summary does\\\") // optional\\n .baseUnit(\\\"bytes\\\") // optional <1>\\n .tags(\\\"region\\\", \\\"test\\\") // optional\\n .scale(100) // optional <2>\\n .register(registry);\\n----\\n\\n<1> Add base units for maximum portability. Base units are part of the naming convention for some monitoring systems. Leaving it off and violating the naming convention has no adverse effect if you forget.\\n<2> Optionally, you can provide a scaling factor by which each recorded sample is multiplied as it is recorded.\\n\\nNOTE: The maximum (which is named `max`) for basic `DistributionSummary` implementations, such as `CumulativeDistributionSummary` and `StepDistributionSummary`, is a time window maximum (`TimeWindowMax`).\\nIt means that its value is the maximum value during a time window.\\nIf no new values are recorded for the time window length, the maximum is reset to 0 as a new time window starts.\\nTime window size is the step size of the meter registry, unless expiry in `DistributionStatisticConfig` is explicitly set to another value.\\nA time window max is used to capture the maximum latency in a subsequent interval after heavy resource pressure triggers the latency and prevents metrics from being published.\\nPercentiles are also time window percentiles (`TimeWindowPercentileHistogram`).\\n\\n== Scaling and Histograms\\n\\nMicrometer's preselected percentile histogram buckets are all integers from 1 to `Long.MAX_VALUE`. Currently, `minimumExpectedValue` and `maximumExpectedValue` serve to control the cardinality of the bucket set. If we try to detect that your min/max yields a small range and scale the preselected bucket domain to your summary's range, we do not have another lever to control bucket cardinality.\\n\\nInstead, if your summary's domain is more constrained, scale your summary's range by a fixed factor. The use case we have heard so far is for summaries of ratios whose domain is [0,1]. Given that scenario, we can use the following code to create values from 0 to 100:\\n\\n[source,java]\\n----\\nDistributionSummary.builder(\\\"my.ratio\\\").scale(100).register(registry)\\n----\\n\\nThis way, the ratio winds up in the range [0,100] and we can set `maximumExpectedValue` to 100. You can pair this with custom SLO boundaries if you care about particular ratios:\\n\\n[source,java]\\n----\\nDistributionSummary.builder(\\\"my.ratio\\\")\\n .scale(100)\\n .serviceLevelObjectives(70, 80, 90)\\n .register(registry)\\n----\\n\\n\\n== Memory Footprint Estimation\\n\\nThe total memory footprint of a distribution summary can vary dramatically, depending on which options you choose. The following table of memory consumption is based on the use of various features. These figures assume no tags and a ring buffer length of 3. Adding tags adds somewhat to the total, as does increasing the buffer length. Total storage can also vary somewhat depending on the registry implementation.\\n\\n* R = Ring buffer length. We assume the default of 3 in all examples. R is set with `DistributionSummary.Builder#distributionStatisticBufferLength`.\\n* B = Total histogram buckets. It can be SLO boundaries or percentile histogram buckets. By default, summaries have NO minimum and maximum expected value, so we ship all 276 predetermined histogram buckets. You should always clamp distribution summaries with a `minimumExpectedValue` and `maximumExpectedValue` when you intend to ship percentile histograms.\\n* M = Time-decaying max. 104 bytes.\\n* Fb = Fixed boundary histogram. 8b * B * R.\\n* Pp = Percentile precision. By default, it is 1. It is generally in the range of [0, 3]. Pp is set with `DistributionSummary.Builder#percentilePrecision`.\\n* Hdr(Pp) = High dynamic range histogram.\\n - When Pp = 0: 1.9kb * R + 0.8kb\\n - When Pp = 1: 3.8kb * R + 1.1kb\\n - When Pp = 2: 18.2kb * R + 4.7kb\\n - When Pp = 3: 66kb * R + 33kb\\n\\n\\n[width=\\\"80%\\\",options=\\\"header\\\"]\\n|=========================================================\\n|Client-side percentiles |Histogram and/or SLOs |Formula | Example\\n\\n|No |No |M| ~0.1kb\\n|No |Yes |M + Fb|For percentile histogram clamped to 66 buckets, ~6kb\\n|Yes |Yes |M + Hdr(Pp)|For the addition of a 0.95 percentile with defaults otherwise, ~12.6kb\\n|=========================================================\\n\\nNOTE: For Prometheus, R is _always_ equal to 1, regardless of how you attempt to configure it through `DistributionSummary.Builder`. This special case exists for Prometheus because it expects cumulative histogram data that never rolls over.\\n\\n:leveloffset!:\\n\\n== Long Task Timers\\n\\n:leveloffset: +1\\n\\nThe long task timer is a special type of timer that lets you measure time while an event being measured is *still running*. A normal Timer only records the duration *after* the task is complete.\\n\\nLong task timers publish at least the following statistics:\\n\\n* Active task count\\n* Total duration of active tasks\\n* The maximum duration of active tasks\\n\\nUnlike a regular `Timer`, a long task timer does not publish statistics about completed tasks.\\n\\nConsider a background process to refresh metadata from a data store. For example, https://github.com/Netflix/edda[Edda] caches AWS resources, such as instances, volumes, auto-scaling groups, and others. Normally all data can be refreshed in a few minutes. If the AWS services have problems, it can take much longer. A long task timer can be used to track the active time for refreshing the metadata.\\n\\nFor example, in a Spring application, it is common for such long running processes to be implemented with `@Scheduled`. Micrometer provides a special `@Timed` annotation for instrumenting these processes with a long task timer:\\n\\n[source, java]\\n----\\n@Timed(value = \\\"aws.scrape\\\", longTask = true)\\n@Scheduled(fixedDelay = 360000)\\nvoid scrapeResources() {\\n // find instances, volumes, auto-scaling groups, etc...\\n}\\n----\\n\\nIt is up to the application framework to make something happen with `@Timed`. If your framework of choice does not support it, you can still use the long task timer:\\n\\n[source, java]\\n----\\nLongTaskTimer scrapeTimer = registry.more().longTaskTimer(\\\"scrape\\\");\\nvoid scrapeResources() {\\n scrapeTimer.record(() => {\\n // find instances, volumes, auto-scaling groups, etc...\\n });\\n}\\n----\\n\\nIf we wanted to alert when this process exceeds a threshold, with a long task timer, we receive that alert at the first reporting interval after we have exceeded the threshold. With a regular timer, we would not receive the alert until the first reporting interval after the process completed, over an hour later!\\n\\nThe interface contains a fluent builder for long task timers:\\n\\n[source, java]\\n----\\nLongTaskTimer longTaskTimer = LongTaskTimer\\n .builder(\\\"long.task.timer\\\")\\n .description(\\\"a description of what this timer does\\\") // optional\\n .tags(\\\"region\\\", \\\"test\\\") // optional\\n .register(registry);\\n----\\n\\n:leveloffset!:\\n\\n== Histograms and Percentiles\\n\\n:leveloffset: +1\\n\\nTimers and distribution summaries support collecting data to observe their percentile distributions. There are two main approaches to viewing percentiles:\\n\\n* *Percentile histograms*: Micrometer accumulates values to an underlying histogram and ships a predetermined set of buckets to the monitoring system. The monitoring system's query language is responsible for calculating percentiles off of this histogram. Currently, only Prometheus, Atlas, and Wavefront support histogram-based percentile approximations, through `histogram_quantile`, `:percentile`, and `hs()`, respectively. If you target Prometheus, Atlas, or Wavefront, prefer this approach, since you can aggregate the histograms across dimensions (by summing the values of the buckets across a set of dimensions) and derive an aggregable percentile from the histogram.\\n* *Client-side percentiles*: Micrometer computes a percentile approximation for each meter ID (set of name and tags) and ships the percentile value to the monitoring system. This is not as flexible as a percentile histogram because it is not possible to aggregate percentile approximations across tags. Nevertheless, it provides some level of insight into percentile distributions for monitoring systems that do not support server-side percentile calculation based on a histogram.\\n\\nThe following example builds a timer with a histogram:\\n\\n[source,java]\\n----\\nTimer.builder(\\\"my.timer\\\")\\n .publishPercentiles(0.5, 0.95) // median and 95th percentile <1>\\n .publishPercentileHistogram() // <2>\\n .serviceLevelObjectives(Duration.ofMillis(100)) // <3>\\n .minimumExpectedValue(Duration.ofMillis(1)) // <4>\\n .maximumExpectedValue(Duration.ofSeconds(10))\\n----\\n\\n<1> `publishPercentiles`: Used to publish percentile values computed in your application. These values are non-aggregable across dimensions.\\n<2> `publishPercentileHistogram`: Used to publish a histogram suitable for computing aggregable (across dimensions) percentile approximations in Prometheus (by using `histogram_quantile`), Atlas (by using `:percentile`), and Wavefront (by using `hs()`). For Prometheus and Atlas, the buckets in the resulting histogram are preset by Micrometer based on a generator that has been determined empirically by Netflix to yield a reasonable error bound on most real world timers and distribution summaries. By default, the generator yields 276 buckets, but Micrometer includes only those that are within the range set by `minimumExpectedValue` and `maximumExpectedValue`, inclusive. Micrometer clamps timers by default to a range of 1 millisecond to 1 minute, yielding 73 histogram buckets per timer dimension. `publishPercentileHistogram` has no effect on systems that do not support aggregable percentile approximations. No histogram is shipped for these systems.\\n<3> `serviceLevelObjectives`: Used to publish a cumulative histogram with buckets defined by your SLOs. When used in concert with `publishPercentileHistogram` on a monitoring system that supports aggregable percentiles, this setting adds additional buckets to the published histogram. When used on a system that does not support aggregable percentiles, this setting causes a histogram to be published with only these buckets.\\n<4> `minimumExpectedValue`/`maximumExpectedValue`: Controls the number of buckets shipped by `publishPercentileHistogram` and controls the accuracy and memory footprint of the underlying HdrHistogram structure.\\n\\nSince shipping percentiles to the monitoring system generates additional time series, it is generally preferable to *not* configure them in core libraries that are included as dependencies in applications. Instead, applications can turn on this behavior for some set of timers and distribution summaries by using a meter filter.\\n\\nFor example, suppose we have a handful of timers in a common library. We have prefixed these timer names with `myservice`:\\n\\n[source,java]\\n----\\nregistry.timer(\\\"myservice.http.requests\\\").record(..);\\nregistry.timer(\\\"myservice.db.requests\\\").record(..);\\n----\\n\\nWe can turn on client-side percentiles for both timers by using a meter filter:\\n\\n[source,java]\\n----\\nregistry.config().meterFilter(\\n new MeterFilter() {\\n @Override\\n public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) {\\n if(id.getName().startsWith(\\\"myservice\\\")) {\\n return DistributionStatisticConfig.builder()\\n .percentiles(0.95)\\n .build()\\n .merge(config);\\n }\\n return config;\\n }\\n });\\n----\\n\\n:leveloffset!:\\n\"","export default __webpack_public_path__ + \"439c0eea1918ef143002cf62a9393e2a.png\";","export default __webpack_public_path__ + \"594dce115710525d7771ebe3ab82db19.png\";","export default __webpack_public_path__ + \"5cdb40b089820639454d90a5e4874aee.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\nMicrometer provides several binders for monitoring the JVM:\\n\\n[source, java]\\n----\\nnew ClassLoaderMetrics().bindTo(registry); <1>\\nnew JvmMemoryMetrics().bindTo(registry); <2>\\nnew JvmGcMetrics().bindTo(registry); <3>\\nnew ProcessorMetrics().bindTo(registry); <4>\\nnew JvmThreadMetrics().bindTo(registry); <5>\\n----\\n<1> Gauges loaded and unloaded classes.\\n<2> Gauges buffer and memory pool utilization.\\n<3> Gauges max and live data size, promotion and allocation rates, and times GC pauses (or concurrent phase time in the case of CMS).\\n<4> Gauges current CPU total and load average.\\n<5> Gauges thread peak, number of daemon threads, and live threads.\\n\\nMicrometer also provides a meter binder for `ExecutorService`. You can instrument your `ExecutorService` as follows:\\n\\n[source, java]\\n----\\nnew ExecutorServiceMetrics(executor, executorServiceName, tags).bindTo(registry);\\n----\\n\\nMetrics created from the binder vary based on the type of `ExecutorService`.\\n\\nFor `ThreadPoolExecutor`, the following metrics are provided:\\n\\n* `executor.completed` (`FunctionCounter`): The approximate total number of tasks that have completed execution.\\n* `executor.active` (`Gauge`): The approximate number of threads that are actively executing tasks.\\n* `executor.queued` (`Gauge`): The approximate number of tasks that are queued for execution.\\n* `executor.pool.size` (`Gauge`): The current number of threads in the pool.\\n\\nFor `ForkJoinPool`, the following metrics are provided:\\n\\n* `executor.steals` (`FunctionCounter`): Estimate of the total number of tasks stolen from one thread's work queue by\\nanother. The reported value underestimates the actual total number of steals when the pool is not quiescent.\\n* `executor.queued` (`Gauge`): An estimate of the total number of tasks currently held in queues by worker threads.\\n* `executor.active` (`Gauge`): An estimate of the number of threads that are currently stealing or executing tasks.\\n* `executor.running` (`Gauge`): An estimate of the number of worker threads that are not blocked but are waiting to join tasks or for other managed synchronization threads.\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\nMicrometer supports binding metrics to a variety of different popular caching libraries. Each implementation supports basic features, such as cache hits versus misses, from which you can derive basic information about the cache hit ratio over a period of time. Micrometer uses a function tracking counter to monitor such things as hits and misses, giving you a notion not only of hits and misses over the total life of the cache (the basic metric exposed from Guava's `CacheStats`, for example) but hits and misses inside a given interval.\\n\\nTo demonstrate the features of cache monitoring, we start with a simple program that uses `reactor-netty` to read the entirety of Mary Shelley's _Frankenstein_ and put each word in the cache if it has not yet been seen:\\n\\n====\\n[source,java]\\n----\\n// read all of Frankenstein\\nHttpClient.create(\\\"www.gutenberg.org\\\")\\n .get(\\\"/cache/epub/84/pg84.txt\\\")\\n .flatMapMany(res -> res.addHandler(wordDecoder()).receive().asString())\\n .delayElements(Duration.ofMillis(10)) // one word per 10 ms\\n .filter(word -> !word.isEmpty())\\n .doOnNext(word -> {\\n if (cache.getIfPresent(word) == null)\\n cache.put(word, 1);\\n })\\n .blockLast();\\n----\\n====\\n\\nThe following image shows the hits versus misses on a cache that has been tuned to hold a maximum of 10,000 entries:\\n\\n.Hits vs. misses, viewed in Prometheus\\nimage::\" + require(\"!file-loader!./img/prometheus-guava-cache.png\") + \"[Hits vs. misses,width=800]\\n\\n```\\nrate(book_guava_requests_total[10s])\\n```\\n\\nBy dividing the hits by the sum of all `get` operations (regardless of whether or not each one was a hit or a miss), we can arrive at a notion of the upper bound for the hit ratio for reading Frankenstein with only 10,000 words:\\n\\n.Hit ratio, viewed by Prometheus\\nimage::\" + require(\"!file-loader!./img/prometheus-guava-cache-ratio.png\") + \"[Hit ratio,width=800]\\n\\n```\\nsum(rate(book_guava_requests_total{result=\\\"hit\\\"}[1m])) / sum(rate(book_guava_requests_total[1m]))\\n```\\n\\nIn a real-world scenario, we tune caches according to how we evaluate the tradeoff between storage and load efficiency. You could create an alert based on some upper bound for the rate at which misses occur or on a lower bound for the hit ratio. Setting an upper bound on miss ratio is better than a lower bound on hit ratio. For both ratios, an absence of any activity drops the value to 0.\\nThe following image shows the miss ratio when it exceeds 10%:\\n\\n.Alerting when the miss ratio exceeds 10%\\nimage::\" + require(\"!file-loader!./img/grafana-guava-miss-ratio.png\") + \"[Miss ratio (alerted),width=800]\\n\"","export default __webpack_public_path__ + \"fd12bde9dc50409da244eb7ba80f6548.png\";","export default __webpack_public_path__ + \"aa70057042488eef46660369434e99d4.png\";","export default __webpack_public_path__ + \"3c191f6ce81fefe9b7d1980fc9d5b4fe.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\nMicrometer supports binding metrics to `OkHttpClient` through `EventListener`.\\n\\nYou can collect metrics from `OkHttpClient` by adding `OkHttpMetricsEventListener` as follows:\\n\\n[source,java]\\n----\\nOkHttpClient client = new OkHttpClient.Builder()\\n .eventListener(OkHttpMetricsEventListener.builder(registry, \\\"okhttp.requests\\\")\\n .tags(Tags.of(\\\"foo\\\", \\\"bar\\\"))\\n .build())\\n .build();\\n----\\n\\nNOTE: The `uri` tag is usually limited to URI patterns to mitigate tag cardinality explosion, but `OkHttpClient` does not\\nprovide URI patterns. We provide `URI_PATTERN` header to support `uri` tag, or you can configure a URI mapper to provide\\nyour own tag values for `uri` tag.\\n\\nTo configure a URI mapper, you can use `uriMapper()` as follows:\\n\\n[source,java]\\n----\\nOkHttpClient client = new OkHttpClient.Builder()\\n .eventListener(OkHttpMetricsEventListener.builder(registry, \\\"okhttp.requests\\\")\\n .uriMapper(req -> req.url().encodedPath())\\n .tags(Tags.of(\\\"foo\\\", \\\"bar\\\"))\\n .build())\\n .build();\\n----\\n\\nWARNING: The sample might trigger tag cardinality explosion, as a URI path itself is being used for tag values.\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\nMicrometer supports binding metrics to `Jetty` through `Connection.Listener`.\\n\\nYou can collect metrics from `Jetty` by adding `JettyConnectionMetrics` as follows:\\n\\n[source,java]\\n----\\n Server server = new Server(0);\\n Connector connector = new ServerConnector(server);\\n connector.addBean(new JettyConnectionMetrics(registry, connector, Tags.of(\\\"foo\\\", \\\"bar\\\"));\\n server.setConnectors(new Connector[] { connector });\\n----\\n\\nMicrometer also supports binding metrics to `Jersey` through `ApplicationEventListener`.\\n\\nYou can collect metrics from `Jersey` by adding `MetricsApplicationEventListener` as follows:\\n\\n[source,java]\\n----\\nResourceConfig resourceConfig = new ResourceConfig();\\nresourceConfig.register(new MetricsApplicationEventListener(\\n registry,\\n new DefaultJerseyTagsProvider(),\\n \\\"http.server.requests\\\",\\n true));\\nServletContainer servletContainer = new ServletContainer(resourceConfig);\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\nMicrometer supports binding metrics to `Netty`.\\n\\nYou can collect metrics from `ByteBuf` allocators and from `EventLoopGroup` instances.\\nInstrumentation can be done once at startup, if resources are already known:\\n\\n[source,java,subs=+attributes]\\n-----\\n// Create or get an existing resources\\nDefaultEventLoopGroup eventExecutors = new DefaultEventLoopGroup();\\nUnpooledByteBufAllocator unpooledByteBufAllocator = new UnpooledByteBufAllocator(false);\\n// Use binders to instrument them\\nnew NettyEventExecutorMetrics(eventExecutors).bindTo(this.registry);\\nnew NettyAllocatorMetrics(unpooledByteBufAllocator).bindTo(this.registry);\\n-----\\n\\nNetty infrastructure can be configured in many ways, so you can also instrument lazily at runtime as resources are used.\\nIf you do so, you must ensure that you will not bind metrics for the same resource multiple times as this can have runtime drawbacks:\\n\\n[source,java,subs=+attributes]\\n-----\\n@Override\\nprotected void initChannel(SocketChannel channel) throws Exception {\\n EventLoop eventLoop = channel.eventLoop();\\n if (!isEventLoopInstrumented(eventLoop)) {\\n new NettyEventExecutorMetrics(eventLoop).bindTo(this.meterRegistry);\\n }\\n ByteBufAllocator allocator = channel.alloc();\\n if (!isAllocatorInstrumented(allocator) && allocator instanceof ByteBufAllocatorMetricProvider) {\\n ByteBufAllocatorMetricProvider allocatorMetric = (ByteBufAllocatorMetricProvider) allocator;\\n new NettyAllocatorMetrics(allocatorMetric).bindTo(this.meterRegistry);\\n }\\n}\\n-----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Passing through to Dropwizard's Console Reporter\\n:toc:\\n\\nThis guide shows how to plug in less commonly used Dropwizard `Reporter` implementations -- in this case, the `ConsoleReporter`.\\n\\n[source,java]\\n----\\n @Bean\\n public MetricRegistry dropwizardRegistry() {\\n return new MetricRegistry();\\n }\\n\\n @Bean\\n public ConsoleReporter consoleReporter(MetricRegistry dropwizardRegistry) {\\n ConsoleReporter reporter = ConsoleReporter.forRegistry(dropwizardRegistry)\\n .convertRatesTo(TimeUnit.SECONDS)\\n .convertDurationsTo(TimeUnit.MILLISECONDS)\\n .build();\\n reporter.start(1, TimeUnit.SECONDS);\\n return reporter;\\n }\\n\\n @Bean\\n public MeterRegistry consoleLoggingRegistry(MetricRegistry dropwizardRegistry) {\\n DropwizardConfig consoleConfig = new DropwizardConfig() {\\n\\n @Override\\n public String prefix() {\\n return \\\"console\\\";\\n }\\n\\n @Override\\n public String get(String key) {\\n return null;\\n }\\n\\n };\\n\\n return new DropwizardMeterRegistry(consoleConfig, dropwizardRegistry, HierarchicalNameMapper.DEFAULT, Clock.SYSTEM) {\\n @Override\\n protected Double nullGaugeValue() {\\n return null;\\n }\\n };\\n }\\n----\\n\\nNote that, in a Spring environment, this registry is added to other implementations in a composite and is used for all metrics, both custom and\\nauto-configured.\\n\\n[source,java]\\n----\\nclass MyComponent {\\n private final MeterRegistry registry;\\n\\n public MyComponent(MeterRegistry registry) {\\n this.registry = registry;\\n }\\n\\n public void doSomeWork(String lowCardinalityInput) {\\n registry.timer(\\\"my.latency\\\", \\\"input\\\", lowCardinalityInput).record(() -> {\\n // do work\\n });\\n }\\n}\\n----\\n\\nThe following listing shows typical output for this custom timer:\\n\\n[source,txt]\\n----\\n3/2/18 10:14:27 AM =============================================================\\n\\n-- Timers ----------------------------------------------------------------------\\nmyLatency.lowCardinalityInput.INPUT\\n count = 1\\n mean rate = 1.02 calls/second\\n 1-minute rate = 0.00 calls/second\\n 5-minute rate = 0.00 calls/second\\n 15-minute rate = 0.00 calls/second\\n min = 100.00 milliseconds\\n max = 100.00 milliseconds\\n mean = 100.00 milliseconds\\n stddev = 0.00 milliseconds\\n median = 100.00 milliseconds\\n 75% <= 100.00 milliseconds\\n 95% <= 100.00 milliseconds\\n 98% <= 100.00 milliseconds\\n 99% <= 100.00 milliseconds\\n 99.9% <= 100.00 milliseconds\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= HttpSender with Resilience4j Retry\\n\\n`HttpSender` is an interface for HTTP clients that are used in meter registries for HTTP-based metrics publication. There\\nare two implementations:\\n\\n* `HttpUrlConnectionSender`: `HttpURLConnection`-based `HttpSender`\\n* `OkHttpSender`: OkHttp-based `HttpSender`\\n\\nThere is no out-of-the-box support for retry, but you can decorate it with Resilience4j retry, as follows:\\n\\n[source,java]\\n----\\n @Bean\\n public DatadogMeterRegistry datadogMeterRegistry(DatadogConfig datadogConfig, Clock clock) {\\n return DatadogMeterRegistry.builder(datadogConfig)\\n .clock(clock)\\n .httpClient(new RetryHttpClient())\\n .build();\\n }\\n\\n private static class RetryHttpClient extends HttpUrlConnectionSender {\\n\\n private final RetryConfig retryConfig = RetryConfig.custom()\\n .maxAttempts(2)\\n .waitDuration(Duration.ofSeconds(5))\\n .build();\\n\\n private final Retry retry = Retry.of(\\\"datadog-metrics\\\", this.retryConfig);\\n\\n @Override\\n public Response send(Request request) {\\n CheckedFunction0<Response> retryableSupplier = Retry.decorateCheckedSupplier(\\n this.retry,\\n () -> super.send(request));\\n return Try.of(retryableSupplier).get();\\n }\\n\\n }\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Custom Meter Registry\\n\\nMicrometer supports popular meter registries out of the box, so you should check those first.\\nFor an existing meter registry, if you think that your requirements are generally useful, consider creating an issue or PR against the Micrometer issue tracker.\\nFor a non-existent meter registry, if it is widely-used, consider creating an issue or PR for it.\\n\\nIf you need to create your own custom meter registry, you can create it by extending one of the base classes for meter registries: `MeterRegistry`, `PushMeterRegistry`, or `StepMeterRegistry`.\\n\\nThe most common way is to extend `StepMeterRegistry`.\\nYou can create your own custom `StepMeterRegistry`.\\n\\nFirst, define your own meter registry configuration by extending `StepRegistryConfig`, as follows:\\n\\n[source,java]\\n----\\npublic interface CustomRegistryConfig extends StepRegistryConfig {\\n\\n CustomRegistryConfig DEFAULT = k -> null;\\n\\n @Override\\n default String prefix() {\\n return \\\"custom\\\";\\n }\\n\\n}\\n----\\n\\nSecond, define your own meter registry by extending `StepMeterRegistry`, as follows:\\n\\n[source,java]\\n----\\npublic class CustomMeterRegistry extends StepMeterRegistry {\\n\\n public CustomMeterRegistry(CustomRegistryConfig config, Clock clock) {\\n super(config, clock);\\n\\n start(new NamedThreadFactory(\\\"custom-metrics-publisher\\\"));\\n }\\n\\n @Override\\n protected void publish() {\\n getMeters().stream().forEach(meter -> System.out.println(\\\"Publishing \\\" + meter.getId()));\\n }\\n\\n @Override\\n protected TimeUnit getBaseTimeUnit() {\\n return TimeUnit.MILLISECONDS;\\n }\\n\\n}\\n----\\n\\nFinally, create the meter registry configuration and the meter registry.\\nIf you use Spring Boot, you can do so as follows:\\n\\n[source,java]\\n----\\n@Configuration\\npublic class MetricsConfig {\\n\\n @Bean\\n public CustomRegistryConfig customRegistryConfig() {\\n return CustomRegistryConfig.DEFAULT;\\n }\\n\\n @Bean\\n public CustomMeterRegistry customMeterRegistry(CustomRegistryConfig customRegistryConfig, Clock clock) {\\n return new CustomMeterRegistry(customRegistryConfig, clock);\\n }\\n\\n}\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Observation\\n:toc:\\n:sectnums:\\n:dimensional: true\\n\\n== Purpose\\n\\nMicrometer Observation is part of the https://github.com/micrometer-metrics/micrometer[Micrometer] project and contains the Observation API. The main idea behind it is that you\\n\\n> Instrument code once, and get multiple benefits out of it\\n\\n== Installing\\n\\nMicrometer comes with a Bill of Materials (BOM) which is a project that manages all the project versions for consistency.\\n\\nThe following example shows the required dependency for Micrometer Observation in Gradle:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation platform('io.micrometer:micrometer-bom:latest.release')\\nimplementation 'io.micrometer:micrometer-observation'\\n----\\n\\nThe following example shows the required dependency in Maven:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependencyManagement>\\n <dependencies>\\n <dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-bom</artifactId>\\n <version>${micrometer.version}</version>\\n <type>pom</type>\\n <scope>import</scope>\\n </dependency>\\n </dependencies>\\n</dependencyManagement>\\n\\n<dependencies>\\n <dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-observation</artifactId>\\n </dependency>\\n</dependencies>\\n----\\n\\n== Introduction\\n\\n:leveloffset: +1\\n\\nFor any Observation to happen, you need to register `ObservationHandler` objects through an `ObservationRegistry`. An `ObservationHandler` reacts only to supported implementations of an `Observation.Context` and can create timers, spans, and logs by reacting to the lifecycle events of an Observation such as\\n\\n* `start` - Observation has been started. Happens when the `Observation#start()` method gets called.\\n* `stop` - Observation has been stopped. Happens when the `Observation#stop()` method gets called.\\n* `error` - An error occurred while observing. Happens when the `Observation#error(exception)` method gets called.\\n* `event` - An event happened when observing. Happens when the `Observation#event(event)` method gets called.\\n* `scope started` - Observation opens a Scope. The Scope must be closed when no longer used. Handlers can create thread local variables on start that are cleared upon closing of the scope. Happens when the `Observation#openScope()` method gets called.\\n* `scope stopped` - Observation stops a Scope. Happens when the `Observation.Scope#close()` method gets called.\\n\\nWhenever any of these methods is called, an `ObservationHandler` method (such as `onStart(T extends Observation.Context ctx)`, `onStop(T extends Observation.Context ctx)`, and so on) is called. To pass state between the handler methods, you can use the `Observation.Context`.\\n\\nThis is how Observation state diagram looks like:\\n\\n[source]\\n----\\n Observation Observation\\n Context Context\\nCreated ----------> Started ----------> Stopped\\n----\\n\\nThis is how Observation Scope state diagram looks like:\\n\\n[source]\\n----\\n Observation\\n Context\\nScope Started ----------> Scope Finished\\n----\\n\\nTo make it possible to debug production problems an Observation needs additional metadata such as key-value pairs (also known as tags). You can then query your metrics or distributed tracing backend by those tags to find the required data. Tags can be either of high or low cardinality.\\n\\nIMPORTANT: *High cardinality* means that a pair will have an unbounded number of possible values. An HTTP URL is a good\\nexample of such a key value (e.g. `/foo/user1234`, `/foo/user2345` etc.). *Low cardinality* means that a key value will have a bounded number of possible values. A *templated* HTTP URL is a good example of such a key value (e.g. `/foo/{userId}`).\\n\\nTo separate Observation lifecycle operations from an Observation configuration (such as names and low and high cardinality tags), you can use the `ObservationConvention` that provides an easy way of overriding the default naming conventions.\\n\\nBelow you can find an example of using the Observation API.\\n\\n[source,java,subs=+attributes]\\n-----\\nstatic class Example {\\n\\n private final ObservationRegistry registry;\\n\\n Example(ObservationRegistry registry) {\\n this.registry = registry;\\n }\\n\\n void run() {\\n Observation.createNotStarted(\\\"foo\\\", registry)\\n .lowCardinalityKeyValue(\\\"lowTag\\\", \\\"lowTagValue\\\")\\n .highCardinalityKeyValue(\\\"highTag\\\", \\\"highTagValue\\\")\\n .observe(() -> System.out.println(\\\"Hello\\\"));\\n }\\n\\n}\\n-----\\n\\nTIP: Calling `observe(() -> ...)` leads to starting the Observation, putting it in scope, running the lambda, putting an error on the Observation if one took place, closing the scope and stopping the Observation.\\n\\n:leveloffset!:\\n\\n== ObservationHandler\\n\\n:leveloffset: +1\\n\\nA popular way to record them is storing the start state in a `Timer.Sample` instance and stopping it when the event has ended.\\nRecording such measurements could look like this:\\n\\n[source,java,subs=+attributes]\\n-----\\nMeterRegistry registry = new SimpleMeterRegistry();\\nTimer.Sample sample = Timer.start(registry);\\ntry {\\n // do some work here\\n}\\nfinally {\\n sample.stop(Timer.builder(\\\"my.timer\\\").register(registry));\\n}\\n-----\\n\\nIf you want to have more observation options (such as metrics and tracing out of the box plus anything else you will plug in) then you'll need to rewrite that code to use the `Observation` API.\\n\\n[source,java,subs=+attributes]\\n-----\\nObservationRegistry registry = ObservationRegistry.create();\\nObservation.createNotStarted(\\\"my.operation\\\", registry).observe(this::doSomeWorkHere);\\n-----\\n\\nOne of the new features in Micrometer 1.10 is the ability to register \\\"handlers\\\" (`ObservationHandler`) that are notified about the lifecycle event of an observation (e.g.: you can run custom code when an observation is started/stopped).\\nUsing this feature lets you add tracing capabilities to your existing metrics instrumentation (see: `DefaultTracingObservationHandler`). The implementation of these handlers does not need to be tracing related, it is completely up to you how you are going to implement them (e.g.: you can add logging capabilities) if you want.\\n\\n=== Observation.Context\\n\\nIn order to pass information between the instrumented code and the handler (or between handler methods, e.g.: `onStart` and `onStop`), you can utilize an `Observation.Context`. An `Observation.Context` is a `Map`-like container that can store values for you while your handler can access the data inside the context.\\n\\n=== ObservationHandler Example\\n\\nBased on this, we can implement a simple handler that lets the users know about its invocations by printing them out to `stdout`.\\n\\n[source,java,subs=+attributes]\\n-----\\nstatic class SimpleHandler implements ObservationHandler<Observation.Context> {\\n\\n @Override\\n public void onStart(Observation.Context context) {\\n System.out.println(\\\"START \\\" + \\\"data: \\\" + context.get(String.class));\\n }\\n\\n @Override\\n public void onError(Observation.Context context) {\\n System.out.println(\\\"ERROR \\\" + \\\"data: \\\" + context.get(String.class) + \\\", error: \\\" + context.getError());\\n }\\n\\n @Override\\n public void onEvent(Observation.Event event, Observation.Context context) {\\n System.out.println(\\\"EVENT \\\" + \\\"event: \\\" + event + \\\" data: \\\" + context.get(String.class));\\n }\\n\\n @Override\\n public void onStop(Observation.Context context) {\\n System.out.println(\\\"STOP \\\" + \\\"data: \\\" + context.get(String.class));\\n }\\n\\n @Override\\n public boolean supportsContext(Observation.Context handlerContext) {\\n // you can decide if your handler should be invoked for this context object or\\n // not\\n return true;\\n }\\n\\n}\\n-----\\n\\nYou need to register the handler to the `ObservationRegistry`.\\n\\n[source,java,subs=+attributes]\\n-----\\nObservationRegistry registry = ObservationRegistry.create();\\nregistry.observationConfig().observationHandler(new SimpleHandler());\\n-----\\n\\nYou can use the `observe` method to instrument your codebase.\\n\\n[source,java,subs=+attributes]\\n-----\\nObservationRegistry registry = ObservationRegistry.create();\\nObservation.Context context = new Observation.Context().put(String.class, \\\"test\\\");\\n// using a context is optional, so you can call createNotStarted without it:\\n// Observation.createNotStarted(name, registry)\\nObservation.createNotStarted(\\\"my.operation\\\", () -> context, registry).observe(this::doSomeWorkHere);\\n-----\\n\\nYou can also take full control of the scoping mechanism.\\n\\n[source,java,subs=+attributes]\\n-----\\nObservationRegistry registry = ObservationRegistry.create();\\nObservation.Context context = new Observation.Context().put(String.class, \\\"test\\\");\\n// using a context is optional, so you can call start without it:\\n// Observation.start(name, registry)\\nObservation observation = Observation.start(\\\"my.operation\\\", () -> context, registry);\\ntry (Observation.Scope scope = observation.openScope()) {\\n doSomeWorkHere();\\n}\\ncatch (Exception ex) {\\n observation.error(ex); // and don't forget to handle exceptions\\n throw ex;\\n}\\nfinally {\\n observation.stop();\\n}\\n-----\\n\\n=== Signaling Errors and Arbitrary Events\\n\\nWhen **instrumenting** code we might want to signal that an error happened or signal that an arbitrary event happened. The observation API lets us do it via it `error` and `event` methods.\\n\\nOne use-case for signaling arbitrary event can be attaching annotations to `Span` for Distributed Tracing but you can also process them however you want in your own handler, e.g.: emit log events based on them.\\n\\n[source,java,subs=+attributes]\\n-----\\nObservationRegistry registry = ObservationRegistry.create();\\nObservation observation = Observation.start(\\\"my.operation\\\", registry);\\ntry (Observation.Scope scope = observation.openScope()) {\\n observation.event(Observation.Event.of(\\\"my.event\\\", \\\"look what happened\\\"));\\n doSomeWorkHere();\\n}\\ncatch (Exception exception) {\\n observation.error(exception);\\n throw exception;\\n}\\nfinally {\\n observation.stop();\\n}\\n-----\\n\\n=== Observation.ObservationConvention Example\\n\\nWhen **instrumenting** code we want to provide sensible defaults for tags but also we want to allow users to easily change those defaults. An `ObservationConvention` interface is a description of what tags and name we should create for an `Observation.Context`. See the full usage example of an instrumentation together with overriding the default tags.\\n\\n[source,java,subs=+attributes]\\n-----\\n\\n/**\\n * A dedicated {@link Observation.Context} used for taxing.\\n */\\nclass TaxContext extends Observation.Context {\\n\\n private final String taxType;\\n\\n private final String userId;\\n\\n TaxContext(String taxType, String userId) {\\n this.taxType = taxType;\\n this.userId = userId;\\n }\\n\\n String getTaxType() {\\n return taxType;\\n }\\n\\n String getUserId() {\\n return userId;\\n }\\n\\n}\\n\\n/**\\n * An example of an {@link ObservationFilter} that will add the key-values to all\\n * observations.\\n */\\nclass CloudObservationFilter implements ObservationFilter {\\n\\n @Override\\n public Observation.Context map(Observation.Context context) {\\n return context.addLowCardinalityKeyValue(KeyValue.of(\\\"cloud.zone\\\", CloudUtils.getZone()))\\n .addHighCardinalityKeyValue(KeyValue.of(\\\"cloud.instance.id\\\", CloudUtils.getCloudInstanceId()));\\n }\\n\\n}\\n\\n/**\\n * An example of an {@link ObservationConvention} that renames the tax related\\n * observations and adds cloud related tags to all contexts. When registered via the\\n * `ObservationRegistry#observationConfig#observationConvention` will override the\\n * default {@link TaxObservationConvention}. If the user provides a custom\\n * implementation of the {@link TaxObservationConvention} and passes it to the\\n * instrumentation, the custom implementation wins.\\n *\\n * In other words\\n *\\n * 1) Custom {@link ObservationConvention} has precedence 2) If no custom convention\\n * was passed and there's a matching {@link GlobalObservationConvention} it will be\\n * picked 3) If there's no custom, nor matching global convention, the default\\n * {@link ObservationConvention} will be used\\n *\\n * If you need to add some key-values regardless of the used\\n * {@link ObservationConvention} you should use an {@link ObservationFilter}.\\n */\\nclass GlobalTaxObservationConvention implements GlobalObservationConvention<TaxContext> {\\n\\n // this will be applicable for all tax contexts - it will rename all the tax\\n // contexts\\n @Override\\n public boolean supportsContext(Observation.Context context) {\\n return context instanceof TaxContext;\\n }\\n\\n @Override\\n public String getName() {\\n return \\\"global.tax.calculate\\\";\\n }\\n\\n}\\n\\n// Interface for an ObservationConvention related to calculating Tax\\ninterface TaxObservationConvention extends ObservationConvention<TaxContext> {\\n\\n @Override\\n default boolean supportsContext(Observation.Context context) {\\n return context instanceof TaxContext;\\n }\\n\\n}\\n\\n/**\\n * Default convention of tags related to calculating tax. If no user one or global\\n * convention will be provided then this one will be picked.\\n */\\nclass DefaultTaxObservationConvention implements TaxObservationConvention {\\n\\n @Override\\n public KeyValues getLowCardinalityKeyValues(TaxContext context) {\\n return KeyValues.of(TAX_TYPE.withValue(context.getTaxType()));\\n }\\n\\n @Override\\n public KeyValues getHighCardinalityKeyValues(TaxContext context) {\\n return KeyValues.of(USER_ID.withValue(context.getUserId()));\\n }\\n\\n @Override\\n public String getName() {\\n return \\\"default.tax.name\\\";\\n }\\n\\n}\\n\\n/**\\n * If micrometer-docs-generator is used, we will automatically generate documentation\\n * for your observations. Check this URL\\n * https://github.com/micrometer-metrics/micrometer-docs-generator#documentation for\\n * setup example and read the {@link ObservationDocumentation} javadocs.\\n */\\nenum TaxObservationDocumentation implements ObservationDocumentation {\\n\\n CALCULATE {\\n @Override\\n public Class<? extends ObservationConvention<? extends Observation.Context>> getDefaultConvention() {\\n return DefaultTaxObservationConvention.class;\\n }\\n\\n @Override\\n public String getContextualName() {\\n return \\\"calculate tax\\\";\\n }\\n\\n @Override\\n public String getPrefix() {\\n return \\\"tax\\\";\\n }\\n\\n @Override\\n public KeyName[] getLowCardinalityKeyNames() {\\n return TaxLowCardinalityKeyNames.values();\\n }\\n\\n @Override\\n public KeyName[] getHighCardinalityKeyNames() {\\n return TaxHighCardinalityKeyNames.values();\\n }\\n };\\n\\n enum TaxLowCardinalityKeyNames implements KeyName {\\n\\n TAX_TYPE {\\n @Override\\n public String asString() {\\n return \\\"tax.type\\\";\\n }\\n }\\n\\n }\\n\\n enum TaxHighCardinalityKeyNames implements KeyName {\\n\\n USER_ID {\\n @Override\\n public String asString() {\\n return \\\"tax.user.id\\\";\\n }\\n }\\n\\n }\\n\\n}\\n\\n/**\\n * Our business logic that we want to observe.\\n */\\nclass TaxCalculator {\\n\\n private final ObservationRegistry observationRegistry;\\n\\n // If the user wants to override the default they can override this. Otherwise,\\n // it will be {@code null}.\\n @Nullable\\n private final TaxObservationConvention observationConvention;\\n\\n TaxCalculator(ObservationRegistry observationRegistry,\\n @Nullable TaxObservationConvention observationConvention) {\\n this.observationRegistry = observationRegistry;\\n this.observationConvention = observationConvention;\\n }\\n\\n void calculateTax(String taxType, String userId) {\\n // Create a new context\\n TaxContext taxContext = new TaxContext(taxType, userId);\\n // Create a new observation\\n TaxObservationDocumentation.CALCULATE\\n .observation(this.observationConvention, new DefaultTaxObservationConvention(), () -> taxContext,\\n this.observationRegistry)\\n // Run the actual logic you want to observe\\n .observe(this::calculateInterest);\\n }\\n\\n private void calculateInterest() {\\n // do some work\\n }\\n\\n}\\n\\n/**\\n * Example of user changing the default conventions.\\n */\\nclass CustomTaxObservationConvention extends DefaultTaxObservationConvention {\\n\\n @Override\\n public KeyValues getLowCardinalityKeyValues(TaxContext context) {\\n return super.getLowCardinalityKeyValues(context)\\n .and(KeyValue.of(\\\"additional.low.cardinality.tag\\\", \\\"value\\\"));\\n }\\n\\n @Override\\n public KeyValues getHighCardinalityKeyValues(TaxContext context) {\\n return KeyValues.of(\\\"this.would.override.the.default.high.cardinality.tags\\\", \\\"value\\\");\\n }\\n\\n @Override\\n public String getName() {\\n return \\\"tax.calculate\\\";\\n }\\n\\n}\\n\\n/**\\n * A utility class to set cloud related arguments.\\n */\\nstatic class CloudUtils {\\n\\n static String getZone() {\\n return \\\"...\\\";\\n }\\n\\n static String getCloudInstanceId() {\\n return \\\"...\\\";\\n }\\n\\n}\\n-----\\n\\nBelow you can find an example of setting the whole code together.\\n\\n[source,java,subs=+attributes]\\n-----\\n// Registry setup\\nObservationRegistry observationRegistry = ObservationRegistry.create();\\n// add metrics\\nSimpleMeterRegistry registry = new SimpleMeterRegistry();\\nobservationRegistry.observationConfig().observationHandler(new DefaultMeterObservationHandler(registry));\\nobservationRegistry.observationConfig().observationConvention(new GlobalTaxObservationConvention());\\n// This will be applied to all observations\\nobservationRegistry.observationConfig().observationFilter(new CloudObservationFilter());\\n\\n// In this case we're overriding the default convention by passing the custom one\\nTaxCalculator taxCalculator = new TaxCalculator(observationRegistry, new CustomTaxObservationConvention());\\n// run the logic you want to observe\\ntaxCalculator.calculateTax(\\\"INCOME_TAX\\\", \\\"1234567890\\\");\\n-----\\n\\n=== Observation Predicates and Filters\\n\\nTo globally disable observations under given conditions you can use an `ObservationPredicate`. To mutate the `Observation.Context` you can use an `ObservationFilter`.\\n\\nTo set these just call `ObservationRegistry#observationConfig()#observationPredicate()` and `ObservationRegistry#observationConfig()#observationFilter()` methods respectively.\\n\\nBelow you can find an example of predicates and filters.\\n\\n[source,java,subs=+attributes]\\n-----\\n// Example using a metrics handler - we need a MeterRegistry\\nMeterRegistry meterRegistry = new SimpleMeterRegistry();\\n\\n// Create an ObservationRegistry\\nObservationRegistry registry = ObservationRegistry.create();\\n// Add predicates and filter to the registry\\nregistry.observationConfig()\\n // ObservationPredicate can decide whether an observation should be\\n // ignored or not\\n .observationPredicate((observationName, context) -> {\\n // Creates a noop observation if observation name is of given name\\n if (\\\"to.ignore\\\".equals(observationName)) {\\n // Will be ignored\\n return false;\\n }\\n if (context instanceof MyContext) {\\n // For the custom context will ignore a user with a given name\\n return !\\\"user to ignore\\\".equals(((MyContext) context).getUsername());\\n }\\n // Will proceed for all other types of context\\n return true;\\n })\\n // ObservationFilter can modify a context\\n .observationFilter(context -> {\\n // We're adding a low cardinality key to all contexts\\n context.addLowCardinalityKeyValue(KeyValue.of(\\\"low.cardinality.key\\\", \\\"low cardinality value\\\"));\\n if (context instanceof MyContext) {\\n // We're mutating a specific type of a context\\n MyContext myContext = (MyContext) context;\\n myContext.setUsername(\\\"some username\\\");\\n // We want to remove a high cardinality key value\\n return myContext.removeHighCardinalityKeyValue(\\\"high.cardinality.key.to.ignore\\\");\\n }\\n return context;\\n })\\n // Example of using metrics\\n .observationHandler(new DefaultMeterObservationHandler(meterRegistry));\\n\\n// Observation will be ignored because of the name\\nthen(Observation.start(\\\"to.ignore\\\", () -> new MyContext(\\\"don't ignore\\\"), registry)).isSameAs(Observation.NOOP);\\n// Observation will be ignored because of the entries in MyContext\\nthen(Observation.start(\\\"not.to.ignore\\\", () -> new MyContext(\\\"user to ignore\\\"), registry))\\n .isSameAs(Observation.NOOP);\\n\\n// Observation will not be ignored...\\nMyContext myContext = new MyContext(\\\"user not to ignore\\\");\\nmyContext.addHighCardinalityKeyValue(KeyValue.of(\\\"high.cardinality.key.to.ignore\\\", \\\"some value\\\"));\\nObservation.createNotStarted(\\\"not.to.ignore\\\", () -> myContext, registry).observe(this::yourCodeToMeasure);\\n// ...and will have the context mutated\\nthen(myContext.getLowCardinalityKeyValue(\\\"low.cardinality.key\\\").getValue()).isEqualTo(\\\"low cardinality value\\\");\\nthen(myContext.getUsername()).isEqualTo(\\\"some username\\\");\\nthen(myContext.getHighCardinalityKeyValues())\\n .doesNotContain(KeyValue.of(\\\"high.cardinality.key.to.ignore\\\", \\\"some value\\\"));\\n-----\\n\\n=== Using Annotations With @Observed\\n\\nIf you have turned on Aspect Oriented Programming (e.g. via `org.aspectj:aspectjweaver`) you can use the `@Observed` annotation to create observations. You can put that annotation either on a method to observe it or a class to observe all methods in it. Let's look at the following example.\\n\\nHere you can see an `ObservedService` that has an annotation on a method.\\n\\n[source,java,subs=+attributes]\\n-----\\nstatic class ObservedService {\\n\\n @Observed(name = \\\"test.call\\\", contextualName = \\\"test#call\\\",\\n lowCardinalityKeyValues = { \\\"abc\\\", \\\"123\\\", \\\"test\\\", \\\"42\\\" })\\n void call() {\\n System.out.println(\\\"call\\\");\\n }\\n\\n}\\n-----\\n\\nThe following test asserts whether the proper observation gets created when a proxied `ObservedService` instance gets called.\\n\\n[source,java,subs=+attributes]\\n-----\\n// create a test registry\\nTestObservationRegistry registry = TestObservationRegistry.create();\\n// add a system out printing handler\\nregistry.observationConfig().observationHandler(new ObservationTextPublisher());\\n\\n// create a proxy around the observed service\\nAspectJProxyFactory pf = new AspectJProxyFactory(new ObservedService());\\npf.addAspect(new ObservedAspect(registry));\\n\\n// make a call\\nObservedService service = pf.getProxy();\\nservice.call();\\n\\n// assert that observation has been properly created\\nTestObservationRegistryAssert.assertThat(registry)\\n .hasSingleObservationThat()\\n .hasBeenStopped()\\n .hasNameEqualTo(\\\"test.call\\\")\\n .hasContextualNameEqualTo(\\\"test#call\\\")\\n .hasLowCardinalityKeyValue(\\\"abc\\\", \\\"123\\\")\\n .hasLowCardinalityKeyValue(\\\"test\\\", \\\"42\\\")\\n .hasLowCardinalityKeyValue(\\\"class\\\", ObservedService.class.getName())\\n .hasLowCardinalityKeyValue(\\\"method\\\", \\\"call\\\").doesNotHaveError();\\n-----\\n\\n:leveloffset!:\\n\\n== Instrumenting\\n\\n:leveloffset: +1\\n\\nIn this section we will see some common examples of reusing existing Micrometer and Micrometer Tracing handlers and context types to do instrumentation.\\n\\nIMPORTANT: Before you decide to instrument a project yourself, please double-check whether it hasn't already been instrumented!\\n\\nTo better understand how you can do instrumentation we need to distinguish two concepts.\\n\\n- Context propagation\\n- Creation of Observations\\n\\n*Context propagation* - we propagate existing context through threads or network. We're using the https://micrometer.io/docs/contextPropagation[Micrometer Context Propagation] library to define the context and to propagate it through threads. We're using dedicated `SenderContext` and `ReceiverContext` objects, together with Micrometer Tracing handlers, to create Observations that will propagate context over the wire.\\n\\n*Creation of Observations* - we want to wrap an operation in an Observation to get measurements. We need to know if there previously has been a parent Observation to maintain the parent-child relationship of Observations.\\n\\n[[instrumentation_of_thread_switching_components]]\\n== Instrumentation of Thread Switching Components\\n\\nWe might want to create an Observation around a `Runnable` or `Callable` that we're submitting through an `Executor`. For that to work we need to know if in the parent thread there was an Observation that the new thread should continue, or for which a child Observation should be created.\\n\\nLet's look at the following example.\\n\\n[source,java,subs=+attributes]\\n-----\\n// Example of an Executor Service\\nExecutorService executor = Executors.newCachedThreadPool();\\n\\n\\n// This snippet shows an example of how to wrap in an observation code that would\\n// be executed in a separate thread\\n\\n// Let's assume that we have a parent observation\\nObservation parent = Observation.createNotStarted(\\\"parent\\\", registry);\\n// Observation is put in scope via the <observe()> method\\nFuture<Boolean> child = parent.observe(() -> {\\n // [Thread 1] Current Observation is the same as <parent>\\n then(registry.getCurrentObservation()).isSameAs(parent);\\n // [Thread 1] We're wrapping the executor in a Context Propagating version.\\n // <ContextExecutorService> comes from Context Propagation library\\n return ContextExecutorService.wrap(executor).submit(() -> {\\n // [Thread 2] Current Observation is same as <parent> - context got\\n // propagated\\n then(registry.getCurrentObservation()).isSameAs(parent);\\n // Wraps the code that should be run in a separate thread in an\\n // observation\\n return Observation.createNotStarted(\\\"child\\\", registry).observe(this::yourCodeToMeasure);\\n });\\n});\\n-----\\n\\n[[instrumentation_of_reactive_libraries]]\\n== Instrumentation of Reactive Libraries\\n\\nIn this section we'll discuss how to wrap Reactive libraries in Observations and how to use Reactor Context to safely propagate Observations between threads.\\n\\n[[instrumentation_of_reactive_libraries_after_reactor_3_5_3]]\\n=== For Reactor 3.5.3 and After\\n\\nIn Reactor 3.5.3 release (through this https://github.com/reactor/reactor-core/pull/3335[PR]) an option to turn on automated context propagation was added. To use this, please ensure that you're using the following projects at minimum in the following versions:\\n\\n- Reactor https://github.com/reactor/reactor-core/releases/tag/v3.5.7[3.5.7]\\n- Micrometer Context-Propagation https://github.com/micrometer-metrics/context-propagation/releases/tag/v1.0.3[1.0.3]\\n- Micrometer https://github.com/micrometer-metrics/micrometer/releases/tag/v1.10.8[1.10.8]\\n- Micrometer Tracing https://github.com/micrometer-metrics/tracing/releases/tag/v1.0.7[1.0.7]\\n\\nTo use the feature call the new Reactor's Hook method (e.g. in your `public static void main` method) like this\\n\\n[source,java,subs=+attributes]\\n-----\\nHooks.enableAutomaticContextPropagation();\\n-----\\n\\nThis will automatically wrap Reactor internal mechanisms to propagate context between operators, threads etc. Usage of `tap` and `handle` or Context Propagation API is not required.\\n\\nLet's look at the following example.\\n\\n[source,java,subs=+attributes]\\n-----\\n// This snippet shows an example of how to use the new Hook API with Reactor\\nHooks.enableAutomaticContextPropagation();\\n// Starting from Micrometer 1.10.8 you need to set your registry on this singleton\\n// instance of OTLA\\nObservationThreadLocalAccessor.getInstance().setObservationRegistry(registry);\\n\\n// Let's assume that we have a parent observation\\nObservation parent = Observation.start(\\\"parent\\\", registry);\\n// Now we put it in thread local\\nparent.scoped(() -> {\\n\\n // Example of propagating whatever there was in thread local\\n Integer block = Mono.just(1).publishOn(Schedulers.boundedElastic()).doOnNext(integer -> {\\n log.info(\\\"Context Propagation happens - the <parent> observation gets propagated [\\\"\\n + registry.getCurrentObservation() + \\\"]\\\");\\n then(registry.getCurrentObservation()).isSameAs(parent);\\n })\\n .flatMap(integer -> Mono.just(integer).map(monoInteger -> monoInteger + 1))\\n .transformDeferredContextual((integerMono, contextView) -> integerMono.doOnNext(integer -> {\\n log.info(\\\"Context Propagation happens - the <parent> observation gets propagated [\\\"\\n + registry.getCurrentObservation() + \\\"]\\\");\\n then(registry.getCurrentObservation()).isSameAs(parent);\\n }))\\n // Let's assume that we're modifying the context\\n .contextWrite(context -> context.put(\\\"foo\\\", \\\"bar\\\"))\\n // Since we are NOT part of the Reactive Chain (e.g. this is not a\\n // WebFlux application)\\n // you MUST call <contextCapture> to capture all ThreadLocal values\\n // and store them in a Reactor Context.\\n // ----------------------\\n // If you were part of the\\n // Reactive Chain (e.g. returning Mono from endpoint)\\n // there is NO NEED to call <contextCapture>. If you need to propagate\\n // your e.g. Observation\\n // to the Publisher you just created (e.g. Mono or Flux) please\\n // consider adding it\\n // to the Reactor Context directly instead of opening an Observation\\n // scope and calling <contextCapture> (see example below).\\n .contextCapture()\\n .block();\\n\\n // We're still using <parent> as current observation\\n then(registry.getCurrentObservation()).isSameAs(parent);\\n\\n then(block).isEqualTo(2);\\n\\n // Now, we want to create a child observation for a Reactor stream and put it\\n // to Reactor Context\\n // Automatically its parent will be <parent> observation since <parent> is in\\n // Thread Local\\n Observation child = Observation.start(\\\"child\\\", registry);\\n block = Mono.just(1).publishOn(Schedulers.boundedElastic()).doOnNext(integer -> {\\n log.info(\\n \\\"Context Propagation happens - the <child> observation from Reactor Context takes precedence over thread local <parent> observation [\\\"\\n + registry.getCurrentObservation() + \\\"]\\\");\\n then(registry.getCurrentObservation()).isSameAs(child);\\n })\\n .flatMap(integer -> Mono.just(integer).map(monoInteger -> monoInteger + 1))\\n .transformDeferredContextual((integerMono, contextView) -> integerMono.doOnNext(integer -> {\\n log.info(\\n \\\"Context Propagation happens - the <child> observation from Reactor Context takes precedence over thread local <parent> observation [\\\"\\n + registry.getCurrentObservation() + \\\"]\\\");\\n then(registry.getCurrentObservation()).isSameAs(child);\\n }))\\n // Remember to stop the child Observation!\\n .doFinally(signalType -> child.stop())\\n // When using Reactor we ALWAYS search for\\n // ObservationThreadLocalAccessor.KEY entry in the Reactor Context to\\n // search for an Observation. You DON'T have to use <contextCapture>\\n // because\\n // you have manually provided the ThreadLocalAccessor key\\n .contextWrite(context -> context.put(ObservationThreadLocalAccessor.KEY, child))\\n .block();\\n\\n // We're back to having <parent> as current observation\\n then(registry.getCurrentObservation()).isSameAs(parent);\\n\\n then(block).isEqualTo(2);\\n});\\n\\n// There should be no remaining observation\\nthen(registry.getCurrentObservation()).isNull();\\n\\n// We need to stop the parent\\nparent.stop();\\n-----\\n\\nIf performance of this approach is not satisfactory, please verify whether disabling the hook and explicitly using `handle` or `tap` operators improves the performance.\\n\\n[[instrumentation_of_reactive_libraries_before_reactor_3_5_3]]\\n=== Before Reactor 3.5.3\\n\\nThe preferred way of propagating elements through the Flux using Reactor is not via ``ThreadLocal``s but through Reactor Context. Reactor however gives you two operators, `tap()` and `handle()` where, if https://micrometer.io/docs/contextPropagation[Micrometer Context Propagation] library is on the classpath, it will set thread local values for you.\\n\\nLet's look at the following example.\\n\\n[source,java,subs=+attributes]\\n-----\\n// This snippet shows an example of how to wrap code that is using Reactor\\n\\n// Let's assume that we have a parent observation\\nObservation parent = Observation.start(\\\"parent\\\", registry);\\n\\n// We want to create a child observation for a Reactor stream\\nObservation child = Observation.start(\\\"child\\\", registry)\\n // There's no thread local entry, so we will pass parent observation\\n // manually. If we put the Observation in scope we could then call\\n // <.contextCapture()> method from Reactor to capture all thread locals\\n // and store them in Reactor Context.\\n .parentObservation(parent);\\nInteger block = Mono.just(1)\\n // Example of not propagating context by default\\n .doOnNext(integer -> {\\n log.info(\\n \\\"No context propagation happens by default in Reactor - there will be no Observation in thread local here [\\\"\\n + registry.getCurrentObservation() + \\\"]\\\");\\n then(registry.getCurrentObservation()).isNull();\\n })\\n // Example of having entries in thread local for <tap()> operator\\n .tap(() -> new DefaultSignalListener<Integer>() {\\n @Override\\n public void doFirst() throws Throwable {\\n log.info(\\\"We're using tap() -> there will be Observation in thread local here [\\\"\\n + registry.getCurrentObservation() + \\\"]\\\");\\n then(registry.getCurrentObservation()).isNotNull();\\n }\\n })\\n .flatMap(integer -> Mono.just(integer).map(monoInteger -> monoInteger + 1))\\n // Example of retrieving ThreadLocal entries via ReactorContext\\n .transformDeferredContextual((integerMono, contextView) -> integerMono.doOnNext(integer -> {\\n try (ContextSnapshot.Scope scope = ContextSnapshot.setAllThreadLocalsFrom(contextView)) {\\n log.info(\\n \\\"We're retrieving thread locals from Reactor Context - there will be Observation in thread local here [\\\"\\n + registry.getCurrentObservation() + \\\"]\\\");\\n then(registry.getCurrentObservation()).isNotNull();\\n }\\n }))\\n // Example of having entries in thread local for <handle()> operator\\n .handle((BiConsumer<Integer, SynchronousSink<Integer>>) (integer, synchronousSink) -> {\\n log.info(\\\"We're using handle() -> There will be Observation in thread local here [\\\"\\n + registry.getCurrentObservation() + \\\"]\\\");\\n then(registry.getCurrentObservation()).isNotNull();\\n synchronousSink.next(integer);\\n })\\n // Remember to stop the child Observation!\\n .doFinally(signalType -> child.stop())\\n // When using Reactor we ALWAYS search for\\n // ObservationThreadLocalAccessor.KEY entry in the Reactor Context to\\n // search for an Observation\\n .contextWrite(context -> context.put(ObservationThreadLocalAccessor.KEY, child))\\n // If there were ThreadLocal entries that are using Micrometer Context\\n // Propagation they would be caught here. All implementations of\\n // <ThreadLocalAccessor> will store their thread local entries under their\\n // keys in Reactor Context\\n .contextCapture()\\n .block();\\n\\n// We didn't have any observations in thread local\\nthen(registry.getCurrentObservation()).isNull();\\n\\n// We need to stop the parent\\nparent.stop();\\n\\nthen(block).isEqualTo(2);\\n-----\\n\\n[[instrumentation_of_http_communication]]\\n== Instrumentation of HTTP Communication\\n\\nIn order to instrument an HTTP-based communication we need to use the `RequestReplySenderContext` and `RequestReplyReceiverContext` for the client and server side respectively.\\n\\nAs an example for the client side we will use a handler that instruments the HTTP request by adding a `foo:bar` header (if you have Micrometer Tracing on the classpath you could reuse the `PropagatingSenderTracingObservationHandler` and `PropagatingReceiverTracingObservationHandler` to propagate tracing context over the wire). Let's look at the example of such a handler.\\n\\n[source,java,subs=+attributes]\\n-----\\nstatic class HeaderPropagatingHandler implements ObservationHandler<SenderContext<Object>> {\\n\\n @Override\\n public void onStart(SenderContext<Object> context) {\\n context.getSetter().set(context.getCarrier(), \\\"foo\\\", \\\"bar\\\");\\n }\\n\\n @Override\\n public boolean supportsContext(Observation.Context context) {\\n return context instanceof SenderContext;\\n }\\n\\n}\\n-----\\n\\nLet's look at the following of HTTP client side instrumentation that reuses the handler.\\n\\n[source,java,subs=+attributes]\\n-----\\n// This example can be combined with the idea of ObservationConvention to allow\\n// users to easily customize the key values. Please read the rest of the\\n// documentation on how to do it.\\n\\n// In Micrometer Tracing we would have predefined\\n// PropagatingSenderTracingObservationHandler but for the sake of this demo we\\n// create our own handler that puts \\\"foo\\\":\\\"bar\\\" headers into the request\\nregistry.observationConfig().observationHandler(new HeaderPropagatingHandler());\\n\\n// We're using WireMock to stub the HTTP GET call to \\\"/foo\\\" with a response \\\"OK\\\"\\nstubFor(get(\\\"/foo\\\").willReturn(ok().withBody(\\\"OK\\\")));\\n\\n// RequestReplySenderContext is a special type of context used for request-reply\\n// communication. It requires to define what the Request type is and how we can\\n// instrument it. It also needs to know what the Response type is\\nRequestReplySenderContext<HttpUriRequestBase, ClassicHttpResponse> context = new RequestReplySenderContext<>(\\n (carrier, key, value) -> Objects.requireNonNull(carrier).addHeader(key, value));\\n\\n// We're instrumenting the Apache HTTPClient\\ntry (CloseableHttpClient httpclient = HttpClients.createDefault()) {\\n // The HttpGet is our carrier (we can mutate it to instrument the headers)\\n HttpGet httpget = new HttpGet(info.getHttpBaseUrl() + \\\"/foo\\\");\\n // We must set the carrier BEFORE we run <Observation#start>\\n context.setCarrier(httpget);\\n // You can set the remote service address to provide more debugging\\n // information\\n context.setRemoteServiceAddress(info.getHttpBaseUrl());\\n // Examples of setting key values from the request\\n Observation observation = Observation.createNotStarted(\\\"http.client.requests\\\", () -> context, registry)\\n .contextualName(\\\"HTTP \\\" + httpget.getMethod())\\n .lowCardinalityKeyValue(\\\"http.url\\\", info.getHttpBaseUrl() + \\\"/{name}\\\")\\n .highCardinalityKeyValue(\\\"http.full-url\\\", httpget.getRequestUri());\\n observation.observeChecked(() -> {\\n String response = httpclient.execute(httpget, classicHttpResponse -> {\\n // We should set the response before we stop the observation\\n context.setResponse(classicHttpResponse);\\n // Example of setting key values from the response\\n observation.highCardinalityKeyValue(\\\"http.content.length\\\",\\n String.valueOf(classicHttpResponse.getEntity().getContentLength()));\\n return EntityUtils.toString(classicHttpResponse.getEntity());\\n });\\n\\n then(response).isEqualTo(\\\"OK\\\");\\n });\\n}\\n\\n// We want to be sure that we have successfully enriched the HTTP headers\\nverify(getRequestedFor(urlEqualTo(\\\"/foo\\\")).withHeader(\\\"foo\\\", equalTo(\\\"bar\\\")));\\n-----\\n\\nAs an example for the server side we will use a handler that instruments the Observation by adding the `foo` low cardinality key with the value being the matched path from the HTTP request. Let's look at the example of such a handler.\\n\\n[source,java,subs=+attributes]\\n-----\\nstatic class HeaderReadingHandler implements ObservationHandler<ReceiverContext<Context>> {\\n\\n @Override\\n public void onStart(ReceiverContext<Context> context) {\\n String fooHeader = context.getGetter().get(context.getCarrier(), \\\"foo\\\");\\n // We're setting the value of the <foo> header as a low cardinality key value\\n context.addLowCardinalityKeyValue(KeyValue.of(\\\"foo\\\", fooHeader));\\n }\\n\\n @Override\\n public boolean supportsContext(Observation.Context context) {\\n return context instanceof ReceiverContext;\\n }\\n\\n}\\n-----\\n\\nLet's look at the following of HTTP server side instrumentation that reuses the handler.\\n\\n[source,java,subs=+attributes]\\n-----\\n// This example can be combined with the idea of ObservationConvention to allow\\n// users to easily customize the key values. Please read the rest of the\\n// documentation on how to do it.\\n\\n// In Micrometer Tracing we would have predefined\\n// PropagatingReceiverTracingObservationHandler but for the sake of this demo we\\n// create our own handler that will reuse the <foo> header from the request as a\\n// low cardinality key value\\nregistry.observationConfig().observationHandler(new HeaderReadingHandler());\\n\\ntry (Javalin javalin = Javalin.create().before(\\\"/hello/{name}\\\", ctx -> {\\n // We're creating the special RequestReplyReceiverContext that will reuse the\\n // information from the HTTP headers\\n RequestReplyReceiverContext<Context, Context> receiverContext = new RequestReplyReceiverContext<>(\\n Context::header);\\n // Remember to set the carrier!!!\\n receiverContext.setCarrier(ctx);\\n String remoteServiceAddress = ctx.scheme() + \\\"://\\\" + ctx.host();\\n receiverContext.setRemoteServiceAddress(remoteServiceAddress);\\n // We're starting an Observation with the context\\n Observation observation = Observation\\n .createNotStarted(\\\"http.server.requests\\\", () -> receiverContext, registry)\\n .contextualName(\\\"HTTP \\\" + ctx.method() + \\\" \\\" + ctx.matchedPath())\\n .lowCardinalityKeyValue(\\\"http.url\\\", remoteServiceAddress + ctx.matchedPath())\\n .highCardinalityKeyValue(\\\"http.full-url\\\", remoteServiceAddress + ctx.path())\\n .lowCardinalityKeyValue(\\\"http.method\\\", ctx.method())\\n .start();\\n // Let's be consistent and always set the Observation related objects under\\n // the same key\\n ctx.attribute(ObservationThreadLocalAccessor.KEY, observation);\\n}).get(\\\"/hello/{name}\\\", ctx -> {\\n // We need to be thread-safe - we're not using ThreadLocals, we're retrieving\\n // information from the attributes\\n Observation observation = ctx.attribute(ObservationThreadLocalAccessor.KEY);\\n observation.scoped(() -> {\\n // If we need thread locals (e.g. MDC entries) we can use <scoped()>\\n log.info(\\\"We're using scoped - Observation in thread local here [\\\" + registry.getCurrentObservation()\\n + \\\"]\\\");\\n then(registry.getCurrentObservation()).isNotNull();\\n });\\n // We're returning body\\n ctx.result(\\\"Hello World [\\\" + observation.getContext().getLowCardinalityKeyValue(\\\"foo\\\").getValue() + \\\"]\\\");\\n}).after(\\\"/hello/{name}\\\", ctx -> {\\n // After sending the response we want to stop the Observation\\n Observation observation = ctx.attribute(ObservationThreadLocalAccessor.KEY);\\n observation.stop();\\n}).start(0)) {\\n // We're sending an HTTP request with a <foo:bar> header. We're expecting that\\n // it will be reused in the response\\n String response = sendRequestToHelloEndpointWithHeader(javalin.port(), \\\"foo\\\", \\\"bar\\\");\\n\\n // The response must contain the value from the header\\n then(response).isEqualTo(\\\"Hello World [bar]\\\");\\n}\\n-----\\n\\n== Instrumentation of Messaging Communication\\n\\nTo instrument messaging components you should proceed in the same way as you would with <<instrumentation_of_http_communication,HTTP-based communication>>, however instead of `RequestReplySenderContext` and `RequestReplyReceiverContext` you would use `SenderContext` and `ReceiverContext`. You can also set the `remoteServiceName` on a context to suggest the name of the broker (e.g. `kafka` or `rabbitmq`).\\n\\n:leveloffset!:\\n\\n== Testing\\n\\n:leveloffset: +1\\n\\nMicrometer Observation comes with `micrometer-observation-test` module that allows you to unit-test your Observations.\\n\\n== Installing\\n\\nThe following example shows the required dependency in Gradle (assuming that Micrometer BOM has been added):\\n\\n[source,groovy,subs=+attributes]\\n-----\\ntestImplementation 'io.micrometer:micrometer-observation-test'\\n-----\\n\\nThe following example shows the required dependency in Maven (assuming that Micrometer BOM has been added):\\n\\n[source,xml,subs=+attributes]\\n-----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-observation-test</artifactId>\\n <scope>test</scope>\\n</dependency>\\n-----\\n\\n== Running Observation Unit Tests\\n\\nLet's say that you have the following production code. It will create an observation with 2 tags (low and high cardinality) and then call `observe` that will start the observation, put it in scope, close the scope and stop the observation.\\n\\n[source,java,subs=+attributes]\\n-----\\nstatic class Example {\\n\\n private final ObservationRegistry registry;\\n\\n Example(ObservationRegistry registry) {\\n this.registry = registry;\\n }\\n\\n void run() {\\n Observation.createNotStarted(\\\"foo\\\", registry)\\n .lowCardinalityKeyValue(\\\"lowTag\\\", \\\"lowTagValue\\\")\\n .highCardinalityKeyValue(\\\"highTag\\\", \\\"highTagValue\\\")\\n .observe(() -> System.out.println(\\\"Hello\\\"));\\n }\\n\\n}\\n-----\\n\\nTo unit-test this code you can use the `TestObservationRegistry` class.\\n\\n[source,java,subs=+attributes]\\n-----\\n@Test\\nvoid should_assert_your_observation() {\\n // create a test registry in your tests\\n TestObservationRegistry registry = TestObservationRegistry.create();\\n\\n // run your production code with the TestObservationRegistry\\n new Example(registry).run();\\n\\n // check your observation\\n TestObservationRegistryAssert.assertThat(registry)\\n .doesNotHaveAnyRemainingCurrentObservation()\\n .hasObservationWithNameEqualTo(\\\"foo\\\")\\n .that()\\n .hasHighCardinalityKeyValue(\\\"highTag\\\", \\\"highTagValue\\\")\\n .hasLowCardinalityKeyValue(\\\"lowTag\\\", \\\"lowTagValue\\\")\\n .hasBeenStarted()\\n .hasBeenStopped();\\n}\\n-----\\n\\n:leveloffset!:\\n\\n== Documentation Generation\\n\\n:leveloffset: +1\\n\\n== Automated Documentation Generation\\n\\nBy using the https://github.com/micrometer-metrics/micrometer-docs-generator[Micrometer Docs Generator] project and by implementing the `ObservationDocumentation`, `SpanDocumentation` or `MeterDocumentation` interfaces as an `enum` we can scan your sources and generate Asciidoctor documentation. This allows you to maintain the docuemntation for your observability instrumentation in code, and as long as you use the `enum` implementation in your instrumentation, it will ensure that your documentation stays in-sync with the instrumentation.\\n\\nBelow you can find an example of a Maven `pom.xml` with the Micrometer Docs Generator project.\\n\\n.pom.xml\\n[source,xml,subs=+attributes]\\n-----\\n<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<project xmlns:xsi=\\\"http://www.w3.org/2001/XMLSchema-instance\\\"\\n\\t\\t xmlns=\\\"http://maven.apache.org/POM/4.0.0\\\"\\n\\t\\t xsi:schemaLocation=\\\"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd\\\">\\n\\t<modelVersion>4.0.0</modelVersion>\\n\\t<groupId>com.example</groupId>\\n\\t<artifactId>micrometer-docs-generator-example</artifactId>\\n\\t<packaging>jar</packaging>\\n\\t<name>micrometer-docs-generator-example</name>\\n\\t<description>micrometer-docs-generator-example</description>\\n\\t<properties>\\n\\t\\t<micrometer-docs-generator.version>1.0.0</micrometer-docs-generator.version>\\n\\t\\t<micrometer-docs-generator.inputPath>${maven.multiModuleProjectDirectory}/folder-with-sources-to-scan/</micrometer-docs-generator.inputPath>\\n\\t\\t<micrometer-docs-generator.inclusionPattern>.*</micrometer-docs-generator.inclusionPattern>\\n\\t\\t<micrometer-docs-generator.outputPath>${maven.multiModuleProjectDirectory}/target/output-folder-with-adocs/'</micrometer-docs-generator.outputPath>\\n\\t</properties>\\n\\t<build>\\n\\t\\t<plugins>\\n\\t\\t\\t<plugin>\\n\\t\\t\\t\\t<groupId>org.codehaus.mojo</groupId>\\n\\t\\t\\t\\t<artifactId>exec-maven-plugin</artifactId>\\n\\t\\t\\t\\t<executions>\\n\\t\\t\\t\\t\\t<execution>\\n\\t\\t\\t\\t\\t\\t<id>generate-docs</id>\\n\\t\\t\\t\\t\\t\\t<phase>prepare-package</phase>\\n\\t\\t\\t\\t\\t\\t<goals>\\n\\t\\t\\t\\t\\t\\t\\t<goal>java</goal>\\n\\t\\t\\t\\t\\t\\t</goals>\\n\\t\\t\\t\\t\\t\\t<configuration>\\n\\t\\t\\t\\t\\t\\t\\t<mainClass>io.micrometer.docs.DocsGeneratorCommand</mainClass>\\n\\t\\t\\t\\t\\t\\t\\t<includePluginDependencies>true</includePluginDependencies>\\n\\t\\t\\t\\t\\t\\t\\t<arguments>\\n\\t\\t\\t\\t\\t\\t\\t\\t<argument>${micrometer-docs-generator.inputPath}</argument>\\n\\t\\t\\t\\t\\t\\t\\t\\t<argument>${micrometer-docs-generator.inclusionPattern}</argument>\\n\\t\\t\\t\\t\\t\\t\\t\\t<argument>${micrometer-docs-generator.outputPath}</argument>\\n\\t\\t\\t\\t\\t\\t\\t</arguments>\\n\\t\\t\\t\\t\\t\\t</configuration>\\n\\t\\t\\t\\t\\t</execution>\\n\\t\\t\\t\\t</executions>\\n\\t\\t\\t\\t<dependencies>\\n\\t\\t\\t\\t\\t<dependency>\\n\\t\\t\\t\\t\\t\\t<groupId>io.micrometer</groupId>\\n\\t\\t\\t\\t\\t\\t<artifactId>micrometer-docs-generator</artifactId>\\n\\t\\t\\t\\t\\t\\t<version>${micrometer-docs-generator.version}</version>\\n\\t\\t\\t\\t\\t\\t<type>jar</type>\\n\\t\\t\\t\\t\\t</dependency>\\n\\t\\t\\t\\t</dependencies>\\n\\t\\t\\t</plugin>\\n\\t\\t</plugins>\\n\\t</build>\\n\\n\\t<repositories>\\n\\t\\t<repository>\\n\\t\\t\\t<id>spring-snapshots</id>\\n\\t\\t\\t<name>Spring Snapshots</name>\\n\\t\\t\\t<url>https://repo.spring.io/snapshot</url> <!-- For Snapshots -->\\n\\t\\t\\t<snapshots>\\n\\t\\t\\t\\t<enabled>true</enabled>\\n\\t\\t\\t</snapshots>\\n\\t\\t\\t<releases>\\n\\t\\t\\t\\t<enabled>false</enabled>\\n\\t\\t\\t</releases>\\n\\t\\t</repository>\\n\\t\\t<repository>\\n\\t\\t\\t<id>spring-milestones</id>\\n\\t\\t\\t<name>Spring Milestones</name>\\n\\t\\t\\t<url>https://repo.spring.io/milestone</url> <!-- For Milestones -->\\n\\t\\t\\t<snapshots>\\n\\t\\t\\t\\t<enabled>false</enabled>\\n\\t\\t\\t</snapshots>\\n\\t\\t</repository>\\n\\t</repositories>\\n</project>\\n-----\\n\\nBelow you can find an example of a Gradle `build.gradle` with the Micrometer Docs Generator project.\\n\\n.build.gradle\\n[source,groovy,subs=+attributes]\\n-----\\nrepositories {\\n\\tmaven { url 'https://repo.spring.io/snapshot' } // for snapshots\\n\\tmaven { url 'https://repo.spring.io/milestone' } // for milestones\\n\\tmavenCentral() // for GA\\n}\\n\\next {\\n\\tmicrometerDocsVersion=\\\"1.0.2\\\"\\n}\\n\\nconfigurations {\\n\\tadoc\\n}\\n\\ndependencies {\\n\\tadoc \\\"io.micrometer:micrometer-docs-generator:$micrometerDocsVersion\\\"\\n}\\n\\ntask generateObservabilityDocs(type: JavaExec) {\\n\\tmainClass = \\\"io.micrometer.docs.DocsGeneratorCommand\\\"\\n\\tclasspath configurations.adoc\\n\\t// input folder, inclusion pattern, output folder\\n\\targs project.rootDir.getAbsolutePath(), \\\".*\\\", project.rootProject.buildDir.getAbsolutePath()\\n}\\n-----\\n\\nRunning these tasks would lead to generation of adoc files similar to these ones.\\n\\n._metrics.adoc\\n[source,adoc,subs=+attributes]\\n-----\\n[[observability-metrics]]\\n=== Observability - Metrics\\n\\nBelow you can find a list of all samples declared by this project.\\n\\n[[observability-metrics-task-runner-observation]]\\n==== Task Runner Observation\\n\\n> Observation created when a task runner is executed.\\n\\n**Metric name** `spring.cloud.task.runner` (defined by convention class `org.springframework.cloud.task.configuration.observation.DefaultTaskObservationConvention`). **Type** `timer` and **base unit** `seconds`.\\n\\nFully qualified name of the enclosing class `org.springframework.cloud.task.configuration.observation.TaskDocumentedObservation`.\\n\\nIMPORTANT: All tags must be prefixed with `spring.cloud.task` prefix!\\n\\n.Low cardinality Keys\\n|===\\n|Name | Description\\n|`spring.cloud.task.runner.bean-name`|Name of the bean that was executed by Spring Cloud Task.\\n|===\\n-----\\n\\n._spans.adoc\\n[source,adoc,subs=+attributes]\\n-----\\n[[observability-spans]]\\n=== Observability - Spans\\n\\nBelow you can find a list of all spans declared by this project.\\n\\n[[observability-spans-task-runner-observation]]\\n==== Task Runner Observation Span\\n\\n> Observation created when a task runner is executed.\\n\\n**Span name** `spring.cloud.task.runner` (defined by convention class `org.springframework.cloud.task.configuration.observation.DefaultTaskObservationConvention`).\\n\\nFully qualified name of the enclosing class `org.springframework.cloud.task.configuration.observation.TaskDocumentedObservation`.\\n\\nIMPORTANT: All tags and event names must be prefixed with `spring.cloud.task` prefix!\\n\\n.Tag Keys\\n|===\\n|Name | Description\\n|`spring.cloud.task.runner.bean-name`|Name of the bean that was executed by Spring Cloud Task.\\n|===\\n-----\\n\\n=== Options\\n\\nThe main entry class for the docs generation is `DocsGeneratorCommand` class.\\nThis class takes following options.\\n\\n.Optional parameters\\n[cols=\\\"1,1\\\"]\\n|===\\n| `--metrics`\\n| Generate metrics documentation.\\n\\n| `--spans`\\n| Generate spans documentation.\\n\\n| `--conventions`\\n| Generate observation conventions documentation.\\n\\n| `--metrics-template=<location>`\\n| Handlebars template file location. This can be a path in the classpath or file system. +\\ne.g. `templates/metrics.adoc.hbs`, `/home/foo/bar.hbs`\\n\\n| `--spans-template=<location>`\\n| Handlebars template file location. This can be a path in the classpath or file system. +\\ne.g. `templates/spans.adoc.hbs`, `/home/foo/bar.hbs`\\n\\n| `--conventions-template=<location>`\\n| Handlebars template file location. This can be a path in the classpath or file system. +\\ne.g. `templates/conventions.adoc.hbs`, `/home/foo/bar.hbs`\\n\\n| `--metrics-output=<location>`\\n| Generated metrics doc file location. This can be an absolute path or relative path to the output directory. +\\nDefault: `_metrics.adoc`\\n\\n| `--spans-output=<location>`\\n| Generated spans doc file location. This can be an absolute path or relative path to the output directory. +\\nDefault: `_spans.adoc`\\n| `--conventions-output=<location>`\\n| Generated observation convention doc file location. This can be an absolute path or relative path to the output directory. +\\nDefault: `_conventions.adoc`\\n|===\\n\\n:leveloffset!:\\n\\n== Existing Instrumentations\\n\\n:leveloffset: +1\\n\\nMicrometer Observation is used to instrument various projects. Below you can find a table of projects that are using Micrometer Observation to _\\\"instrument once and have multiple benefits out of it\\\"_.\\n\\n.External Project Instrumentations\\n|===\\n|Project Name |Link\\n\\n| Apache Camel | https://issues.apache.org/jira/browse/CAMEL-19023[Issue]\\n| Apache CXF | https://github.com/apache/cxf/pull/1346#event-10091735987[PR]\\n| Apache Dubbo | https://github.com/apache/dubbo/pull/11021[PR]\\n| Apache HttpComponents | https://github.com/micrometer-metrics/micrometer/tree/main/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/httpcomponents[Repo]\\n| Apache Skywalking | https://github.com/apache/skywalking-java/pull/401[PR], https://skywalking.apache.org/docs/skywalking-java/next/en/setup/service-agent/java-agent/application-toolkit-micrometer-1.10/[Docs]\\n| Armeria | https://github.com/line/armeria/pull/4980[PR]\\n| Appsmith | https://github.com/appsmithorg/appsmith/commit/5e46a2f4b7bf184aba03b4b93038edce8a615366[Commit]\\n| gRPC | https://github.com/micrometer-metrics/micrometer/pull/3427[PR]\\n| Halo | https://github.com/halo-dev/halo/commit/d192b8c956887e4701b94e3ed302fb88e4771583[Commit]\\n| JDBC | https://github.com/jdbc-observations/datasource-micrometer[Repo]\\n| JDK Http Client | https://github.com/micrometer-metrics/micrometer/blob/main/micrometer-core/src/main/java11/io/micrometer/core/instrument/binder/jdk/MicrometerHttpClient.java[Repo]\\n| Jetty | https://github.com/micrometer-metrics/micrometer/pull/3416[PR]\\n| Jersey | https://github.com/micrometer-metrics/micrometer/tree/main/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jersey/server[Repo]\\n| JMS | https://github.com/micrometer-metrics/micrometer/blob/main/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jms/JmsInstrumentation.java[Repo]\\n| Kotlin Coroutines | https://github.com/micrometer-metrics/micrometer/pull/3256[PR]\\n| Lettuce | https://github.com/lettuce-io/lettuce-core/commit/6604fbe9e9cff476806c50716e17803e11d1e0ca[Commit]\\n| Micronaut | https://github.com/micronaut-projects/micronaut-micrometer/issues/492[Issue]\\n| OkHttp | https://github.com/micrometer-metrics/micrometer/tree/main/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/okhttp3[Repo]\\n| OpenFeign | https://github.com/OpenFeign/feign/pull/1760[PR]\\n| RabbitMQ | https://github.com/rabbitmq/rabbitmq-java-client/issues/952[Issue]\\n| RabbitMQ Stream | https://github.com/rabbitmq/rabbitmq-stream-java-client/pull/384[PR]\\n| Resilience4j | https://github.com/resilience4j/resilience4j/pull/1698[PR]\\n| R2DBC | https://github.com/r2dbc/r2dbc-proxy/issues/122[Issue]\\n| Reactor | https://micrometer.io/docs/observation#instrumentation_of_reactive_libraries[Docs]\\n| Reactor Netty | https://projectreactor.io/docs/netty/release/reference/index.html#_tracing_3[Docs]\\n| Redisson | https://github.com/redisson/redisson/issues/4976[Issue],\\nhttps://github.com/redisson/redisson/wiki/16.-Observability#162-tracing[Docs]\\n| RSocket | https://github.com/rsocket/rsocket-java/tree/master/rsocket-micrometer/src/main/java/io/rsocket/micrometer/observation[Repo]\\n| Spring Amqp | https://docs.spring.io/spring-amqp/docs/current/reference/html/index.html#observation[Docs]\\n| Spring Batch | https://docs.spring.io/spring-batch/docs/current/reference/html/monitoring-and-metrics.html#tracing[Docs]\\n| Spring Cloud Config | https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#observability[Docs]\\n| Spring Cloud CircuitBreaker | https://github.com/spring-cloud/spring-cloud-circuitbreaker/commit/4aa6883274a26b4c01b2c38e256d0b985978052e[Commit]\\n| Spring Cloud Function | https://github.com/spring-cloud/spring-cloud-function/tree/main/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/observability[Repo]\\n| Spring Cloud Gateway | https://github.com/spring-cloud/spring-cloud-gateway/tree/main/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/headers/observation[Repo]\\n| Spring Cloud OpenFeign | https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/#micrometer-support[Docs]\\n| Spring Cloud Task | https://docs.spring.io/spring-cloud-task/docs/current/reference/html/#enabling-observations-for-applicationrunner-and-commandlinerunner[Docs]\\n| Spring Cloud Vault | https://github.com/spring-cloud/spring-cloud-vault/commit/1116f81971f16f9f9e42ad0994ee12a24404610e[Commit]\\n| Spring Data Cassandra | https://docs.spring.io/spring-data/cassandra/docs/current/reference/html/#cassandra.observability[Docs]\\n| Spring Data MongoDB | https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongodb.observability[Docs]\\n| Spring Data Redis | https://docs.spring.io/spring-data-redis/docs/current/reference/html/#redis.observability[Docs]\\n| Spring GraphQL | https://docs.spring.io/spring-graphql/docs/current/reference/html/#observability[Docs]\\n| Spring Integration | https://docs.spring.io/spring-integration/reference/metrics.html#micrometer-observation[Docs]\\n| Spring Kafka | https://docs.spring.io/spring-kafka/reference/html/#x30-obs[Docs]\\n| Spring Security | https://docs.spring.io/spring-security/reference/reactive/integrations/observability.html[Docs]\\n| Spring Modulith | https://docs.spring.io/spring-modulith/docs/current/reference/html/#observability[Docs]\\n| Spring MVC | https://docs.spring.io/spring-framework/reference/integration/observability.html[Docs]\\n| Spring Pulsar | https://docs.spring.io/spring-pulsar/docs/current/reference/html/#micrometer[Docs]\\n| Spring WebFlux | https://docs.spring.io/spring-framework/reference/integration/observability.html[Docs]\\n|===\\n\\nIf your project is instrumented using Micrometer Observation, and it's not listed in the table above, https://github.com/micrometer-metrics/micrometer-docs/edit/main/src/docs/observation/observation-projects.adoc[please file a PR] to our documentation! If you want to instrument your project and need our help just mention us in your issue - https://github.com/shakuzen/[@shakuzen], https://github.com/jonatan-ivanov/[@jonatan-ivanov], https://github.com/marcingrzejszczak/[@marcingrzejszczak].\\n\\n:leveloffset!:\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Tracing support\\n:toc:\\n:sectnums:\\n:dimensional: true\\n\\n== Purpose\\n\\nThe problem of tracing is not new.\\nApplication developers have been creating ways to track the state of their applications for a long time.\\nFor much of that time, developers had to create the necessary tracing framework themselves.\\n\\nIn 2016, the Spring Cloud team created a tracing library that could help a lot of developers.\\nIt was called https://github.com/spring-cloud/spring-cloud-sleuth[Spring Cloud Sleuth].\\nThe Spring team realized that tracing could be separated from Spring Cloud and created the Micrometer Tracing project, which is, essentially, a Spring-agnostic copy of Spring Cloud Sleuth.\\nMicrometer Tracing had its 1.0.0 GA release in November 2022 and has been getting steadily better ever since.\\n\\nhttps://github.com/micrometer-metrics/tracing[Micrometer Tracing] provides a simple facade for the most popular tracer libraries, letting you instrument your JVM-based application code without vendor lock-in.\\nIt is designed to add little to no overhead to your tracing collection activity while maximizing the portability of your tracing effort.\\n\\nIt also provides a tracing extension to Micrometer's `ObservationHandler` (from Micrometer 1.10.0).\\nWhenever an `Observation` is used, a corresponding span will be created, started, stopped and reported.\\n\\n== Installing\\n\\nMicrometer Tracing comes with a Bill of Materials (BOM) which is a project that contains all the project versions for you.\\n\\nThe following example shows the required dependency in Gradle:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation platform('io.micrometer:micrometer-tracing-bom:latest.release')\\nimplementation 'io.micrometer:micrometer-tracing'\\n----\\n\\nThe following example shows the required dependency in Maven:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependencyManagement>\\n <dependencies>\\n <dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-tracing-bom</artifactId>\\n <version>${micrometer-tracing.version}</version>\\n <type>pom</type>\\n <scope>import</scope>\\n </dependency>\\n </dependencies>\\n</dependencyManagement>\\n\\n<dependencies>\\n <dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-tracing</artifactId>\\n </dependency>\\n</dependencies>\\n----\\n\\nYou should add a tracing bridge you want to use, such as `micrometer-tracing-bridge-brave` or `micrometer-tracing-bridge-otel` and span exporters / reporters.\\nIn case of adding a bridge the `micrometer-tracing` library is added transitively.\\n\\n== Glossary\\n\\n:leveloffset: +1\\n\\nMicrometer Tracing contains a core module with an instrumentation https://en.wikipedia.org/wiki/Service_provider_interface[SPI], a set of modules containing bridges to various tracers, a set of modules containing dedicated span reporting mechanisms, and a test kit.\\nYou need to understand the following definitions for distributed tracing:\\n\\nMicrometer Tracing borrows https://research.google.com/pubs/pub36356.html[Dapper's] terminology.\\n\\n*Span*: The basic unit of work.\\nFor example, sending an RPC is a new span, as is sending a response to an RPC.\\nSpans also have other data, such as descriptions, timestamped events, key-value annotations (tags), the ID of the span that caused them, and process IDs (normally IP addresses).\\n\\nSpans can be started and stopped, and they keep track of their timing information.\\nOnce you create a span, you must stop it at some point in the future.\\n\\n*Trace*: A set of spans forming a tree-like structure.\\nFor example, if you run a distributed big-data store, a trace might be formed by a `PUT` request.\\n\\n*Annotation/Event*: Used to record the existence of an event in time.\\n\\n*Tracer*: A library that handles the lifecycle of a span.\\nIt can create, start, stop and report spans to an external system via reporters / exporters.\\n\\n*Tracing context*: For distributed tracing to work the tracing context (trace identifier, span identifier, etc.) must be propagated through the process (e.g. over threads) and over the network.\\n\\n*Log correlation*: Parts of the tracing context (e.g. trace identifier, span identifier) can be populated to the logs of a given application.\\nOne can then collect all logs in a single storage and group them via trace id.\\nThat way one can get all logs, for a single business operation (trace) from all services put in a chronological order.\\n\\n*Latency analysis tools*: A tool that collects exported spans and visualizes the whole trace.\\nAllows easy latency analysis.\\n\\nThe following image shows how *Span* and *Trace* look in a system.\\n\\nimage::\" + require(\"!file-loader!./img/trace-id.jpg\") + \"[Trace Info propagation]\\n\\nEach color of a note signifies a span (there are seven spans - from *A* to *G*).\\nConsider the following note:\\n\\n[source]\\n----\\nTrace Id = X\\nSpan Id = D\\nClient Sent\\n----\\n\\nThis note indicates that the current span has *Trace Id* set to *X* and *Span Id* set to *D*.\\nAlso, from the RPC perspective, the `Client Sent` event took place.\\n\\nLet's consider more notes:\\n\\n[source]\\n----\\nTrace Id = X\\nSpan Id = A\\n(no custom span)\\n\\nTrace Id = X\\nSpan Id = C\\n(custom span)\\n----\\n\\nYou can continue with a created span (example with `no custom span` indication) or you can create child spans manually (example with `custom span` indication).\\n\\nThe following image shows how parent-child relationships of spans look:\\n\\nimage::\" + require(\"!file-loader!./img/parents.jpg\") + \"[Parent child relationship]\\n\\n:leveloffset!:\\n\\n== Supported Tracers\\n\\n:leveloffset: +1\\n\\nMicrometer Tracing supports the following Tracers.\\n\\n* https://github.com/openzipkin/brave[*OpenZipkin Brave*]\\n* https://opentelemetry.io/[*OpenTelemetry*]\\n\\n== Installing\\n\\nThe following example shows the required dependency in Gradle (assuming that Micrometer Tracing BOM has been added):\\n\\n.Brave Tracer\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-tracing-bridge-brave'\\n----\\n\\n.OpenTelemetry Tracer\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-tracing-bridge-otel'\\n----\\n\\nThe following example shows the required dependency in Maven (assuming that Micrometer Tracing BOM has been added):\\n\\n.Brave Tracer\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-tracing-bridge-brave</artifactId>\\n</dependency>\\n----\\n\\n.OpenTelemetry Tracer\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-tracing-bridge-otel</artifactId>\\n</dependency>\\n----\\n\\nIMPORTANT: Remember to pick *only one* bridge.\\nYou *shouldn't have* two bridges on the classpath.\\n\\n:leveloffset!:\\n\\n== Supported Reporters\\n\\n:leveloffset: +1\\n\\nMicrometer Tracing supports directly the following Reporters.\\n\\n* https://tanzu.vmware.com/observability[*Tanzu Observability by Wavefront*]\\n* https://zipkin.io[*OpenZipkin Zipkin*]\\n\\n== Installing\\n\\nThe following example shows the required dependency in Gradle (assuming that Micrometer Tracing BOM has been added):\\n\\n.Tanzu Observability by Wavefront\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-tracing-reporter-wavefront'\\n----\\n\\n.OpenZipkin Zipkin with Brave\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.zipkin.reporter2:zipkin-reporter-brave'\\n----\\n\\n.OpenZipkin Zipkin with OpenTelemetry\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.opentelemetry:opentelemetry-exporter-zipkin'\\n----\\n\\n.An OpenZipkin URL sender dependency to send out spans to Zipkin via a `URLConnectionSender`\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.zipkin.reporter2:zipkin-sender-urlconnection'\\n----\\n\\nThe following example shows the required dependency in Maven (assuming that Micrometer Tracing BOM has been added):\\n\\n.Tanzu Observability by Wavefront\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-tracing-reporter-wavefront</artifactId>\\n</dependency>\\n----\\n\\n.OpenZipkin Zipkin with Brave\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.zipkin.reporter2</groupId>\\n <artifactId>zipkin-reporter-brave</artifactId>\\n</dependency>\\n----\\n\\n.OpenZipkin Zipkin with OpenTelemetry\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.opentelemetry</groupId>\\n <artifactId>opentelemetry-exporter-zipkin</artifactId>\\n</dependency>\\n----\\n\\n.An OpenZipkin URL sender dependency to send out spans to Zipkin via a `URLConnectionSender`\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.zipkin.reporter2</groupId>\\n <artifactId>zipkin-sender-urlconnection</artifactId>\\n</dependency>\\n----\\n\\nIMPORTANT: Remember that Brave by default adds Zipkin as a dependency. If you want to use just Wavefront and you're using classpath dependant solutions such as Spring Boot, you might be required to exclude the transitive dependency on Zipkin when using Brave (e.g. via exlcuding the `io.zipkin.reporter2` group).\\n\\n:leveloffset!:\\n\\n== Using Micrometer Tracing Directly\\n\\n:leveloffset: +1\\n\\nIn this section we will describe how to use the Micrometer Tracing API directly to create and report spans.\\n\\n== Micrometer Tracing Examples\\n\\nBelow you can see basic operations on a span. Please read the comments in the snippet for details.\\n\\n[source,java,subs=+attributes]\\n-----\\n// Create a span. If there was a span present in this thread it will become\\n// the `newSpan`'s parent.\\nSpan newSpan = this.tracer.nextSpan().name(\\\"calculateTax\\\");\\n// Start a span and put it in scope. Putting in scope means putting the span\\n// in thread local\\n// and, if configured, adjust the MDC to contain tracing information\\ntry (Tracer.SpanInScope ws = this.tracer.withSpan(newSpan.start())) {\\n // ...\\n // You can tag a span - put a key value pair on it for better debugging\\n newSpan.tag(\\\"taxValue\\\", taxValue);\\n // ...\\n // You can log an event on a span - an event is an annotated timestamp\\n newSpan.event(\\\"taxCalculated\\\");\\n}\\nfinally {\\n // Once done remember to end the span. This will allow collecting\\n // the span to send it to a distributed tracing system e.g. Zipkin\\n newSpan.end();\\n}\\n-----\\n\\nBelow you can see how to continue a span in a new thread, that was started in another thread.\\n\\n[source,java,subs=+attributes]\\n-----\\nSpan spanFromThreadX = this.tracer.nextSpan().name(\\\"calculateTax\\\");\\ntry (Tracer.SpanInScope ws = this.tracer.withSpan(spanFromThreadX.start())) {\\n executorService.submit(() -> {\\n // Pass the span from thread X\\n Span continuedSpan = spanFromThreadX;\\n // ...\\n // You can tag a span\\n continuedSpan.tag(\\\"taxValue\\\", taxValue);\\n // ...\\n // You can log an event on a span\\n continuedSpan.event(\\\"taxCalculated\\\");\\n }).get();\\n}\\nfinally {\\n spanFromThreadX.end();\\n}\\n-----\\n\\nBelow you can see how to create a child span when explicitly knowing who the parent span is.\\n\\n[source,java,subs=+attributes]\\n-----\\n// let's assume that we're in a thread Y and we've received\\n// the `initialSpan` from thread X. `initialSpan` will be the parent\\n// of the `newSpan`\\nSpan newSpan = this.tracer.nextSpan(initialSpan).name(\\\"calculateCommission\\\");\\n// ...\\n// You can tag a span\\nnewSpan.tag(\\\"commissionValue\\\", commissionValue);\\n// ...\\n// You can log an event on a span\\nnewSpan.event(\\\"commissionCalculated\\\");\\n// Once done remember to end the span. This will allow collecting\\n// the span to send it to e.g. Zipkin. The tags and events set on the\\n// newSpan will not be present on the parent\\nnewSpan.end();\\n-----\\n\\n== Micrometer Tracing Brave Setup\\n\\nIn this subsection we will set up Micrometer Tracing with Brave.\\n\\nBelow you can see how to create a Micrometer Tracing `Tracer` using Brave components that would send completed spans to Zipkin.\\n\\n[source,java,subs=+attributes]\\n-----\\n// [Brave component] Example of using a SpanHandler. SpanHandler is a component\\n// that gets called when a span is finished. Here we have an example of setting it\\n// up with sending spans\\n// in a Zipkin format to the provided location via the UrlConnectionSender\\n// (through the <io.zipkin.reporter2:zipkin-sender-urlconnection> dependency)\\n// Another option could be to use a TestSpanHandler for testing purposes.\\nSpanHandler spanHandler = ZipkinSpanHandler\\n .create(AsyncReporter.create(URLConnectionSender.create(\\\"http://localhost:9411/api/v2/spans\\\")));\\n\\n// [Brave component] CurrentTraceContext is a Brave component that allows you to\\n// retrieve the current TraceContext.\\nThreadLocalCurrentTraceContext braveCurrentTraceContext = ThreadLocalCurrentTraceContext.newBuilder()\\n .addScopeDecorator(MDCScopeDecorator.get()) // Example of Brave's\\n // automatic MDC setup\\n .build();\\n\\n// [Micrometer Tracing component] A Micrometer Tracing wrapper for Brave's\\n// CurrentTraceContext\\nCurrentTraceContext bridgeContext = new BraveCurrentTraceContext(this.braveCurrentTraceContext);\\n\\n// [Brave component] Tracing is the root component that allows to configure the\\n// tracer, handlers, context propagation etc.\\nTracing tracing = Tracing.newBuilder()\\n .currentTraceContext(this.braveCurrentTraceContext)\\n .supportsJoin(false)\\n .traceId128Bit(true)\\n // For Baggage to work you need to provide a list of fields to propagate\\n .propagationFactory(BaggagePropagation.newFactoryBuilder(B3Propagation.FACTORY)\\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create(\\\"from_span_in_scope 1\\\")))\\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create(\\\"from_span_in_scope 2\\\")))\\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create(\\\"from_span\\\")))\\n .build())\\n .sampler(Sampler.ALWAYS_SAMPLE)\\n .addSpanHandler(this.spanHandler)\\n .build();\\n\\n\\n// [Brave component] Tracer is a component that handles the life-cycle of a span\\nbrave.Tracer braveTracer = this.tracing.tracer();\\n\\n// [Micrometer Tracing component] A Micrometer Tracing wrapper for Brave's Tracer\\nTracer tracer = new BraveTracer(this.braveTracer, this.bridgeContext, new BraveBaggageManager());\\n\\n-----\\n\\n== Micrometer Tracing OpenTelemetry Setup\\n\\nIn this subsection we will set up Micrometer Tracing with OpenTelemetry (OTel).\\n\\nBelow you can see how to create a Micrometer Tracing `Tracer` using OTel components that would send completed spans to Zipkin.\\n\\n[source,java,subs=+attributes]\\n-----\\n// [OTel component] Example of using a SpanExporter. SpanExporter is a component\\n// that gets called when a span is finished. Here we have an example of setting it\\n// up with sending spans\\n// in a Zipkin format to the provided location via the UrlConnectionSender\\n// (through the <io.opentelemetry:opentelemetry-exporter-zipkin> and\\n// <io.zipkin.reporter2:zipkin-sender-urlconnection> dependencies)\\n// Another option could be to use an ArrayListSpanProcessor for testing purposes\\nSpanExporter spanExporter = new ZipkinSpanExporterBuilder()\\n .setSender(URLConnectionSender.create(\\\"http://localhost:9411/api/v2/spans\\\"))\\n .build();\\n\\n// [OTel component] SdkTracerProvider is an SDK implementation for TracerProvider\\nSdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()\\n .setSampler(alwaysOn())\\n .addSpanProcessor(BatchSpanProcessor.builder(spanExporter).build())\\n .build();\\n\\n// [OTel component] The SDK implementation of OpenTelemetry\\nOpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder()\\n .setTracerProvider(sdkTracerProvider)\\n .setPropagators(ContextPropagators.create(B3Propagator.injectingSingleHeader()))\\n .build();\\n\\n// [OTel component] Tracer is a component that handles the life-cycle of a span\\nio.opentelemetry.api.trace.Tracer otelTracer = openTelemetrySdk.getTracerProvider()\\n .get(\\\"io.micrometer.micrometer-tracing\\\");\\n\\n// [Micrometer Tracing component] A Micrometer Tracing wrapper for OTel\\nOtelCurrentTraceContext otelCurrentTraceContext = new OtelCurrentTraceContext();\\n\\n// [Micrometer Tracing component] A Micrometer Tracing listener for setting up MDC\\nSlf4JEventListener slf4JEventListener = new Slf4JEventListener();\\n\\n// [Micrometer Tracing component] A Micrometer Tracing listener for setting\\n// Baggage in MDC. Customizable\\n// with correlation fields (currently we're setting empty list)\\nSlf4JBaggageEventListener slf4JBaggageEventListener = new Slf4JBaggageEventListener(Collections.emptyList());\\n\\n// [Micrometer Tracing component] A Micrometer Tracing wrapper for OTel's Tracer.\\n// You can consider\\n// customizing the baggage manager with correlation and remote fields (currently\\n// we're setting empty lists)\\nOtelTracer tracer = new OtelTracer(otelTracer, otelCurrentTraceContext, event -> {\\n slf4JEventListener.onEvent(event);\\n slf4JBaggageEventListener.onEvent(event);\\n}, new OtelBaggageManager(otelCurrentTraceContext, Collections.emptyList(), Collections.emptyList()));\\n\\n-----\\n\\n== Micrometer Tracing Baggage API\\n\\nTraces connect from service to service using header propagation. Besides trace identifiers, other properties (called `Baggage`) can also be passed along with the request.\\n\\nBelow you can find an example on how to use the Tracer API (version `1.0.x`) to create and extract baggage.\\n\\n[source,java,subs=+attributes]\\n-----\\n// ---------------------------------------------------------------------------\\n// Example for Tracing 1.0.x\\n// ---------------------------------------------------------------------------\\nSpan span = tracer.nextSpan().name(\\\"parent\\\").start();\\n\\n// Assuming that there's a span in scope...\\ntry (Tracer.SpanInScope ws = tracer.withSpan(span)) {\\n\\n // Not passing a TraceContext explicitly will bind the baggage to the\\n // current TraceContext\\n // If you want to retrieve the baggage value you should make it current\\n // first\\n try (BaggageInScope baggage = tracer.createBaggage(\\\"from_span_in_scope 1\\\", \\\"value 1\\\").makeCurrent()) {\\n // This is how you retrieve the baggage\\n String baggageValue = baggage.get();\\n then(baggageValue).as(\\\"[In scope] Baggage 1\\\").isEqualTo(\\\"value 1\\\");\\n\\n String baggageValueViaTracer = tracer.getBaggage(\\\"from_span_in_scope 1\\\").get();\\n then(baggageValueViaTracer).as(\\\"[In scope] Baggage 1\\\").isEqualTo(\\\"value 1\\\");\\n }\\n\\n try (BaggageInScope baggage = tracer.createBaggage(\\\"from_span_in_scope 2\\\", \\\"value 2\\\").makeCurrent()) {\\n then(baggage.get()).as(\\\"[In scope] Baggage 2\\\").isEqualTo(\\\"value 2\\\");\\n then(tracer.getBaggage(\\\"from_span_in_scope 2\\\").get()).as(\\\"[In scope] Baggage 2\\\")\\n .isEqualTo(\\\"value 2\\\");\\n }\\n}\\n\\n// Assuming that you have a handle to the span\\ntry (BaggageInScope baggage = tracer.createBaggage(\\\"from_span\\\")\\n .set(span.context(), \\\"value 3\\\")\\n .makeCurrent()) {\\n String baggageValueFromATraceContext = baggage.get(span.context());\\n then(baggageValueFromATraceContext).as(\\\"[Span passed explicitly] Baggage 3\\\").isEqualTo(\\\"value 3\\\");\\n\\n String baggageValueFromATraceContextThroughTracer = tracer.getBaggage(\\\"from_span\\\").get(span.context());\\n then(baggageValueFromATraceContextThroughTracer).as(\\\"[Span passed explicitly] Baggage 3\\\")\\n .isEqualTo(\\\"value 3\\\");\\n}\\n\\n// Assuming that there's no span in scope\\n// When there's no span in scope, there will never be any baggage - even if\\n// you make it current\\ntry (BaggageInScope baggage = tracer.createBaggage(\\\"from_span_in_scope 1\\\", \\\"value 1\\\").makeCurrent()) {\\n then(baggage.get()).as(\\\"[Out of span scope] Baggage 1\\\").isNull();\\n then(tracer.getBaggage(\\\"from_span_in_scope 1\\\").get()).as(\\\"[Out of span scope] Baggage 1\\\").isNull();\\n}\\nthen(tracer.getBaggage(\\\"from_span_in_scope 1\\\").get()).as(\\\"[Out of scope] Baggage 1\\\").isNull();\\nthen(tracer.getBaggage(\\\"from_span_in_scope 2\\\").get()).as(\\\"[Out of scope] Baggage 2\\\").isNull();\\nthen(tracer.getBaggage(\\\"from_span\\\").get()).as(\\\"[Out of scope] Baggage 3\\\").isNull();\\nthen(tracer.getBaggage(\\\"from_span\\\").get(span.context())).as(\\\"[Out of scope - with context] Baggage 3\\\")\\n .isNull();\\n-----\\n\\nBelow you can find an example on how to use the Tracer API (version `1.1.x`) to create and extract baggage.\\n\\n[source,java,subs=+attributes]\\n-----\\n// ---------------------------------------------------------------------------\\n// Example for Tracing 1.1.x\\n// ---------------------------------------------------------------------------\\n\\nSpan span = tracer.nextSpan().name(\\\"parent\\\").start();\\n\\n// Assuming that there's a span in scope...\\ntry (Tracer.SpanInScope ws = tracer.withSpan(span)) {\\n\\n // Not passing a TraceContext explicitly will bind the baggage to the\\n // current TraceContext\\n try (BaggageInScope baggage = tracer.createBaggageInScope(\\\"from_span_in_scope 1\\\", \\\"value 1\\\")) {\\n // This is how you retrieve the baggage\\n String baggageValue = baggage.get();\\n then(baggageValue).as(\\\"[In scope] Baggage 1\\\").isEqualTo(\\\"value 1\\\");\\n\\n String baggageValueViaTracer = tracer.getBaggage(\\\"from_span_in_scope 1\\\").get();\\n then(baggageValueViaTracer).as(\\\"[In scope] Baggage 1\\\").isEqualTo(\\\"value 1\\\");\\n }\\n\\n try (BaggageInScope baggage = tracer.createBaggageInScope(\\\"from_span_in_scope 2\\\", \\\"value 2\\\")) {\\n then(baggage.get()).as(\\\"[In scope] Baggage 2\\\").isEqualTo(\\\"value 2\\\");\\n then(tracer.getBaggage(\\\"from_span_in_scope 2\\\").get()).as(\\\"[In scope] Baggage 2\\\")\\n .isEqualTo(\\\"value 2\\\");\\n }\\n}\\n\\n// Assuming that you have a handle to the span\\ntry (BaggageInScope baggage = tracer.createBaggageInScope(span.context(), \\\"from_span\\\", \\\"value 3\\\")) {\\n String baggageValueFromATraceContext = baggage.get(span.context());\\n then(baggageValueFromATraceContext).as(\\\"[Span passed explicitly] Baggage 3\\\").isEqualTo(\\\"value 3\\\");\\n\\n String baggageValueFromATraceContextThroughTracer = tracer.getBaggage(\\\"from_span\\\").get(span.context());\\n then(baggageValueFromATraceContextThroughTracer).as(\\\"[Span passed explicitly] Baggage 3\\\")\\n .isEqualTo(\\\"value 3\\\");\\n}\\n\\n// Assuming that there's no span in scope\\n// When there's no span in scope, there will never be any baggage - even if\\n// you make it current\\ntry (BaggageInScope baggage = tracer.createBaggageInScope(\\\"from_span_in_scope 1\\\", \\\"value 1\\\")) {\\n then(baggage.get()).as(\\\"[Out of span scope] Baggage 1\\\").isNull();\\n then(tracer.getBaggage(\\\"from_span_in_scope 1\\\").get()).as(\\\"[Out of span scope] Baggage 1\\\").isNull();\\n}\\nthen(tracer.getBaggage(\\\"from_span_in_scope 1\\\").get()).as(\\\"[Out of scope] Baggage 1\\\").isNull();\\nthen(tracer.getBaggage(\\\"from_span_in_scope 2\\\").get()).as(\\\"[Out of scope] Baggage 2\\\").isNull();\\nthen(tracer.getBaggage(\\\"from_span\\\").get()).as(\\\"[Out of scope] Baggage 3\\\").isNull();\\nthen(tracer.getBaggage(\\\"from_span\\\").get(span.context())).as(\\\"[Out of scope - with context] Baggage 3\\\")\\n .isNull();\\n-----\\n\\nIMPORTANT: For Brave, remember to set up the `PropagationFactory` so that it contains the baggage fields that you will be using in your code. Check the example below for details.\\n\\n[source,java,subs=+attributes]\\n-----\\nTracing tracing = Tracing.newBuilder()\\n .currentTraceContext(this.braveCurrentTraceContext)\\n .supportsJoin(false)\\n .traceId128Bit(true)\\n // For Baggage to work you need to provide a list of fields to propagate\\n .propagationFactory(BaggagePropagation.newFactoryBuilder(B3Propagation.FACTORY)\\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create(\\\"from_span_in_scope 1\\\")))\\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create(\\\"from_span_in_scope 2\\\")))\\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create(\\\"from_span\\\")))\\n .build())\\n .sampler(Sampler.ALWAYS_SAMPLE)\\n .addSpanHandler(this.spanHandler)\\n .build();\\n\\n-----\\n\\n== Aspect Oriented Programming (starting from Micrometer Tracing 1.1.0)\\n\\nIMPORTANT: This section is applicable from Micrometer Tracing 1.1.0.\\n\\nMicrometer Tracing contains a `@NewSpan`, `@ContinueSpan` and `@SpanTag` annotations that frameworks can use to create or customize spans for either specific types of methods such as those serving web request endpoints or, more generally, to all methods.\\n\\nWARNING: Micrometer's Spring Boot configuration does _not_ recognize these aspects on arbitrary methods.\\n\\nAn AspectJ aspect is included. You can use it in your application either through compile/load time AspectJ weaving or through framework facilities that interpret AspectJ aspects and proxy targeted methods in some other way, such as Spring AOP. Here is a sample Spring AOP configuration:\\n\\n[source,java,subs=+attributes]\\n-----\\n@Configuration\\npublic class SpanAspectConfiguration {\\n\\n @Bean\\n NewSpanParser newSpanParser() {\\n return new DefaultNewSpanParser();\\n }\\n\\n // You can provide your own resolvers - here we go with a noop example.\\n @Bean\\n ValueResolver valueResolver() {\\n return new NoOpValueResolver();\\n }\\n\\n // Example of a SpEL resolver\\n @Bean\\n ValueExpressionResolver valueExpressionResolver() {\\n return new SpelTagValueExpressionResolver();\\n }\\n\\n @Bean\\n MethodInvocationProcessor methodInvocationProcessor(NewSpanParser newSpanParser, Tracer tracer,\\n BeanFactory beanFactory) {\\n return new ImperativeMethodInvocationProcessor(newSpanParser, tracer, beanFactory::getBean,\\n beanFactory::getBean);\\n }\\n\\n @Bean\\n SpanAspect spanAspect(MethodInvocationProcessor methodInvocationProcessor) {\\n return new SpanAspect(methodInvocationProcessor);\\n }\\n\\n}\\n\\n// Example of using SpEL to resolve expressions in @SpanTag\\nstatic class SpelTagValueExpressionResolver implements ValueExpressionResolver {\\n\\n private static final Log log = LogFactory.getLog(SpelTagValueExpressionResolver.class);\\n\\n @Override\\n public String resolve(String expression, Object parameter) {\\n try {\\n SimpleEvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();\\n ExpressionParser expressionParser = new SpelExpressionParser();\\n Expression expressionToEvaluate = expressionParser.parseExpression(expression);\\n return expressionToEvaluate.getValue(context, parameter, String.class);\\n }\\n catch (Exception ex) {\\n log.error(\\\"Exception occurred while tying to evaluate the SpEL expression [\\\" + expression + \\\"]\\\", ex);\\n }\\n return parameter.toString();\\n }\\n\\n}\\n-----\\n\\nApplying `SpanAspect` makes `@NewSpan` and `@ContinueSpan` usable on any arbitrary method in an AspectJ proxied instance, as the following example shows:\\n\\n[source,java,subs=+attributes]\\n-----\\n// In Sleuth @NewSpan and @ContinueSpan annotations would be taken into\\n// consideration. In Micrometer Tracing due to limitations of @Aspect\\n// we can't do that. The @SpanTag annotation will work well though.\\nprotected interface TestBeanInterface {\\n\\n void testMethod2();\\n\\n void testMethod3();\\n\\n void testMethod10(@SpanTag(\\\"testTag10\\\") String param);\\n\\n void testMethod10_v2(@SpanTag(\\\"testTag10\\\") String param);\\n\\n}\\n\\n// Example of an implementation class\\nprotected static class TestBean implements TestBeanInterface {\\n\\n @NewSpan\\n @Override\\n public void testMethod2() {\\n }\\n\\n @NewSpan(name = \\\"customNameOnTestMethod3\\\")\\n @Override\\n public void testMethod3() {\\n }\\n\\n @ContinueSpan(log = \\\"customTest\\\")\\n @Override\\n public void testMethod10(@SpanTag(\\\"customTestTag10\\\") String param) {\\n\\n }\\n\\n @ContinueSpan(log = \\\"customTest\\\")\\n @Override\\n public void testMethod10_v2(String param) {\\n\\n }\\n\\n}\\n\\n// --------------------------\\n// ----- USAGE EXAMPLE ------\\n// --------------------------\\n\\n\\n// Creates a new span with\\ntestBean().testMethod2();\\nthen(createdSpanViaAspect()).isEqualTo(\\\"test-method2\\\");\\n\\n// Uses the name from the annotation\\ntestBean().testMethod3();\\nthen(createdSpanViaAspect()).isEqualTo(\\\"custom-name-on-test-method3\\\");\\n\\n// Continues the previous span\\nSpan span = this.tracer.nextSpan().name(\\\"foo\\\");\\ntry (Tracer.SpanInScope ws = this.tracer.withSpan(span.start())) {\\n\\n // Adds tags and events to an existing span\\n testBean().testMethod10(\\\"tagValue\\\");\\n SimpleSpan continuedSpan = modifiedSpanViaAspect();\\n then(continuedSpan.getName()).isEqualTo(\\\"foo\\\");\\n then(continuedSpan.getTags()).containsEntry(\\\"customTestTag10\\\", \\\"tagValue\\\");\\n then(continuedSpan.getEvents()).extracting(\\\"value\\\").contains(\\\"customTest.before\\\", \\\"customTest.after\\\");\\n}\\nspan.end();\\n\\n// Continues the previous span\\nspan = this.tracer.nextSpan().name(\\\"foo\\\");\\ntry (Tracer.SpanInScope ws = this.tracer.withSpan(span.start())) {\\n\\n // Adds tags and events to an existing span (reusing setup from the parent\\n // interface)\\n testBean().testMethod10_v2(\\\"tagValue\\\");\\n SimpleSpan continuedSpan = modifiedSpanViaAspect();\\n then(continuedSpan.getName()).isEqualTo(\\\"foo\\\");\\n then(continuedSpan.getTags()).containsEntry(\\\"testTag10\\\", \\\"tagValue\\\");\\n then(continuedSpan.getEvents()).extracting(\\\"value\\\").contains(\\\"customTest.before\\\", \\\"customTest.after\\\");\\n}\\nspan.end();\\n\\n\\n-----\\n\\n\\n:leveloffset!:\\n\\n== Configuring with Micrometer Observation\\n\\n:leveloffset: +1\\n\\n== Handler Configuration\\n\\n// TODO: We need to separately document that Micrometer provides a TimerObservationHandler\\n\\nFor Micrometer Tracing to work with Micrometer Observation, you need to add a tracing related `ObservationHandler`.\\nCheck the example below for an example of adding and using a single `DefaultTracingObservationHandler`.\\n\\n[source,java,subs=+attributes]\\n-----\\nTracer tracer = Tracer.NOOP; // The real tracer will come from your tracer\\n // implementation (Brave /\\n// OTel)\\nPropagator propagator = Propagator.NOOP; // The real propagator will come from\\n // your tracer implementation (Brave /\\n // OTel)\\nMeterRegistry meterRegistry = new SimpleMeterRegistry();\\n\\nObservationRegistry registry = ObservationRegistry.create();\\nregistry.observationConfig()\\n // assuming that micrometer-core is on the classpath\\n .observationHandler(new DefaultMeterObservationHandler(meterRegistry))\\n // we set up a first matching handler that creates spans - it comes from\\n // Micrometer\\n // Tracing. We set up spans for sending and receiving data over the wire\\n // and a default one\\n .observationHandler(new ObservationHandler.FirstMatchingCompositeObservationHandler(\\n new PropagatingSenderTracingObservationHandler<>(tracer, propagator),\\n new PropagatingReceiverTracingObservationHandler<>(tracer, propagator),\\n new DefaultTracingObservationHandler(tracer)));\\n\\n// Creating and starting a new observation\\n// via the `DefaultTracingObservationHandler` that will create a new Span and\\n// start it\\nObservation observation = Observation.start(\\\"my.operation\\\", registry)\\n .contextualName(\\\"This name is more readable - we can reuse it for e.g. spans\\\")\\n .lowCardinalityKeyValue(\\\"this.tag\\\", \\\"will end up as a meter tag and a span tag\\\")\\n .highCardinalityKeyValue(\\\"but.this.tag\\\", \\\"will end up as a span tag only\\\");\\n\\n// Put the observation in scope\\n// This will result in making the previously created Span, the current Span - it's\\n// in ThreadLocal\\ntry (Observation.Scope scope = observation.openScope()) {\\n // Run your code that you want to measure - still the attached Span is the\\n // current one\\n // This means that e.g. logging frameworks could inject to e.g. MDC tracing\\n // information\\n yourCodeToMeasure();\\n}\\nfinally {\\n // The corresponding Span will no longer be in ThreadLocal due to\\n // try-with-resources block (Observation.Scope is an AutoCloseable)\\n // Stop the Observation\\n // The corresponding Span will be stopped and reported to an external system\\n observation.stop();\\n}\\n-----\\n\\nYou can also use a shorter version to perform measurements via the `observe` method.\\n\\n[source,java,subs=+attributes]\\n-----\\nObservationRegistry registry = ObservationRegistry.create();\\n\\nObservation.createNotStarted(\\\"my.operation\\\", registry)\\n .contextualName(\\\"This name is more readable - we can reuse it for e.g. spans\\\")\\n .lowCardinalityKeyValue(\\\"this.tag\\\", \\\"will end up as a meter tag and a span tag\\\")\\n .highCardinalityKeyValue(\\\"but.this.tag\\\", \\\"will end up as a span tag only\\\")\\n .observe(this::yourCodeToMeasure);\\n-----\\n\\nThis will result in the following Micrometer Metrics:\\n\\n```\\nGathered the following metrics\\n Meter with name <my.operation> and type <TIMER> has the following measurements\\n <[\\n Measurement{statistic='COUNT', value=1.0},\\n Measurement{statistic='TOTAL_TIME', value=1.011949454},\\n Measurement{statistic='MAX', value=1.011949454}\\n ]>\\n and has the following tags <[tag(this.tag=will end up as a meter tag and a span tag)]>\\n```\\n\\nAnd the following trace view in e.g. Zipkin\\n\\nimage::\" + require(\"!file-loader!./img/zipkin.jpg\") + \"[Trace Info propagation]\\n\\n=== Ordered Handler Configuration\\n\\nMicrometer Tracing comes with multiple `ObservationHandler` implementations.\\nTo introduce ordering, you can use the `ObservationHandler.AllMatchingCompositeObservationHandler` to run logic for all ``ObservationHandler``s that are matching the given predicate and `ObservationHandler.FirstMatchingCompositeObservationHandler` to run logic only for the first `ObservationHandler` that matches the predicate.\\nThe former can group handlers and the latter can be chosen to e.g. run only one matching `TracingObservationHandler`.\\n\\n== Context Propagation with Micrometer Tracing\\n\\nIn order to make https://micrometer.io/docs/contextPropagation[Context Propagation] work with Micrometer Tracing you need to manually register the proper `ThreadLocalAccessor` as presented below.\\n\\n[source,java,subs=+attributes]\\n-----\\nContextRegistry.getInstance().registerThreadLocalAccessor(new ObservationAwareSpanThreadLocalAccessor(tracer));\\n-----\\n\\n== Exemplars\\n\\nTo add support for https://grafana.com/docs/grafana/latest/fundamentals/exemplars/[exemplars] instead of using the `DefaultMeterObservationHandler` you should use the `TracingAwareMeterObservationHandler` like presented below.\\n\\n[source,java,subs=+attributes]\\n-----\\nObservationRegistry registry = ObservationRegistry.create();\\nregistry.observationConfig()\\n // Don't register the DefaultMeterObservationHandler...\\n // .observationHandler(new DefaultMeterObservationHandler(meterRegistry))\\n // ...instead register the tracing aware version\\n .observationHandler(new TracingAwareMeterObservationHandler<>(\\n new DefaultMeterObservationHandler(meterRegistry), tracer));\\n-----\\n\\n:leveloffset!:\\n\\n== Testing\\n\\n:leveloffset: +1\\n\\nMicrometer Tracing comes with `micrometer-tracing-test` and `micrometer-tracing-integration-test` modules.\\n\\nFor unit tests it provides a `SimpleTracer` that is a test implementation of a `Tracer`.\\n\\nFor the integration tests it provides a `SampleTestRunner` mechanism that you can hook into your samples.\\nIt will\\n\\n* Configure an OpenZipkin Brave Tracer\\n** Set it up with Tanzu Observability by Wavefront Reporter\\n** Set it up with OpenZipkin Zipkin Reporter\\n* Configure an OpenTelemetry Tracer\\n** Set it up with Tanzu Observability by Wavefront Exporter\\n** Set it up with OpenZipkin Zipkin Exporter\\n* Run all the combinations above against the user code and running infrastructure\\n\\n== Installing\\n\\nThe following example shows the required dependency in Gradle (assuming that Micrometer Tracing BOM has been added):\\n\\n[source,groovy,subs=+attributes]\\n-----\\ntestImplementation 'io.micrometer:micrometer-tracing-test' // for unit tests\\ntestImplementation 'io.micrometer:micrometer-tracing-integration-test' // for integration tests\\n-----\\n\\nThe following example shows the required dependency in Maven (assuming that Micrometer Tracing BOM has been added):\\n\\n[source,xml,subs=+attributes]\\n-----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-tracing-test</artifactId> <!-- For unit tests -->\\n <scope>test</scope>\\n</dependency>\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-tracing-integration-test</artifactId> <!-- For integration tests -->\\n <scope>test</scope>\\n</dependency>\\n-----\\n\\n== Running Tracing Unit Tests\\n\\nTo run unit tests of your custom handler you may want to use the `SimpleTracer` test `Tracer` implementation. Let's assume the following custom `TracingObservationHandler`.\\n\\n[source,java,subs=+attributes]\\n-----\\nstatic class MyTracingObservationHandler implements TracingObservationHandler<CustomContext> {\\n\\n private final Tracer tracer;\\n\\n MyTracingObservationHandler(Tracer tracer) {\\n this.tracer = tracer;\\n }\\n\\n @Override\\n public void onStart(CustomContext context) {\\n String databaseName = context.getDatabaseName();\\n Span.Builder builder = this.tracer.spanBuilder().kind(Span.Kind.CLIENT).remoteServiceName(databaseName);\\n getTracingContext(context).setSpan(builder.start());\\n }\\n\\n @Override\\n public void onError(CustomContext context) {\\n getTracingContext(context).getSpan().error(context.getError());\\n }\\n\\n @Override\\n public void onStop(CustomContext context) {\\n Span span = getRequiredSpan(context);\\n span.name(context.getContextualName() != null ? context.getContextualName() : context.getName());\\n tagSpan(context, span);\\n span.end();\\n }\\n\\n @Override\\n public boolean supportsContext(Observation.Context context) {\\n return context instanceof CustomContext;\\n }\\n\\n @Override\\n public Tracer getTracer() {\\n return this.tracer;\\n }\\n\\n}\\n-----\\n\\nTo verify whether the spans got properly created we can use the `SimpleTracer` as follows:\\n\\n[source,java,subs=+attributes]\\n-----\\nclass SomeComponentThatIsUsingMyTracingObservationHandlerTests {\\n\\n ObservationRegistry registry = ObservationRegistry.create();\\n\\n SomeComponent someComponent = new SomeComponent(registry);\\n\\n SimpleTracer simpleTracer = new SimpleTracer();\\n\\n MyTracingObservationHandler handler = new MyTracingObservationHandler(simpleTracer);\\n\\n @BeforeEach\\n void setup() {\\n registry.observationConfig().observationHandler(handler);\\n }\\n\\n @Test\\n void should_store_a_span() {\\n // this code will call actual Observation API\\n someComponent.doSthThatShouldCreateSpans();\\n\\n TracerAssert.assertThat(simpleTracer)\\n .onlySpan()\\n .hasNameEqualTo(\\\"insert user\\\")\\n .hasKindEqualTo(Span.Kind.CLIENT)\\n .hasRemoteServiceNameEqualTo(\\\"mongodb-database\\\")\\n .hasTag(\\\"mongodb.command\\\", \\\"insert\\\")\\n .hasTag(\\\"mongodb.collection\\\", \\\"user\\\")\\n .hasTagWithKey(\\\"mongodb.cluster_id\\\")\\n .assertThatThrowable()\\n .isInstanceOf(IllegalStateException.class)\\n .backToSpan()\\n .hasIpThatIsBlank()\\n .hasPortThatIsNotSet();\\n }\\n\\n}\\n-----\\n\\n== Running integration tests\\n\\nThe following example shows how you can run your code to test your integrations\\n\\n* by asserting spans that were stored without emitting them to a reporting system\\n* against running Tanzu Observability by Wavefront instance (this option turns on when you have passed the Wavefront related configuration in the constructor - otherwise the test will be disabled)\\n* against running Zipkin instance (this option turns on when Zipkin is running - otherwise the test will be disabled)\\n\\n[source,java,subs=+attributes]\\n-----\\nclass ObservabilitySmokeTest extends SampleTestRunner {\\n\\n ObservabilitySmokeTest() {\\n super(SampleRunnerConfig.builder().wavefrontApplicationName(\\\"my-app\\\").wavefrontServiceName(\\\"my-service\\\")\\n .wavefrontToken(\\\"...\\\")\\n .wavefrontUrl(\\\"...\\\")\\n .zipkinUrl(\\\"...\\\") // defaults to localhost:9411\\n .build());\\n }\\n\\n @Override\\n public BiConsumer<BuildingBlocks, Deque<ObservationHandler<? extends Observation.Context>>> customizeObservationHandlers() {\\n return (bb, handlers) -> {\\n ObservationHandler defaultHandler = handlers.removeLast();\\n handlers.addLast(new MyTracingObservationHandler(bb.getTracer()));\\n handlers.addLast(defaultHandler);\\n };\\n }\\n\\n @Override\\n public SampleTestRunnerConsumer yourCode() {\\n return (bb, meterRegistry) -> {\\n // here you would be running your code\\n yourCode();\\n\\n SpansAssert.assertThat(bb.getFinishedSpans())\\n .haveSameTraceId()\\n .hasNumberOfSpansEqualTo(8)\\n .hasNumberOfSpansWithNameEqualTo(\\\"handle\\\", 4)\\n .forAllSpansWithNameEqualTo(\\\"handle\\\", span -> span.hasTagWithKey(\\\"rsocket.request-type\\\"))\\n .hasASpanWithNameIgnoreCase(\\\"request_stream\\\")\\n .thenASpanWithNameEqualToIgnoreCase(\\\"request_stream\\\")\\n .hasTag(\\\"rsocket.request-type\\\", \\\"REQUEST_STREAM\\\")\\n .backToSpans()\\n .hasASpanWithNameIgnoreCase(\\\"request_channel\\\")\\n .thenASpanWithNameEqualToIgnoreCase(\\\"request_channel\\\")\\n .hasTag(\\\"rsocket.request-type\\\", \\\"REQUEST_CHANNEL\\\")\\n .backToSpans()\\n .hasASpanWithNameIgnoreCase(\\\"request_fnf\\\")\\n .thenASpanWithNameEqualToIgnoreCase(\\\"request_fnf\\\")\\n .hasTag(\\\"rsocket.request-type\\\", \\\"REQUEST_FNF\\\")\\n .backToSpans()\\n .hasASpanWithNameIgnoreCase(\\\"request_response\\\")\\n .thenASpanWithNameEqualToIgnoreCase(\\\"request_response\\\")\\n .hasTag(\\\"rsocket.request-type\\\", \\\"REQUEST_RESPONSE\\\");\\n\\n MeterRegistryAssert.assertThat(meterRegistry)\\n .hasTimerWithNameAndTags(\\\"rsocket.response\\\", Tags.of(Tag.of(\\\"error\\\", \\\"none\\\"), Tag.of(\\\"rsocket.request-type\\\", \\\"REQUEST_RESPONSE\\\")))\\n .hasTimerWithNameAndTags(\\\"rsocket.fnf\\\", Tags.of(Tag.of(\\\"error\\\", \\\"none\\\"), Tag.of(\\\"rsocket.request-type\\\", \\\"REQUEST_FNF\\\")))\\n .hasTimerWithNameAndTags(\\\"rsocket.request\\\", Tags.of(Tag.of(\\\"error\\\", \\\"none\\\"), Tag.of(\\\"rsocket.request-type\\\", \\\"REQUEST_RESPONSE\\\")))\\n .hasTimerWithNameAndTags(\\\"rsocket.channel\\\", Tags.of(Tag.of(\\\"error\\\", \\\"none\\\"), Tag.of(\\\"rsocket.request-type\\\", \\\"REQUEST_CHANNEL\\\")))\\n .hasTimerWithNameAndTags(\\\"rsocket.stream\\\", Tags.of(Tag.of(\\\"error\\\", \\\"none\\\"), Tag.of(\\\"rsocket.request-type\\\", \\\"REQUEST_STREAM\\\")));\\n };\\n }\\n\\n}\\n-----\\n\\n:leveloffset!:\\n\"","export default __webpack_public_path__ + \"7043f6f1d0731de0cc0943e896c32fca.jpg\";","export default __webpack_public_path__ + \"e4aa3da5f34dc789ae92d1f759a97b85.jpg\";","export default __webpack_public_path__ + \"b8a4008ab6f119930854d422d6bd39b9.jpg\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Context Propagation support\\n:toc:\\n:sectnums:\\n:dimensional: true\\n\\n== Purpose\\n\\nhttps://github.com/micrometer-metrics/context-propagation[A library] that assists with context propagation across different types of context\\nmechanisms such as `ThreadLocal`, Reactor https://projectreactor.io/docs/core/release/reference/#context[Context]\\nand others.\\n\\nAbstractions:\\n\\n* `ThreadLocalAccessor` - contract to assist with access to a `ThreadLocal` value.\\n* `ContextAccessor` - contract to assist with access to a `Map`-like context.\\n* `ContextRegistry` - registry for instances of `ThreadLocalAccessor` and `ContextAccessor`.\\n* `ContextSnapshot` - holder of contextual values, that provides methods to capture and to propagate.\\n\\nExample Scenarios:\\n\\n* In imperative code, e.g. Spring MVC controller, capture `ThreadLocal` values into a\\n`ContextSnapshot`. After that use the snapshot to populate a Reactor `Context` with the\\ncaptured values, or to wrap a task (e.g. `Runnable`, `Callable`, etc) or an `Executor`\\nwith a decorator that restores `ThreadLocal` values when the task executes.\\n* In reactive code, e.g. Spring WebFlux controller, create a `ContextSnapshot` from\\nReactor `Context` values. After that use the snapshot to restore `ThreadLocal` values\\nwithin a specific stage (operator) of the reactive chain.\\n\\nContext values can originate from any context mechanism and propagate to any other, any\\nnumber of times. For example, a value in a `Reactor` context may originate as a\\n`ThreadLocal`, and may yet become a `ThreadLocal` again, and so on.\\n\\nGenerally, imperative code should interact with `ThreadLocal` values as usual, and\\nlikewise Reactor code should interact with the Reactor `Context` as usual. The Context\\nPropagation library is not intended to replace those, but to assist with propagation when\\ncrossing from one type of context to another, e.g. when imperative code invokes a Reactor\\nchain, or when a Reactor chain invokes an imperative component that expects\\n`ThreadLocal` values.\\n\\nThe library is not limited to context propagation from imperative to reactive. It can\\nassist in asynchronous scenarios to propagate `ThreadLocal` values from one thread to\\nanother. It can also propagate to any other type of context for which there is a\\nregistered `ContextAccesor` instance.\\n\\n== Installing\\n\\nSnapshots are published to https://repo.spring.io/snapshot for every successful build on the `main` branch and maintenance branches.\\n\\nMilestone releases are published to https://repo.spring.io/milestone. Include that as a Maven repository in your build\\nconfiguration to use milestone releases. Note that milestone releases are for testing purposes and are not intended for\\nproduction use.\\n\\nThe following example shows the required dependency in Gradle:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:context-propagation:latest.integration'\\n----\\n\\nThe following example shows the required dependency in Maven:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependencies>\\n <dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>context-propagation</artifactId>\\n <version>${micrometer-context-propagation.version}</version>\\n </dependency>\\n</dependencies>\\n----\\n\\n== Usage Examples\\n\\n:leveloffset: +1\\n\\n== `ThreadLocal` Population\\n\\nBelow you can find a holder for `ThreadLocal` values.\\n\\n.ObservationThreadLocalHolder\\n[source,java,subs=+attributes]\\n-----\\n/**\\n * Example of a wrapper around ThreadLocal values.\\n */\\npublic class ObservationThreadLocalHolder {\\n\\n private static final ThreadLocal<String> holder = new ThreadLocal<>();\\n\\n public static void setValue(String value) {\\n holder.set(value);\\n }\\n\\n public static String getValue() {\\n return holder.get();\\n }\\n\\n public static void reset() {\\n holder.remove();\\n }\\n\\n}\\n-----\\n\\nBelow you can find a `ThreadLocalAccessor` that interacts with the holder.\\n\\n.ObservationThreadLocalAccessor\\n[source,java,subs=+attributes]\\n-----\\n/**\\n * Example {@link ThreadLocalAccessor} implementation.\\n */\\npublic class ObservationThreadLocalAccessor implements ThreadLocalAccessor<String> {\\n\\n public static final String KEY = \\\"micrometer.observation\\\";\\n\\n @Override\\n public Object key() {\\n return KEY;\\n }\\n\\n @Override\\n public String getValue() {\\n return ObservationThreadLocalHolder.getValue();\\n }\\n\\n @Override\\n public void setValue(String value) {\\n ObservationThreadLocalHolder.setValue(value);\\n }\\n\\n @Override\\n public void setValue() {\\n ObservationThreadLocalHolder.reset();\\n }\\n\\n}\\n-----\\n\\nBelow you can find an example of how to store and restore thread local values via `ThreadLocalAccessor`, `ContextSnapshot` and `ContextRegistry`.\\n\\n[source,java,subs=+attributes]\\n-----\\n// Create a new Context Registry (you can use a global too)\\nContextRegistry registry = new ContextRegistry();\\n// Register thread local accessors (you can use SPI too)\\nregistry.registerThreadLocalAccessor(new ObservationThreadLocalAccessor());\\n\\n// When you set a thread local value...\\nObservationThreadLocalHolder.setValue(\\\"hello\\\");\\n// ... we can capture it using ContextSnapshot\\nContextSnapshot snapshot = ContextSnapshotFactory.builder().contextRegistry(registry).build().captureAll();\\n\\n// After capturing if you change the thread local value again ContextSnapshot will\\n// not see it\\nObservationThreadLocalHolder.setValue(\\\"hola\\\");\\ntry {\\n // We're populating the thread local values with what we had in\\n // ContextSnapshot\\n try (Scope scope = snapshot.setThreadLocals()) {\\n // Within this scope you will see the stored thread local values\\n then(ObservationThreadLocalHolder.getValue()).isEqualTo(\\\"hello\\\");\\n }\\n // After the scope is closed we will come back to the previously present\\n // values in thread local\\n then(ObservationThreadLocalHolder.getValue()).isEqualTo(\\\"hola\\\");\\n}\\nfinally {\\n // We're clearing the thread local values so that we don't pollute the thread\\n ObservationThreadLocalHolder.reset();\\n}\\n-----\\n\\n:leveloffset!:\\n\"","var map = {\n\t\"./appOptics.adoc\": 94,\n\t\"./atlas.adoc\": 97,\n\t\"./azure-monitor.adoc\": 101,\n\t\"./cloudwatch.adoc\": 102,\n\t\"./datadog.adoc\": 103,\n\t\"./dynatrace.adoc\": 104,\n\t\"./elastic.adoc\": 105,\n\t\"./ganglia.adoc\": 106,\n\t\"./graphite.adoc\": 108,\n\t\"./hierarchical-name-mapping.adoc\": 110,\n\t\"./humio.adoc\": 111,\n\t\"./influx.adoc\": 113,\n\t\"./install.adoc\": 114,\n\t\"./instana.adoc\": 115,\n\t\"./jmx.adoc\": 116,\n\t\"./kairos.adoc\": 118,\n\t\"./new-relic.adoc\": 119,\n\t\"./otlp.adoc\": 124,\n\t\"./prometheus.adoc\": 125,\n\t\"./signalFx.adoc\": 131,\n\t\"./stackdriver.adoc\": 137,\n\t\"./statsD.adoc\": 138,\n\t\"./wavefront.adoc\": 139\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 93;","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer AppOptics\\n:toc:\\n:sectnums:\\n:system: appoptics\\n\\nAppOptics is a dimensional time-series SaaS with built-in dashboarding.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThe following example configures an AppOptics instance:\\n\\n[source,java]\\n----\\nAppOpticsConfig appopticsConfig = new AppOpticsConfig() {\\n @Override\\n public String apiToken() {\\n return MY_TOKEN;\\n }\\n\\n @Override\\n @Nullable\\n public String get(String k) {\\n return null;\\n }\\n};\\nMeterRegistry registry = new AppOpticsMeterRegistry(appopticsConfig, Clock.SYSTEM);\\n----\\n\\n`AppOpticsConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.appoptics` directly to the `AppOpticsConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.appoptics:\\n api-token: YOURKEY\\n\\n # You will probably want disable AppOptics publishing in a local development profile.\\n enabled: true\\n\\n # The interval at which metrics are sent to AppOptics. The default is 1 minute.\\n step: 1m\\n----\\n\\n== Graphing\\n\\nThis section serves as a quick start to rendering useful representations in AppOptics for metrics that originate in Micrometer.\\n\\n=== Timers\\n\\nThe AppOptics implementation of `Timer` produces three fields in AppOptics:\\n\\n* `sum`: Rate of calls per second.\\n* `count`: Rate of total time per second.\\n* `max`: A sliding window maximum amount recorded.\\n\\n.Dimensionally aggregable average in AppOptics.\\nimage::\" + require(\"!file-loader!./img/appoptics-timer-average.png\") + \"[AppOptics timer average]\\n\\nAppOptics performs the `sum/count` division dimensionally to generate aggregable averages on your behalf.\\n\\n.Timer over a simulated service.\\nimage::\" + require(\"!file-loader!./img/appoptics-timer.png\") + \"[AppOptics-rendered timer]\\n\"","export default __webpack_public_path__ + \"0592f647d85fc092e402fdfb77234e24.png\";","export default __webpack_public_path__ + \"6bf5cf6071710d129ffaadb50d2b0874.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Atlas\\n:toc:\\n:sectnums:\\n:system: atlas\\n\\nAtlas is an in-memory dimensional time series database with built-in graphing, a custom stack-based query language, and advanced math operations. Atlas originated at Netflix, where it remains the operational metrics solution.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\n[source,java]\\n----\\nAtlasConfig atlasConfig = new AtlasConfig() {\\n @Override\\n public Duration step() {\\n return Duration.ofSeconds(10);\\n }\\n\\n @Override\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\nMeterRegistry registry = new AtlasMeterRegistry(atlasConfig, Clock.SYSTEM);\\n----\\n\\nMicrometer uses Netflix's https://github.com/netflix/spectator[Spectator] as the underlying instrumentation library when recording metrics destined for Atlas. `AtlasConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties prefixed with `management.metrics.export.atlas` directly to the `AtlasConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.atlas:\\n # The location of your Atlas server\\n uri: http://localhost:7101/api/v1/publish\\n\\n # You will probably want to conditionally disable Atlas publishing in local development.\\n enabled: true\\n\\n # The interval at which metrics are sent to Atlas. The default is 1 minute.\\n step: 1m\\n----\\n\\n== Graphing\\n\\nThis section serves as a quick start to rendering useful representations in Atlas for metrics originating in Micrometer. See the https://github.com/netflix/atlas/wiki[Atlas wiki] for a far more complete reference of what is possible in Atlas.\\n\\n=== Counters\\n\\nAtlas serves up graphs in the form of PNG images (and other https://github.com/Netflix/atlas/wiki/Output-Formats[output formats] as well).\\n\\nWe use the following query to visualize the counter from Atlas. Note that the value is rate-normalized over the step interval rather than monotonically increasing. Atlas always expects link:/docs/concepts#_client_side[rate-aggregated] data for counters from Micrometer.\\n\\n.Counter over a positive-biased random walk.\\nimage::\" + require(\"!file-loader!./img/atlas-counter.png\") + \"[Atlas-rendered counter]\\n\\n[source,http]\\n----\\nGET /api/v1/graph?\\n q=\\n name,counter,:eq,\\n 2,:lw\\n &tz=US/Central\\n &s=e-15m <1>\\n &w=400 <2>\\n &l=0 <3>\\nHost: localhost:7101\\n----\\n<1> The range of time we want to visualize along the x-axis. `e` represents the end time or \\\"`now`\\\". This graph's axis is from 15 minutes ago until now. Atlas automatically chooses the finest grained step interval available from the data that would render at least 1px wide on the resultant image.\\n<2> The overall width of the PNG image returned should be 400px.\\n<3> Set the y-axis lower limit to 0 so that random perturbation in the walk does not look so dramatic.\\n\\n=== Timers\\n\\nWhile reading directly from a `Timer` returns a `double`, the underlying value is\\nstored in https://github.com/netflix/spectator[Spectator] as a nanosecond-precise `long`. What precision is lost by\\nconverting to a `double` in the `Timer` interface does not affect a system like\\nAtlas, because it has been configured to read measurements from the underlying\\nSpectator `Timer` that Micrometer is hiding from you.\\n\\nThe Spectator Atlas `Timer` produces four time series, each with a different `statistic` tag:\\n\\n* `count`: Rate of calls per second.\\n* `totalTime`: Rate of total time per second.\\n* `totalOfSquares`: Rate of total time squared per second (useful for standard deviation).\\n* `max`: The maximum amount recorded.\\n\\nTherefore, you can achieve a throughput (requests/second) line with the following query:\\n\\n```http\\nname,timer,:eq,statistic,count,:eq,:and\\n```\\n\\nNotice that `statistic` is just a dimension that can be drilled down and selected like any other.\\n\\nFurthermore, `totalTime/count` represents average latency and can be selected with a short-hand `:dist-avg` query, which selects the `totalTime` and `count` time series and performs the division for us:\\n\\n```http\\nname,timer,:eq,:dist-avg\\n```\\n\\nIn the preceding example, you can see these two lines plotted on a single dual-axis graph.\\n\\n.Timer over a simulated service.\\nimage::\" + require(\"!file-loader!./img/atlas-timer.png\") + \"[Atlas-rendered timer]\\n\\n\\n=== Long task timers\\n\\nSuppose we had a task that took two minutes to complete when it was expected to complete in less than 70 seconds. A key benefit of long task timers is the ability to receive an alert at the first reporting interval after we have exceeded the threshold. With a regular timer, we would not receive an alert until the first reporting interval after the process completed. If we had a ten-second publishing interval, the regular timer alert would arrive almost a minute after the long task timer alert.\\n\\n.Simulated back-to-back long tasks.\\nimage::\" + require(\"!file-loader!./img/atlas-long-task-timer.png\") + \"[Atlas-rendered long task timer]\\n\\n[source, http]\\n----\\nGET /api/v1/graph?\\n q=\\n name,longTaskTimer,:eq,statistic,duration,:eq,:and, <1>\\n :dup,\\n 70,:gt,:vspan,f00,:color,40,:alpha,alerted,:legend, <2>\\n 70,f00,:color,alert+threshold,:legend <3>\\n &tz=US/Central\\n &s=e-15m\\n &w=400\\n &l=0\\n &title=Peaks+of+Long+Tasks\\n &ylabel=time\\nHost: localhost:7101\\n----\\n<1> A representation of long tasks that are happening back-to-back.\\n<2> A vertical span that appears whenever the long task exceeds our threshold of 70 seconds. So that it does not overwhelm the graph, we also decrease the opacity of the vspan.\\n<3> Plot the threshold of 70 seconds as a separate line.\\n\"","export default __webpack_public_path__ + \"b22351bea254b10bef1c26d3cc3ef397.png\";","export default __webpack_public_path__ + \"4ce8699a76d05ed4311151acc1772b1f.png\";","export default __webpack_public_path__ + \"1127e78d5d7524b0c0540de3d2a732b2.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Azure Monitor\\n:toc:\\n:sectnums:\\n:system: azure-monitor\\n\\nAzure Monitor is a dimensional time-series SaaS with built-in dashboarding.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThe following example configures a Micrometer Azure Monitor:\\n\\n[source,java]\\n----\\nAzureMonitorConfig azureMonitorConfig = new AzureMonitorConfig() {\\n @Override\\n public String instrumentationKey() {\\n return MY_KEY;\\n }\\n\\n @Override\\n public String get(String key) {\\n return null;\\n }\\n};\\nMeterRegistry registry = new AzureMonitorMeterRegistry(azureMonitorConfig, Clock.SYSTEM);\\n----\\n\\n`AzureMonitorConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.azure-monitor` directly to the `AzureMonitorConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.azure-monitor:\\n instrumentation-key: YOURKEY\\n\\n # You will probably want disable Azure Monitor publishing in a local development profile.\\n enabled: true\\n\\n # The interval at which metrics are sent to Azure Monitor. The default is 1 minute.\\n step: 1m\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer CloudWatch\\nTommy Ludwig <tludwig@vmware.com>\\n:toc:\\n:sectnums:\\n:system: cloudwatch2\\n\\nhttps://aws.amazon.com/cloudwatch/[Amazon CloudWatch] is a dimensional time-series SaaS on Amazon's cloud.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\nNOTE: The `micrometer-registry-cloudwatch2` module uses AWS SDK v2. `micrometer-registry-cloudwatch` is for AWS SDK v1.\\n\\n== Configuring\\n\\nThe following example configures Micrometer CloudWatch:\\n\\n[source,java]\\n----\\nCloudWatchConfig cloudWatchConfig = new CloudWatchConfig() {\\n @Override\\n public String get(String s) {\\n return null;\\n }\\n\\n @Override\\n public String namespace() {\\n return \\\"mynamespace\\\";\\n }\\n};\\nMeterRegistry meterRegistry = new CloudWatchMeterRegistry(cloudWatchConfig, Clock.SYSTEM, CloudWatchAsyncClient.create());\\n----\\n\\nYou can provide your own `CloudWatchAsyncClient` to the constructor of the registry.\\n\\n`CloudWatchConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, https://docs.awspring.io/spring-cloud-aws/docs/current/reference/html/index.html#cloudwatch-metrics[Micrometer support in Spring Cloud AWS] binds properties prefixed with `management.metrics.export.cloudwatch` directly to the `CloudWatchConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.cloudwatch:\\n namespace: YOURNAMESPACE\\n\\n # You will probably want to disable publishing in a local development profile.\\n enabled: true\\n\\n # The interval at which metrics are sent to CloudWatch. The default is 1 minute.\\n step: 1m\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Datadog\\n:toc:\\n:sectnums:\\n:system: datadog\\n\\nDatadog is a dimensional time-series SaaS with built-in dashboarding and alerting.\\n\\n== Installation and Configuration\\n\\nMicrometer supports shipping metrics to Datadog directly by using its HTTP API or by using DogStatsD through the link:/docs/registry/statsD[StatsD registry].\\nThe API approach is far more efficient if you need to choose between the two.\\n\\n=== Direct to Datadog API Approach\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy]\\n----\\nimplementation 'io.micrometer:micrometer-registry-datadog:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-datadog</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\nMetrics are rate-aggregated and pushed to `datadoghq` on a periodic interval. Rate aggregation performed by the registry yields datasets that are similar to those produced by `dogstatsd`.\\n\\n[source, java]\\n----\\nDatadogConfig config = new DatadogConfig() {\\n @Override\\n public Duration step() {\\n return Duration.ofSeconds(10);\\n }\\n\\n @Override\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\nMeterRegistry registry = new DatadogMeterRegistry(config, Clock.SYSTEM);\\n----\\n\\n`DatadogConfig` is an interface with a set of default methods.\\nIf, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration through properties.\\nFor example, Spring Boot's Micrometer support binds properties directly to the `DatadogConfig`.\\nSee the https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.metrics.export.datadog[Datadog] section in the Spring Boot reference documentation.\\n\\n`DatadogConfig.hostTag()` specifies a tag key that is mapped to https://docs.datadoghq.com/api/v1/metrics/#submit-metrics[the `host` field] when shipping metrics to Datadog.\\nFor example, if `DatadogConfig.hostTag()` returns `host`, the tag having `host` as its key is used.\\nYou can set the tag by using common tags, as follows:\\n\\n[source,java]\\n----\\nregistry.config().commonTags(\\\"host\\\", \\\"my-host\\\");\\n----\\n\\n`uri` is an important property to configure.\\nThe default value is `https://api.datadoghq.com`.\\nDepending on the Datadog site (region), the api endpoint will be different.\\nTo find your the correct `uri` for your account, do the following:\\n\\n1. Read about https://docs.datadoghq.com/getting_started/site/[Datadog site].\\n2. Go to https://docs.datadoghq.com/api/latest/metrics/[Metrics API reference] and select your own option from the \\\"DATADOG SITE\\\" dropdown.\\n3. Check any API request's endpoint.\\n\\nE.g. For `US5` site, the correct API endpoint is `https://api.us5.datadoghq.com` while for `US3` site, it is `https://api.us3.datadoghq.com/`.\\n\\n=== Through DogStatsD Approach\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-statsd:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-statsd</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\nMetrics are immediately shipped to DogStatsD using Datadog's flavor of the StatsD line protocol. `java-dogstatsd-client` is _not_ needed on the classpath for this to work, as Micrometer uses its own implementation.\\n\\n[source,java]\\n----\\nStatsdConfig config = new StatsdConfig() {\\n @Override\\n public String get(String k) {\\n return null;\\n }\\n\\n @Override\\n public StatsdFlavor flavor() {\\n return StatsdFlavor.DATADOG;\\n }\\n};\\n\\nMeterRegistry registry = new StatsdMeterRegistry(config, Clock.SYSTEM);\\n----\\n\\nMicrometer supports DogStatsD's https://docs.datadoghq.com/developers/dogstatsd/?tab=kubernetes#origin-detection-over-udp[origin detection over UDP] feature on Kubernetes if the `DD_ENTITY_ID` environment variable is properly set.\\n\\nMicrometer, by default, publishes `Timer` meters to DogStatsD as the StatsD \\\"timing\\\" metric type `ms`,\\nwhich are sent to Datadog as https://docs.datadoghq.com/metrics/types/?tab=histogram#metric-types[histogram] type metrics.\\nMicrometer publishes `DistributionSummary` meters as histogram type metrics by default, also.\\n\\nWhen `percentileHistogram` is enabled for the meter, Micrometer sends `Timer` and `DistributionSummary` meters as Datadog https://docs.datadoghq.com/metrics/distributions[Distributions] to DogStatsD.\\nYou can make a `DistributionSummary` with `percentileHistogram` enabled as follows:\\n\\n[source,java]\\n----\\nDistributionSummary responseSizeSummary = DistributionSummary.builder(\\\"http.server.response.size\\\")\\n .baseUnit(\\\"bytes\\\")\\n .publishPercentileHistogram()\\n .register(registry);\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Dynatrace\\n:toc:\\n:sectnums:\\n:system: dynatrace\\n\\nhttps://www.dynatrace.com/[*Dynatrace*] is a Software Intelligence Platform featuring application performance monitoring (APM), artificial intelligence for operations (AIOps), IT infrastructure monitoring, digital experience management (DEM), and digital business analytics capabilities.\\nIt can ingest multi-purpose dimensional time-series data and has built-in dashboarding.\\nBoth SaaS and self-hosted (Managed) deployments are offered.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nFor setting up new integrations with Dynatrace, it is recommended to use the latest version of the https://docs.dynatrace.com/docs/shortlink/api-metrics-v2[Dynatrace Metrics API] (v2).\\nIf you are using Micrometer with Spring Boot, please also refer to the https://docs.dynatrace.com/docs/shortlink/micrometer-metrics-ingest[Dynatrace documentation] and/or the https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.metrics.export.dynatrace[Spring Boot documentation].\\nDynatrace provides different ways of setting up integrations:\\n\\n=== Using Dynatrace auto-configuration (preferred) [[bookmark-auto-configuration]]\\n\\nDynatrace auto-configuration is available for hosts that are monitored by a OneAgent or by the Dynatrace Operator for Kubernetes.\\n\\nIf a Dynatrace OneAgent is installed on the host running Micrometer, metrics can be exported directly using the OneAgent without having to specify an endpoint URI or API token.\\nIf running in Kubernetes with the Dynatrace operator installed, the registry will pick up your endpoint URI and API token from the operator instead.\\nIn this case there is no need to configure anything, so you can use the following code in your project to export Micrometer metrics to Dynatrace:\\n\\n[source,java]\\n----\\nDynatraceConfig dynatraceConfig = new DynatraceConfig() {\\n @Override\\n @Nullable\\n public String get(String k) {\\n // This method of the interface is used by the other configuration methods and needs to be\\n // implemented here. Returning null accepts the defaults for the other configuration items.\\n return null;\\n }\\n};\\nMeterRegistry registry = new DynatraceMeterRegistry(dynatraceConfig, Clock.SYSTEM);\\n----\\n\\nIf you are using Micrometer 1.10.0 or above, you can also use the DEFAULT config to achieve the same with less code:\\n\\n[source,java]\\n----\\nMeterRegistry registry = new DynatraceMeterRegistry(DynatraceConfig.DEFAULT, Clock.SYSTEM);\\n----\\n\\nIt is also possible to change other properties by creating an instance of the `DynatraceConfig` and overwriting the respective methods.\\nFor example, you can specify the exporter version, which defaults to `v2` unless a deviceId is set:\\n\\n[source,java]\\n----\\nDynatraceConfig dynatraceConfig = new DynatraceConfig() {\\n @Override\\n public DynatraceApiVersion apiVersion() {\\n return DynatraceApiVersion.V2;\\n }\\n\\n @Override\\n @Nullable\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\nMeterRegistry registry = new DynatraceMeterRegistry(dynatraceConfig, Clock.SYSTEM);\\n----\\n\\n`DynatraceConfig` is an interface with a set of default methods.\\nSpring Boot's Micrometer support binds properties prefixed with `management.dynatrace.metrics.export` directly to the `DynatraceConfig`.\\n\\nNOTE: Property names for binding attributes from Spring Boot have changed in Spring Boot version 3.0.0. If you use a Spring Boot version before 3.0.0, use `management.metrics.export.dynatrace` instead of `management.dynatrace.metrics.export`.\\n\\nUsing Spring Boot Micrometer support allows configuring the Dynatrace exporter by using <<bookmark-available-properties, the available properties>>.\\nWhen using Micrometer with Spring Boot, you don't have to instantiate the `DynatraceMeterRegistry` manually as Spring Boot will do it automatically for you.\\nAll configuration options that can be set by overwriting methods can also be set via Spring Boot properties, and adding a separate MeterRegistry can lead to metrics not being exported as auto-configuration might break.\\n\\nTo use the Dynatrace metrics exporter for Micrometer in your Spring Boot project, it is enough to include the `runtimeOnly 'io.micrometer:micrometer-registry-dynatrace'` dependency.\\nIn this default configuration, metrics will be exported to the local OneAgent or Kubernetes operator-provided endpoint.\\n\\n=== Using a custom endpoint\\n\\nIf auto-configuration is not available on the host, both the Dynatrace Metrics API v2 endpoint and an API token have to be specified.\\nThe https://docs.dynatrace.com/docs/shortlink/api-authentication[Dynatrace API token documentation] contains more information on how to create an API token.\\nThe 'Ingest metrics' (`metrics.ingest`) permission is required on the token in order to ingest metrics.\\nIt is recommended to limit scope to only this permission.\\n\\n[source,java]\\n----\\nDynatraceConfig dynatraceConfig = new DynatraceConfig() {\\n @Override\\n public DynatraceApiVersion apiVersion() {\\n // not strictly required, but makes the code more clear/explicit\\n return DynatraceApiVersion.V2;\\n }\\n\\n @Override\\n public String uri() {\\n // The endpoint of the Dynatrace Metrics API v2 including path, e.g.:\\n // \\\"https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest\\\"\\n String endpoint = System.getenv(\\\"ENVVAR_METRICS_INGEST_URL\\\");\\n return endpoint != null ? endpoint : DynatraceConfig.super.uri();\\n }\\n\\n @Override\\n public String apiToken() {\\n // should be read from a secure source\\n String token = System.getenv(\\\"ENVVAR_METRICS_INGEST_TOKEN\\\");\\n return token != null ? token : \\\"\\\";\\n }\\n\\n @Override\\n @Nullable\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\nMeterRegistry registry = new DynatraceMeterRegistry(dynatraceConfig, Clock.SYSTEM);\\n----\\n\\nThese properties can also be set via Spring Boot, using property or yaml files.\\nIt is also possible to reference environment variables using the Spring property placeholders (e.g.: `management.dynatrace.metrics.export.uri: ${DT_METRICS_INGEST_URL}`).\\n\\nNOTE: `v2` is used as the default API version unless a `deviceId` is set (<<bookmark-apiv1, see below>>).\\n\\n[source,yml]\\n----\\n# For Spring Boot 3.0.0 and above:\\nmanagement.dynatrace.metrics.export:\\n# For Spring Boot versions below 3.0.0, use the line below instead of the line above:\\n# management.metrics.export.dynatrace:\\n # for SaaS: https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest\\n # for managed deployments: https://{your-domain}/e/{your-environment-id}/api/v2/metrics/ingest\\n uri: YOUR_METRICS_INGEST_URL\\n\\n # should be read from a secure source\\n api-token: YOUR_METRICS_INGEST_TOKEN\\n----\\n\\n=== Meter metadata\\n\\nStarting with Micrometer 1.12.0, the Dynatrace registry v2 exports meter metadata to Dynatrace.\\nCurrently supported types of metadata are *unit* (called \\\"base unit\\\" in Micrometer) and *description*.\\nNo changes are required to start exporting Metadata to Dynatrace - upgrading to version 1.12.0 or above is enough.\\nFind more information about metrics metadata in the https://docs.dynatrace.com/docs/shortlink/metric-ingestion-protocol#metadata[Dynatrace documentation].\\n\\nThe export of metrics metadata can be disabled by setting the `exportMeterMetadata` property on the `DynatraceConfig` (see <<bookmark-available-properties, the section on available properties>> below) to `false`.\\n\\n== API Versions\\n\\n=== API v2 [[bookmark-apiv2]]\\n\\nWhen the API version is configured to `v2`, the registry will send data using the https://docs.dynatrace.com/docs/shortlink/api-metrics-v2[Metrics API v2].\\nIn order to maintain backwards compatibility, when a `deviceId` is set (which is required for `v1` and not used in `v2`), `v1` is used as the default.\\nOtherwise, the version defaults to `v2`, and does not have to be set explicitly.\\nWith no endpoint URI and token set, metrics will be exported to the local OneAgent endpoint or, if running in Kubernetes with the Dynatrace operator installed, to the endpoint provided by the operator.\\nIf no auto-configuration is desired, it is possible to specify endpoint and token explicitly, in order to export metrics to that specific endpoint.\\nExplicitly specifying these will overwrite auto-configuration.\\n\\n*Minimal configuration with Dynatrace auto-configuration*\\n\\nIn the minimal configuration <<bookmark-auto-configuration, shown above>> (no URI or API token), the v2 registry will attempt to retrieve the endpoint provided by the Dynatrace Kubernetes operator.\\nIf the operator is not set up or does not provide this information, the exporter will attempt to send metrics to the https://docs.dynatrace.com/docs/shortlink/local-api[local OneAgent metrics ingest endpoint].\\nNote that this only works if a OneAgent is running on the host and the https://docs.dynatrace.com/docs/shortlink/local-api#enable-the-oneagent-metric-api[local OneAgent Metric API] is available.\\nIf the ingestion port for the local OneAgent was changed to a custom one, the full endpoint URI has to be provided for the URI property (with API token left empty).\\n\\n*Configuration with URI and API token*\\n\\nIf no auto-configuration is available or the metrics should be sent to a different endpoint (e.g. a different tenant), the Dynatrace v2 exporter can be configured with an explicit endpoint URI and an https://docs.dynatrace.com/docs/shortlink/api-authentication[API token].\\nThe https://docs.dynatrace.com/docs/shortlink/api-authentication[API token] must have the https://docs.dynatrace.com/docs/dynatrace-api/basics/dynatrace-api-authentication#token-scopes[\\\"Ingest metrics\\\"] (`metrics.ingest`) permission set.\\nIt is recommended to limit scope to only this permission.\\n\\nThe entire Metrics v2 API endpoint URI has to be specified including its path, i.e.: with the path `/api/v2/metrics/ingest` on SaaS and managed deployments, or `/metrics/ingest` for OneAgent endpoints as mentioned in the https://docs.dynatrace.com/docs/shortlink/api-metrics-v2-post-datapoints[documentation].\\n\\n*Properties available in the v2 exporter* [[bookmark-available-properties]]\\n\\nWhen using the https://docs.dynatrace.com/docs/shortlink/api-metrics-v2[Dynatrace metrics API v2], the following properties can be set:\\n\\n[source,java]\\n----\\nDynatraceConfig dynatraceConfig = new DynatraceConfig() {\\n @Override\\n public DynatraceApiVersion apiVersion() {\\n return DynatraceApiVersion.V2;\\n }\\n\\n @Override\\n public String uri() {\\n // The endpoint of the Dynatrace Metrics API v2 including path, e.g.:\\n // \\\"https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest\\\".\\n String endpoint = System.getenv(\\\"ENVVAR_METRICS_INGEST_URL\\\");\\n return endpoint != null ? endpoint : DynatraceConfig.super.uri();\\n }\\n\\n @Override\\n public String apiToken() {\\n // should be read from a secure source\\n String token = System.getenv(\\\"ENVVAR_METRICS_INGEST_TOKEN\\\");\\n return token != null ? token : \\\"\\\";\\n }\\n\\n @Override\\n public String metricKeyPrefix() {\\n // will be prepended to all metric keys\\n return \\\"your.desired.prefix\\\";\\n }\\n\\n @Override\\n public boolean enrichWithDynatraceMetadata() {\\n return true;\\n }\\n\\n @Override\\n public Map<String, String> defaultDimensions() {\\n // create and return a map containing the desired key-value pairs.\\n Map<String, String> dims = new HashMap<>();\\n dims.put(\\\"dimensionKey\\\", \\\"dimensionValue\\\");\\n return dims;\\n }\\n\\n // Only available in Micrometer 1.9.0 and above\\n @Override\\n public boolean useDynatraceSummaryInstruments() {\\n return false;\\n }\\n\\n // Only available in Micrometer 1.12.0 and above\\n @Override\\n public boolean exportMeterMetadata() {\\n return true;\\n }\\n\\n @Override\\n @Nullable\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\n----\\n\\nThese properties can also be set in Spring Boot configuration files:\\n\\n[source,yml]\\n----\\nmanagement.dynatrace.metrics.export:\\n # Required only if not using the OneAgent endpoint\\n # For SaaS: https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest\\n # For managed deployments: https://{your-domain}/e/{your-environment-id}/api/v2/metrics/ingest\\n uri: YOUR_METRICS_INGEST_URL\\n\\n # should be read from a secure source\\n api-token: YOUR_METRICS_INGEST_TOKEN\\n\\n # These properties can only be used with the v2 exporter.\\n v2:\\n # Sets a prefix that is prepended to each exported metric key.\\n metric-key-prefix: my.metric.key.prefix\\n\\n # If set to true and a local OneAgent or operator is running, retrieves metadata\\n # and adds it as additional dimensions to all data points (default: true)\\n enrich-with-dynatrace-metadata: true\\n\\n # Sets an arbitrary number of key-value pairs as default dimensions.\\n # Micrometer tags will overwrite these dimensions, if they have the same key.\\n # Each exported metric will contain these dimensions.\\n default-dimensions:\\n key1: \\\"value1\\\"\\n key2: \\\"value2\\\"\\n\\n # (since 1.9.0) Whether or not to use the Dynatrace-specific summary instruments. (default: true)\\n # This should only be disabled if problems with existing instrumentation are discovered after upgrading to 1.9.0.\\n # Set to false, this will restore the previous (1.8.x) behavior for Timers and DistributionSummaries.\\n use-dynatrace-summary-instruments: true\\n\\n # (since 1.12.0) Determines whether meter metadata (unit, description) should be exported.\\n export-meter-metadata: true\\n\\n # The export interval in which metrics are sent to Dynatrace (default: 60s).\\n step: 60s\\n----\\n\\nFor more information about the metadata picked up by the Dynatrace metadata enrichment feature, see https://docs.dynatrace.com/docs/shortlink/enrichment-files[the Dynatrace documentation].\\n\\nIn Micrometer 1.9.0, Dynatrace-specific summary instruments (`DynatraceTimer` and `DynatraceDistributionSummary`) were introduced.\\nThese specialized instruments are tailored to the Dynatrace metrics ingest, and prevent the creation of invalid metrics.\\nThey are available from version 1.9.0 and are used as a drop-in replacement by default.\\nNo action is needed from users upgrading to 1.9.0. If there is a discrepancy in the observed metrics, it is possible to return to the previous behavior by setting the `useDynatraceSummaryInstruments` toggle to `false`.\\n\\n=== API v1 (Legacy) [[bookmark-apiv1]]\\n\\nWhen the apiVersion is configured to `v1`, the registry will send data using the https://docs.dynatrace.com/docs/shortlink/api-custom-metrics[Dynatrace Timeseries API v1 for custom metrics].\\nIf a `deviceId` is specified, it will default to `v1` for backwards compatibility with earlier setups.\\nThe `device-id` property is required for `v1` and not used in `v2`.\\nExisting setups will continue to work when updating to newer versions of Micrometer.\\nThe reported metrics will be assigned to https://docs.dynatrace.com/docs/shortlink/api-custom-device-report-metric[custom devices] in Dynatrace.\\n\\nFor the v1 API, do not specify the ingest path, but only the base URL of your environment, e.g.: `uri: https://{your-environment-id}.live.dynatrace.com`\\n\\n[source,java]\\n----\\nDynatraceConfig dynatraceConfig = new DynatraceConfig() {\\n @Override\\n public String uri() {\\n // The Dynatrace environment URI without any path, e.g.:\\n // https://{your-environment-id}.live.dynatrace.com\\n return MY_DYNATRACE_URI;\\n }\\n\\n @Override\\n public String apiToken() {\\n // should be read from a secure source\\n return MY_TOKEN;\\n }\\n\\n @Override\\n public String deviceId() {\\n return MY_DEVICE_ID;\\n }\\n\\n @Override\\n @Nullable\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\nMeterRegistry registry = new DynatraceMeterRegistry(dynatraceConfig, Clock.SYSTEM);\\n----\\n\\n[source,yml]\\n----\\nmanagement.dynatrace.metrics.export:\\n # For v1 export, do not append a path to the endpoint URL, e.g.:\\n # For SaaS: https://{your-environment-id}.live.dynatrace.com\\n # For managed deployments: https://{your-domain}/e/{your-environment-id}\\n uri: https://{your-environment-id}.live.dynatrace.com\\n\\n # should be read from a secure source\\n api-token: MY_TOKEN\\n\\n # When setting the device id, metrics will be exported to the v1 timeseries endpoint\\n # Using just device-id (without the v1 prefix) is deprecated, but will work to maintain backwards compatibility.\\n v1:\\n device-id: sample\\n\\n # To disable Dynatrace publishing, e.g. in a local development profile, use:\\n # enabled: false\\n\\n # The interval at which metrics are sent to Dynatrace. The default is 1 minute.\\n step: 1m\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Elastic\\n:toc:\\n:sectnums:\\n:system: elastic\\n\\nElasticsearch is an open source search and analytics platform. Metrics stored in Elasticsearch can be visualized in Kibana.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThe following example configures an ElasticSearch instance:\\n\\n[source,java]\\n----\\nElasticConfig elasticConfig = new ElasticConfig() {\\n @Override\\n @Nullable\\n public String get(String k) {\\n return null;\\n }\\n};\\nMeterRegistry registry = new ElasticMeterRegistry(elasticConfig, Clock.SYSTEM);\\n----\\n\\n`ElasticConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.elastic` directly to the `ElasticConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.elastic:\\n # You will probably want disable Elastic publishing in a local development profile.\\n enabled: true\\n\\n # The interval at which metrics are sent to Elastic. The default is 1 minute.\\n step: 1m\\n\\n # The index to store metrics in, defaults to \\\"micrometer-metrics\\\"\\n index: micrometer-metrics\\n----\\n\\n== Elastic APM agent integration\\n\\nIf you are using the Elastic APM agent, it can collect metrics from Micrometer `MeterRegistry` instances automatically. You can use the `SimpleMeterRegistry` if you only want metrics collected by the Elastic APM agent and not shipped anywhere else. See the https://www.elastic.co/guide/en/apm/agent/java/current/metrics.html#metrics-micrometer[Elastic docs] for more details.\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Ganglia\\n:toc:\\n:sectnums:\\n:system: ganglia\\n\\nGanglia is an aging hierarchical metrics system which enjoyed wide popularity in Linux system monitoring and is still in place in many organizations. It originated in the early 2000s at the University of California, Berkeley.\\n\\nNOTE: The `micrometer-registry-ganglia` module uses the https://github.com/ganglia/gmetric4j[gmetric4j] library, which contains classes generated by the LGPL licensed https://sourceforge.net/projects/remotetea/[remotetea project].\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThe following example configures a Ganglia instance:\\n\\n[source,java]\\n----\\nGangliaConfig gangliaConfig = new GangliaConfig() {\\n @Override\\n public String host() {\\n return \\\"mygraphitehost\\\";\\n }\\n\\n @Override\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\n\\nMeterRegistry registry = new GangliaMeterRegistry(gangliaConfig, Clock.SYSTEM);\\n----\\n\\nMicrometer uses Dropwizard Metrics as the underlying instrumentation library when recording metrics destined for Ganglia. `GangliaConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.ganglia` directly to the `GangliaConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.ganglia:\\n # The location of your Ganglia server\\n host: mygraphitehost\\n\\n # You will probably want to conditionally disable Ganglia publishing in local development.\\n enabled: true\\n\\n # The interval at which metrics are sent to Ganglia. The default is 1 minute.\\n step: 1m\\n----\\n\\n== Hierarchical name mapping\\n\\nMicrometer provides a `HierarchicalNameMapper` interface that governs how a dimensional meter ID is mapped to flat hierarchical names.\\n\\nThe default (`HierarchicalNameMapper.DEFAULT`) sorts tags alphabetically by key and appends tag key/value pairs to the base meter name with '.' -- for example, `http_server_requests.method.GET.response.200`. The name and tag keys have the registry's naming convention applied to them first.\\n\\nIf there is something special about your naming scheme that you need to honor, you can provide your own `HierarchicalNameMapper` implementation. The most common cause of a custom mapper comes from a need to prefix something to the front of every metric (generally something like `app.<name>.http_server_requests.method.GET.response.200`).\\n\\n== Graphing\\n\\nThis section serves as a quick start to rendering useful representations in Ganglia for metrics originating in Micrometer.\\n\\n=== Counters\\n\\nGanglia counters measure mean throughput and one-, five-, and fifteen-minute exponentially-weighted moving average throughputs.\\n\\n.A Ganglia rendered graph of the random walk counter.\\nimage::\" + require(\"!file-loader!./img/ganglia-counter.png\") + \"[Ganglia-rendered counter]\\n\"","export default __webpack_public_path__ + \"80865a7f65d47863b3b264a9ed09629a.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Graphite\\n:toc:\\n:sectnums:\\n:system: graphite\\n\\nGraphite is one of the most popular current hierarchical metrics systems backed by a fixed-size database, similar in design and purpose to RRDtool. It originated at Orbitz in 2006 and was open sourced in 2008.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThe following example configures a Graphite instance:\\n\\n[source,java]\\n----\\nGraphiteConfig graphiteConfig = new GraphiteConfig() {\\n @Override\\n public String host() {\\n return \\\"mygraphitehost\\\";\\n }\\n\\n @Override\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\n\\nMeterRegistry registry = new GraphiteMeterRegistry(graphiteConfig, Clock.SYSTEM, HierarchicalNameMapper.DEFAULT);\\n----\\n\\nMicrometer uses Dropwizard Metrics as the underlying instrumentation library when recording metrics destined for Graphite. `GraphiteConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.graphite` directly to the `GraphiteConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.graphite:\\n # The location of your Graphite server\\n host: mygraphitehost\\n\\n # You will probably want to conditionally disable Graphite publishing in local development.\\n enabled: true\\n\\n # The interval at which metrics are sent to Graphite. The default is 1 minute.\\n step: 1m\\n----\\n\\n== Graphite Tag Support\\n\\nAs of Micrometer version 1.4.0, Micrometer supports exporting Graphite metrics by using tags instead of the traditional hierarchical format. By default, metrics are exported by using the tag format, unless any `tagsAsPrefix` values are configured.\\nhttps://graphite.readthedocs.io/en/latest/tags.html[Tag support] was added to Graphite in the 1.1.0 Graphite release.\\nIf you wish to revert to the traditional hierarchical format, ensure that the `graphiteTagsEnabled` config value is set to `false`.\\nThe following documentation sections on hierarchical name mapping and metrics prefixing are only applicable if tag support is disabled.\\n\\n== Hierarchical name mapping\\n\\nMicrometer provides a `HierarchicalNameMapper` interface that governs how a dimensional meter ID is mapped to flat hierarchical names.\\n\\nThe default (`HierarchicalNameMapper.DEFAULT`) sorts tags alphabetically by key and appends tag key/value pairs to the base meter name with '.' -- for example, `http_server_requests.method.GET.response.200`. The name and tag keys have the registry's naming convention applied to them first.\\n\\nIf there is something special about your naming scheme that you need to honor, you can provide your own `HierarchicalNameMapper` implementation. The most common cause of a custom mapper comes from a need to prefix something to the front of every metric (generally something like `app.<name>.http_server_requests.method.GET.response.200`).\\n\\n== Prefixing your metrics\\n\\nTo add a prefix to all metrics that go to graphite, use the `GraphiteConfig#tagsAsPrefix` configuration option. This option applies the tag value of a set of common tags as a prefix. For example, if `tagsAsPrefix` contains `application`, and a meter named `myTimer` is created with a tag of `application=APPNAME`, it appears in Graphite as `APPNAME.myTimer`.\\n\\nGenerally, when you use `tagsAsPrefix`, you should add common tags to the registry so that the tags are present on all meters that belong to that registry:\\n\\n[source,java]\\n----\\n@Bean\\npublic MeterRegistryCustomizer<MeterRegistry> commonTags() {\\n return r -> r.config().commonTags(\\\"application\\\", \\\"APPNAME\\\");\\n}\\n----\\n\\nWe do it this way because, generally, a tag prefix in Graphite is correlated to a common tag elsewhere. Prefixes tend to be something like app name or host. By applying those values as common tags, you make your metrics more portable (that is, if you ever switch to a dimensional monitoring system, you are set).\\n\\nYou can use this when the order of the prefix matters. Micrometer always sorts tags, but the order of tag keys in `tagsAsPrefix` is preserved, so adding `host` and `application` to `tagsAsPrefix` results in a prefixed metric, such as `HOST.APP.myCounter`.\\n\\nTo meet your specific naming needs, you can also provide a custom hierarchical name mapper when creating `GraphiteMeterRegistry`, as follows:\\n\\n[source,java]\\n----\\nGraphiteMeterRegistry r = new GraphiteMeterRegistry(\\n GraphiteConfig.DEFAULT,\\n Clock.SYSTEM,\\n (id, convention) -> \\\"prefix.\\\" + HierarchicalNameMapper.DEFAULT.toHierarchicalName(id, convention));\\n----\\n\\nNOTE: If you use a custom `HierarchicalNameMapper`, `tagsAsPrefix` is ignored.\\n\\n== Further Customizing the `GraphiteReporter`\\n\\nWe give you the option to configure `GraphiteReporter` yourself if you need further customization. To do so, use this constructor and provide your own `GraphiteReporter`:\\n\\n[source,java]\\n----\\nGraphiteMeterRegistry(GraphiteConfig config, Clock clock, HierarchicalNameMapper nameMapper,\\n MetricRegistry metricRegistry, GraphiteReporter reporter)\\n----\\n\\n== Graphing\\n\\nThis section serves as a quick start to rendering useful representations in Graphite for metrics originating in Micrometer.\\n\\n=== Counters\\n\\nGraphite counters measure mean throughput and one-, five-, and fifteen-minute exponentially-weighted moving average throughputs.\\n\\n.A Graphite rendered graph of the random walk counter.\\nimage::\" + require(\"!file-loader!./img/graphite-counter.png\") + \"[Graphite-rendered counter]\\n\"","export default __webpack_public_path__ + \"cd6b0314737fa94a81e42689517fd7fb.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n== Hierarchical name mapping\\n\\nMicrometer provides a `HierarchicalNameMapper` interface that governs how a dimensional meter ID is mapped to flat hierarchical names.\\n\\nThe default (`HierarchicalNameMapper.DEFAULT`) sorts tags alphabetically by key and appends tag key/value pairs to the base meter name with '.' -- for example, `http_server_requests.method.GET.response.200`. The name and tag keys have the registry's naming convention applied to them first.\\n\\nIf there is something special about your naming scheme that you need to honor, you can provide your own `HierarchicalNameMapper` implementation. The most common cause of a custom mapper comes from a need to prefix something to the front of every metric (generally something like `app.<name>.http_server_requests.method.GET.response.200`).\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Humio\\n:toc:\\n:sectnums:\\n:system: humio\\n\\nHumio is a dimensional time-series SaaS with built-in dashboarding.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThe following example configures a Humio instance:\\n\\n[source,java]\\n----\\nHumioConfig humioConfig = new HumioConfig() {\\n @Override\\n public String apiToken() {\\n return MY_TOKEN;\\n }\\n\\n @Override\\n @Nullable\\n public String get(String k) {\\n return null;\\n }\\n};\\nMeterRegistry registry = new HumioMeterRegistry(humioConfig, Clock.SYSTEM);\\n----\\n\\n`HumioConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.humio` directly to the `HumioConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.humio:\\n api-token: YOURKEY\\n\\n # You will probably want disable Humio publishing in a local development profile.\\n enabled: true\\n\\n # The interval at which metrics are sent to Humio. The default is 1 minute.\\n step: 1m\\n\\n # The cluster Micrometer will send metrics to. The default is \\\"https://cloud.humio.com\\\"\\n uri: https://myhumiohost\\n----\\n\\n== Graphing\\n\\nThis section serves as a quick start to rendering useful representations in Humio for metrics originating in Micrometer.\\n\\n=== Timers\\n\\nThe Humio implementation of `Timer` produces four fields in Humio:\\n\\n* `sum`: Rate of calls per second.\\n* `count`: Rate of total time per second.\\n* `max`: A sliding window maximum amount recorded.\\n* `avg`: A non-aggregable average for only this set of tag values.\\n\\nThe following query constructs a dimensionally aggregable average latency per URI:\\n\\n[source, text]\\n----\\nname = http_server_requests\\n| timechart(uri, function=max(avg))\\n----\\n\\n.Timer over a simulated service.\\nimage::\" + require(\"!file-loader!./img/humio-timer.png\") + \"[Humio-rendered timer]\\n\"","export default __webpack_public_path__ + \"6584fae5a94c66dd29f69056b031d7e3.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Influx\\n:toc:\\n:sectnums:\\n:system: influx\\n\\nThe InfluxData suite of tools supports real-time stream processing and storage of time-series data. It supports downsampling, automatically expiring and deleting unwanted data, as well as backup and restore.\\n\\nThe InfluxMeterRegistry supports the 1.x InfluxDB API as well as the v2 API.\\n\\n== Configuring\\n\\nMicrometer supports shipping metrics to InfluxDB directly or through Telegraf through the StatsD registry.\\n\\n=== Direct to InfluxDB\\n\\nThe following example adds the required library in Gradle:\\n\\n[source,groovy]\\n----\\nimplementation 'io.micrometer:micrometer-registry-influx:latest.release'\\n----\\n\\nThe following example adds the required library in Maven:\\n\\n[source,xml]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-influx</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\nMetrics are rate-aggregated and pushed to InfluxDB on a periodic interval. Rate aggregation performed by the registry yields datasets that are quite similar to those produced by Telegraf. The following example configures a meter registry for InfluxDB:\\n\\n.InfluxDB 1.x configuration example\\n[source, java]\\n----\\nInfluxConfig config = new InfluxConfig() {\\n @Override\\n public Duration step() {\\n return Duration.ofSeconds(10);\\n }\\n\\n @Override\\n public String db() {\\n return \\\"mydb\\\";\\n }\\n\\n @Override\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\nMeterRegistry registry = new InfluxMeterRegistry(config, Clock.SYSTEM);\\n----\\n\\nTo ship metrics to InfluxDB 2.x, make sure to configure the `org` and `bucket` to which to write the metrics, as well as the authentication `token`.\\n\\n.InfluxDB v2 configuration example\\n[source, java]\\n----\\nInfluxConfig config = new InfluxConfig() {\\n\\n @Override\\n public String org() {\\n return \\\"myorg\\\";\\n }\\n\\n @Override\\n public String bucket() {\\n return \\\"app-metrics\\\";\\n }\\n\\n @Override\\n public String token() {\\n return \\\"auth_token_here\\\"; // FIXME: This should be securely bound rather than hard-coded, of course.\\n }\\n\\n @Override\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\nMeterRegistry registry = new InfluxMeterRegistry(config, Clock.SYSTEM);\\n----\\n\\n`InfluxConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.influx` directly to the `InfluxConfig`:\\n\\n[source, yaml]\\n----\\nmanagement.metrics.export.influx:\\n api-version: v2 # API version of InfluxDB to use. Defaults to 'v1' unless an org is configured. If an org is configured, defaults to 'v2'.\\n auto-create-db: true # Whether to create the InfluxDB database if it does not exist before attempting to publish metrics to it. InfluxDB v1 only. (Default: true)\\n batch-size: 10000 # Number of measurements per request to use for this backend. If more measurements are found, then multiple requests will be made. (Default: 10000)\\n bucket: mybucket # Bucket for metrics. Use either the bucket name or ID. Defaults to the value of the db property if not set. InfluxDB v2 only.\\n compressed: true # Whether to enable GZIP compression of metrics batches published to InfluxDB. (Default: true)\\n connect-timeout: 1s # Connection timeout for requests to this backend. (Default: 1s)\\n consistency: one # Write consistency for each point. (Default: one)\\n db: mydb # Database to send metrics to. InfluxDB v1 only. (Default: mydb)\\n enabled: true # Whether exporting of metrics to this backend is enabled. (Default: true)\\n num-threads: 2 # Number of threads to use with the metrics publishing scheduler. (Default: 2)\\n org: myorg # Org to write metrics to. InfluxDB v2 only.\\n password: mysecret # Login password of the InfluxDB server. InfluxDB v1 only.\\n read-timeout: 10s # Read timeout for requests to this backend. (Default: 10s)\\n retention-policy: my_rp # Retention policy to use (InfluxDB writes to the DEFAULT retention policy if one is not specified). InfluxDB v1 only.\\n step: 1m # Step size (i.e. reporting frequency) to use. (Default: 1m)\\n token: AUTH_TOKEN_HERE # Authentication token to use with calls to the InfluxDB backend. For InfluxDB v1, the Bearer scheme is used. For v2, the Token scheme is used.\\n uri: http://localhost:8086 # URI of the InfluxDB server. (Default: http://localhost:8086)\\n user-name: myusername # Login user of the InfluxDB server. InfluxDB v1 only.\\n----\\n\\n=== Through Telegraf\\n\\nTelegraf is a StatsD agent that expects a modified flavor of the StatsD line protocol.\\n\\nThe following listing adds the relevant library in Gradle:\\n\\n[source,groovy]\\n----\\nimplementation 'io.micrometer:micrometer-registry-statsd:latest.release'\\n----\\n\\nThe following listing adds the relevant library in Maven:\\n\\n[source,xml]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-statsd</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\nMetrics are shipped immediately over UDP to Telegraf by using Telegraf's flavor of the StatsD line protocol.\\n\\n[source,java]\\n----\\nStatsdConfig config = new StatsdConfig() {\\n @Override\\n public String get(String k) {\\n return null;\\n }\\n\\n @Override\\n public StatsdFlavor flavor() {\\n return StatsdFlavor.Telegraf;\\n }\\n};\\n\\nMeterRegistry registry = new StatsdMeterRegistry(config, Clock.SYSTEM);\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Instana\\nFabian Lange <fabian.lange@instana.com>\\n:toc:\\n:sectnums:\\n:system: instana\\n\\nInstana is an automatic application performance management and infrastructure monitoring system.\\n\\n== Installation and Configuration\\n\\nInstana automatically detects and reports all metrics without the need of any additional dependency or configuration.\\nIt does so by detecting all instances of `io.micrometer.core.instrument.MeterRegistry` and collecting all registered `io.micrometer.core.instrument.Meter` instances from them.\\n\\nYou can run the Instana agent alongside your application by using Micrometer, and the Instana agent automatically monitors it.\\n\\n== Supported Metrics\\n\\n* **Timer**: The total time of recorded events, scaled to milliseconds.\\n* **Counter**: The cumulative count since this counter was created.\\n* **Gauge**: The current value.\\n* **DistributionSummary**: The total number of all recorded events.\\n* **LongTaskTimer**: The current number of tasks being executed.\\n* **FunctionCounter**: The cumulative count since this counter was created.\\n* **FunctionTimer**: The total time of all occurrences of the timed event.\\n* **TimeGauge**: The current value, scaled to the appropriate base unit.\\n\\nThe metrics show up on the Java Virtual Machine dashboard in Instana. You can configure alerting based on these metrics.\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer JMX\\n:toc:\\n:sectnums:\\n:system: jmx\\n\\nMicrometer provides a hierarchical mapping to JMX, primarily as a cheap and portable way to view metrics locally. Where JMX exporting is found in production, the same metrics are generally exported to another, more purpose-fit monitoring system.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\nMicrometer also sometimes scrapes data from JMX beans for use in reporting metrics. This registry implementation is not needed for these uses. Rather, this module is strictly used to _export_ data to JMX.\\n\\n== Hierarchical name mapping\\n\\nMicrometer provides a `HierarchicalNameMapper` interface that governs how a dimensional meter ID is mapped to flat hierarchical names.\\n\\nThe default (`HierarchicalNameMapper.DEFAULT`) sorts tags alphabetically by key and appends tag key/value pairs to the base meter name with '.' -- for example, `http_server_requests.method.GET.response.200`. The name and tag keys have the registry's naming convention applied to them first.\\n\\nIf there is something special about your naming scheme that you need to honor, you can provide your own `HierarchicalNameMapper` implementation. The most common cause of a custom mapper comes from a need to prefix something to the front of every metric (generally something like `app.<name>.http_server_requests.method.GET.response.200`).\\n\\n== Counters\\n\\nJMX counters measure mean throughput and one-, five-, and fifteen-minute exponentially-weighted moving average throughputs.\\n\\n.The JMX rendered values of the random walk counter.\\nimage::\" + require(\"!file-loader!./img/jmx-counter.png\") + \"[JMX-rendered counter]\\n\"","export default __webpack_public_path__ + \"8077bd6e31e279e04a38e631b2d61a1e.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer KairosDB\\n:toc:\\n:sectnums:\\n:system: kairos\\n\\nKairosDB is a dimensional time-series database built on top of Cassandra. Charting can be accomplished in Grafana by using a link:https://docs.grafana.org/v4.0/datasources/kairosdb/[Kairos datasource].\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThe following example configures KairosDB:\\n\\n[source,java]\\n----\\nKairosConfig kairosConfig = new KairosConfig() {\\n @Override\\n @Nullable\\n public String get(String k) {\\n return null;\\n }\\n};\\nMeterRegistry registry = new KairosMeterRegistry(kairosConfig, Clock.SYSTEM);\\n----\\n\\n`KairosConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.kairos` directly to the `KairosConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.kairos:\\n # You will probably want disable Kairos publishing in a local development profile.\\n enabled: true\\n\\n # The interval at which metrics are sent to Kairos. The default is 1 minute.\\n step: 1m\\n\\n # Authentication may be required, depending on how you have Kairos configured\\n user-name: MYUSER\\n password: MYPASSWORD\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer New Relic\\n:toc:\\n:sectnums:\\n:system: new-relic\\n\\nNew Relic offers a dimensional monitoring system product called Insights. It includes a full UI and a query language called NRQL. New Relic Insights operates on a push model. Some features of NRQL assume that Insights receives a distinct event payload for every timing, count, and so on. Micrometer instead ships aggregates at a prescribed interval, letting your app's throughput scale without concern for event propagation to Insights becoming a bottleneck.\\n\\nNOTE: New Relic provides its own Micrometer `MeterRegistry` implementation based on dimensional metrics.\\nIt intends to supersede Micrometer's `NewRelicMeterRegistry` (which uses custom events in New Relic), because New Relic's dimensional metrics are a better fit for metrics than custom events.\\nYou can find more details in https://github.com/newrelic/micrometer-registry-newrelic[its GitHub repository].\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThe following example configures New Relic:\\n\\n[source,java]\\n----\\nNewRelicConfig newRelicConfig = new NewRelicConfig() {\\n @Override\\n public String accountId() {\\n return \\\"MYACCOUNT\\\";\\n }\\n\\n @Override\\n public String apiKey() {\\n return \\\"MY_INSIGHTS_API_KEY\\\";\\n }\\n\\n @Override\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\n\\nMeterRegistry registry = new NewRelicMeterRegistry(newRelicConfig, Clock.SYSTEM);\\n----\\n\\nThere are two distinct sources of API keys in New Relic.\\n\\n`NewRelicConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.newrelic` directly to the `NewRelicConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.newrelic:\\n account-id: MYACCOUNT\\n api-key: MY_INSIGHTS_API_KEY\\n\\n # The interval at which metrics are sent to New Relic. See Duration.parse for the expected format.\\n # The default is 1 minute.\\n step: 1m\\n----\\n\\n== Graphing\\n\\nThis section serves as a quick start to rendering useful representations in New Relic for metrics originating in Micrometer. See the https://docs.newrelic.com/docs/insights/nrql-new-relic-query-language/using-nrql/introduction-nrql[New Relic NRQL docs] for a far more complete reference of what is possible in New Relic.\\n\\n=== Timers\\n\\nAt each publishing interval, the New Relic `Timer` produces a single event with the timer's name and several attributes:\\n\\n* `avg`: A mean latency for the publishing interval.\\n* `count`: Throughput per second over the publishing interval.\\n* `totalTime`: Total time per second over the publishing interval (used with `count`) to create aggregable means.\\n\\nAdditionally, if any percentiles or SLO buckets are defined on the timer, additional events are produced:\\n\\n* `${name}.percentiles`: Micrometer calculated percentiles for the publishing interval. One event is produced for each percentile, with a tag of `phi` in the range of [0,1].\\n* `${name}.histogram`: One event is produced for each SLO boundary with a tag of 'le', indicating that it represents a cumulative count of events less than or equal to SLO boundaries over the publishing interval.\\n\\nTo generate an aggregable view of latency in New Relic, divide `totalTime` by `count`:\\n\\n[source,sql]\\n----\\nSELECT sum(totalTime)/sum(count) as 'Average Latency', max(max) as 'Max' FROM timer since 30 minutes ago TIMESERIES auto\\n----\\n\\n.Timer latency.\\nimage::\" + require(\"!file-loader!./img/new-relic-timer-latency.png\") + \"[New Relic-rendered timer]\\n\\nTo generate a throughput chart:\\n\\n[source,sql]\\n----\\nSELECT average(count) as 'Average Throughput' FROM timer since 30 minutes ago TIMESERIES auto\\n----\\n\\n.Timer throughput.\\nimage::\" + require(\"!file-loader!./img/new-relic-timer-throughput.png\") + \"[New Relic-rendered timer throughput]\\n\\nTo generate a plot of client-side percentiles:\\n\\n[source,sql]\\n----\\nSELECT latest(value) from timerPercentile FACET phi since 30 minutes ago TIMESERIES auto\\n----\\n\\n.Timer Percentiles.\\nimage::\" + require(\"!file-loader!./img/new-relic-timer-percentiles.png\") + \"[New Relic-rendered percentiles]\\n\\nNote how these percentiles are _not aggregable_. We have selected the `latest(value)` function to display this chart (it isn't correct to `average(value)` on a percentile value). The more dimensions you add to a timer, the less useful these values become.\\n\\nFinally, if you define SLO boundaries with the fluent builder for `Timer`, you can view throughput below certain SLO boundaries. In this example, we set SLO boundaries at 275 (yellow), 300 (red), and 500 (blue) milliseconds for a simulated `Timer` that is recording samples normally distributed around 250 ms. These counts represent the rate/second of samples less than or equal to each SLO boundary.\\n\\n[source,sql]\\n----\\nSELECT sum(value) from timerHistogram FACET le since 30 minutes ago TIMESERIES auto\\n----\\n\\n.Timer SLO boundaries.\\nimage::\" + require(\"!file-loader!./img/new-relic-timer-sla.png\") + \"[New Relic-rendered SLO boundaries]\\n\\nWhere the lines converge at various points, it is evident that no sample exceeded the 275 ms SLO boundary.\\n\"","export default __webpack_public_path__ + \"4d25b7833c033d6e2380ec4ecc988d66.png\";","export default __webpack_public_path__ + \"02f1215f99df0a7a03ac1d5986ace874.png\";","export default __webpack_public_path__ + \"03797aa9d08a216ed90efab2b59e0114.png\";","export default __webpack_public_path__ + \"e1fdf4994baf8640b183e76694d53390.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer OTLP\\n:toc:\\n:sectnums:\\n:system: otlp\\n\\nOpenTelemetry is a CNCF incubating project for providing standards for telemetry data. OpenTelemetry protocol (OTLP) is a vendor neutral protocol that can be used to send data to various backends which support it. You can read the corresponding docs on how the metrics are ingested and can be visualized in the respective vendor docs.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\nThe following example configures an OTLP registry:\\n\\n[source,java]\\n----\\nOtlpConfig otlpConfig = new OtlpConfig() {\\n @Override\\n public String get(final String key) {\\n return null;\\n }\\n};\\n\\nMeterRegistry registry = new OtlpMeterRegistry(otlpConfig, Clock.SYSTEM);\\n----\\n\\n`OtlpConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source (e.g.: a simple `Map` can work), you can override the default configuration through properties. For example, Micrometer's Spring Boot support binds properties prefixed with `management.otlp.metrics.export` directly to the `OtlpConfig`:\\n\\n[source, yaml]\\n----\\nmanagement:\\n otlp:\\n metrics:\\n export:\\n # Supported configs\\n url: \\\"https://otlp.example.com:4318/v1/metrics\\\"\\n aggregationTemporality: \\\"cumulative\\\"\\n headers:\\n header1: value1\\n resourceAttributes:\\n key1: value1\\n----\\n\\n1. `url` - The URL to which data will be reported. Defaults to `http://localhost:4318/v1/metrics`\\n2. `aggregationTemporality` - https://opentelemetry.io/docs/specs/otel/metrics/data-model/#temporality[Aggregation temporality, window=_blank] determines how the additive quantities are expressed, in relation to time. The supported values are `cumulative` or `delta`. Defaults to `cumulative`. +\\n*Note*: This config was introduced in version 1.11.0.\\n3. `headers` - Additional headers to send with exported metrics. This can be used for authorization headers. By default, headers will be loaded from the config. If that is not set, they can be taken from the environment variables `OTEL_EXPORTER_OTLP_HEADERS` and `OTEL_EXPORTER_OTLP_METRICS_HEADERS`. If a header is set in both the environmental variables, the header in the latter will override the former.\\n4. `resourceAttributes` - https://opentelemetry.io/docs/specs/otel/resource/semantic_conventions/#service[Resource attributes, window=_blank] that will be used for all metrics published. By default, Micrometer adds the following resource attributes:\\n\\n[%autowidth]\\n|===\\n|Key | Default value\\n\\n|telemetry.sdk.name\\n|io.micrometer\\n\\n|telemetry.sdk.language\\n|java\\n\\n|telemetry.sdk.version\\n|<micrometer-core-version> (e.g.: 1.11.0)\\n\\n|service.name\\n|unknown_service\\n|===\\n\\nIf this config is empty, then resource attributes will be loaded from the environmental variable `OTEL_RESOURCE_ATTRIBUTES`. `service.name` can be overridden by the environmental variable `OTEL_SERVICE_NAME` and this takes precedence over other configs.\\n\\n== Supported metrics\\nhttps://opentelemetry.io/docs/specs/otel/metrics/data-model/#metric-points[Metric points, window=_blank] define the different data points that are supported in OTLP. Micrometer supports exporting the below data points in OTLP format,\\n\\n1. https://opentelemetry.io/docs/specs/otel/metrics/data-model/#sums[Sums, window=_blank]\\n2. https://opentelemetry.io/docs/specs/otel/metrics/data-model/#gauge[Gauge, window=_blank]\\n3. https://opentelemetry.io/docs/specs/otel/metrics/data-model/#histogram[Histogram, window=_blank]\\n4. https://opentelemetry.io/docs/specs/otel/metrics/data-model/#summary-legacy[Summary, window=_blank]\\n\\nThe below table maps OTLP data points and the Micrometer meters:\\n\\n[%autowidth]\\n|===\\n|OTLP data point | Micrometer meter type\\n\\n|Sums\\n|Counter, FunctionCounter\\n\\n|Gauge\\n|Gauge, TimeGauge, MultiGauge\\n\\n|Histogram\\n|Timer, DistributionSummary, LongTaskTimer, FunctionTimer (only sum and count are set)\\n\\n|Summary\\n|Timer, DistributionSummary, LongTaskTimer\\n|===\\n\\n*Note*:\\n\\n1. `max` on Histogram data point is only supported in delta aggregation temporality. This is because the values represented by cumulative min and max will stabilize as more events are recorded and are less useful when recorded over application's lifecycle.\\n2. Currently, Micrometer only exports metadata for type `Meter` to OTLP.\\n\\n== Histograms and Percentiles\\nMicrometer `Timer` and `DistributionSummary` support configuring link:/docs/concepts#_histograms_and_percentiles[client-side percentiles and percentile histograms]. OTLP specification terms Summary data point (client-side percentiles) as legacy and not recommended for new applications. Summary data point also cannot have min/max associated with it. Due to these reasons Micrometer prefers exporting Timers and DistributionSummary as Histogram data point. By default, a Timer/DistributionSummary without any additional percentile/histogram config will be exported as Histogram data point. However, by configuring the timer to generate only client-side percentiles using `publishPercentiles` this can be changed to a Summary data point exporting pre-calculated percentiles. When both `publishPercentiles` and (`publishPercentileHistogram` or `serviceLevelObjectives`) are configured, Histogram data point is preferred and pre-calculated percentiles *will not* be generated. See the below table on which data point will be used with different configurations:\\n\\n[%autowidth]\\n|===\\n|Configuration | OTLP data point\\n\\n| publishPercentiles\\n| Summary\\n\\n| publishPercentileHistogram\\n| Histogram\\n\\n| serviceLevelObjectives\\n| Histogram\\n\\n| publishPercentiles and (publishPercentileHistogram/serviceLevelObjectives)\\n| Histogram\\n|===\\n\\nAlternatively, if you are using Spring Boot, you can use the https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.metrics.customizing.per-meter-properties[per-meter properties, window=_blank] to configure this behaviour.\\n\\nIf you want to generate Histogram data point for a Timer with name `test.timer` and default buckets generated by Micrometer, use:\\n\\n[source,properties]\\n----\\nmanagement.metrics.distribution.percentiles-histogram.test.timer=true\\n----\\n\\nand for buckets with customized SLO, use:\\n\\n[source,properties]\\n----\\nmanagement.metrics.distribution.slo.test.timer=10.0,100.0,500.0,1000.0\\n----\\n\\nAlternatively, if you want to generate Summary data point for a timer with name `test.timer` and 90th and 99th percentiles, you can use the below config:\\n\\n[source,properties]\\n----\\nmanagement.metrics.distribution.percentiles.test.timer=0.9,0.99\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Prometheus\\n:toc:\\n:sectnums:\\n:system: prometheus\\n\\nPrometheus is a dimensional time series database with a built-in UI, a custom query language, and math operations.\\nPrometheus is designed to operate on a pull model, periodically scraping metrics from application instances, based on service discovery.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nPrometheus expects to scrape or poll individual application instances for metrics.\\nIn addition to creating a Prometheus registry, you also need to expose an HTTP endpoint to Prometheus' scraper.\\nIn a Spring Boot application, a https://docs.spring.io/spring-boot/docs/current/actuator-api/htmlsingle/#prometheus[Prometheus actuator endpoint] is auto-configured in the presence of Spring Boot Actuator.\\nOtherwise, you can use any JVM-based HTTP server implementation to expose scrape data to Prometheus.\\n\\nThe following example uses the JDK's `com.sun.net.httpserver.HttpServer` to expose a scrape endpoint:\\n\\n[source,java]\\n----\\nPrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);\\n\\ntry {\\n HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);\\n server.createContext(\\\"/prometheus\\\", httpExchange -> {\\n String response = prometheusRegistry.scrape(); <1>\\n httpExchange.sendResponseHeaders(200, response.getBytes().length);\\n try (OutputStream os = httpExchange.getResponseBody()) {\\n os.write(response.getBytes());\\n }\\n });\\n\\n new Thread(server::start).start();\\n} catch (IOException e) {\\n throw new RuntimeException(e);\\n}\\n----\\n<1> The `PrometheusMeterRegistry` has a `scrape()` function that knows how to supply the String data necessary for the scrape. All you have to do is wire it to an endpoint.\\n\\nYou can alternatively use `io.prometheus.client.exporter.HTTPServer` that you can find in `io.prometheus:simpleclient_httpserver`:\\n[source,java]\\n----\\nPrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);\\n// you can set the daemon flag to false if you want the server to block\\nnew HTTPServer(new InetSocketAddress(8080), prometheusRegistry.getPrometheusRegistry(), true);\\n----\\n\\nAnother alternative can be `io.prometheus.client.exporter.MetricsServlet` that you can find in `io.prometheus:simpleclient_servlet` in case your app is running in a servlet container (e.g.: Tomcat):\\n[source,java]\\n----\\nPrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);\\nHttpServlet metricsServlet = new MetricsServlet(prometheusRegistry.getPrometheusRegistry());\\n----\\n\\n=== Scrape format\\n\\nBy default, the https://prometheus.io/docs/instrumenting/exposition_formats/#text-based-format[Prometheus text format] is returned from the `PrometheusMeterRegistry` `scrape()` method.\\n\\nThe https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md[OpenMetrics] format can also be produced.\\nTo specify the format to be returned, you can pass a content type to the `scrape` method.\\nFor example, to get the OpenMetrics 1.0.0 format scrape, you could use the Prometheus Java client constant for it, as follows:\\n\\n[source,java]\\n----\\nString openMetricsScrape = registry.scrape(TextFormat.CONTENT_TYPE_OPENMETRICS_100);\\n----\\n\\nIn Spring Boot applications, the https://docs.spring.io/spring-boot/docs/current/actuator-api/htmlsingle/#prometheus[Prometheus Actuator endpoint] supports scraping in either format, defaulting to the Prometheus text format in absence of a specific `Accept` header.\\n\\n=== The Prometheus Rename Filter\\n\\nIn some cases, Micrometer provides instrumentation that overlaps with commonly used Prometheus simple client modules but has chosen a different naming scheme for consistency and portability.\\nIf you wish to use the Prometheus \\\"standard\\\" names, add the following filter:\\n\\n[source,java]\\n----\\nprometheusRegistry.config().meterFilter(new PrometheusRenameFilter());\\n----\\n\\n== Graphing\\n\\nThis section serves as a quick start to rendering useful representations in Prometheus for metrics originating in Micrometer.\\nSee the https://prometheus.io/docs/querying/basics[Prometheus docs] for a far more complete reference of what is possible in Prometheus.\\n\\n=== Grafana Dashboard\\n\\nA publicly available Grafana dashboard for Micrometer-sourced JVM and Tomcat metrics is available https://grafana.com/grafana/dashboards/4701-jvm-micrometer/[here].\\n\\nimage::\" + require(\"!file-loader!./img/prometheus-dashboard.png\") + \"[Grafana dashboard for JVM and Tomcat binders]\\n\\nThe dashboard features:\\n\\n* JVM memory\\n* Process memory (provided by https://github.com/mweirauch/micrometer-jvm-extras[micrometer-jvm-extras])\\n* CPU-Usage, Load, Threads, File Descriptors, and Log Events\\n* JVM Memory Pools (Heap, Non-Heap)\\n* Garbage Collection\\n* Classloading\\n* Direct/Mapped buffer sizes\\n\\nInstead of using the `job` tag to distinguish different applications, this dashboard makes use of a common tag called `application`, which is applied to every metric.\\nYou can apply the common tag as follows:\\n\\n[source,java]\\n----\\nregistry.config().commonTags(\\\"application\\\", \\\"MYAPPNAME\\\");\\n----\\n\\nIn Spring Boot applications, you can use the https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.metrics.customizing.common-tags[property support for common tags]:\\n\\n[source,properties]\\n----\\nmanagement.metrics.tags.application=MYAPPNAME\\n----\\n\\n=== Counters\\n\\nThe query that generates a graph for the random-walk counter is\\n`rate(counter[10s])`.\\n\\n.A Grafana rendered graph of the random walk counter.\\nimage::\" + require(\"!file-loader!./img/prometheus-counter.png\") + \"[Grafana-rendered Prometheus counter]\\n\\nRepresenting a counter without rate normalization over some time window is rarely useful, as the representation is a function of both the rapidity with which the counter is incremented and the longevity of the service. It is generally most useful to rate-normalize these time series to reason about them. Since Prometheus keeps track of discrete events across all time, it has the advantage of allowing for the selection of an arbitrary time window across which to normalize at query time (for example, `rate(counter[10s])` provides a notion of requests per second over 10 second windows). The rate-normalized graph in the preceding image would return back to a value around 55 as soon as the new instance (say on a production deployment) was in service.\\n\\n.Counter over the same random walk, no rate normalization.\\nimage::\" + require(\"!file-loader!./img/prometheus-counter-norate.png\") + \"[Grafana-rendered Prometheus counter (no rate)]\\n\\nIn contrast, without rate normalization, the counter drops back to zero on service restart, and the count increases without bound for the duration of the service's uptime.\\n\\n=== Timers\\n\\nThe Prometheus `Timer` produces two counter time series with different names:\\n\\n* `${name}_count`: Total number of all calls.\\n* `${name}_sum`: Total time of all calls.\\n\\nRepresenting a counter without rate normalization over some time window is rarely useful, as the representation is a function of both the rapidity with which the counter is incremented and the longevity of the service.\\n\\nUsing the following Prometheus queries, we can graph the most commonly used statistics about timers:\\n\\n* Average latency: `rate(timer_sum[10s])/rate(timer_count[10s])`\\n* Throughput (requests per second): `rate(timer_count[10s])`\\n\\n.Timer over a simulated service.\\nimage::\" + require(\"!file-loader!./img/prometheus-timer.png\") + \"[Grafana-rendered Prometheus timer]\\n\\n=== Long task timers\\n\\nThe Prometheus query to plot the duration of a long task timer for a serial task is `long_task_timer_sum`. In Grafana, we can set an alert threshold at some fixed point.\\n\\n.Simulated back-to-back long tasks with a fixed alert threshold.\\nimage::\" + require(\"!file-loader!./img/prometheus-long-task-timer.png\") + \"[Grafana-rendered Prometheus long task timer]\\n\"","export default __webpack_public_path__ + \"39fa40459993be394ab40488bf8c6a8f.png\";","export default __webpack_public_path__ + \"594dce115710525d7771ebe3ab82db19.png\";","export default __webpack_public_path__ + \"439c0eea1918ef143002cf62a9393e2a.png\";","export default __webpack_public_path__ + \"fc8d290e3f5356fad7d93f76c6abe188.png\";","export default __webpack_public_path__ + \"fb6c59cc88b85301c5bbb890afc71593.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer SignalFx\\n:toc:\\n:sectnums:\\n:system: signalfx\\n\\nSignalFx is a dimensional monitoring system SaaS with a full UI that operates on a push model. It has a rich set of alert \\\"`detectors`\\\".\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThe following example configures SignalFx:\\n\\n[source,java]\\n----\\nSignalFxConfig signalFxConfig = new SignalFxConfig() {\\n @Override\\n public String accessToken() {\\n return \\\"MYTOKEN\\\";\\n }\\n\\n @Override\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\n\\nMeterRegistry registry = new SignalFxMeterRegistry(signalFxConfig, Clock.SYSTEM);\\n----\\n\\nThere are two distinct sources of API keys in SignalFx.\\n\\n`SignalFxConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.signalfx` directly to the `SignalFxConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.signalfx:\\n access-token: MYTOKEN\\n\\n # The interval at which metrics are sent to Ganglia. See Duration.parse for the expected format.\\n # The default is 1 minute.\\n step: 1m\\n----\\n\\n== Graphing\\n\\nThis section serves as a quick start to rendering useful representations in SignalFx for metrics originating in Micrometer. See the https://docs.signalfx.com/en/latest/charts/index.html[SignalFx docs] for a far more complete reference of what is possible in SignalFx.\\n\\n=== Timers\\n\\nAt each publishing interval, the SignalFx `Timer` produces several time series in SignalFx:\\n\\n* `${name}.avg`: A mean latency for the publishing interval.\\n* `${name}.count`: Throughput per second over the publishing interval.\\n* `${name}.totalTime`: Total time per second over the publishing interval (used with `count`) to create aggregable means.\\n* `${name}.percentiles`: Micrometer calculated percentiles for the publishing interval. One time series is produced for each percentile, with a tag of `phi` in the range of [0,1].\\n* `${name}.histogram`: One event is produced for each SLO boundary with a tag of 'le', indicating that it represents a cumulative count of events less than or equal to SLO boundaries over the publishing interval.\\n\\nTo generate an aggregable view of latency in SignalFx, divide `totalTime` by `count`:\\n\\nimage::\" + require(\"!file-loader!./img/signalfx-timer-latency-query.png\") + \"[SignalFx-aggregable latency query]\\n\\nThis is accomplished by adding signals for `${name}.totalTime` and `${name}.count`, adding a formula that divides them, and hiding the inputs to the formula.\\n\\n.Timer latency.\\nimage::\" + require(\"!file-loader!./img/signalfx-timer-latency.png\") + \"[SignalFx-rendered timer]\\n\\nTo generate a throughput chart, use the `${name}.count` signal:\\n\\n.Timer throughput.\\nimage::\" + require(\"!file-loader!./img/signalfx-timer-throughput.png\") + \"[SignalFx-rendered timer throughput]\\n\\nTo generate a plot of client-side percentiles, use the `${name}.percentiles` signal:\\n\\n.Timer Percentiles.\\nimage::\" + require(\"!file-loader!./img/signalfx-timer-percentiles.png\") + \"[SignalFx-rendered percentiles]\\n\\nNote that these percentiles are _not aggregable_. The more dimensions you add to a timer, the less useful these values become.\\n\\nFinally, if you define SLO boundaries with the fluent builder for `Timer`, you can view throughput below certain SLO boundaries by using the `${name}.histogram` signal. In this example, we set SLO boundaries at 275 (green), 300 (blue), and 500 (purple) milliseconds for a simulated `Timer` that is recording samples normally distributed around 250 ms. These counts represent the rate/second of samples less than or equal to each SLO boundary.\\n\\n.Timer SLO boundaries.\\nimage::\" + require(\"!file-loader!./img/signalfx-timer-sla.png\") + \"[SignalFx-rendered SLO boundaries]\\n\\nWhere the lines converge at various points it is evident that no sample exceeded the 275 ms SLO boundary.\\n\"","export default __webpack_public_path__ + \"d77cd7a4fea8c37d7dc37e7bbe069b5e.png\";","export default __webpack_public_path__ + \"beec842accba1a667e0e288745191070.png\";","export default __webpack_public_path__ + \"02141ef2139e0de5d180b5b76dff1982.png\";","export default __webpack_public_path__ + \"a165f31f4506fa9b07f0f2319dd58aa0.png\";","export default __webpack_public_path__ + \"b19ccbd241a3bfd9377d4066961b1620.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Stackdriver Monitoring\\nRay Tsang <saturnism@gmail.com>\\n:toc:\\n:sectnums:\\n:system: stackdriver\\n\\nStackdriver Monitoring is a dimensional time-series SaaS with built-in dashboarding.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThe following example configures Stackdriver:\\n\\n[source,java]\\n----\\nStackdriverConfig stackdriverConfig = new StackdriverConfig() {\\n @Override\\n public String projectId() {\\n return MY_PROJECT_ID;\\n }\\n\\n @Override\\n public String get(String key) {\\n return null;\\n }\\n}\\n\\nMeterRegistry registry = StackdriverMeterRegistry.builder(stackdriverConfig).build();\\n----\\n\\n`StackdriverConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.stackdriver` directly to the `StackdriverConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.stackdriver:\\n project-id: MY_PROJECT_ID\\n resource-type: global\\n\\n # You will probably want to disable Stackdriver Monitoring publishing in a local development profile.\\n enabled: true\\n\\n # The interval at which metrics are sent to Stackdriver Monitoring. The default is 1 minute.\\n step: 1m\\n----\\n\\nFor most environments, you need to create and configure credentials to push metrics to Stackdriver Monitoring.\\nIn most cases, you should create a service account with Stackdriver Monitoring permissions and configure a\\n`GOOGLE_APPLICATION_CREDENTIALS` environmental variable to the path of the service account key file.\\nThe following example shows how to do so:\\n\\n[source]\\n----\\nexport PROJECT_ID=MY_PROJECT_ID\\nexport APP_NAME=MY_APP\\n\\n# Create a service account\\ngcloud iam service-accounts create $APP_NAME\\n\\n# Grant the service account Stackdriver Monitoring writer permission\\ngcloud projects add-iam-policy-binding $PROJECT_ID \\\\\\n --member serviceAccount:$APP_NAME@$PROJECT_ID.iam.gserviceaccount.com \\\\\\n --role roles/monitoring.metricWriter\\n\\n# Create a key JSON file\\ngcloud iam service-accounts keys create $HOME/$APP_NAME-key.json \\\\\\n --iam-account $APP_NAME@$PROJECT_ID.iam.gserviceaccount.com\\n\\n# Configure GOOGLE_APPLICATION_CREDENTIALS env var\\nexport GOOGLE_APPLICATION_CREDENTIALS=$HOME/$APP_NAME-key.json\\n----\\n\\nWhen running in managed environments (such as Google App Engine, Google Cloud Run, Google Cloud Function)\\nyou need not configure this environmental variable. In those environments, a service account is\\nautomatically associated with the application instance. The underlying Stackdriver Monitoring client\\nlibrary can automatically detect and use those credentials.\\n\\n== Stackdriver Labels\\n\\nMicrometer metrics tags are mapped to https://cloud.google.com/monitoring/api/v3/metrics-details#intro-time-series[Stackdriver metrics labels]. With tags and labels, you can further filter or group\\nby the tag or label. See link:/docs/concepts#_tag_naming[Micrometer Concepts] for more information on tags.\\nThe following example filters by tags:\\n\\n[source,java]\\n----\\nMeterRegistry registry = StackdriverMeterRegistry.builder(stackdriverConfig).build();\\nregistry.config().commonTags(\\\"application\\\", \\\"my-application\\\");\\n----\\n\\nYou can also configure resource labels with the `StackdriverConfig` method `resourceLabels`. Depending on the configured `resourceType`, there will be required resource labels. See the documentation on https://cloud.google.com/monitoring/custom-metrics/creating-metrics#which-resource[choosing a monitored resource type].\\n\\nIMPORTANT: When using Micrometer across multiple applications/instances, it is necessary that Stackdriver labels are unique per application/instance. Otherwise, you will see errors like `One or more TimeSeries could not be written: One or more points were written more frequently than the maximum sampling period configured`. If using a resource type other than `global`, the resource labels may already make metrics unique per application instance. If not, a common tag with the hostname or platform-provided instance ID may be a good candidate for achieving this.\\n\\n== Spring Boot\\n\\nSpring Boot provides auto-configuration for Micrometer's StackdriverMeterRegistry. For more information, see the https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready-metrics-export-stackdriver[Spring Boot documentation].\\n\\nYou can manually configure or register the `StackdriverMeterRegistry`.\\nIn addition to using Spring Boot Actuator, make sure you create the `StackdriverMeterRegistry` bean:\\n\\n[source,java]\\n----\\n@Bean\\nStackdriverConfig stackdriverConfig() {\\n return new StackdriverConfig() {\\n @Override\\n public String projectId() {\\n return MY_PROJECT_ID;\\n }\\n\\n @Override\\n public String get(String key) {\\n return null;\\n }\\n }\\n}\\n\\n@Bean\\nStackdriverMeterRegistry meterRegistry(StackdriverConfig stackdriverConfig) {\\n return StackdriverMeterRegistry.builder(stackdriverConfig).build();\\n}\\n----\\n\\nYou can also use https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-metrics-common-tags[Spring Boot Actuator Common Tags configuration] to configure common tags:\\n\\n[source]\\n----\\nspring.application.name=my-application\\nmanagement.metrics.tags.application=${spring.application.name}\\n----\\n\\n== GraalVM native image compilation\\n\\nTo compile an application using `micrometer-registry-stackdriver` to a https://www.graalvm.org/reference-manual/native-image/[native image using GraalVM], add the https://github.com/GoogleCloudPlatform/native-image-support-java[native-image-support-java] library as a dependency. This will ensure the correct native image configuration is available and avoid errors like `Classes that should be initialized at run time got initialized during image building`.\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer StatsD\\n:toc:\\n:sectnums:\\n:system: statsd\\n\\nStatsD is a UDP-based sidecar-driven metrics collection system. The maintainer of the original StatsD line protocol specification is Etsy. Datadog's DogStatsD and Influx's Telegraf each accept a modified version of the line protocol, having each enriched the original specification with dimensionality in different ways.\\n\\nIf you intend to use the Datadog or Telegraf flavors, see the documentation for Micrometer's link:/docs/registry/datadog[Datadog] or link:/docs/registry/influx[Influx] support.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThis configuration is used to ship metrics to a StatsD agent that is compatible with the original Etsy protocol. Metrics are shipped immediately over UDP to the agent.\\n\\n[source,java]\\n----\\nStatsdConfig config = new StatsdConfig() {\\n @Override\\n public String get(String k) {\\n return null;\\n }\\n\\n\\n @Override\\n public StatsdFlavor flavor() {\\n return StatsdFlavor.Etsy;\\n }\\n};\\n\\nMeterRegistry registry = new StatsdMeterRegistry(config, Clock.SYSTEM);\\n----\\n\\nNOTE: You can also configure Telegraf to accept the dogstatsd format. If you use Telegraf, configuring Micrometer to ship Telegraf-formatted StatsD lines eases the requirements of your Telegraf configuration.\\n\\n`StatsdConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.statsd` directly to the `StatsdConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.statsd:\\n flavor: etsy\\n\\n # You will probably want to conditionally disable StatsD publishing in local development.\\n enabled: true\\n\\n # The interval at which metrics are sent to StatsD. The default is 1 minute.\\n step: 1m\\n----\\n\\n== Customizing the Metrics Sink\\n\\nBy default, Micrometer publishes StatsD line protocol over UDP, as the vast majority of existing StatsD agents are UDP servers. It is possible to fully customize how the line protocol is shipped by modifying the builder for `StatsdMeterRegistry`:\\n\\n[source,java]\\n----\\nConsumer<String> lineLogger = line -> logger.info(line); <1>\\n\\nMeterRegistry registry = StatsdMeterRegistry.builder(StatsdConfig.DEFAULT) <2>\\n .clock(clock)\\n .lineSink(lineLogger)\\n .build();\\n----\\n<1> Define what to do with lines.\\n<2> The flavor configuration option determines the structure of the line for the default line builder. It has no effect if you override the line builder with a customization.\\n\\n=== Using Apache Kafka for Line Sink\\n\\nYou can also use Apache Kafka for line sink, as follows:\\n\\n[source,java]\\n----\\nProperties properties = new Properties();\\nproperties.setProperty(BOOTSTRAP_SERVERS_CONFIG, \\\"localhost:9092\\\");\\nproperties.setProperty(KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());\\nproperties.setProperty(VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());\\n\\nProducer<String, String> producer = new KafkaProducer<>(properties);\\n\\nStatsdMeterRegistry.builder(statsdConfig)\\n .lineSink((line) -> producer.send(new ProducerRecord<>(\\\"my-metrics\\\", line)))\\n .build();\\n----\\n\\nNow Micrometer produces lines for metrics to the `my-metrics` topic and you can consume the lines on the topic.\\n\\n== Customizing the Line Format\\n\\nThe built-in Etsy, dogstatsd, and Telegraf flavors cover most known public StatsD agents, but you can completely customize the line format to satisfy closed, proprietary agents. Again, we use the `StatsdMeterRegistry` builder to establish a line builder for each ID. Providing an instance of the builder _per ID_ offers you the opportunity to eagerly cache the serialization of the ID's name and tags to optimize the serialization of a StatsD line based on that ID as samples are recorded. The following listing defines a fictional format:\\n\\n[source,java]\\n----\\nFunction<Meter.Id, StatsdLineBuilder> nameAndUnits = id -> new StatsdLineBuilder() {\\n String name = id.getName() + \\\"/\\\" + (id.getBaseUnit() == null ? \\\"unknown\\\" : id.getBaseUnit());\\n\\n @Override\\n public String count(long amount, Statistic stat) {\\n return name + \\\":\\\" + amount + \\\"|c\\\";\\n }\\n\\n ... // implement gauge, histogram, and timing similarly\\n}\\n\\nMeterRegistry registry = StatsdMeterRegistry.builder(StatsdConfig.DEFAULT) <1>\\n .clock(clock)\\n .lineBuilder(nameAndUnits)\\n .build();\\n----\\n<1> Because you have taken control of line building, the flavor is ignored.\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Wavefront\\n:toc:\\n:sectnums:\\n:system: wavefront\\n\\nWavefront is a dimensional monitoring system offered as a SaaS with a full UI, custom query language, and advanced math operations. Wavefront operates on a push model. Metrics may either be pushed through a sidecar process running on the same host (called the Wavefront proxy) or directly to the Wavefront API.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThis section describes how to configure Wavefront when you send data:\\n\\n* <<configuring-directly-to-wavefront>>\\n* <<configuring-through-a-wavefront-proxy-sidecar>>\\n\\n[[configuring-directly-to-wavefront]]\\n=== Directly to Wavefront\\n\\nThe following example configures sending directly to Wavefront:\\n\\n[source,java]\\n----\\nWavefrontConfig config = new WavefrontConfig() {\\n @Override\\n public String uri() {\\n return \\\"https://longboard.wavefront.com\\\"; <1>\\n }\\n\\n @Override\\n public String apiToken() {\\n return \\\"MYAPIKEY\\\"; <2>\\n }\\n\\n @Override\\n public String get(String key) {\\n return null; <3>\\n }\\n};\\nMeterRegistry registry = new WavefrontMeterRegistry(config, Clock.SYSTEM);\\n----\\n<1> `longboard` is the name of the co-tenant instance on which most organizations start. Once you reach a sufficient scale, Wavefront may move you\\nto a dedicated host.\\n<2> This is required when pushing directly to Wavefront's API.\\n<3> Accept the rest of the defaults.\\n\\n[[configuring-through-a-wavefront-proxy-sidecar]]\\n=== Through a Wavefront Proxy Sidecar\\n\\nThe following example configures sending through a Wavefront proxy sidecar:\\n\\n[source,java]\\n----\\nMeterRegistry registry = new WavefrontMeterRegistry(WavefrontConfig.DEFAULT_PROXY, Clock.SYSTEM);\\n----\\n\\nThe default proxy configuration pushs metrics and histogram distributions to a Wavefront proxy sitting on `localhost:2878`.\\n\\nNOTE: If publishing metrics to a Wavefront proxy, the URI must be expressed in the form of `proxy://HOST:PORT`.\\n\\n== Graphing\\n\\nThis section serves as a quick start to rendering useful representations in Wavefront for metrics originating in Micrometer. See the https://docs.wavefront.com/query_language_getting_started.html[Wavefront docs] for a far more complete reference of what is possible in Wavefront.\\n\\n=== Counters\\n\\nThe query that generates a graph for a random-walk counter is `rate(ts(counter))`.\\n\\n.A Wavefront rendered graph of the random walk counter.\\nimage::\" + require(\"!file-loader!./img/wavefront-counter-rate.png\") + \"[Wavefront-rendered counter]\\n\\nRepresenting a counter without rate normalization over some time window is rarely useful, as the\\nrepresentation is a function of both the rapidity with which the counter is incremented and the\\nlongevity of the service. It is generally most useful to rate-normalize these time series to\\nreason about them.\\n\\nBecause Wavefront keeps track of cumulative counts across all time, it has the\\nadvantage of allowing for the selection of a particular time function at query time (for example,\\n`rate(ts(counter))` to compute the per-second rate of change).\\n\\n=== Timers\\n\\nThe Wavefront `Timer` produces different time series depending on whether or not\\n`publishPercentileHistogram` is enabled.\\n\\nIf `publishPercentileHistogram` is enabled, the Wavefront `Timer` produces histogram distributions\\nthat let you query for the latency at any percentile using `hs()` queries. For example, you can\\nvisualize latency at the 95th percentile (`percentile(95, hs(timer.m))`) or the 99.9th percentile\\n(`percentile(99.9, hs(timer.m))`). For more information on histogram distributions, see\\n<<wavefront-histograms>>, later in this section.\\n\\nIf `publishPercentileHistogram` is disabled, the Wavefront `Timer` produces several\\ntime series:\\n\\n* `${name}.avg`: Mean latency across all calls.\\n* `${name}.count`: Total number of all calls.\\n* `${name}.sum`: Total time of all calls.\\n* `${name}.max`: Max latency over the publishing interval.\\n* `${name}.percentiles`: Micrometer-calculated percentiles for the publishing interval. These\\ncannot be aggregated across dimensions.\\n\\nYou can use these time series to generate a quick view of latency in Wavefront:\\n\\n.Timer latency.\\nimage::\" + require(\"!file-loader!./img/wavefront-timer-latency.png\") + \"[Wavefront-rendered timer]\\n\\nThe preceding chart shows the average latency (`rate(ts(timer.sum))/rate(ts(timer.count))` in\\ngreen), 95th percentile (`ts(timer.percentile, phi=\\\"0.95\\\")` in orange), and max (`ts(timer.max)`\\nin blue).\\n\\nAdditionally, `rate(ts(timer.count))` represents a rate/second throughput of events being timed:\\n\\n.Timer throughput.\\nimage::\" + require(\"!file-loader!./img/wavefront-timer-throughput.png\") + \"[Wavefront-rendered timer throughput]\\n\\n[[wavefront-histograms]]\\n=== Wavefront Histograms\\n\\nWavefront's histogram implementation stores an actual distribution of metrics, as opposed to single metrics. This lets you apply any percentile and aggregation function on the distribution at query time without having to specify specific percentiles and metrics to keep during metric collection.\\n\\nWavefront histogram distributions are collected and reported for any `Timer` or `DistributionSummary` that has `publishPercentileHistogram` enabled.\\n\\nBy default, distributions that are reported to Wavefront get aggregated by the minute, providing you with a histogram distribution for each minute. You also have the option of aggregating by hour or day. You can customize this with the following configuration options:\\n\\n* `reportMinuteDistribution`: Boolean specifying whether to aggregate by minute. Enabled by default. Metric name in Wavefront has `.m` suffix.\\n* `reportHourDistribution`: Boolean specifying whether to aggregate by hour. Disabled by default. Metric name in Wavefront has `.h` suffix.\\n* `reportDayDistribution`: Boolean specifying whether to aggregate by day. Disabled by default. Metric name in Wavefront has `.d` suffix.\\n\\nIf you are sending to a Wavefront proxy, by default, both metrics and histogram distributions are published to the same port: 2878 in the default proxy configuration. If your proxy is configured to listen for histogram distributions on a different port, you can specify the port to which to publish by using the `distributionPort` configuration option.\\n\\nYou can query histogram distributions in Wavefront by using `hs()` queries. For example, `percentile(98, hs(${name}.m))` returns the 98th percentile for a particular histogram aggregated over each minute. Each histogram metric name has a suffix (`.m`, `.h`, or `.d`), depending on the histogram's aggregation interval.\\n\\nSee the https://docs.wavefront.com/proxies_histograms.html[Wavefront Histograms documentation] for more information.\\n\"","export default __webpack_public_path__ + \"105c9d351e5cabcc4504a9b863032ca3.png\";","export default __webpack_public_path__ + \"10ee7658d93746e240978c7ca9b3467b.png\";","export default __webpack_public_path__ + \"9cc263d6b012a89bad0374b418540a31.png\";","export default __webpack_public_path__ + \"static/media/logo.e2f91fdb.svg\";","import React from 'react';\nimport {Link} from 'react-router-dom';\nimport logo from '../../img/logo.svg';\nimport 'font-awesome/css/font-awesome.min.css';\nimport './style.css';\nimport { Nav, Navbar } from \"react-bootstrap\";\n\nexport default function MyNavbar() {\n return (\n <Navbar collapseOnSelect expand=\"lg\" bg=\"dark\" variant=\"dark\" style={{ borderTop: '8px solid #1ba89c' }} >\n <Navbar.Brand href=\"/\">\n <img src={logo} className=\"img-fluid\" style={{ maxHeight: 80 }} alt=\"Micrometer\" />\n </Navbar.Brand>\n <Navbar.Toggle aria-controls=\"responsive-navbar-nav\" />\n <Navbar.Collapse id=\"responsive-navbar-nav\">\n <Nav className=\"ml-auto mt-2 mt-lg-0\">\n <Nav.Item href=\"/docs\">\n <Nav.Link as={Link} to=\"/docs\"><i className=\"fa fa-lg fa-book\"/> Documentation</Nav.Link>\n </Nav.Item>\n <Nav.Item>\n <Nav.Link href=\"https://github.com/micrometer-metrics/micrometer\"><i className=\"fa fa-lg fa-github-alt\" /> GitHub</Nav.Link>\n </Nav.Item>\n <Nav.Item>\n <Nav.Link href=\"https://twitter.com/micrometerio\"><i className=\"fa fa-lg fa-twitter\" /> Twitter</Nav.Link>\n </Nav.Item>\n <Nav.Item>\n <Nav.Link href=\"https://slack.micrometer.io\"><i className=\"fa fa-lg fa-slack\" /> Slack</Nav.Link>\n </Nav.Item>\n </Nav>\n </Navbar.Collapse>\n </Navbar>\n );\n}\n","import React from 'react';\n\nexport default function Footer() {\n return (\n <div className=\"bg-dark text-center\">\n <div className=\"col-12\" style={{padding: 10, color: 'white'}}>\n <p>Copyright © 2005 - 2023 Broadcom. All Rights Reserved. The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries. See <a href=\"https://www.vmware.com/help/legal.html\">Terms of Use</a> and <a href=\"https://www.vmware.com/help/privacy.html\">Privacy Policy</a>.</p>\n </div>\n </div>\n )\n}\n","import React from 'react';\nimport {NavLink} from 'react-router-dom';\n\nimport './style.css';\n\nexport default function DocRoot() {\n return (\n <div className=\"container-fluid mt-4\" style={{ paddingRight: 30, paddingLeft: 30 }}>\n <h1>Micrometer Documentation</h1>\n\n <p>\n Micrometer provides a simple facade over the instrumentation clients for the most popular observability systems,\n allowing you to instrument your JVM-based application code without vendor lock-in. Think SLF4J, but for\n application observability! Data recorded by Micrometer are intended to be used to observe, alert, and\n react to the current/recent operational state of your environment.\n </p>\n\n <p>\n Join the discussion with any comments and feature requests on Micrometer's\n public <a href=\"https://slack.micrometer.io\"><i className=\"fa fa-lg fa-slack\" /> Slack Workspace</a>.\n </p>\n\n <ol>\n <li><NavLink className=\"doc-section\" to=\"/docs/installing\">Installing</NavLink>. Where to get the latest release\n and snapshot builds.\n </li>\n <li><NavLink className=\"doc-section\" to=\"/docs/concepts\">Concepts</NavLink>. An introduction to\n the abstraction provided by Micrometer.\n </li>\n <li><span className=\"doc-section\">Setup</span>. Instructions for how to configure Micrometer for use with\n different monitoring systems. As a facade over multiple monitoring systems, the point of Micrometer is to\n allow you to instrument your code in the same way and be able to visualize the results in your monitoring\n system of choice.\n <ul>\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/appOptics\">AppOptics</NavLink>. AppOptics\n is a dimensional time-series SAAS with built-in dashboarding. Micrometer supports shipping\n metrics to AppOptics directly via its API.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/atlas\">Atlas</NavLink>. An\n in-memory dimensional time series database with built-in graphing, a custom stack-based query language,\n and advanced math operations. Atlas originated at Netflix, where it remains the operational metrics\n solution.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/cloudwatch\">CloudWatch</NavLink>. CloudWatch \n is a dimensional time-series SaaS on Amazon's cloud.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/datadog\">Datadog</NavLink>. Datadog\n is a dimensional time-series SAAS with built-in dashboarding and alerting. Micrometer supports shipping\n metrics to Datadog directly via its API or through Dogstatsd via the StatsD registry.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/dynatrace\">Dynatrace</NavLink>. Dynatrace\n is a Software Intelligence Platform featuring application performance monitoring (APM), artificial\n intelligence for operations (AIOps), IT infrastructure monitoring, digital experience management (DEM),\n and digital business analytics capabilities. Micrometer supports shipping metrics to Dynatrace directly\n via its API.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/elastic\">Elastic</NavLink>. Elasticsearch is an\n open source search and analytics platform. Metrics stored in Elasticsearch can be visualized in Kibana.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/ganglia\">Ganglia</NavLink>. An\n aging hierarchical metrics system which enjoyed wide popularity in Linux system monitoring and is still in\n place in many organizations. It originated in the early 2000s at the University of California, Berkeley.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/graphite\">Graphite</NavLink>. One\n of the most popular current hierarchical metrics systems backed by a fixed-size database, similar in\n design and purpose to RRD. It originated at Orbitz in 2006 and was open sourced in 2008.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/humio\">Humio</NavLink>. Humio\n is a dimensional time-series SAAS with built-in dashboarding. Micrometer supports shipping\n metrics to Humio directly via its API.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/influx\">Influx</NavLink>.\n The InfluxData suite of tools supports real-time stream processing and storage of time-series data. It\n supports downsampling, automatically expiring and deleting unwanted data, as well as backup and restore.\n Analysis of data is done via a SQL-like query language.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/instana\">Instana</NavLink>.\n Instana is an automatic application performance management and infrastructure monitoring system.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/jmx\">JMX</NavLink>. Micrometer\n provides a hierarchical mapping to JMX, primarily as a cheap and portable way to view metrics locally.\n Where JMX exporting is found in production, the same metrics are generally exported to another, more\n purpose-fit monitoring system.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/kairos\">KairosDB</NavLink>. KairosDB is a\n dimensional time-series database built on top of Cassandra. Charting can be accomplished in Grafana.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/new-relic\">New Relic</NavLink>.\n Micrometer publishes to New Relic Insights, a SaaS offering with a full UI and a query language called NRQL.\n New Relic Insights operates on a push model.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/otlp\">OpenTelemetry Protocol (OTLP)</NavLink>.\n OpenTelemetry is a CNCF incubating project for providing standards for telemetry data. Micrometer can publish metrics using the OpenTelemetry protocol (OTLP) to the backends that support it.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/prometheus\">Prometheus</NavLink>.\n An in-memory dimensional time series database with a simple built-in UI, a custom query language, and math\n operations. Prometheus is designed to operate on a pull model, scraping metrics from application instances\n periodically based on service discovery.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/signalFx\">SignalFx</NavLink>.\n SignalFx is a dimensional monitoring system SaaS with a full UI operating on a push model. It has a rich\n set of alert \"detectors\".\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/stackdriver\">Stackdriver</NavLink>.\n Stackdriver Monitoring is a dimensional time-series SAAS with built-in dashboarding and alerting. Micrometer\n supports shipping metrics to Stackdriver directly via its API using a push model. Alternatively, you can\n export Micrometer metrics via Prometheus and use a Prometheus to Stackdriver sidecar.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/statsD\">StatsD</NavLink>.\n Micrometer supports three flavors of StatsD: the original Etsy format plus the Datadog and Telegraf\n (Influx) extensions of StatsD that add dimensional support. Use this registry if you prefer to publish\n metrics to a StatsD agent. Also use this registry with Datadog flavor to publish metrics to Splunk.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/wavefront\">Wavefront</NavLink>.\n Wavefront is a SaaS-based metrics monitoring and analytics platform that lets you visualize, query, and\n alert over data from across your entire stack (infrastructure, network, custom app metrics, business KPIs,\n etc.)\n </li>\n </ul>\n </li>\n <li><span className=\"doc-section\">Reference</span>. Detailed list of out-of-the-box\n instrumentation provided by Micrometer.\n <ul>\n <li><a className=\"doc-section\"\n href=\"https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready-metrics\">Spring\n Boot</a>. Micrometer is the instrumentation library powering the delivery of application metrics from Spring.\n </li>\n <li><NavLink className=\"doc-section\" to=\"/docs/ref/jvm\">JVM</NavLink>. Metrics on classloaders, memory,\n garbage collection, threads, etc.\n </li>\n <li><NavLink className=\"doc-section\" to=\"/docs/ref/cache\">Cache</NavLink>. Instrumentation for the most\n popular caching frameworks.\n </li>\n <li><NavLink className=\"doc-section\" to=\"/docs/ref/okhttpclient\">OkHttpClient</NavLink>. Instrumentation for OkHttpClient.\n </li>\n <li><NavLink className=\"doc-section\" to=\"/docs/ref/jetty\">Jetty and Jersey</NavLink>. Instrumentation for Jetty and Jersey.\n </li>\n <li><NavLink className=\"doc-section\" to=\"/docs/ref/netty\">Netty</NavLink>. Instrumentation for Netty.\n </li>\n </ul>\n </li>\n <li><span className=\"doc-section\">Guides</span>.\n <ul>\n <li><NavLink className=\"doc-section\" to=\"/docs/guide/consoleReporter\">Passing through to Dropwizard's console reporter</NavLink></li>\n </ul>\n <ul>\n <li><NavLink className=\"doc-section\" to=\"/docs/guide/httpSenderResilience4jRetry\">HttpSender with Resilience4j retry</NavLink></li>\n </ul>\n <ul>\n <li><NavLink className=\"doc-section\" to=\"/docs/guide/customMeterRegistry\">Custom meter registry</NavLink></li>\n </ul>\n </li>\n <li><NavLink className=\"doc-section\" to=\"/docs/observation\">Micrometer Observation</NavLink>. An introduction to\n the Micrometer Observation API.\n </li>\n <li><NavLink className=\"doc-section\" to=\"/docs/tracing\">Micrometer Tracing</NavLink>. An introduction to\n the abstraction provided by Micrometer Tracing.\n </li>\n <li><NavLink className=\"doc-section\" to=\"/docs/contextPropagation\">Micrometer Context Propagation</NavLink>. An introduction to\n the abstraction provided by Micrometer Context Propagation.\n </li>\n <li>\n <a className=\"doc-section\" href=\"/support\">Support policy</a>. Micrometer's support policy for releases.\n </li>\n </ol>\n </div>\n );\n}\n","import React, {Component} from 'react';\nimport PropTypes from 'prop-types';\nimport '@asciidoctor/core/dist/css/asciidoctor.css';\n\n// To rebuild this with a small set of languages, clone highlight.js, run:\n// `node tools/build.js java groovy http xml gradle yaml json -t node`\n// Copy much of the build directory to ./highlight.\n// You will have to force off a couple eslint rules in highlight.js as well.\nimport hljs from './highlight';\nimport './highlight.github.css';\n\nlet asciidoctor = require('asciidoctor')();\n\nasciidoctor.Extensions.register(function () {\n this.treeProcessor(function() {\n let self = this;\n self.process(function (doc) {\n doc.findBy({'context': 'image'}).forEach(function(img) {\n // hack to add an additional attribute. otherwise, setAttribute only allows you to replace existing attributes\n let alt = img.getAttribute('alt');\n img.setAttribute('alt', alt + '\" class=\"img-fluid', true);\n });\n return doc;\n });\n });\n});\n\nexport default class Asciidoc extends Component {\n constructor(props) {\n super(props);\n this.highlightCode = this.highlightCode.bind(this);\n }\n\n componentDidMount() {\n this.highlightCode();\n }\n\n componentDidUpdate() {\n this.highlightCode();\n }\n\n highlightCode() {\n this.root.querySelectorAll('pre code').forEach(node => hljs.highlightBlock(node));\n }\n\n render() {\n let converted = asciidoctor.convert(this.props.source, { attributes: this.props.attrs, safe: 'safe'});\n\n return (\n <div\n ref={(root) => { this.root = root; }}\n dangerouslySetInnerHTML={{ __html: converted }} />\n )\n }\n}\n\nAsciidoc.propTypes = {\n source: PropTypes.string,\n attrs: PropTypes.any,\n};","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Asciidoc from '../Asciidoc';\n\nimport './style.css';\n\nexport default function DocSection({ title, content, attrs }) {\n return (\n <div className=\"container-fluid mt-4 ml-3 mr-3\">\n <h1>{title}</h1>\n <hr/>\n <Asciidoc\n source={content}\n attrs={attrs} />\n </div>\n );\n}\n\nDocSection.defaultProps = {\n attrs: {},\n};\n\nDocSection.propTypes = {\n title: PropTypes.string.isRequired,\n content: PropTypes.string.isRequired,\n attrs: PropTypes.object,\n};","import React from 'react';\nimport { Route, Redirect } from 'react-router-dom';\n\nimport DocRoot from '../DocRoot';\nimport DocSection from '../DocSection';\n\n/* eslint import/no-webpack-loader-syntax: off */\nlet docsInstalling = require('!asciidoc-loader!../../generated-docs/installing/index.adoc');\nlet docsConcepts = require('!asciidoc-loader!../../generated-docs/concepts/index.adoc');\nlet docsJvm = require('!asciidoc-loader!../../generated-docs/jvm/index.adoc');\nlet docsCache = require('!asciidoc-loader!../../generated-docs/cache/index.adoc');\nlet docsOkHttpClient = require('!asciidoc-loader!../../generated-docs/okhttpclient/index.adoc');\nlet docsJetty = require('!asciidoc-loader!../../generated-docs/jetty/index.adoc');\nlet docsNetty = require('!asciidoc-loader!../../generated-docs/netty/index.adoc');\nlet docsConsoleReporter = require('!asciidoc-loader!../../generated-docs/guide/console-reporter.adoc');\nlet docsHttpSenderResilience4jRetry = require('!asciidoc-loader!../../generated-docs/guide/http-sender-resilience4j-retry.adoc');\nlet docsCustomMeterRegistry = require('!asciidoc-loader!../../generated-docs/guide/custom-meter-registry.adoc');\nlet docsObservation = require('!asciidoc-loader!../../generated-docs/observation/index.adoc');\nlet docsTracing = require('!asciidoc-loader!../../generated-docs/tracing/index.adoc');\nlet docsContextPropagation = require('!asciidoc-loader!../../generated-docs/contextpropagation/index.adoc');\n\nconst systems = ['appOptics', 'atlas', 'azure-monitor', 'cloudwatch', 'datadog', 'dynatrace', 'elastic', 'ganglia', 'graphite', 'humio', 'influx', 'instana', 'jmx', 'kairos', 'new-relic', 'otlp', 'prometheus', 'signalFx', 'stackdriver', 'statsD', 'wavefront'];\n\nlet docsBySystem = {};\nsystems.forEach(sys => docsBySystem[sys] = require(`!asciidoc-loader!../../generated-docs/implementations/${sys}.adoc`));\n\nexport default function DocRoutes() {\n return (\n <div>\n <Route exact path=\"/docs\" component={DocRoot} />\n\n <Route path=\"/docs/installing\" render={() =>\n <DocSection title=\"Installing\" content={docsInstalling}/>\n }/>\n\n <Route exact path=\"/docs/concepts\" render={() =>\n <DocSection title=\"Concepts\" content={docsConcepts} />} />\n\n <Route path=\"/docs/registry/:system\" render={({ match }) => {\n let system = match.params.system;\n return systems.includes(system) ?\n <DocSection title={`Micrometer ${system.split('-').map(part => part[0].toUpperCase() + part.slice(1)).join(\" \")}`}\n content={docsBySystem[system]} /> :\n <Redirect to=\"/docs\" />;\n }} />\n\n <Route path=\"/docs/ref/jvm\" render={() =>\n <DocSection title=\"JVM and System Metrics\" content={docsJvm}/>\n }/>\n\n <Route path=\"/docs/ref/cache\" render={() =>\n <DocSection title=\"Cache Metrics\" content={docsCache}/>\n }/>\n\n <Route path=\"/docs/ref/okhttpclient\" render={() =>\n <DocSection title=\"OkHttpClient Metrics\" content={docsOkHttpClient}/>\n }/>\n\n <Route path=\"/docs/ref/jetty\" render={() =>\n <DocSection title=\"Jetty and Jersey Metrics\" content={docsJetty}/>\n }/>\n\n <Route path=\"/docs/ref/netty\" render={() =>\n <DocSection title=\"Netty Metrics\" content={docsNetty}/>\n }/>\n\n <Route path=\"/docs/guide/consoleReporter\" render={() =>\n <DocSection title=\"Passing through to Dropwizard's console reporter\" content={docsConsoleReporter}/>\n }/>\n\n <Route path=\"/docs/guide/httpSenderResilience4jRetry\" render={() =>\n <DocSection title=\"HttpSender with Resilience4j retry\" content={docsHttpSenderResilience4jRetry}/>\n }/>\n\n <Route path=\"/docs/guide/customMeterRegistry\" render={() =>\n <DocSection title=\"Custom meter registry\" content={docsCustomMeterRegistry}/>\n }/>\n\n <Route path=\"/docs/observation\" render={() =>\n <DocSection title=\"Observation\" content={docsObservation}/>\n }/>\n\n <Route path=\"/docs/tracing\" render={() =>\n <DocSection title=\"Tracing\" content={docsTracing}/>\n }/>\n\n <Route path=\"/docs/contextPropagation\" render={() =>\n <DocSection title=\"Context Propagation\" content={docsContextPropagation}/>\n }/>\n </div>\n )\n}\n","import {Alert, Button, Navbar} from \"react-bootstrap\";\nimport React from \"react\";\nimport './style.css';\n\nexport default function MigrationAlert() {\n return (\n <Navbar sticky=\"top\" className=\"d-flex align-items-center justify-content-center text-center\">\n <Alert variant=\"warning\">\n <Alert.Heading>New Documentation Site</Alert.Heading>\n <Button variant=\"secondary\" href=\"https://docs.micrometer.io/micrometer/reference/\">Go to the new docs</Button>\n <br />\n This is an archive to keep links alive.\n </Alert>\n </Navbar>\n );\n}\n","import React from 'react';\nimport { Route, Redirect, Switch } from 'react-router-dom';\nimport MyNavbar from '../MyNavbar';\nimport Footer from '../Footer';\nimport DocRoot from '../DocRoot';\nimport DocRoutes from '../DocRoutes';\nimport MigrationAlert from \"../MigrationAlert\";\n\nexport default function App() {\n return (\n <div>\n <MyNavbar />\n\n <MigrationAlert />\n\n <Switch>\n <Route exact path=\"/docs\" component={DocRoot} />\n\n <Route exact path=\"/docs/support\" component={() => {\n window.location.replace('/support');\n return null;\n }\n }/>\n\n <DocRoutes/>\n\n <Route path=\"**\" render={() => <Redirect to=\"/docs\" />} />\n </Switch>\n\n <div className=\"container-fluid\" style={{ paddingRight: 0, paddingLeft: 0 }}>\n <Footer className=\"row\" />\n </div>\n </div>\n );\n}\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://cra.link/PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://cra.link/PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://cra.link/PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log('No internet connection found. App is running in offline mode.');\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n registration.unregister();\n })\n .catch((error) => {\n console.error(error.message);\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { Router } from 'react-router-dom'\nimport App from './components/App/App';\nimport * as serviceWorkerRegistration from './registerServiceWorker';\nimport { createBrowserHistory } from 'history';\n\n// We have to import the CSS here. By placing it in index.html like the Bootstrap getting started guide suggests,\n// Any CSS imported further down the component hierarchy will appear after Bootstrap CSS in the <style> ordering in <head>,\n// effectively overriding Bootstrap styles.\nimport 'bootstrap/dist/css/bootstrap.min.css';\n\nimport './index.css'; // where we wish to override bootstrap defaults\n\nconst history = createBrowserHistory();\n\nReactDOM.render(<Router history={history}><App/></Router>, document.getElementById('root'));\nserviceWorkerRegistration.unregister();\n"],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/main.d5237926.chunk.js b/static/js/main.d5237926.chunk.js deleted file mode 100644 index c7b33f39..00000000 --- a/static/js/main.d5237926.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this["webpackJsonpmicrometer-docs"]=this["webpackJsonpmicrometer-docs"]||[]).push([[0],Array(28).concat([function(e,t,n){var r=n(46);r.registerLanguage("gradle",n(47)),r.registerLanguage("groovy",n(48)),r.registerLanguage("http",n(49)),r.registerLanguage("java",n(50)),r.registerLanguage("xml",n(51)),r.registerLanguage("yaml",n(52)),r.registerLanguage("json",n(53)),e.exports=r},,,,,,,,,function(e,t,n){},,,,,,function(e,t,n){},,,function(e,t,n){!function(e){"object"===typeof window&&window||"object"===typeof self&&self;(function(e){var t=[],n=Object.keys,r={},a={},i=/^(no-?highlight|plain|text)$/i,o=/\blang(?:uage)?-([\w-]+)\b/i,s=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,c="</span>",l={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};function u(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function d(e){return e.nodeName.toLowerCase()}function m(e,t){var n=e&&e.exec(t);return n&&0===n.index}function g(e){return i.test(e)}function h(e){var t,n,r,a,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",n=o.exec(i))return R(n[1])?n[1]:"no-highlight";for(t=0,r=(i=i.split(/\s+/)).length;t<r;t++)if(g(a=i[t])||R(a))return a}function p(e){var t,n={},r=Array.prototype.slice.call(arguments,1);for(t in e)n[t]=e[t];return r.forEach((function(e){for(t in e)n[t]=e[t]})),n}function f(e){var t=[];return function e(n,r){for(var a=n.firstChild;a;a=a.nextSibling)3===a.nodeType?r+=a.nodeValue.length:1===a.nodeType&&(t.push({event:"start",offset:r,node:a}),r=e(a,r),d(a).match(/br|hr|img|input/)||t.push({event:"stop",offset:r,node:a}));return r}(e,0),t}function b(e,n,r){var a=0,i="",o=[];function s(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset<n[0].offset?e:n:"start"===n[0].event?e:n:e.length?e:n}function c(e){function n(e){return" "+e.nodeName+'="'+u(e.value).replace('"',""")+'"'}i+="<"+d(e)+t.map.call(e.attributes,n).join("")+">"}function l(e){i+="</"+d(e)+">"}function m(e){("start"===e.event?c:l)(e.node)}for(;e.length||n.length;){var g=s();if(i+=u(r.substring(a,g[0].offset)),a=g[0].offset,g===e){o.reverse().forEach(l);do{m(g.splice(0,1)[0]),g=s()}while(g===e&&g.length&&g[0].offset===a);o.reverse().forEach(c)}else"start"===g[0].event?o.push(g[0].node):o.pop(),m(g.splice(0,1)[0])}return i+u(r.substr(a))}function y(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(t){return p(e,{variants:null},t)}))),e.cached_variants||e.endsWithParent&&[p(e)]||[e]}function v(e){function t(e){return e&&e.source||e}function r(n,r){return new RegExp(t(n),"m"+(e.case_insensitive?"i":"")+(r?"g":""))}function a(i,o){if(!i.compiled){if(i.compiled=!0,i.keywords=i.keywords||i.beginKeywords,i.keywords){var s={},c=function(t,n){e.case_insensitive&&(n=n.toLowerCase()),n.split(" ").forEach((function(e){var n=e.split("|");s[n[0]]=[t,n[1]?Number(n[1]):1]}))};"string"===typeof i.keywords?c("keyword",i.keywords):n(i.keywords).forEach((function(e){c(e,i.keywords[e])})),i.keywords=s}i.lexemesRe=r(i.lexemes||/\w+/,!0),o&&(i.beginKeywords&&(i.begin="\\b("+i.beginKeywords.split(" ").join("|")+")\\b"),i.begin||(i.begin=/\B|\b/),i.beginRe=r(i.begin),i.end||i.endsWithParent||(i.end=/\B|\b/),i.end&&(i.endRe=r(i.end)),i.terminator_end=t(i.end)||"",i.endsWithParent&&o.terminator_end&&(i.terminator_end+=(i.end?"|":"")+o.terminator_end)),i.illegal&&(i.illegalRe=r(i.illegal)),null==i.relevance&&(i.relevance=1),i.contains||(i.contains=[]),i.contains=Array.prototype.concat.apply([],i.contains.map((function(e){return y("self"===e?i:e)}))),i.contains.forEach((function(e){a(e,i)})),i.starts&&a(i.starts,o);var l=i.contains.map((function(e){return e.beginKeywords?"\\.?("+e.begin+")\\.?":e.begin})).concat([i.terminator_end,i.illegal]).map(t).filter(Boolean);i.terminators=l.length?r(l.join("|"),!0):{exec:function(){return null}}}}a(e)}function w(e,t,n,a){function i(e,t){var n,r;for(n=0,r=t.contains.length;n<r;n++)if(m(t.contains[n].beginRe,e))return t.contains[n]}function o(e,t){if(m(e.endRe,t)){for(;e.endsParent&&e.parent;)e=e.parent;return e}if(e.endsWithParent)return o(e.parent,t)}function s(e,t){return!n&&m(t.illegalRe,e)}function d(e,t){var n=x.case_insensitive?t[0].toLowerCase():t[0];return e.keywords.hasOwnProperty(n)&&e.keywords[n]}function g(e,t,n,r){var a='<span class="'+(r?"":l.classPrefix);return(a+=e+'">')+t+(n?"":c)}function h(){var e,t,n,r;if(!O.keywords)return u(I);for(r="",t=0,O.lexemesRe.lastIndex=0,n=O.lexemesRe.exec(I);n;)r+=u(I.substring(t,n.index)),(e=d(O,n))?(k+=e[1],r+=g(e[0],u(n[0]))):r+=u(n[0]),t=O.lexemesRe.lastIndex,n=O.lexemesRe.exec(I);return r+u(I.substr(t))}function p(){var e="string"===typeof O.subLanguage;if(e&&!r[O.subLanguage])return u(I);var t=e?w(O.subLanguage,I,!0,M[O.subLanguage]):T(I,O.subLanguage.length?O.subLanguage:void 0);return O.relevance>0&&(k+=t.relevance),e&&(M[O.subLanguage]=t.top),g(t.language,t.value,!1,!0)}function f(){C+=null!=O.subLanguage?p():h(),I=""}function b(e){C+=e.className?g(e.className,"",!0):"",O=Object.create(e,{parent:{value:O}})}function y(e,t){if(I+=e,null==t)return f(),0;var n=i(t,O);if(n)return n.skip?I+=t:(n.excludeBegin&&(I+=t),f(),n.returnBegin||n.excludeBegin||(I=t)),b(n,t),n.returnBegin?0:t.length;var r=o(O,t);if(r){var a=O;a.skip?I+=t:(a.returnEnd||a.excludeEnd||(I+=t),f(),a.excludeEnd&&(I=t));do{O.className&&(C+=c),O.skip||O.subLanguage||(k+=O.relevance),O=O.parent}while(O!==r.parent);return r.starts&&b(r.starts,""),a.returnEnd?0:t.length}if(s(t,O))throw new Error('Illegal lexeme "'+t+'" for mode "'+(O.className||"<unnamed>")+'"');return I+=t,t.length||1}var x=R(e);if(!x)throw new Error('Unknown language: "'+e+'"');v(x);var S,O=a||x,M={},C="";for(S=O;S!==x;S=S.parent)S.className&&(C=g(S.className,"",!0)+C);var I="",k=0;try{for(var E,A,j=0;O.terminators.lastIndex=j,E=O.terminators.exec(t);)A=y(t.substring(j,E.index),E[0]),j=E.index+A;for(y(t.substr(j)),S=O;S.parent;S=S.parent)S.className&&(C+=c);return{relevance:k,value:C,language:e,top:O}}catch(D){if(D.message&&-1!==D.message.indexOf("Illegal"))return{relevance:0,value:u(t)};throw D}}function T(e,t){t=t||l.languages||n(r);var a={relevance:0,value:u(e)},i=a;return t.filter(R).forEach((function(t){var n=w(t,e,!1);n.language=t,n.relevance>i.relevance&&(i=n),n.relevance>a.relevance&&(i=a,a=n)})),i.language&&(a.second_best=i),a}function x(e){return l.tabReplace||l.useBR?e.replace(s,(function(e,t){return l.useBR&&"\n"===e?"<br>":l.tabReplace?t.replace(/\t/g,l.tabReplace):""})):e}function S(e,t,n){var r=t?a[t]:n,i=[e.trim()];return e.match(/\bhljs\b/)||i.push("hljs"),-1===e.indexOf(r)&&i.push(r),i.join(" ").trim()}function O(e){var t,n,r,a,i,o=h(e);g(o)||(l.useBR?(t=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n"):t=e,i=t.textContent,r=o?w(o,i,!0):T(i),(n=f(t)).length&&((a=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=r.value,r.value=b(n,f(a),i)),r.value=x(r.value),e.innerHTML=r.value,e.className=S(e.className,o,r.language),e.result={language:r.language,re:r.relevance},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.relevance}))}function M(e){l=p(l,e)}function C(){if(!C.called){C.called=!0;var e=document.querySelectorAll("pre code");t.forEach.call(e,O)}}function I(){addEventListener("DOMContentLoaded",C,!1),addEventListener("load",C,!1)}function k(t,n){var i=r[t]=n(e);i.aliases&&i.aliases.forEach((function(e){a[e]=t}))}function E(){return n(r)}function R(e){return e=(e||"").toLowerCase(),r[e]||r[a[e]]}e.highlight=w,e.highlightAuto=T,e.fixMarkup=x,e.highlightBlock=O,e.configure=M,e.initHighlighting=C,e.initHighlightingOnLoad=I,e.registerLanguage=k,e.listLanguages=E,e.getLanguage=R,e.inherit=p,e.IDENT_RE="[a-zA-Z]\\w*",e.UNDERSCORE_IDENT_RE="[a-zA-Z_]\\w*",e.NUMBER_RE="\\b\\d+(\\.\\d+)?",e.C_NUMBER_RE="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BINARY_NUMBER_RE="\\b(0b[01]+)",e.RE_STARTERS_RE="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BACKSLASH_ESCAPE={begin:"\\\\[\\s\\S]",relevance:0},e.APOS_STRING_MODE={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},e.QUOTE_STRING_MODE={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},e.PHRASAL_WORDS_MODE={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/},e.COMMENT=function(t,n,r){var a=e.inherit({className:"comment",begin:t,end:n,contains:[]},r||{});return a.contains.push(e.PHRASAL_WORDS_MODE),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|XXX):",relevance:0}),a},e.C_LINE_COMMENT_MODE=e.COMMENT("//","$"),e.C_BLOCK_COMMENT_MODE=e.COMMENT("/\\*","\\*/"),e.HASH_COMMENT_MODE=e.COMMENT("#","$"),e.NUMBER_MODE={className:"number",begin:e.NUMBER_RE,relevance:0},e.C_NUMBER_MODE={className:"number",begin:e.C_NUMBER_RE,relevance:0},e.BINARY_NUMBER_MODE={className:"number",begin:e.BINARY_NUMBER_RE,relevance:0},e.CSS_NUMBER_MODE={className:"number",begin:e.NUMBER_RE+"(%|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},e.REGEXP_MODE={className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,{begin:/\[/,end:/\]/,relevance:0,contains:[e.BACKSLASH_ESCAPE]}]},e.TITLE_MODE={className:"title",begin:e.IDENT_RE,relevance:0},e.UNDERSCORE_TITLE_MODE={className:"title",begin:e.UNDERSCORE_IDENT_RE,relevance:0},e.METHOD_GUARD={begin:"\\.\\s*"+e.UNDERSCORE_IDENT_RE,relevance:0}})(t)}()},function(e,t){e.exports=function(e){return{case_insensitive:!0,keywords:{keyword:"task project allprojects subprojects artifacts buildscript configurations dependencies repositories sourceSets description delete from into include exclude source classpath destinationDir includes options sourceCompatibility targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant def abstract break case catch continue default do else extends final finally for if implements instanceof native new private protected public return static switch synchronized throw throws transient try volatile while strictfp package import false null super this true antlrtask checkstyle codenarc copy boolean byte char class double float int interface long short void compile runTime file fileTree abs any append asList asWritable call collect compareTo count div dump each eachByte eachFile eachLine every find findAll flatten getAt getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter newReader newWriter next plus pop power previous print println push putAt read readBytes readLines reverse reverseEach round size sort splitEachLine step subMap times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader withStream withWriter withWriterAppend write writeLine"},contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.NUMBER_MODE,e.REGEXP_MODE]}}},function(e,t){e.exports=function(e){return{keywords:{literal:"true false null",keyword:"byte short char int long boolean float double void def as in assert trait super this abstract static volatile transient public private protected synchronized final class interface enum if else for while switch case break default continue throw throws try catch finally implements extends new import package return instanceof"},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,{className:"string",begin:'"""',end:'"""'},{className:"string",begin:"'''",end:"'''"},{className:"string",begin:"\\$/",end:"/\\$",relevance:10},e.APOS_STRING_MODE,{className:"regexp",begin:/~?\/[^\/\n]+\//,contains:[e.BACKSLASH_ESCAPE]},e.QUOTE_STRING_MODE,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},e.BINARY_NUMBER_MODE,{className:"class",beginKeywords:"class interface trait enum",end:"{",illegal:":",contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"},{className:"string",begin:/[^\?]{0}[A-Za-z0-9_$]+ *:/},{begin:/\?/,end:/\:/},{className:"symbol",begin:"^\\s*[A-Za-z0-9_$]+:",relevance:0}],illegal:/#|<\//}}},function(e,t){e.exports=function(e){var t="HTTP/[0-9\\.]+";return{aliases:["https"],illegal:"\\S",contains:[{begin:"^"+t,end:"$",contains:[{className:"number",begin:"\\b\\d{3}\\b"}]},{begin:"^[A-Z]+ (.*?) "+t+"$",returnBegin:!0,end:"$",contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{begin:t},{className:"keyword",begin:"[A-Z]+"}]},{className:"attribute",begin:"^\\w",end:": ",excludeEnd:!0,illegal:"\\n|\\s|=",starts:{end:"$",relevance:0}},{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}]}}},function(e,t){e.exports=function(e){var t="false synchronized int abstract float private char boolean 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",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};return{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:"([\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*(<[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*(\\s*,\\s*[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-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:[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]},n,{className:"meta",begin:"@[A-Za-z]+"}]}}},function(e,t){e.exports=function(e){var t={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:"attr",begin:"[A-Za-z0-9\\._:-]+",relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/},{begin:/[^\s"'=<>`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],case_insensitive:!0,contains:[{className:"meta",begin:"<!DOCTYPE",end:">",relevance:10,contains:[{begin:"\\[",end:"\\]"}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{begin:/<\?(php)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0}]},{className:"tag",begin:"<style(?=\\s|>|$)",end:">",keywords:{name:"style"},contains:[t],starts:{end:"</style>",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:"<script(?=\\s|>|$)",end:">",keywords:{name:"script"},contains:[t],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["actionscript","javascript","handlebars","xml"]}},{className:"tag",begin:"</?",end:"/?>",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},t]}]}}},function(e,t){e.exports=function(e){var t="true false yes no null",n="^[ \\-]*",r="[a-zA-Z_][\\w\\-]*",a={className:"attr",variants:[{begin:n+r+":"},{begin:'^[ \\-]*"'+r+'":'},{begin:"^[ \\-]*'"+r+"':"}]},i={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]};return{case_insensitive:!0,aliases:["yml","YAML","yaml"],contains:[a,{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>] *$",returnEnd:!0,contains:i.contains,end:a.variants[0].begin},{className:"type",begin:"!!"+e.UNDERSCORE_IDENT_RE},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"^ *-",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:t,keywords:{literal:t}},e.C_NUMBER_MODE,i]}}},function(e,t){e.exports=function(e){var t={literal:"true false null"},n=[e.QUOTE_STRING_MODE,e.C_NUMBER_MODE],r={end:",",endsWithParent:!0,excludeEnd:!0,contains:n,keywords:t},a={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE],illegal:"\\n"},e.inherit(r,{begin:/:/})],illegal:"\\S"},i={begin:"\\[",end:"\\]",contains:[e.inherit(r)],illegal:"\\S"};return n.splice(n.length,0,a,i),{contains:n,keywords:t,illegal:"\\S"}}},function(e,t,n){},,,,,,,,,function(e,t,n){},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\nMicrometer contains a core library with the instrumentation SPI and an in-memory implementation that does not export data anywhere, a series of modules with implementations for various monitoring systems, and a test module.\n\nTo use Micrometer, add the dependency for your monitoring system.\n\nThe following example adds Prometheus in Gradle:\n\n[source,groovy]\n----\nimplementation 'io.micrometer:micrometer-registry-prometheus:latest.release'\n----\n\nThe following example adds Prometheus in Maven:\n\n[source,xml]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-prometheus</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\nThrough Micrometer's composite meter registry (described in greater detail in link:/docs/concepts#_composite_registries[\"Concepts\"]), you may configure more than one registry implementation if you intend to publish metrics to more than one monitoring system.\n\nIf you have not decided on a monitoring system yet and want only to try out the instrumentation SPI, you can add a dependency on `micrometer-core` instead and configure the `SimpleMeterRegistry`.\n\n== Snapshots\n\nEvery successful https://app.circleci.com/pipelines/github/micrometer-metrics/micrometer[build] of Micrometer's `main` and maintenance branches (for example, `1.7.x`) results in the publication of a new snapshot version. You can use the latest snapshot by adding the Maven repository `https://repo.spring.io/snapshot` to your build and using the corresponding snapshot version -- for example, `1.8.0-SNAPSHOT`.\n\n== Milestones\n\nMilestone releases are made available for early testing purposes and are not intended for production use.\nMilestone releases are published to https://repo.spring.io/milestone.\nInclude that as a Maven repository in your build configuration to use milestone releases.\nMilestones are marked as \"`pre-releases`\" on GitHub, and the version has a suffix, such as `-M1` or `-RC1` (milestone 1 or release candidate 1, respectively).\n"},function(e,t,n){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Concepts\n:toc:\n:sectnums:\n:dimensional: true\n\n== Purpose\n\nMicrometer is a metrics instrumentation library for JVM-based applications. It provides a simple facade over the instrumentation clients for the most popular monitoring systems, letting you instrument your JVM-based application code without vendor lock-in. It is designed to add little to no overhead to your metrics collection activity while maximizing the portability of your metrics effort.\n\nStarting from Micrometer 1.10, Micrometer provides the link:../docs/observation[Observation API] and a plugin mechanism that allows you to add capabilities including the tracing features. You can read more about this in the link:../docs/tracing[Micrometer Tracing documentation].\n\nFor better understanding the differences among these different types of systems (Metrics, Distributed Tracing, and Logging) we recommend Adrian Cole\'s talk, titled https://www.dotconferences.com/2017/04/adrian-cole-observability-3-ways-logging-metrics-tracing[Observability\n3 Ways]. To learn more about Micrometer Observation API we recommend Tommy Ludwig\'s and Marcin Grzejszczak\'s talk, titled https://www.youtube.com/watch?v=fh3VbrPvAjg[Observability of Your Application].\n\n== Dependencies\n\nThe `micrometer-core` module aims to have minimal dependencies. It does not require any third-party (non-Micrometer) dependencies on the classpath at compile time for applications using Micrometer.\n\nUse of the link:#_pause_detection[pause detection] feature requires the https://github.com/LatencyUtils/LatencyUtils[LatencyUtils] dependency to be available on the classpath at runtime. If your application does not use the pause detection feature, you can exclude LatencyUtils from your runtime classpath.\n\nhttps://github.com/HdrHistogram/HdrHistogram[HdrHistogram] is needed on the classpath at runtime if you use link:#_histograms_and_percentiles[client-side percentiles]. If you are not using client-side percentiles, you may exclude HdrHistogram from your application\'s runtime classpath.\n\n== Supported Monitoring Systems\n\n:leveloffset: +1\n\nMicrometer contains a core module with an instrumentation https://en.wikipedia.org/wiki/Service_provider_interface[SPI], a set of modules containing implementations for various monitoring systems (each is called a registry), and a test kit. You need to understand three important characteristics of monitoring systems:\n\n* *Dimensionality*. Whether the system supports metric names to be enriched with tag key/value pairs. If a system is not _dimensional_, it is _hierarchical_, which means it supports only a flat metric name. When publishing metrics to hierarchical systems, Micrometer flattens the set of tag key/value pairs and adds them to the name.\n\n[cols=2*,options="header"]\n|===\n|Dimensional\n|Hierarchical\n\n|AppOptics, Atlas, Azure Monitor, Cloudwatch, Datadog, Datadog StatsD, Dynatrace, Elastic, Humio, Influx, KairosDB, New Relic, Prometheus, SignalFx, Sysdig StatsD, Telegraf StatsD, Wavefront\n|Graphite, Ganglia, JMX, Etsy StatsD\n|===\n\n\n* *<<rate-aggregation>>*. In this context, we mean aggregation of a set of samples over a prescribed time interval. Some monitoring systems expect some types of discrete samples (such as counts) to be converted to a rate by the application prior to being published. Other systems expect cumulative values to always be sent. Still others have no opinion on it either way.\n\n[cols=2*,options="header"]\n|===\n|Client-side\n|Server-side\n\n|AppOptics, Atlas, Azure Monitor, Datadog, Dynatrace, Elastic, Graphite, Ganglia, Humio, Influx, JMX, Kairos, New Relic, all StatsD flavors, SignalFx\n|Prometheus, Wavefront footnote:[As of 1.2.0, Micrometer sends cumulative values to Wavefront.]\n|===\n\n* *Publishing*. Some systems expect to poll applications for metrics at their leisure, while others expect metrics to be pushed to them on a regular interval.\n\n[cols=2*,options="header"]\n|===\n|Client pushes\n|Server polls\n\n|AppOptics, Atlas, Azure Monitor, Datadog, Dynatrace, Elastic, Graphite, Ganglia, Humio, Influx, JMX, Kairos, New Relic, SignalFx, Wavefront\n|Prometheus, all StatsD flavors\n|===\n\nThere are other, more minor, variations in expectations from one monitoring system to another, such as their conception of base units of measurement (particularly time) and the canonical naming convention for metrics. Micrometer customizes your metrics to meet these demands on a per-registry basis.\n\n:leveloffset!:\n\n== Registry\n\n:leveloffset: +1\n\nA `Meter` is the interface for collecting a set of measurements (which we individually call metrics) about your application. Meters in Micrometer are created from and held in a `MeterRegistry`. Each supported monitoring system has an implementation of `MeterRegistry`. How a registry is created varies for each implementation.\n\nMicrometer includes a `SimpleMeterRegistry` that holds the latest value of each meter in memory and does not export the data anywhere. If you do not yet have a preferred monitoring system, you can get started playing with metrics by using the simple registry:\n\n====\n[source,java]\n----\nMeterRegistry registry = new SimpleMeterRegistry();\n----\n====\n\nNOTE: A `SimpleMeterRegistry` is autowired for you in Spring-based applications.\n\n== Composite Registries\n\nMicrometer provides a `CompositeMeterRegistry` to which you can add multiple registries, letting you publish metrics to more than one monitoring system simultaneously:\n\n====\n[source,java]\n----\nCompositeMeterRegistry composite = new CompositeMeterRegistry();\n\nCounter compositeCounter = composite.counter("counter");\ncompositeCounter.increment(); <1>\n\nSimpleMeterRegistry simple = new SimpleMeterRegistry();\ncomposite.add(simple); <2>\n\ncompositeCounter.increment(); <3>\n----\n\n1. Increments are NOOP\'d until there is a registry in the composite. The counter\'s count still yields 0 at this point.\n2. A counter named `counter` is registered to the simple registry.\n3. The simple registry counter is incremented, along with counters for any other registries in the composite.\n====\n\n== Global Registry\n\nMicrometer provides a static global registry `Metrics.globalRegistry` and a set of static builders for generating meters based on this registry (note that `globalRegistry` is a composite registry):\n\n====\n[source,java]\n----\nclass MyComponent {\n Counter featureCounter = Metrics.counter("feature", "region", "test"); <1>\n\n void feature() {\n featureCounter.increment();\n }\n\n void feature2(String type) {\n Metrics.counter("feature.2", "type", type).increment(); <2>\n }\n}\n\nclass MyApplication {\n void start() {\n // wire your monitoring system to global static state\n Metrics.addRegistry(new SimpleMeterRegistry()); <3>\n }\n}\n----\n\n1. Wherever possible (and especially where instrumentation performance is critical), store `Meter` instances in fields to avoid a lookup on their name or tags on each use.\n2. When tags need to be determined from local context, you have no choice but to construct or lookup the Meter inside your method body. The lookup cost is just a single hash lookup, so it is acceptable for most use cases.\n3. It is OK to add registries _after_ meters have been created with code like `Metrics.counter(...)`. These meters are added to each registry, as it is bound to the global composite.\n====\n\n:leveloffset!:\n\n== Meters\n\n:leveloffset: +1\n\nMicrometer supports a set of `Meter` primitives, including `Timer`, `Counter`, `Gauge`, `DistributionSummary`, `LongTaskTimer`, `FunctionCounter`, `FunctionTimer`, and `TimeGauge`. Different meter types result in a different number of time series metrics. For example, while there is a single metric that represents a `Gauge`, a `Timer` measures both the count of timed events and the total time of all timed events.\n\nA meter is uniquely identified by its name and dimensions. We use the terms, "`dimensions`" and "`tags,`" interchangeably, and the Micrometer interface is `Tag` simply because it is shorter. As a general rule, it should be possible to use the name as a pivot. Dimensions let a particular named metric be sliced to drill down and reason about the data. This means that, if only the name is selected, you can drill down by using other dimensions and reason about the value being shown.\n\n:leveloffset!:\n\n== Naming Meters\n\n:leveloffset: +1\n\nMicrometer employs a naming convention that separates lowercase words with a `.` (dot) character. Different monitoring systems have different recommendations regarding naming convention, and some naming conventions may be incompatible between one system and another. Each Micrometer implementation for a monitoring system comes with a naming convention that transforms lowercase dot notation names to the monitoring system\'s recommended naming convention. Additionally, this naming convention implementation removes special characters that are disallowed by the monitoring system from the metric names and tags. You can override the default naming convention for a registry by implementing `NamingConvention` and setting it on the registry:\n\n====\n[source,java]\n----\nregistry.config().namingConvention(myCustomNamingConvention);\n----\n====\n\nWith naming conventions in place, the following timer registered in Micrometer looks good natively in a wide variety of monitoring systems:\n\n====\n[source,java]\n----\nregistry.timer("http.server.requests");\n----\n====\n\n. Prometheus - `http_server_requests_duration_seconds`\n. Atlas - `httpServerRequests`\n. Graphite - `http.server.requests`\n. InfluxDB - `http_server_requests`\n\nBy adhering to Micrometer\'s lowercase dot notation convention, you guarantee the maximum degree of portability for your metric names across monitoring systems.\n\n== Tag Naming\n\nTIP: We recommend that you follow the same lowercase dot notation described for meter names when naming tags. Using this consistent naming convention for tags allows for better translation into the respective monitoring system\'s idiomatic naming schemes.\n\nSuppose we are trying to measure the number of http requests and the number of database calls.\n\n*Recommended Approach*\n\n====\n[source,java]\n----\nregistry.counter("database.calls", "db", "users")\nregistry.counter("http.requests", "uri", "/api/users")\n----\n====\n\nThis variant provides enough context so that, if only the name is selected, the value can be reasoned about and is at least potentially meaningful. For example if we select `database.calls`, we can see the total number of calls to all databases. Then we can group by or select by `db` to drill down further or perform comparative analysis on the contribution of calls to each database.\n\n*Bad Approach*\n\n====\n[source,java]\n----\nregistry.counter("calls",\n "class", "database",\n "db", "users");\n\nregistry.counter("calls",\n "class", "http",\n "uri", "/api/users");\n----\n====\n\nIn this approach, if we select `calls`, we get a value that is an aggregate of the number of calls to the database and to our API endpoint. This time series is not useful without further dimensional drill-down.\n\n== Common Tags\n\nYou can define common tags at the registry level and add them to every metric reported to the monitoring system. This is generally used for dimensional drill-down on the operating environment, such as host, instance, region, stack, and others:\n\n====\n[source,java]\n----\nregistry.config().commonTags("stack", "prod", "region", "us-east-1");\nregistry.config().commonTags(Arrays.asList(Tag.of("stack", "prod"), Tag.of("region", "us-east-1"))); // equivalently\n----\n====\n\nCalls to `commonTags` append additional common tags.\n\n[IMPORTANT]\n====\nCommon tags generally have to be added to the registry _before_ any (possibly autoconfigured) meter binders. Depending on your environment, there are different ways to achieve this.\n\nIf you use Spring Boot, you have two options:\n\n* Add your common tags with https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.metrics.customizing.common-tags[configuration properties]\n* If you need more flexibility (for example, you have to add common tags to a registry defined in a shared library), register a `MeterRegistryCustomizer` callback interface as a bean to add your common tags. See the\nhttps://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.metrics.getting-started[Spring Boot Reference Documentation] for more information.\n====\n\n== Tag Values\n\nTag values must be non-null.\n\nWARNING: Beware of the potential for tag values coming from user-supplied sources to blow up the cardinality of a metric. You should always carefully normalize and add bounds to user-supplied input. Sometimes, the cause is sneaky. Consider the URI tag for recording HTTP requests on service endpoints. If we do not constrain 404\'s to a value like NOT_FOUND, the dimensionality of the metric would grow with each resource that cannot be found.\n\n:leveloffset!:\n\n== Meter Filters\n\n:leveloffset: +1\n\nYou can configure each registry with meter filters, which give you greater control over how and when meters are registered and what kinds of statistics they emit. Meter filters serve three basic functions:\n\n1. **Deny** (or **Accept**) meters being registered.\n2. **Transform** meter IDs (for example, changing the name, adding or removing tags, and changing description or base units).\n3. **Configure** distribution statistics for some meter types.\n\nImplementations of `MeterFilter` are added to the registry programmatically:\n\n====\n[source, java]\n----\nregistry.config()\n .meterFilter(MeterFilter.ignoreTags("too.much.information"))\n .meterFilter(MeterFilter.denyNameStartsWith("jvm"));\n----\n====\n\nMeter filters are applied in order, and the results of transforming or configuring a meter are chained.\n\n== Deny or Accept Meters\n\nThe verbose form of an accept or deny filter is:\n\n====\n[source, java]\n----\nnew MeterFilter() {\n @Override\n public MeterFilterReply accept(Meter.Id id) {\n if(id.getName().contains("test")) {\n return MeterFilterReply.DENY;\n }\n return MeterFilterReply.NEUTRAL;\n }\n}\n----\n====\n\n`MeterFilterReply` has three possible states:\n\n* `DENY`: Do not let this meter be registered. When you try to register a meter against a registry and the filter returns `DENY`, the registry returns a NOOP version of that meter (for example, `NoopCounter` or `NoopTimer`). Your code can continue to interact with the NOOP meter, but anything recorded to it is discarded immediately with minimal overhead.\n* `NEUTRAL`: If no other meter filter has returned `DENY`, registration of meters proceeds normally.\n* `ACCEPT`: If a filter returns `ACCEPT`, the meter is immediately registered without interrogating the accept methods of any further filters.\n\n=== Convenience Methods\n\n`MeterFilter` provides several convenience static builders for deny and accept type filters:\n\n* `accept()`: Accept every meter, overriding the decisions of any filters that follow.\n* `accept(Predicate<Meter.Id>)`: Accept any meter matching the predicate.\n* `acceptNameStartsWith(String)`: Accept every meter with a matching prefix.\n* `deny()`: Deny every meter, overriding the decisions of any filters that follow.\n* `denyNameStartsWith(String)`: Deny every meter with a matching prefix. All `MeterBinder` implementations provided by Micrometer have names with common prefixes to allow for easy grouping visualization in UIs but also to make them easy to disable or enable as a group with a prefix. For example, you can deny all JVM metrics with `MeterFilter.denyNameStartsWith("jvm")`.\n* `deny(Predicate<Meter.Id>)`: Deny any meter that matches the predicate.\n* `maximumAllowableMetrics(int)`: Deny any meter after the registry has reached a certain number of meters.\n* `maximumAllowableTags(String meterNamePrefix, String tagKey, int maximumTagValues, MeterFilter onMaxReached)`: Places an upper bound on the number of tags produced by matching series.\n\n**Whitelisting** only a certain group of metrics is a particularly common case for monitoring systems that are _expensive_. This can be achieved with a static call:\n\n* `denyUnless(Predicate<Meter.Id>)`: Deny all meters that _do not_ match the predicate.\n\n=== Chaining Deny Accept Meters\n\nMeter filters are applied in the order in which they are configured on the registry, so it is possible to stack deny and accept filters to achieve more complex rules:\n\n====\n[source, java]\n----\nregistry.config()\n .meterFilter(MeterFilter.acceptNameStartsWith("http"))\n .meterFilter(MeterFilter.deny()); <1>\n----\n====\n\nThis achieves another form of whitelisting by stacking two filters together. Only `http` metrics are allowed to exist in this registry.\n\n== Transforming metrics\n\nThe following example shows a transform filter:\n\n====\n[source, java]\n----\nnew MeterFilter() {\n @Override\n public Meter.Id map(Meter.Id id) {\n if(id.getName().startsWith("test")) {\n return id.withName("extra." + id.getName()).withTag("extra.tag", "value");\n }\n return id;\n }\n}\n----\n====\n\nThis filter adds a name prefix and an additional tag conditionally to meters starting with a name of `test`.\n\n`MeterFilter` provides convenience builders for many common transformation cases:\n\n* `commonTags(Iterable<Tag>)`: Adds a set of tags to all metrics. Adding common tags for application name, host, region, and others is a highly recommended practice.\n* `ignoreTags(String...)`: Drops matching tag keys from every meter. This is particularly useful when a tag provably comes to have\ntoo high cardinality and starts stressing your monitoring system or costing too much but you cannot change all the instrumentation points quickly.\n* `replaceTagValues(String tagKey, Function<String, String> replacement, String... exceptions)`: Replace tag values according to the provided mapping for all matching tag keys. You can use this to reduce the total cardinality of a tag by mapping some portion of tag values to something else.\n* `renameTag(String meterNamePrefix, String fromTagKey, String toTagKey)`: Rename a tag key for every metric that begins with a given prefix.\n\n== Configuring Distribution Statistics\n\n`Timer` and `DistributionSummary` contain a set of optional distribution statistics (in addition to the basics of count, total, and max) that you can configure through filters. These distribution statistics include pre-computed percentiles, SLOs, and histograms.\n\n====\n[source, java]\n----\nnew MeterFilter() {\n @Override\n public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) {\n if (id.getName().startsWith(prefix)) {\n return DistributionStatisticConfig.builder()\n .publishPercentiles(0.9, 0.95)\n .build()\n .merge(config);\n }\n return config;\n }\n};\n----\n====\n\nGenerally, you should create a new `DistributionStatisticConfig` with only the pieces you wish to configure and then `merge` it with the input configuration. This lets you drop down on registry-provided defaults for distribution statistics and to chain multiple filters together, each configuring some part of the distribution statistics (for example, you might want a 100ms SLO for all HTTP requests but only percentile histograms on a few critical endpoints).\n\n`MeterFilter` provides convenience builders for:\n\n* `maxExpected(Duration/long)`: Governs the upper bound of percentile histogram buckets shipped from a timer or summary.\n* `minExpected(Duration/long)`: Governs the lower bound of percentile histogram buckets shipped from a timer or summary.\n\nSpring Boot offers property-based filters for configuring SLOs, percentiles, and percentile histograms by name prefix.\n\n:leveloffset!:\n\n[[rate-aggregation]]\n== Rate Aggregation\n\n:leveloffset: +1\n\nMicrometer is aware of whether a particular monitoring system expects rate aggregation to happen client-side before metrics are published or ad-hoc as part of the query on the server. It accumulates metrics according to which style the monitoring system expects.\n\nNot all measurements are reported or best viewed as a rate. For example, gauge values and the active task count long task timers are not rates.\n\n== Server-side\n\nMonitoring systems that perform server-side rate math expect absolute values to be reported at each publishing interval. For example, the absolute count of all increments to a counter since the beginning of the application is sent on each publishing interval.\n\nSuppose we have a slightly positively biased random walk that chooses to increment a counter once every 10 milliseconds. If we view the raw counter value in a system like Prometheus, we see a step-wise monotonically increasing function (the width of the step is the interval at which Prometheus is polling or scraping for data).\n\nimage::'+n(66)+"[Absolute counter value]\n\nRepresenting a counter without rate aggregation over some time window is rarely useful, as the representation is a function of both the rapidity with which the counter is incremented and the longevity of the service. In the preceding example, the counter drops back to zero on service restart. The rate-aggregated graph would return back to a value around 55 as soon as the new instance (say on a production deployment) was in service.\n\nimage::"+n(67)+'[Rate-aggregated counter]\n\nIf you have achieved zero-downtime deployments (for example, through red-black deployments), you should be able to comfortably set _minimum_ alert thresholds on the rate-aggregated graph without service restarts causing dips in the counter value.\n\nIMPORTANT: For most production purposes, whether it be alerting, automated canary analysis, or other use cases, base your automation off of rate-aggregated data.\n\n== Client-side\n\nTwo other classes of monitoring system either:\n\n. Expect rate-aggregated data. Given the key insight that for most production purposes, we should be basing our decisions off of rates rather than absolute values, such systems benefit from having to do less math to satisfy queries.\n. Have relatively little or no math operations that would let us rate-aggregate data through our queries. For these systems, publishing pre-aggregated data is the only way to build meaningful representations.\n\nMicrometer efficiently maintains rate data by means of a step value that accumulates data for the current publishing interval. When the step value is polled (when publishing, for example), if the step value detects that the current interval has elapsed, it moves current data to "`previous`" state. This previous state is what is reported until the next time current data overwrites it. The following image shows the interaction of current and previous state, along with polling:\n\nimage::'+n(68)+'[Behavior of a step value,width=1200]\n\nThe value returned by the poll function is always _rate per second * interval_. If the step value shown in the preceding image represents the values of a counter, we could say that the counter saw "`0.3 increments per second`" in the first interval, which is reportable to the backend at any time during the second interval.\n\nMicrometer timers track at least a count and the total time as separate measurements. Suppose we configure publishing at 10-second intervals and we saw 20 requests that each took 100ms. Then, for the first interval:\n\n. `count` = 10 seconds * (20 requests / 10 seconds) = 20 requests\n. `totalTime` = 10 seconds * (20 * 100 ms / 10 seconds) = 2 seconds\n\nThe `count` statistic is meaningful by itself: It is a measure of _throughput_. `totalTime` represents the total latency of all requests in the interval. Additionally:\n\n`totalTime / count` = 2 seconds / 20 requests = 0.1 seconds / request = 100 ms / request\n\nThis is a useful measure of _average latency_. When the same idea is applied to the `totalAmount` and `count` emanating from distribution summaries, the measure is called a _distribution average_. Average latency is just the distribution average for a distribution summary measured in time (a timer). Some monitoring systems (such as Atlas) provide facilities for computing the distribution average from these statistics, and Micrometer includes `totalTime` and `count` as separate statistics. Others, (such as Datadog) do not have this kind of operation built-in, and Micrometer calculates the distribution average client-side and ships that.\n\nShipping the rate for the publishing interval is sufficient to reason about the rate over any time window greater than or equal to the publishing interval. In our example, if a service continues to receive 20 requests that each take 100ms for every 10 second interval in a given minute, we could say:\n\n. Micrometer reported "`20 requests`" for `count` on every 10 second interval. The monitoring system sums these six 10 second intervals and arrives at the conclusion that there are 120 requests / minute. Note that it is the monitoring system doing this summation, not Micrometer.\n. Micrometer reported "`2 seconds`" of `totalTime` on every 10 second interval. The monitoring system can sum all total time statistics over the minute to yield "`12 seconds`" of total time in the minute interval. Then, the average latency is as we expect: 12 seconds / 120 requests = 100 ms / request.\n\n:leveloffset!:\n\n== Counters\n\n:leveloffset: +1\n\nCounters report a single metric: a count. The `Counter` interface lets you increment by a fixed amount, which must be positive.\n\nTIP: Never count something you can time with a `Timer` or summarize with a `DistributionSummary`! Both `Timer` and `DistributionSummary` always publish a count of events in addition to other measurements.\n\nWhen building graphs and alerts off of counters, you should generally be most interested in measuring the rate at which some event occurs over a given time interval. Consider a simple queue. You could use counters to measure various things, such as the rate at which items are being inserted and removed.\n\nIt is tempting, at first, to conceive of visualizing absolute counts rather than a rate, but the absolute count is usually both a function of the rapidity with which something is used *and* the longevity of the application instance under instrumentation. Building dashboards and alerts of the rate of a counter per some interval of time disregards the longevity of the app, letting you see aberrant behavior long after the application has started.\n\nNOTE: Be sure to read through the timer section before jumping into using counters, as timers record a count of timed events as part of the suite of metrics that go into timing. For those pieces of code you intend to time, you do NOT need to add a separate counter.\n\nThe following code simulates a real counter whose rate exhibits some perturbation over a short time window:\n\n[source,java]\n----\nNormal rand = ...; // a random generator\n\nMeterRegistry registry = ...\nCounter counter = registry.counter("counter"); <1>\n\nFlux.interval(Duration.ofMillis(10))\n .doOnEach(d -> {\n if (rand.nextDouble() + 0.1 > 0) { <2>\n counter.increment(); <3>\n }\n })\n .blockLast();\n----\n<1> Most counters can be created off of the registry itself with a name and, optionally, a set of tags.\n<2> A slightly positively biased random walk.\n<3> This is how you interact with a counter. You could also call `counter.increment(n)` to increment by more than one in a single operation.\n\nA fluent builder for counters on the `Counter` interface itself provides access to less frequently used options, such as\nbase units and description. You can register the counter as the last step of its construction by calling `register`:\n\n[source, java]\n----\nCounter counter = Counter\n .builder("counter")\n .baseUnit("beans") // optional\n .description("a description of what this counter does") // optional\n .tags("region", "test") // optional\n .register(registry);\n----\n\n== Function-tracking Counters\n\nMicrometer also provides a more infrequently used counter pattern that tracks a monotonically increasing function (a function that stays the same or increases over time but never decreases). Some monitoring systems, such as Prometheus, push cumulative values for counters to the backend, but others publish the rate at which a counter is incrementing over the push interval. By employing this pattern, you let the Micrometer implementation for your monitoring system choose whether to rate-normalize the counter, and your counter remains portable across different types of monitoring systems.\n\n[source, java]\n-----\nCache cache = ...; // suppose we have a Guava cache with stats recording on\nregistry.more().counter("evictions", tags, cache, c -> c.stats().evictionCount()); <1>\n-----\n\n<1> `evictionCount()` is a monotonically increasing function that increments with every cache eviction from the beginning of its life.\n\nThe function-tracking counter, in concert with the monitoring system\'s rate normalizing functionality (whether this is an artifact of the query language or the way data is pushed to the system), adds a layer of richness on top of the cumulative value of the function itself. You can reason about the _rate_ at which the value is increasing, whether that rate is within an acceptable bound, is increasing or decreasing over time, and so on.\n\nWARNING: Micrometer cannot guarantee the monotonicity of the function for you. By using this signature, you are asserting its monotonicity based on what you know about its definition.\n\nA fluent builder for function counters on the `FunctionCounter` interface itself provides access to less frequently used options, such as base units and description. You can register the counter as the last step of its construction by calling `register(MeterRegistry)`.\n\n[source, java]\n----\nMyCounterState state = ...;\n\nFunctionCounter counter = FunctionCounter\n .builder("counter", state, state -> state.count())\n .baseUnit("beans") // optional\n .description("a description of what this counter does") // optional\n .tags("region", "test") // optional\n .register(registry);\n----\n\n:leveloffset!:\n\n== Gauges\n\n:leveloffset: +1\n\nA gauge is a handle to get the current value. Typical examples for gauges would be the size of a collection or map or number of threads in a running state.\n\nTIP: Gauges are useful for monitoring things with natural upper bounds. We do not recommend using a gauge to monitor things like request count, as they can grow without bound for the duration of an application instance\'s life.\n\nTIP: Never gauge something you can count with a `Counter`!\n\nMicrometer takes the stance that gauges should be sampled and not be set, so there is no information about what might have occurred between samples. Any intermediate values set on a gauge are lost by the time the gauge value is reported to a metrics backend, so there is little value in setting those intermediate values in the first place.\n\nThink of a `Gauge` as a "`heisen-gauge`": a meter that changes only when it is observed. Every other meter type accumulates intermediate counts toward the point where the data is sent to the metrics backend.\n\nThe `MeterRegistry` interface contains methods for building gauges to observe numeric values, functions, collections, and maps:\n\n[source, java]\n----\nList<String> list = registry.gauge("listGauge", Collections.emptyList(), new ArrayList<>(), List::size); <1>\nList<String> list2 = registry.gaugeCollectionSize("listSize2", Tags.empty(), new ArrayList<>()); <2>\nMap<String, Integer> map = registry.gaugeMapSize("mapGauge", Tags.empty(), new HashMap<>());\n----\n<1> A slightly more common form of gauge is one that monitors some non-numeric object. The last argument establishes the function that is used to determine the value of the gauge when the gauge is observed.\n<2> A more convenient form of (1) for when you want to monitor collection size.\n\nAll of the different forms of creating a gauge maintain only a _weak reference_ to the object being observed, so as not to prevent garbage collection of the object.\n\n== Manually Incrementing or Decrementing a Gauge\n\nA gauge can be made to track any `java.lang.Number` subtype that is settable, such as `AtomicInteger` and `AtomicLong` found in `java.util.concurrent.atomic` and similar types, such as Guava\'s `AtomicDouble`:\n\n[source,java]\n----\n// maintain a reference to myGauge\nAtomicInteger myGauge = registry.gauge("numberGauge", new AtomicInteger(0));\n\n// ... elsewhere you can update the value it holds using the object reference\nmyGauge.set(27);\nmyGauge.set(11);\n----\n\nNote that, in this form, unlike other meter types, you do not get a reference to the `Gauge` when creating one. Rather, you get a reference to the thing being observed. This is because of the "`heisen-gauge`" principal: The gauge is self-sufficient once created, so you should never need to interact with it. This lets us give you back only the instrumented object, which allows for quick one-liners that both create the object to be observed and set up metrics around it.\n\nThis pattern should be less common than the `DoubleFunction` form. Remember that frequent setting of the observed `Number` results in a lot of intermediate values that never get published. Only the _instantaneous value_ of the gauge at publish time is ever sent to the monitoring system.\n\nWARNING: Attempting to construct a gauge with a primitive number or one of its `java.lang` object forms is always incorrect. These numbers are immutable. Thus, the gauge cannot ever be changed. Attempting to "`re-register`" the gauge with a different number does not work, as the registry maintains only one meter for each unique combination of name and tags.\n\n== Gauge Fluent Builder\n\nThe interface contains a fluent builder for gauges:\n\n[source, java]\n----\nGauge gauge = Gauge\n .builder("gauge", myObj, myObj::gaugeValue)\n .description("a description of what this gauge does") // optional\n .tags("region", "test") // optional\n .register(registry);\n----\n\nGenerally the returned `Gauge` instance is not useful except in testing, as the gauge is already set up to track a value automatically upon registration.\n\n== Why is My Gauge Reporting NaN or Disappearing?\n\nIt is your responsibility to hold a strong reference to the state object that you are measuring with a `Gauge`. Micrometer is careful to not create strong references to objects that would otherwise be garbage collected. Once the object being gauged is de-referenced and is garbage collected, Micrometer starts reporting a NaN or nothing for a gauge, depending on the registry implementation.\n\nIf you see your gauge reporting for a few minutes and then disappearing or reporting NaN, it almost certainly suggests that the underlying object being gauged has been garbage collected.\n\n== `TimeGauge`\n\n`TimeGauge` is a specialized gauge that tracks a time value, to be scaled to the base unit of time expected by each registry implementation.\n\n`TimeGauge` can be registered with `TimeUnit` as follows:\n\n[source, java]\n----\nAtomicInteger msTimeGauge = new AtomicInteger(4000);\nAtomicInteger usTimeGauge = new AtomicInteger(4000);\nTimeGauge.builder("my.gauge", msTimeGauge, TimeUnit.MILLISECONDS, AtomicInteger::get).register(registry);\nTimeGauge.builder("my.other.gauge", usTimeGauge, TimeUnit.MICROSECONDS, AtomicInteger::get).register(registry);\n----\n\nAnd for example, if the registry is Prometheus, they will be converted in seconds as follows:\n\n```\n# HELP my_gauge_seconds\n# TYPE my_gauge_seconds gauge\nmy_gauge_seconds 4.0\n# HELP my_other_gauge_seconds\n# TYPE my_other_gauge_seconds gauge\nmy_other_gauge_seconds 0.004\n```\n\n== Multi-gauge\n\nMicrometer supports one last special type of `Gauge`, called a `MultiGauge`, to help manage gauging a growing or shrinking list of criteria.\nThis feature lets you select a set of well-bounded but slightly changing set of criteria from something like an SQL query and report some metric for each row as a `Gauge`. The following example creates a `MultiGauge`:\n\n[source, java]\n----\n// SELECT count(*) from job group by status WHERE job = \'dirty\'\nMultiGauge statuses = MultiGauge.builder("statuses")\n .tag("job", "dirty")\n .description("The number of widgets in various statuses")\n .baseUnit("widgets")\n .register(registry);\n\n...\n\n// run this periodically whenever you re-run your query\nstatuses.register(\n resultSet.stream()\n .map(result -> Row.of(Tags.of("status", result.getAsString("status")), result.getAsInt("count")))\n .collect(toList())\n);\n----\n\n:leveloffset!:\n\n== Timers\n\n:leveloffset: +1\n\nTimers are intended for measuring short-duration latencies and the frequency of such events. All implementations of `Timer` report at least the total time and the count of events as separate time series. While you can use timers for other use cases, note that negative values are not supported, and recording many longer durations could cause overflow of the total time at `Long.MAX_VALUE` nanoseconds (292.3 years).\n\nAs an example, consider a graph showing request latency to a typical web server. The server can be expected to respond to many requests quickly, so the timer gets updated many times per second.\n\nThe appropriate base unit for timers varies by metrics backend, and for good reason. Micrometer is decidedly un-opinionated about this. However, because of the potential for confusion, Micrometer requires a `TimeUnit` when interacting with `Timer` implementations. Micrometer is aware of the preferences of each implementation and publishes your timing in the appropriate base unit based on the implementation. The following listing shows part of the `Timer` interface:\n\n[source,java]\n----\npublic interface Timer extends Meter {\n ...\n void record(long amount, TimeUnit unit);\n void record(Duration duration);\n double totalTime(TimeUnit unit);\n}\n----\n\nThe interface contains a fluent builder for timers:\n\n[source,java]\n----\nTimer timer = Timer\n .builder("my.timer")\n .description("a description of what this timer does") // optional\n .tags("region", "test") // optional\n .register(registry);\n----\n\nNOTE: The maximum statistical value for basic `Timer` implementations, such as `CumulativeTimer` and `StepTimer`, is a time window maximum (`TimeWindowMax`).\nIt means that its value is the maximum value during a time window.\nIf no new values are recorded for the time window length, the max is reset to 0 as a new time window starts.\nTime window size is the step size of the meter registry, unless expiry in `DistributionStatisticConfig` is explicitly set to other value.\nA time window maximum is used to capture maximum latency in a subsequent interval after heavy resource pressure triggers the latency and prevents metrics from being published.\nPercentiles are also time window percentiles (`TimeWindowPercentileHistogram`).\n\n== Recording Blocks of Code\n\nThe `Timer` interface exposes several convenience overloads for recording timings inline, including the following:\n\n[source,java]\n----\ntimer.record(() -> dontCareAboutReturnValue());\ntimer.recordCallable(() -> returnValue());\n\nRunnable r = timer.wrap(() -> dontCareAboutReturnValue()); <1>\nCallable c = timer.wrap(() -> returnValue());\n----\n<1> Wrap `Runnable` or `Callable` and return the instrumented version of it for use later.\n\nNOTE: A `Timer` is really a specialized distribution summary that is aware of how to scale durations to the base unit of time of each monitoring system and has an automatically\ndetermined base unit. In every case where you want to measure time, you should use a `Timer` rather than a `DistributionSummary`.\n\n== Storing Start State in `Timer.Sample`\n\nYou may also store start state in a sample instance that can be stopped later. The sample records a start time based on the registry\'s clock. After starting a sample, execute the code to be timed and finish the operation by calling `stop(Timer)` on the sample:\n\n[source, java]\n----\nTimer.Sample sample = Timer.start(registry);\n\n// do stuff\nResponse response = ...\n\nsample.stop(registry.timer("my.timer", "response", response.status()));\n----\n\nNote how we do not decide the timer to which to accumulate the sample until it is time to stop the sample. This lets us dynamically determine certain tags from the end state of the operation we are timing.\n\n== The `@Timed` annotation\n\nThe `micrometer-core` modules contains a `@Timed` annotation that frameworks can use to add timing support to either specific types of methods such as those serving web request endpoints or, more generally, to all methods.\n\nWARNING: Micrometer\'s Spring Boot configuration does _not_ recognize `@Timed` on arbitrary methods.\n\nAlso, an incubating AspectJ aspect is included in `micrometer-core`. You can use it in your application either through compile/load time AspectJ weaving or through framework facilities that interpret AspectJ aspects and proxy targeted methods in some other way, such as Spring AOP. Here is a sample Spring AOP configuration:\n\n[source,java]\n----\n@Configuration\npublic class TimedConfiguration {\n @Bean\n public TimedAspect timedAspect(MeterRegistry registry) {\n return new TimedAspect(registry);\n }\n}\n----\n\nApplying `TimedAspect` makes `@Timed` usable on any arbitrary method in an AspectJ proxied instance, as the following example shows:\n\n[source,java]\n----\n@Service\npublic class ExampleService {\n\n @Timed\n public void sync() {\n // @Timed will record the execution time of this method,\n // from the start and until it exits normally or exceptionally.\n ...\n }\n\n @Async\n @Timed\n public CompletableFuture<?> async() {\n // @Timed will record the execution time of this method,\n // from the start and until the returned CompletableFuture\n // completes normally or exceptionally.\n return CompletableFuture.supplyAsync(...);\n }\n\n}\n----\n\n=== @MeterTag on Method Parameters\n\nTo support `@MeterTag` annotation on method parameters you need to configure the `@TimedAspect` to add the `MeterTagAnnotationHandler`.\n\n[source,java,subs=+attributes]\n-----\nValueResolver valueResolver = parameter -> "Value from myCustomTagValueResolver [" + parameter + "]";\n\n// Example of a ValueExpressionResolver that uses Spring Expression Language\nValueExpressionResolver valueExpressionResolver = new SpelValueExpressionResolver();\n\n\n// Setting the handler on the aspect\ntimedAspect.setMeterTagAnnotationHandler(\n new MeterTagAnnotationHandler(aClass -> valueResolver, aClass -> valueExpressionResolver));\n-----\n\nLet\'s assume that we have the following interface.\n\n[source,java,subs=+attributes]\n-----\ninterface MeterTagClassInterface {\n\n @Timed\n void getAnnotationForTagValueResolver(@MeterTag(key = "test", resolver = ValueResolver.class) String test);\n\n @Timed\n void getAnnotationForTagValueExpression(\n @MeterTag(key = "test", expression = "\'hello\' + \' characters\'") String test);\n\n @Timed\n void getAnnotationForArgumentToString(@MeterTag("test") Long param);\n\n}\n-----\n\nWhen its implementations would be called with different arguments (remember that the implementation needs to be annotated with `@Timed` annotation too) the following timers would be created:\n\n[source,java,subs=+attributes]\n-----\n// Example for returning <toString()> on the parameter\nservice.getAnnotationForArgumentToString(15L);\n\nassertThat(registry.get("method.timed").tag("test", "15").timer().count()).isEqualTo(1);\n\n// Example for calling the provided <ValueResolver> on the parameter\nservice.getAnnotationForTagValueResolver("foo");\n\nassertThat(registry.get("method.timed")\n .tag("test", "Value from myCustomTagValueResolver [foo]")\n .timer()\n .count()).isEqualTo(1);\n\n// Example for calling the provided <ValueExpressionResolver>\nservice.getAnnotationForTagValueExpression("15L");\n\nassertThat(registry.get("method.timed").tag("test", "hello characters").timer().count()).isEqualTo(1);\n-----\n\n== Function-tracking Timers\n\nMicrometer also provides a more infrequently used timer pattern that tracks two monotonically increasing functions (a function that stays the same or increases over time but never decreases): a count function and a total time function. Some monitoring systems, such as Prometheus, push cumulative values for counters (which apply to both the count and total time functions in this case) to the backend, but others publish the rate at which a counter increments over the push interval. By employing this pattern, you let the Micrometer implementation for your monitoring system choose whether to rate normalize the timer, and your timer remains portable across different types of monitoring systems.\n\n[source, java]\n-----\nIMap<?, ?> cache = ...; // suppose we have a Hazelcast cache\nregistry.more().timer("cache.gets.latency", Tags.of("name", cache.getName()), cache,\n c -> c.getLocalMapStats().getGetOperationCount(), <1>\n c -> c.getLocalMapStats().getTotalGetLatency(),\n TimeUnit.NANOSECONDS <2>\n);\n-----\n\n<1> `getGetOperationCount()` is a monotonically increasing function incrementing with every cache get from the beginning of its life.\n<2> This represents the unit of time represented by `getTotalGetLatency()`. Each registry implementation specifies what its expected base unit of time is, and the total time reported will be scaled to this value.\n\nThe function-tracking timer, in concert with the monitoring system\'s rate normalizing functionality (whether this is an artifact of the query language or the way data is pushed to the system), adds a layer of richness to the cumulative value of the functions themselves. You can reason about the _rate_ of throughput and latency, whether that rate is within an acceptable bound, is increasing or decreasing over time, and so on.\n\nWARNING: Micrometer cannot guarantee the monotonicity of the count and total time functions for you. By using this signature, you are asserting their monotonicity based on what you know about their definitions.\n\nThere is also a fluent builder for function timers on the `FunctionTimer` interface itself, providing access to less frequently used options, such as base units and description. You can register the timer as the last step of its construction by calling `register(MeterRegistry)`:\n\n[source, java]\n----\nIMap<?, ?> cache = ...\n\nFunctionTimer.builder("cache.gets.latency", cache,\n c -> c.getLocalMapStats().getGetOperationCount(),\n c -> c.getLocalMapStats().getTotalGetLatency(),\n TimeUnit.NANOSECONDS)\n .tags("name", cache.getName())\n .description("Cache gets")\n .register(registry);\n----\n\n== Pause Detection\n\nMicrometer uses the `LatencyUtils` package to compensate for https://highscalability.com/blog/2015/10/5/your-load-generator-is-probably-lying-to-you-take-the-red-pi.html[coordinated omission] -- extra latency arising from system and VM pauses that skew your latency statistics downward. Distribution statistics, such as percentiles and SLO counts, are influenced by a pause detector implementation that adds additional latency here and there to compensate for pauses.\n\nMicrometer supports two pause detector implementations: a clock-drift based detector and a no-op detector. Before Micrometer 1.0.10/1.1.4/1.2.0, a clock-drift detector was configured by default to report as-accurate-as-possible metrics without further configuration. Since 1.0.10/1.1.4/1.2.0, the no-op detector is configured by default, but the clock-drift detector can be configured as shown in the next example.\n\nThe clock-drift based detector has a configurable sleep interval and pause threshold. CPU consumption is inversely proportional to `sleepInterval`, as is pause detection accuracy. 100ms for both values is a reasonable default to offer decent detection of long pause events while consuming a negligible amount of CPU time.\n\nYou can customize the pause detector as follows:\n\n[source,java]\n----\nregistry.config().pauseDetector(new ClockDriftPauseDetector(sleepInterval, pauseThreshold));\nregistry.config().pauseDetector(new NoPauseDetector());\n----\n\nIn the future, we may provide further detector implementations. Some pauses may be able to be inferred from GC logging in some circumstances, for example, without requiring a constant CPU load, however minimal. Also, a future JDK may provide direct access to pause events.\n\n== Memory Footprint Estimation\n\nTimers are the most memory-consuming meter, and their total footprint can vary dramatically, depending on which options you choose. The following table of memory consumption is based on the use of various features. These figures assume no tags and a ring buffer length of 3. Adding tags adds somewhat to the total, as does increasing the buffer length. Total storage can also vary somewhat depending on the registry implementation.\n\n* R = Ring buffer length. We assume the default of 3 in all examples. R is set with `Timer.Builder#distributionStatisticBufferLength`.\n* B = Total histogram buckets. Can be SLO boundaries or percentile histogram buckets. By default, timers are clamped to a minimum expected value of 1ms and a maximum expected value of 30 seconds, yielding 66 buckets for percentile histograms, when applicable.\n* I = Interval estimator for pause compensation. 1.7 kb.\n* M = Time-decaying max. 104 bytes.\n* Fb = Fixed boundary histogram. 8b * B * R.\n* Pp = Percentile precision. By default, it is 1. Generally in the range [0, 3]. Pp is set with `Timer.Builder#percentilePrecision`.\n* Hdr(Pp) = High dynamic range histogram.\n - When Pp = 0: 1.9kb * R + 0.8kb\n - When Pp = 1: 3.8kb * R + 1.1kb\n - When Pp = 2: 18.2kb * R + 4.7kb\n - When Pp = 3: 66kb * R + 33kb\n\n[width="80%",options="header"]\n|=========================================================\n|Pause detection |Client-side percentiles |Histogram and/or SLOs |Formula | Example\n\n|Yes |No |No |I + M| ~1.8kb\n|Yes |No |Yes |I + M + Fb|For default percentile histogram, ~7.7kb\n|Yes |Yes |Yes |I + M + Hdr(Pp)|For the addition of a 0.95 percentile with defaults otherwise, ~14.3kb\n|No |No |No |M| ~0.1kb\n|No |No |Yes |M + Fb|For default percentile histogram, ~6kb\n|No |Yes |Yes |M + Hdr(Pp)|For the addition of a 0.95 percentile with defaults otherwise, ~12.6kb\n|=========================================================\n\nNOTE: For Prometheus, specifically, R is _always_ equal to 1, regardless of how you attempt to configure it through `Timer.Builder`. This special case exists because Prometheus expects cumulative histogram data that never rolls over.\n\n:leveloffset!:\n\n== Distribution Summaries\n\n:leveloffset: +1\n\nA distribution summary tracks the distribution of events. It is similar to a timer structurally, but records values that do not represent a unit of time. For example, you could use a distribution summary to measure the payload sizes of requests hitting a server.\n\nThe following example creates a distribution summary:\n\n[source, java]\n----\nDistributionSummary summary = registry.summary("response.size");\n----\n\nThe interface contains a fluent builder for distribution summaries:\n\n[source, java]\n----\nDistributionSummary summary = DistributionSummary\n .builder("response.size")\n .description("a description of what this summary does") // optional\n .baseUnit("bytes") // optional <1>\n .tags("region", "test") // optional\n .scale(100) // optional <2>\n .register(registry);\n----\n\n<1> Add base units for maximum portability. Base units are part of the naming convention for some monitoring systems. Leaving it off and violating the naming convention has no adverse effect if you forget.\n<2> Optionally, you can provide a scaling factor by which each recorded sample is multiplied as it is recorded.\n\nNOTE: The maximum (which is named `max`) for basic `DistributionSummary` implementations, such as `CumulativeDistributionSummary` and `StepDistributionSummary`, is a time window maximum (`TimeWindowMax`).\nIt means that its value is the maximum value during a time window.\nIf no new values are recorded for the time window length, the maximum is reset to 0 as a new time window starts.\nTime window size is the step size of the meter registry, unless expiry in `DistributionStatisticConfig` is explicitly set to another value.\nA time window max is used to capture the maximum latency in a subsequent interval after heavy resource pressure triggers the latency and prevents metrics from being published.\nPercentiles are also time window percentiles (`TimeWindowPercentileHistogram`).\n\n== Scaling and Histograms\n\nMicrometer\'s preselected percentile histogram buckets are all integers from 1 to `Long.MAX_VALUE`. Currently, `minimumExpectedValue` and `maximumExpectedValue` serve to control the cardinality of the bucket set. If we try to detect that your min/max yields a small range and scale the preselected bucket domain to your summary\'s range, we do not have another lever to control bucket cardinality.\n\nInstead, if your summary\'s domain is more constrained, scale your summary\'s range by a fixed factor. The use case we have heard so far is for summaries of ratios whose domain is [0,1]. Given that scenario, we can use the following code to create values from 0 to 100:\n\n[source,java]\n----\nDistributionSummary.builder("my.ratio").scale(100).register(registry)\n----\n\nThis way, the ratio winds up in the range [0,100] and we can set `maximumExpectedValue` to 100. You can pair this with custom SLO boundaries if you care about particular ratios:\n\n[source,java]\n----\nDistributionSummary.builder("my.ratio")\n .scale(100)\n .serviceLevelObjectives(70, 80, 90)\n .register(registry)\n----\n\n\n== Memory Footprint Estimation\n\nThe total memory footprint of a distribution summary can vary dramatically, depending on which options you choose. The following table of memory consumption is based on the use of various features. These figures assume no tags and a ring buffer length of 3. Adding tags adds somewhat to the total, as does increasing the buffer length. Total storage can also vary somewhat depending on the registry implementation.\n\n* R = Ring buffer length. We assume the default of 3 in all examples. R is set with `DistributionSummary.Builder#distributionStatisticBufferLength`.\n* B = Total histogram buckets. It can be SLO boundaries or percentile histogram buckets. By default, summaries have NO minimum and maximum expected value, so we ship all 276 predetermined histogram buckets. You should always clamp distribution summaries with a `minimumExpectedValue` and `maximumExpectedValue` when you intend to ship percentile histograms.\n* M = Time-decaying max. 104 bytes.\n* Fb = Fixed boundary histogram. 8b * B * R.\n* Pp = Percentile precision. By default, it is 1. It is generally in the range of [0, 3]. Pp is set with `DistributionSummary.Builder#percentilePrecision`.\n* Hdr(Pp) = High dynamic range histogram.\n - When Pp = 0: 1.9kb * R + 0.8kb\n - When Pp = 1: 3.8kb * R + 1.1kb\n - When Pp = 2: 18.2kb * R + 4.7kb\n - When Pp = 3: 66kb * R + 33kb\n\n\n[width="80%",options="header"]\n|=========================================================\n|Client-side percentiles |Histogram and/or SLOs |Formula | Example\n\n|No |No |M| ~0.1kb\n|No |Yes |M + Fb|For percentile histogram clamped to 66 buckets, ~6kb\n|Yes |Yes |M + Hdr(Pp)|For the addition of a 0.95 percentile with defaults otherwise, ~12.6kb\n|=========================================================\n\nNOTE: For Prometheus, R is _always_ equal to 1, regardless of how you attempt to configure it through `DistributionSummary.Builder`. This special case exists for Prometheus because it expects cumulative histogram data that never rolls over.\n\n:leveloffset!:\n\n== Long Task Timers\n\n:leveloffset: +1\n\nThe long task timer is a special type of timer that lets you measure time while an event being measured is *still running*. A normal Timer only records the duration *after* the task is complete.\n\nLong task timers publish at least the following statistics:\n\n* Active task count\n* Total duration of active tasks\n* The maximum duration of active tasks\n\nUnlike a regular `Timer`, a long task timer does not publish statistics about completed tasks.\n\nConsider a background process to refresh metadata from a data store. For example, https://github.com/Netflix/edda[Edda] caches AWS resources, such as instances, volumes, auto-scaling groups, and others. Normally all data can be refreshed in a few minutes. If the AWS services have problems, it can take much longer. A long task timer can be used to track the active time for refreshing the metadata.\n\nFor example, in a Spring application, it is common for such long running processes to be implemented with `@Scheduled`. Micrometer provides a special `@Timed` annotation for instrumenting these processes with a long task timer:\n\n[source, java]\n----\n@Timed(value = "aws.scrape", longTask = true)\n@Scheduled(fixedDelay = 360000)\nvoid scrapeResources() {\n // find instances, volumes, auto-scaling groups, etc...\n}\n----\n\nIt is up to the application framework to make something happen with `@Timed`. If your framework of choice does not support it, you can still use the long task timer:\n\n[source, java]\n----\nLongTaskTimer scrapeTimer = registry.more().longTaskTimer("scrape");\nvoid scrapeResources() {\n scrapeTimer.record(() => {\n // find instances, volumes, auto-scaling groups, etc...\n });\n}\n----\n\nIf we wanted to alert when this process exceeds a threshold, with a long task timer, we receive that alert at the first reporting interval after we have exceeded the threshold. With a regular timer, we would not receive the alert until the first reporting interval after the process completed, over an hour later!\n\nThe interface contains a fluent builder for long task timers:\n\n[source, java]\n----\nLongTaskTimer longTaskTimer = LongTaskTimer\n .builder("long.task.timer")\n .description("a description of what this timer does") // optional\n .tags("region", "test") // optional\n .register(registry);\n----\n\n:leveloffset!:\n\n== Histograms and Percentiles\n\n:leveloffset: +1\n\nTimers and distribution summaries support collecting data to observe their percentile distributions. There are two main approaches to viewing percentiles:\n\n* *Percentile histograms*: Micrometer accumulates values to an underlying histogram and ships a predetermined set of buckets to the monitoring system. The monitoring system\'s query language is responsible for calculating percentiles off of this histogram. Currently, only Prometheus, Atlas, and Wavefront support histogram-based percentile approximations, through `histogram_quantile`, `:percentile`, and `hs()`, respectively. If you target Prometheus, Atlas, or Wavefront, prefer this approach, since you can aggregate the histograms across dimensions (by summing the values of the buckets across a set of dimensions) and derive an aggregable percentile from the histogram.\n* *Client-side percentiles*: Micrometer computes a percentile approximation for each meter ID (set of name and tags) and ships the percentile value to the monitoring system. This is not as flexible as a percentile histogram because it is not possible to aggregate percentile approximations across tags. Nevertheless, it provides some level of insight into percentile distributions for monitoring systems that do not support server-side percentile calculation based on a histogram.\n\nThe following example builds a timer with a histogram:\n\n[source,java]\n----\nTimer.builder("my.timer")\n .publishPercentiles(0.5, 0.95) // median and 95th percentile <1>\n .publishPercentileHistogram() // <2>\n .serviceLevelObjectives(Duration.ofMillis(100)) // <3>\n .minimumExpectedValue(Duration.ofMillis(1)) // <4>\n .maximumExpectedValue(Duration.ofSeconds(10))\n----\n\n<1> `publishPercentiles`: Used to publish percentile values computed in your application. These values are non-aggregable across dimensions.\n<2> `publishPercentileHistogram`: Used to publish a histogram suitable for computing aggregable (across dimensions) percentile approximations in Prometheus (by using `histogram_quantile`), Atlas (by using `:percentile`), and Wavefront (by using `hs()`). For Prometheus and Atlas, the buckets in the resulting histogram are preset by Micrometer based on a generator that has been determined empirically by Netflix to yield a reasonable error bound on most real world timers and distribution summaries. By default, the generator yields 276 buckets, but Micrometer includes only those that are within the range set by `minimumExpectedValue` and `maximumExpectedValue`, inclusive. Micrometer clamps timers by default to a range of 1 millisecond to 1 minute, yielding 73 histogram buckets per timer dimension. `publishPercentileHistogram` has no effect on systems that do not support aggregable percentile approximations. No histogram is shipped for these systems.\n<3> `serviceLevelObjectives`: Used to publish a cumulative histogram with buckets defined by your SLOs. When used in concert with `publishPercentileHistogram` on a monitoring system that supports aggregable percentiles, this setting adds additional buckets to the published histogram. When used on a system that does not support aggregable percentiles, this setting causes a histogram to be published with only these buckets.\n<4> `minimumExpectedValue`/`maximumExpectedValue`: Controls the number of buckets shipped by `publishPercentileHistogram` and controls the accuracy and memory footprint of the underlying HdrHistogram structure.\n\nSince shipping percentiles to the monitoring system generates additional time series, it is generally preferable to *not* configure them in core libraries that are included as dependencies in applications. Instead, applications can turn on this behavior for some set of timers and distribution summaries by using a meter filter.\n\nFor example, suppose we have a handful of timers in a common library. We have prefixed these timer names with `myservice`:\n\n[source,java]\n----\nregistry.timer("myservice.http.requests").record(..);\nregistry.timer("myservice.db.requests").record(..);\n----\n\nWe can turn on client-side percentiles for both timers by using a meter filter:\n\n[source,java]\n----\nregistry.config().meterFilter(\n new MeterFilter() {\n @Override\n public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) {\n if(id.getName().startsWith("myservice")) {\n return DistributionStatisticConfig.builder()\n .percentiles(0.95)\n .build()\n .merge(config);\n }\n return config;\n }\n });\n----\n\n:leveloffset!:\n'},function(e,t,n){"use strict";n.r(t),t.default=n.p+"439c0eea1918ef143002cf62a9393e2a.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"594dce115710525d7771ebe3ab82db19.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"5cdb40b089820639454d90a5e4874aee.png"},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\nMicrometer provides several binders for monitoring the JVM:\n\n[source, java]\n----\nnew ClassLoaderMetrics().bindTo(registry); <1>\nnew JvmMemoryMetrics().bindTo(registry); <2>\nnew JvmGcMetrics().bindTo(registry); <3>\nnew ProcessorMetrics().bindTo(registry); <4>\nnew JvmThreadMetrics().bindTo(registry); <5>\n----\n<1> Gauges loaded and unloaded classes.\n<2> Gauges buffer and memory pool utilization.\n<3> Gauges max and live data size, promotion and allocation rates, and times GC pauses (or concurrent phase time in the case of CMS).\n<4> Gauges current CPU total and load average.\n<5> Gauges thread peak, number of daemon threads, and live threads.\n\nMicrometer also provides a meter binder for `ExecutorService`. You can instrument your `ExecutorService` as follows:\n\n[source, java]\n----\nnew ExecutorServiceMetrics(executor, executorServiceName, tags).bindTo(registry);\n----\n\nMetrics created from the binder vary based on the type of `ExecutorService`.\n\nFor `ThreadPoolExecutor`, the following metrics are provided:\n\n* `executor.completed` (`FunctionCounter`): The approximate total number of tasks that have completed execution.\n* `executor.active` (`Gauge`): The approximate number of threads that are actively executing tasks.\n* `executor.queued` (`Gauge`): The approximate number of tasks that are queued for execution.\n* `executor.pool.size` (`Gauge`): The current number of threads in the pool.\n\nFor `ForkJoinPool`, the following metrics are provided:\n\n* `executor.steals` (`FunctionCounter`): Estimate of the total number of tasks stolen from one thread's work queue by\nanother. The reported value underestimates the actual total number of steals when the pool is not quiescent.\n* `executor.queued` (`Gauge`): An estimate of the total number of tasks currently held in queues by worker threads.\n* `executor.active` (`Gauge`): An estimate of the number of threads that are currently stealing or executing tasks.\n* `executor.running` (`Gauge`): An estimate of the number of worker threads that are not blocked but are waiting to join tasks or for other managed synchronization threads.\n"},function(e,t,n){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\nMicrometer supports binding metrics to a variety of different popular caching libraries. Each implementation supports basic features, such as cache hits versus misses, from which you can derive basic information about the cache hit ratio over a period of time. Micrometer uses a function tracking counter to monitor such things as hits and misses, giving you a notion not only of hits and misses over the total life of the cache (the basic metric exposed from Guava\'s `CacheStats`, for example) but hits and misses inside a given interval.\n\nTo demonstrate the features of cache monitoring, we start with a simple program that uses `reactor-netty` to read the entirety of Mary Shelley\'s _Frankenstein_ and put each word in the cache if it has not yet been seen:\n\n====\n[source,java]\n----\n// read all of Frankenstein\nHttpClient.create("www.gutenberg.org")\n .get("/cache/epub/84/pg84.txt")\n .flatMapMany(res -> res.addHandler(wordDecoder()).receive().asString())\n .delayElements(Duration.ofMillis(10)) // one word per 10 ms\n .filter(word -> !word.isEmpty())\n .doOnNext(word -> {\n if (cache.getIfPresent(word) == null)\n cache.put(word, 1);\n })\n .blockLast();\n----\n====\n\nThe following image shows the hits versus misses on a cache that has been tuned to hold a maximum of 10,000 entries:\n\n.Hits vs. misses, viewed in Prometheus\nimage::'+n(71)+"[Hits vs. misses,width=800]\n\n```\nrate(book_guava_requests_total[10s])\n```\n\nBy dividing the hits by the sum of all `get` operations (regardless of whether or not each one was a hit or a miss), we can arrive at a notion of the upper bound for the hit ratio for reading Frankenstein with only 10,000 words:\n\n.Hit ratio, viewed by Prometheus\nimage::"+n(72)+'[Hit ratio,width=800]\n\n```\nsum(rate(book_guava_requests_total{result="hit"}[1m])) / sum(rate(book_guava_requests_total[1m]))\n```\n\nIn a real-world scenario, we tune caches according to how we evaluate the tradeoff between storage and load efficiency. You could create an alert based on some upper bound for the rate at which misses occur or on a lower bound for the hit ratio. Setting an upper bound on miss ratio is better than a lower bound on hit ratio. For both ratios, an absence of any activity drops the value to 0.\nThe following image shows the miss ratio when it exceeds 10%:\n\n.Alerting when the miss ratio exceeds 10%\nimage::'+n(73)+"[Miss ratio (alerted),width=800]\n"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"fd12bde9dc50409da244eb7ba80f6548.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"aa70057042488eef46660369434e99d4.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"3c191f6ce81fefe9b7d1980fc9d5b4fe.png"},function(e,t){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\nMicrometer supports binding metrics to `OkHttpClient` through `EventListener`.\n\nYou can collect metrics from `OkHttpClient` by adding `OkHttpMetricsEventListener` as follows:\n\n[source,java]\n----\nOkHttpClient client = new OkHttpClient.Builder()\n .eventListener(OkHttpMetricsEventListener.builder(registry, "okhttp.requests")\n .tags(Tags.of("foo", "bar"))\n .build())\n .build();\n----\n\nNOTE: The `uri` tag is usually limited to URI patterns to mitigate tag cardinality explosion, but `OkHttpClient` does not\nprovide URI patterns. We provide `URI_PATTERN` header to support `uri` tag, or you can configure a URI mapper to provide\nyour own tag values for `uri` tag.\n\nTo configure a URI mapper, you can use `uriMapper()` as follows:\n\n[source,java]\n----\nOkHttpClient client = new OkHttpClient.Builder()\n .eventListener(OkHttpMetricsEventListener.builder(registry, "okhttp.requests")\n .uriMapper(req -> req.url().encodedPath())\n .tags(Tags.of("foo", "bar"))\n .build())\n .build();\n----\n\nWARNING: The sample might trigger tag cardinality explosion, as a URI path itself is being used for tag values.\n'},function(e,t){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\nMicrometer supports binding metrics to `Jetty` through `Connection.Listener`.\n\nYou can collect metrics from `Jetty` by adding `JettyConnectionMetrics` as follows:\n\n[source,java]\n----\n Server server = new Server(0);\n Connector connector = new ServerConnector(server);\n connector.addBean(new JettyConnectionMetrics(registry, connector, Tags.of("foo", "bar"));\n server.setConnectors(new Connector[] { connector });\n----\n\nMicrometer also supports binding metrics to `Jersey` through `ApplicationEventListener`.\n\nYou can collect metrics from `Jersey` by adding `MetricsApplicationEventListener` as follows:\n\n[source,java]\n----\nResourceConfig resourceConfig = new ResourceConfig();\nresourceConfig.register(new MetricsApplicationEventListener(\n registry,\n new DefaultJerseyTagsProvider(),\n "http.server.requests",\n true));\nServletContainer servletContainer = new ServletContainer(resourceConfig);\n----\n'},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\nMicrometer supports binding metrics to `Netty`.\n\nYou can collect metrics from `ByteBuf` allocators and from `EventLoopGroup` instances.\nInstrumentation can be done once at startup, if resources are already known:\n\n[source,java,subs=+attributes]\n-----\n// Create or get an existing resources\nDefaultEventLoopGroup eventExecutors = new DefaultEventLoopGroup();\nUnpooledByteBufAllocator unpooledByteBufAllocator = new UnpooledByteBufAllocator(false);\n// Use binders to instrument them\nnew NettyEventExecutorMetrics(eventExecutors).bindTo(this.registry);\nnew NettyAllocatorMetrics(unpooledByteBufAllocator).bindTo(this.registry);\n-----\n\nNetty infrastructure can be configured in many ways, so you can also instrument lazily at runtime as resources are used.\nIf you do so, you must ensure that you will not bind metrics for the same resource multiple times as this can have runtime drawbacks:\n\n[source,java,subs=+attributes]\n-----\n@Override\nprotected void initChannel(SocketChannel channel) throws Exception {\n EventLoop eventLoop = channel.eventLoop();\n if (!isEventLoopInstrumented(eventLoop)) {\n new NettyEventExecutorMetrics(eventLoop).bindTo(this.meterRegistry);\n }\n ByteBufAllocator allocator = channel.alloc();\n if (!isAllocatorInstrumented(allocator) && allocator instanceof ByteBufAllocatorMetricProvider) {\n ByteBufAllocatorMetricProvider allocatorMetric = (ByteBufAllocatorMetricProvider) allocator;\n new NettyAllocatorMetrics(allocatorMetric).bindTo(this.meterRegistry);\n }\n}\n-----\n"},function(e,t){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Passing through to Dropwizard\'s Console Reporter\n:toc:\n\nThis guide shows how to plug in less commonly used Dropwizard `Reporter` implementations -- in this case, the `ConsoleReporter`.\n\n[source,java]\n----\n @Bean\n public MetricRegistry dropwizardRegistry() {\n return new MetricRegistry();\n }\n\n @Bean\n public ConsoleReporter consoleReporter(MetricRegistry dropwizardRegistry) {\n ConsoleReporter reporter = ConsoleReporter.forRegistry(dropwizardRegistry)\n .convertRatesTo(TimeUnit.SECONDS)\n .convertDurationsTo(TimeUnit.MILLISECONDS)\n .build();\n reporter.start(1, TimeUnit.SECONDS);\n return reporter;\n }\n\n @Bean\n public MeterRegistry consoleLoggingRegistry(MetricRegistry dropwizardRegistry) {\n DropwizardConfig consoleConfig = new DropwizardConfig() {\n\n @Override\n public String prefix() {\n return "console";\n }\n\n @Override\n public String get(String key) {\n return null;\n }\n\n };\n\n return new DropwizardMeterRegistry(consoleConfig, dropwizardRegistry, HierarchicalNameMapper.DEFAULT, Clock.SYSTEM) {\n @Override\n protected Double nullGaugeValue() {\n return null;\n }\n };\n }\n----\n\nNote that, in a Spring environment, this registry is added to other implementations in a composite and is used for all metrics, both custom and\nauto-configured.\n\n[source,java]\n----\nclass MyComponent {\n private final MeterRegistry registry;\n\n public MyComponent(MeterRegistry registry) {\n this.registry = registry;\n }\n\n public void doSomeWork(String lowCardinalityInput) {\n registry.timer("my.latency", "input", lowCardinalityInput).record(() -> {\n // do work\n });\n }\n}\n----\n\nThe following listing shows typical output for this custom timer:\n\n[source,txt]\n----\n3/2/18 10:14:27 AM =============================================================\n\n-- Timers ----------------------------------------------------------------------\nmyLatency.lowCardinalityInput.INPUT\n count = 1\n mean rate = 1.02 calls/second\n 1-minute rate = 0.00 calls/second\n 5-minute rate = 0.00 calls/second\n 15-minute rate = 0.00 calls/second\n min = 100.00 milliseconds\n max = 100.00 milliseconds\n mean = 100.00 milliseconds\n stddev = 0.00 milliseconds\n median = 100.00 milliseconds\n 75% <= 100.00 milliseconds\n 95% <= 100.00 milliseconds\n 98% <= 100.00 milliseconds\n 99% <= 100.00 milliseconds\n 99.9% <= 100.00 milliseconds\n----\n'},function(e,t){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= HttpSender with Resilience4j Retry\n\n`HttpSender` is an interface for HTTP clients that are used in meter registries for HTTP-based metrics publication. There\nare two implementations:\n\n* `HttpUrlConnectionSender`: `HttpURLConnection`-based `HttpSender`\n* `OkHttpSender`: OkHttp-based `HttpSender`\n\nThere is no out-of-the-box support for retry, but you can decorate it with Resilience4j retry, as follows:\n\n[source,java]\n----\n @Bean\n public DatadogMeterRegistry datadogMeterRegistry(DatadogConfig datadogConfig, Clock clock) {\n return DatadogMeterRegistry.builder(datadogConfig)\n .clock(clock)\n .httpClient(new RetryHttpClient())\n .build();\n }\n\n private static class RetryHttpClient extends HttpUrlConnectionSender {\n\n private final RetryConfig retryConfig = RetryConfig.custom()\n .maxAttempts(2)\n .waitDuration(Duration.ofSeconds(5))\n .build();\n\n private final Retry retry = Retry.of("datadog-metrics", this.retryConfig);\n\n @Override\n public Response send(Request request) {\n CheckedFunction0<Response> retryableSupplier = Retry.decorateCheckedSupplier(\n this.retry,\n () -> super.send(request));\n return Try.of(retryableSupplier).get();\n }\n\n }\n----\n'},function(e,t){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Custom Meter Registry\n\nMicrometer supports popular meter registries out of the box, so you should check those first.\nFor an existing meter registry, if you think that your requirements are generally useful, consider creating an issue or PR against the Micrometer issue tracker.\nFor a non-existent meter registry, if it is widely-used, consider creating an issue or PR for it.\n\nIf you need to create your own custom meter registry, you can create it by extending one of the base classes for meter registries: `MeterRegistry`, `PushMeterRegistry`, or `StepMeterRegistry`.\n\nThe most common way is to extend `StepMeterRegistry`.\nYou can create your own custom `StepMeterRegistry`.\n\nFirst, define your own meter registry configuration by extending `StepRegistryConfig`, as follows:\n\n[source,java]\n----\npublic interface CustomRegistryConfig extends StepRegistryConfig {\n\n CustomRegistryConfig DEFAULT = k -> null;\n\n @Override\n default String prefix() {\n return "custom";\n }\n\n}\n----\n\nSecond, define your own meter registry by extending `StepMeterRegistry`, as follows:\n\n[source,java]\n----\npublic class CustomMeterRegistry extends StepMeterRegistry {\n\n public CustomMeterRegistry(CustomRegistryConfig config, Clock clock) {\n super(config, clock);\n\n start(new NamedThreadFactory("custom-metrics-publisher"));\n }\n\n @Override\n protected void publish() {\n getMeters().stream().forEach(meter -> System.out.println("Publishing " + meter.getId()));\n }\n\n @Override\n protected TimeUnit getBaseTimeUnit() {\n return TimeUnit.MILLISECONDS;\n }\n\n}\n----\n\nFinally, create the meter registry configuration and the meter registry.\nIf you use Spring Boot, you can do so as follows:\n\n[source,java]\n----\n@Configuration\npublic class MetricsConfig {\n\n @Bean\n public CustomRegistryConfig customRegistryConfig() {\n return CustomRegistryConfig.DEFAULT;\n }\n\n @Bean\n public CustomMeterRegistry customMeterRegistry(CustomRegistryConfig customRegistryConfig, Clock clock) {\n return new CustomMeterRegistry(customRegistryConfig, clock);\n }\n\n}\n----\n'},function(e,t){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Observation\n:toc:\n:sectnums:\n:dimensional: true\n\n== Purpose\n\nMicrometer Observation is part of the https://github.com/micrometer-metrics/micrometer[Micrometer] project and contains the Observation API. The main idea behind it is that you\n\n> Instrument code once, and get multiple benefits out of it\n\n== Installing\n\nMicrometer comes with a Bill of Materials (BOM) which is a project that manages all the project versions for consistency.\n\nThe following example shows the required dependency for Micrometer Observation in Gradle:\n\n[source,groovy,subs=+attributes]\n----\nimplementation platform(\'io.micrometer:micrometer-bom:latest.release\')\nimplementation \'io.micrometer:micrometer-observation\'\n----\n\nThe following example shows the required dependency in Maven:\n\n[source,xml,subs=+attributes]\n----\n<dependencyManagement>\n <dependencies>\n <dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-bom</artifactId>\n <version>${micrometer.version}</version>\n <type>pom</type>\n <scope>import</scope>\n </dependency>\n </dependencies>\n</dependencyManagement>\n\n<dependencies>\n <dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-observation</artifactId>\n </dependency>\n</dependencies>\n----\n\n== Introduction\n\n:leveloffset: +1\n\nFor any Observation to happen, you need to register `ObservationHandler` objects through an `ObservationRegistry`. An `ObservationHandler` reacts only to supported implementations of an `Observation.Context` and can create timers, spans, and logs by reacting to the lifecycle events of an Observation such as\n\n* `start` - Observation has been started. Happens when the `Observation#start()` method gets called.\n* `stop` - Observation has been stopped. Happens when the `Observation#stop()` method gets called.\n* `error` - An error occurred while observing. Happens when the `Observation#error(exception)` method gets called.\n* `event` - An event happened when observing. Happens when the `Observation#event(event)` method gets called.\n* `scope started` - Observation opens a Scope. The Scope must be closed when no longer used. Handlers can create thread local variables on start that are cleared upon closing of the scope. Happens when the `Observation#openScope()` method gets called.\n* `scope stopped` - Observation stops a Scope. Happens when the `Observation.Scope#close()` method gets called.\n\nWhenever any of these methods is called, an `ObservationHandler` method (such as `onStart(T extends Observation.Context ctx)`, `onStop(T extends Observation.Context ctx)`, and so on) is called. To pass state between the handler methods, you can use the `Observation.Context`.\n\nThis is how Observation state diagram looks like:\n\n[source]\n----\n Observation Observation\n Context Context\nCreated ----------\x3e Started ----------\x3e Stopped\n----\n\nThis is how Observation Scope state diagram looks like:\n\n[source]\n----\n Observation\n Context\nScope Started ----------\x3e Scope Finished\n----\n\nTo make it possible to debug production problems an Observation needs additional metadata such as key-value pairs (also known as tags). You can then query your metrics or distributed tracing backend by those tags to find the required data. Tags can be either of high or low cardinality.\n\nIMPORTANT: *High cardinality* means that a pair will have an unbounded number of possible values. An HTTP URL is a good\nexample of such a key value (e.g. `/foo/user1234`, `/foo/user2345` etc.). *Low cardinality* means that a key value will have a bounded number of possible values. A *templated* HTTP URL is a good example of such a key value (e.g. `/foo/{userId}`).\n\nTo separate Observation lifecycle operations from an Observation configuration (such as names and low and high cardinality tags), you can use the `ObservationConvention` that provides an easy way of overriding the default naming conventions.\n\nBelow you can find an example of using the Observation API.\n\n[source,java,subs=+attributes]\n-----\nstatic class Example {\n\n private final ObservationRegistry registry;\n\n Example(ObservationRegistry registry) {\n this.registry = registry;\n }\n\n void run() {\n Observation.createNotStarted("foo", registry)\n .lowCardinalityKeyValue("lowTag", "lowTagValue")\n .highCardinalityKeyValue("highTag", "highTagValue")\n .observe(() -> System.out.println("Hello"));\n }\n\n}\n-----\n\nTIP: Calling `observe(() -> ...)` leads to starting the Observation, putting it in scope, running the lambda, putting an error on the Observation if one took place, closing the scope and stopping the Observation.\n\n:leveloffset!:\n\n== ObservationHandler\n\n:leveloffset: +1\n\nA popular way to record them is storing the start state in a `Timer.Sample` instance and stopping it when the event has ended.\nRecording such measurements could look like this:\n\n[source,java,subs=+attributes]\n-----\nMeterRegistry registry = new SimpleMeterRegistry();\nTimer.Sample sample = Timer.start(registry);\ntry {\n // do some work here\n}\nfinally {\n sample.stop(Timer.builder("my.timer").register(registry));\n}\n-----\n\nIf you want to have more observation options (such as metrics and tracing out of the box plus anything else you will plug in) then you\'ll need to rewrite that code to use the `Observation` API.\n\n[source,java,subs=+attributes]\n-----\nObservationRegistry registry = ObservationRegistry.create();\nObservation.createNotStarted("my.operation", registry).observe(this::doSomeWorkHere);\n-----\n\nOne of the new features in Micrometer 1.10 is the ability to register "handlers" (`ObservationHandler`) that are notified about the lifecycle event of an observation (e.g.: you can run custom code when an observation is started/stopped).\nUsing this feature lets you add tracing capabilities to your existing metrics instrumentation (see: `DefaultTracingObservationHandler`). The implementation of these handlers does not need to be tracing related, it is completely up to you how you are going to implement them (e.g.: you can add logging capabilities) if you want.\n\n=== Observation.Context\n\nIn order to pass information between the instrumented code and the handler (or between handler methods, e.g.: `onStart` and `onStop`), you can utilize an `Observation.Context`. An `Observation.Context` is a `Map`-like container that can store values for you while your handler can access the data inside the context.\n\n=== ObservationHandler Example\n\nBased on this, we can implement a simple handler that lets the users know about its invocations by printing them out to `stdout`.\n\n[source,java,subs=+attributes]\n-----\nstatic class SimpleHandler implements ObservationHandler<Observation.Context> {\n\n @Override\n public void onStart(Observation.Context context) {\n System.out.println("START " + "data: " + context.get(String.class));\n }\n\n @Override\n public void onError(Observation.Context context) {\n System.out.println("ERROR " + "data: " + context.get(String.class) + ", error: " + context.getError());\n }\n\n @Override\n public void onEvent(Observation.Event event, Observation.Context context) {\n System.out.println("EVENT " + "event: " + event + " data: " + context.get(String.class));\n }\n\n @Override\n public void onStop(Observation.Context context) {\n System.out.println("STOP " + "data: " + context.get(String.class));\n }\n\n @Override\n public boolean supportsContext(Observation.Context handlerContext) {\n // you can decide if your handler should be invoked for this context object or\n // not\n return true;\n }\n\n}\n-----\n\nYou need to register the handler to the `ObservationRegistry`.\n\n[source,java,subs=+attributes]\n-----\nObservationRegistry registry = ObservationRegistry.create();\nregistry.observationConfig().observationHandler(new SimpleHandler());\n-----\n\nYou can use the `observe` method to instrument your codebase.\n\n[source,java,subs=+attributes]\n-----\nObservationRegistry registry = ObservationRegistry.create();\nObservation.Context context = new Observation.Context().put(String.class, "test");\n// using a context is optional, so you can call createNotStarted without it:\n// Observation.createNotStarted(name, registry)\nObservation.createNotStarted("my.operation", () -> context, registry).observe(this::doSomeWorkHere);\n-----\n\nYou can also take full control of the scoping mechanism.\n\n[source,java,subs=+attributes]\n-----\nObservationRegistry registry = ObservationRegistry.create();\nObservation.Context context = new Observation.Context().put(String.class, "test");\n// using a context is optional, so you can call start without it:\n// Observation.start(name, registry)\nObservation observation = Observation.start("my.operation", () -> context, registry);\ntry (Observation.Scope scope = observation.openScope()) {\n doSomeWorkHere();\n}\ncatch (Exception ex) {\n observation.error(ex); // and don\'t forget to handle exceptions\n throw ex;\n}\nfinally {\n observation.stop();\n}\n-----\n\n=== Signaling Errors and Arbitrary Events\n\nWhen **instrumenting** code we might want to signal that an error happened or signal that an arbitrary event happened. The observation API lets us do it via it `error` and `event` methods.\n\nOne use-case for signaling arbitrary event can be attaching annotations to `Span` for Distributed Tracing but you can also process them however you want in your own handler, e.g.: emit log events based on them.\n\n[source,java,subs=+attributes]\n-----\nObservationRegistry registry = ObservationRegistry.create();\nObservation observation = Observation.start("my.operation", registry);\ntry (Observation.Scope scope = observation.openScope()) {\n observation.event(Observation.Event.of("my.event", "look what happened"));\n doSomeWorkHere();\n}\ncatch (Exception exception) {\n observation.error(exception);\n throw exception;\n}\nfinally {\n observation.stop();\n}\n-----\n\n=== Observation.ObservationConvention Example\n\nWhen **instrumenting** code we want to provide sensible defaults for tags but also we want to allow users to easily change those defaults. An `ObservationConvention` interface is a description of what tags and name we should create for an `Observation.Context`. See the full usage example of an instrumentation together with overriding the default tags.\n\n[source,java,subs=+attributes]\n-----\n\n/**\n * A dedicated {@link Observation.Context} used for taxing.\n */\nclass TaxContext extends Observation.Context {\n\n private final String taxType;\n\n private final String userId;\n\n TaxContext(String taxType, String userId) {\n this.taxType = taxType;\n this.userId = userId;\n }\n\n String getTaxType() {\n return taxType;\n }\n\n String getUserId() {\n return userId;\n }\n\n}\n\n/**\n * An example of an {@link ObservationFilter} that will add the key-values to all\n * observations.\n */\nclass CloudObservationFilter implements ObservationFilter {\n\n @Override\n public Observation.Context map(Observation.Context context) {\n return context.addLowCardinalityKeyValue(KeyValue.of("cloud.zone", CloudUtils.getZone()))\n .addHighCardinalityKeyValue(KeyValue.of("cloud.instance.id", CloudUtils.getCloudInstanceId()));\n }\n\n}\n\n/**\n * An example of an {@link ObservationConvention} that renames the tax related\n * observations and adds cloud related tags to all contexts. When registered via the\n * `ObservationRegistry#observationConfig#observationConvention` will override the\n * default {@link TaxObservationConvention}. If the user provides a custom\n * implementation of the {@link TaxObservationConvention} and passes it to the\n * instrumentation, the custom implementation wins.\n *\n * In other words\n *\n * 1) Custom {@link ObservationConvention} has precedence 2) If no custom convention\n * was passed and there\'s a matching {@link GlobalObservationConvention} it will be\n * picked 3) If there\'s no custom, nor matching global convention, the default\n * {@link ObservationConvention} will be used\n *\n * If you need to add some key-values regardless of the used\n * {@link ObservationConvention} you should use an {@link ObservationFilter}.\n */\nclass GlobalTaxObservationConvention implements GlobalObservationConvention<TaxContext> {\n\n // this will be applicable for all tax contexts - it will rename all the tax\n // contexts\n @Override\n public boolean supportsContext(Observation.Context context) {\n return context instanceof TaxContext;\n }\n\n @Override\n public String getName() {\n return "global.tax.calculate";\n }\n\n}\n\n// Interface for an ObservationConvention related to calculating Tax\ninterface TaxObservationConvention extends ObservationConvention<TaxContext> {\n\n @Override\n default boolean supportsContext(Observation.Context context) {\n return context instanceof TaxContext;\n }\n\n}\n\n/**\n * Default convention of tags related to calculating tax. If no user one or global\n * convention will be provided then this one will be picked.\n */\nclass DefaultTaxObservationConvention implements TaxObservationConvention {\n\n @Override\n public KeyValues getLowCardinalityKeyValues(TaxContext context) {\n return KeyValues.of(TAX_TYPE.withValue(context.getTaxType()));\n }\n\n @Override\n public KeyValues getHighCardinalityKeyValues(TaxContext context) {\n return KeyValues.of(USER_ID.withValue(context.getUserId()));\n }\n\n @Override\n public String getName() {\n return "default.tax.name";\n }\n\n}\n\n/**\n * If micrometer-docs-generator is used, we will automatically generate documentation\n * for your observations. Check this URL\n * https://github.com/micrometer-metrics/micrometer-docs-generator#documentation for\n * setup example and read the {@link ObservationDocumentation} javadocs.\n */\nenum TaxObservationDocumentation implements ObservationDocumentation {\n\n CALCULATE {\n @Override\n public Class<? extends ObservationConvention<? extends Observation.Context>> getDefaultConvention() {\n return DefaultTaxObservationConvention.class;\n }\n\n @Override\n public String getContextualName() {\n return "calculate tax";\n }\n\n @Override\n public String getPrefix() {\n return "tax";\n }\n\n @Override\n public KeyName[] getLowCardinalityKeyNames() {\n return TaxLowCardinalityKeyNames.values();\n }\n\n @Override\n public KeyName[] getHighCardinalityKeyNames() {\n return TaxHighCardinalityKeyNames.values();\n }\n };\n\n enum TaxLowCardinalityKeyNames implements KeyName {\n\n TAX_TYPE {\n @Override\n public String asString() {\n return "tax.type";\n }\n }\n\n }\n\n enum TaxHighCardinalityKeyNames implements KeyName {\n\n USER_ID {\n @Override\n public String asString() {\n return "tax.user.id";\n }\n }\n\n }\n\n}\n\n/**\n * Our business logic that we want to observe.\n */\nclass TaxCalculator {\n\n private final ObservationRegistry observationRegistry;\n\n // If the user wants to override the default they can override this. Otherwise,\n // it will be {@code null}.\n @Nullable\n private final TaxObservationConvention observationConvention;\n\n TaxCalculator(ObservationRegistry observationRegistry,\n @Nullable TaxObservationConvention observationConvention) {\n this.observationRegistry = observationRegistry;\n this.observationConvention = observationConvention;\n }\n\n void calculateTax(String taxType, String userId) {\n // Create a new context\n TaxContext taxContext = new TaxContext(taxType, userId);\n // Create a new observation\n TaxObservationDocumentation.CALCULATE\n .observation(this.observationConvention, new DefaultTaxObservationConvention(), () -> taxContext,\n this.observationRegistry)\n // Run the actual logic you want to observe\n .observe(this::calculateInterest);\n }\n\n private void calculateInterest() {\n // do some work\n }\n\n}\n\n/**\n * Example of user changing the default conventions.\n */\nclass CustomTaxObservationConvention extends DefaultTaxObservationConvention {\n\n @Override\n public KeyValues getLowCardinalityKeyValues(TaxContext context) {\n return super.getLowCardinalityKeyValues(context)\n .and(KeyValue.of("additional.low.cardinality.tag", "value"));\n }\n\n @Override\n public KeyValues getHighCardinalityKeyValues(TaxContext context) {\n return KeyValues.of("this.would.override.the.default.high.cardinality.tags", "value");\n }\n\n @Override\n public String getName() {\n return "tax.calculate";\n }\n\n}\n\n/**\n * A utility class to set cloud related arguments.\n */\nstatic class CloudUtils {\n\n static String getZone() {\n return "...";\n }\n\n static String getCloudInstanceId() {\n return "...";\n }\n\n}\n-----\n\nBelow you can find an example of setting the whole code together.\n\n[source,java,subs=+attributes]\n-----\n// Registry setup\nObservationRegistry observationRegistry = ObservationRegistry.create();\n// add metrics\nSimpleMeterRegistry registry = new SimpleMeterRegistry();\nobservationRegistry.observationConfig().observationHandler(new DefaultMeterObservationHandler(registry));\nobservationRegistry.observationConfig().observationConvention(new GlobalTaxObservationConvention());\n// This will be applied to all observations\nobservationRegistry.observationConfig().observationFilter(new CloudObservationFilter());\n\n// In this case we\'re overriding the default convention by passing the custom one\nTaxCalculator taxCalculator = new TaxCalculator(observationRegistry, new CustomTaxObservationConvention());\n// run the logic you want to observe\ntaxCalculator.calculateTax("INCOME_TAX", "1234567890");\n-----\n\n=== Observation Predicates and Filters\n\nTo globally disable observations under given conditions you can use an `ObservationPredicate`. To mutate the `Observation.Context` you can use an `ObservationFilter`.\n\nTo set these just call `ObservationRegistry#observationConfig()#observationPredicate()` and `ObservationRegistry#observationConfig()#observationFilter()` methods respectively.\n\nBelow you can find an example of predicates and filters.\n\n[source,java,subs=+attributes]\n-----\n// Example using a metrics handler - we need a MeterRegistry\nMeterRegistry meterRegistry = new SimpleMeterRegistry();\n\n// Create an ObservationRegistry\nObservationRegistry registry = ObservationRegistry.create();\n// Add predicates and filter to the registry\nregistry.observationConfig()\n // ObservationPredicate can decide whether an observation should be\n // ignored or not\n .observationPredicate((observationName, context) -> {\n // Creates a noop observation if observation name is of given name\n if ("to.ignore".equals(observationName)) {\n // Will be ignored\n return false;\n }\n if (context instanceof MyContext) {\n // For the custom context will ignore a user with a given name\n return !"user to ignore".equals(((MyContext) context).getUsername());\n }\n // Will proceed for all other types of context\n return true;\n })\n // ObservationFilter can modify a context\n .observationFilter(context -> {\n // We\'re adding a low cardinality key to all contexts\n context.addLowCardinalityKeyValue(KeyValue.of("low.cardinality.key", "low cardinality value"));\n if (context instanceof MyContext) {\n // We\'re mutating a specific type of a context\n MyContext myContext = (MyContext) context;\n myContext.setUsername("some username");\n // We want to remove a high cardinality key value\n return myContext.removeHighCardinalityKeyValue("high.cardinality.key.to.ignore");\n }\n return context;\n })\n // Example of using metrics\n .observationHandler(new DefaultMeterObservationHandler(meterRegistry));\n\n// Observation will be ignored because of the name\nthen(Observation.start("to.ignore", () -> new MyContext("don\'t ignore"), registry)).isSameAs(Observation.NOOP);\n// Observation will be ignored because of the entries in MyContext\nthen(Observation.start("not.to.ignore", () -> new MyContext("user to ignore"), registry))\n .isSameAs(Observation.NOOP);\n\n// Observation will not be ignored...\nMyContext myContext = new MyContext("user not to ignore");\nmyContext.addHighCardinalityKeyValue(KeyValue.of("high.cardinality.key.to.ignore", "some value"));\nObservation.createNotStarted("not.to.ignore", () -> myContext, registry).observe(this::yourCodeToMeasure);\n// ...and will have the context mutated\nthen(myContext.getLowCardinalityKeyValue("low.cardinality.key").getValue()).isEqualTo("low cardinality value");\nthen(myContext.getUsername()).isEqualTo("some username");\nthen(myContext.getHighCardinalityKeyValues())\n .doesNotContain(KeyValue.of("high.cardinality.key.to.ignore", "some value"));\n-----\n\n=== Using Annotations With @Observed\n\nIf you have turned on Aspect Oriented Programming (e.g. via `org.aspectj:aspectjweaver`) you can use the `@Observed` annotation to create observations. You can put that annotation either on a method to observe it or a class to observe all methods in it. Let\'s look at the following example.\n\nHere you can see an `ObservedService` that has an annotation on a method.\n\n[source,java,subs=+attributes]\n-----\nstatic class ObservedService {\n\n @Observed(name = "test.call", contextualName = "test#call",\n lowCardinalityKeyValues = { "abc", "123", "test", "42" })\n void call() {\n System.out.println("call");\n }\n\n}\n-----\n\nThe following test asserts whether the proper observation gets created when a proxied `ObservedService` instance gets called.\n\n[source,java,subs=+attributes]\n-----\n// create a test registry\nTestObservationRegistry registry = TestObservationRegistry.create();\n// add a system out printing handler\nregistry.observationConfig().observationHandler(new ObservationTextPublisher());\n\n// create a proxy around the observed service\nAspectJProxyFactory pf = new AspectJProxyFactory(new ObservedService());\npf.addAspect(new ObservedAspect(registry));\n\n// make a call\nObservedService service = pf.getProxy();\nservice.call();\n\n// assert that observation has been properly created\nTestObservationRegistryAssert.assertThat(registry)\n .hasSingleObservationThat()\n .hasBeenStopped()\n .hasNameEqualTo("test.call")\n .hasContextualNameEqualTo("test#call")\n .hasLowCardinalityKeyValue("abc", "123")\n .hasLowCardinalityKeyValue("test", "42")\n .hasLowCardinalityKeyValue("class", ObservedService.class.getName())\n .hasLowCardinalityKeyValue("method", "call").doesNotHaveError();\n-----\n\n:leveloffset!:\n\n== Instrumenting\n\n:leveloffset: +1\n\nIn this section we will see some common examples of reusing existing Micrometer and Micrometer Tracing handlers and context types to do instrumentation.\n\nIMPORTANT: Before you decide to instrument a project yourself, please double-check whether it hasn\'t already been instrumented!\n\nTo better understand how you can do instrumentation we need to distinguish two concepts.\n\n- Context propagation\n- Creation of Observations\n\n*Context propagation* - we propagate existing context through threads or network. We\'re using the https://micrometer.io/docs/contextPropagation[Micrometer Context Propagation] library to define the context and to propagate it through threads. We\'re using dedicated `SenderContext` and `ReceiverContext` objects, together with Micrometer Tracing handlers, to create Observations that will propagate context over the wire.\n\n*Creation of Observations* - we want to wrap an operation in an Observation to get measurements. We need to know if there previously has been a parent Observation to maintain the parent-child relationship of Observations.\n\n[[instrumentation_of_thread_switching_components]]\n== Instrumentation of Thread Switching Components\n\nWe might want to create an Observation around a `Runnable` or `Callable` that we\'re submitting through an `Executor`. For that to work we need to know if in the parent thread there was an Observation that the new thread should continue, or for which a child Observation should be created.\n\nLet\'s look at the following example.\n\n[source,java,subs=+attributes]\n-----\n// Example of an Executor Service\nExecutorService executor = Executors.newCachedThreadPool();\n\n\n// This snippet shows an example of how to wrap in an observation code that would\n// be executed in a separate thread\n\n// Let\'s assume that we have a parent observation\nObservation parent = Observation.createNotStarted("parent", registry);\n// Observation is put in scope via the <observe()> method\nFuture<Boolean> child = parent.observe(() -> {\n // [Thread 1] Current Observation is the same as <parent>\n then(registry.getCurrentObservation()).isSameAs(parent);\n // [Thread 1] We\'re wrapping the executor in a Context Propagating version.\n // <ContextExecutorService> comes from Context Propagation library\n return ContextExecutorService.wrap(executor).submit(() -> {\n // [Thread 2] Current Observation is same as <parent> - context got\n // propagated\n then(registry.getCurrentObservation()).isSameAs(parent);\n // Wraps the code that should be run in a separate thread in an\n // observation\n return Observation.createNotStarted("child", registry).observe(this::yourCodeToMeasure);\n });\n});\n-----\n\n[[instrumentation_of_reactive_libraries]]\n== Instrumentation of Reactive Libraries\n\nIn this section we\'ll discuss how to wrap Reactive libraries in Observations and how to use Reactor Context to safely propagate Observations between threads.\n\n[[instrumentation_of_reactive_libraries_after_reactor_3_5_3]]\n=== For Reactor 3.5.3 and After\n\nIn Reactor 3.5.3 release (through this https://github.com/reactor/reactor-core/pull/3335[PR]) an option to turn on automated context propagation was added. To use this, please ensure that you\'re using the following projects at minimum in the following versions:\n\n- Reactor https://github.com/reactor/reactor-core/releases/tag/v3.5.7[3.5.7]\n- Micrometer Context-Propagation https://github.com/micrometer-metrics/context-propagation/releases/tag/v1.0.3[1.0.3]\n- Micrometer https://github.com/micrometer-metrics/micrometer/releases/tag/v1.10.8[1.10.8]\n- Micrometer Tracing https://github.com/micrometer-metrics/tracing/releases/tag/v1.0.7[1.0.7]\n\nTo use the feature call the new Reactor\'s Hook method (e.g. in your `public static void main` method) like this\n\n[source,java,subs=+attributes]\n-----\nHooks.enableAutomaticContextPropagation();\n-----\n\nThis will automatically wrap Reactor internal mechanisms to propagate context between operators, threads etc. Usage of `tap` and `handle` or Context Propagation API is not required.\n\nLet\'s look at the following example.\n\n[source,java,subs=+attributes]\n-----\n// This snippet shows an example of how to use the new Hook API with Reactor\nHooks.enableAutomaticContextPropagation();\n// Starting from Micrometer 1.10.8 you need to set your registry on this singleton\n// instance of OTLA\nObservationThreadLocalAccessor.getInstance().setObservationRegistry(registry);\n\n// Let\'s assume that we have a parent observation\nObservation parent = Observation.start("parent", registry);\n// Now we put it in thread local\nparent.scoped(() -> {\n\n // Example of propagating whatever there was in thread local\n Integer block = Mono.just(1).publishOn(Schedulers.boundedElastic()).doOnNext(integer -> {\n log.info("Context Propagation happens - the <parent> observation gets propagated ["\n + registry.getCurrentObservation() + "]");\n then(registry.getCurrentObservation()).isSameAs(parent);\n })\n .flatMap(integer -> Mono.just(integer).map(monoInteger -> monoInteger + 1))\n .transformDeferredContextual((integerMono, contextView) -> integerMono.doOnNext(integer -> {\n log.info("Context Propagation happens - the <parent> observation gets propagated ["\n + registry.getCurrentObservation() + "]");\n then(registry.getCurrentObservation()).isSameAs(parent);\n }))\n // Let\'s assume that we\'re modifying the context\n .contextWrite(context -> context.put("foo", "bar"))\n // Since we are NOT part of the Reactive Chain (e.g. this is not a\n // WebFlux application)\n // you MUST call <contextCapture> to capture all ThreadLocal values\n // and store them in a Reactor Context.\n // ----------------------\n // If you were part of the\n // Reactive Chain (e.g. returning Mono from endpoint)\n // there is NO NEED to call <contextCapture>. If you need to propagate\n // your e.g. Observation\n // to the Publisher you just created (e.g. Mono or Flux) please\n // consider adding it\n // to the Reactor Context directly instead of opening an Observation\n // scope and calling <contextCapture> (see example below).\n .contextCapture()\n .block();\n\n // We\'re still using <parent> as current observation\n then(registry.getCurrentObservation()).isSameAs(parent);\n\n then(block).isEqualTo(2);\n\n // Now, we want to create a child observation for a Reactor stream and put it\n // to Reactor Context\n // Automatically its parent will be <parent> observation since <parent> is in\n // Thread Local\n Observation child = Observation.start("child", registry);\n block = Mono.just(1).publishOn(Schedulers.boundedElastic()).doOnNext(integer -> {\n log.info(\n "Context Propagation happens - the <child> observation from Reactor Context takes precedence over thread local <parent> observation ["\n + registry.getCurrentObservation() + "]");\n then(registry.getCurrentObservation()).isSameAs(child);\n })\n .flatMap(integer -> Mono.just(integer).map(monoInteger -> monoInteger + 1))\n .transformDeferredContextual((integerMono, contextView) -> integerMono.doOnNext(integer -> {\n log.info(\n "Context Propagation happens - the <child> observation from Reactor Context takes precedence over thread local <parent> observation ["\n + registry.getCurrentObservation() + "]");\n then(registry.getCurrentObservation()).isSameAs(child);\n }))\n // Remember to stop the child Observation!\n .doFinally(signalType -> child.stop())\n // When using Reactor we ALWAYS search for\n // ObservationThreadLocalAccessor.KEY entry in the Reactor Context to\n // search for an Observation. You DON\'T have to use <contextCapture>\n // because\n // you have manually provided the ThreadLocalAccessor key\n .contextWrite(context -> context.put(ObservationThreadLocalAccessor.KEY, child))\n .block();\n\n // We\'re back to having <parent> as current observation\n then(registry.getCurrentObservation()).isSameAs(parent);\n\n then(block).isEqualTo(2);\n});\n\n// There should be no remaining observation\nthen(registry.getCurrentObservation()).isNull();\n\n// We need to stop the parent\nparent.stop();\n-----\n\nIf performance of this approach is not satisfactory, please verify whether disabling the hook and explicitly using `handle` or `tap` operators improves the performance.\n\n[[instrumentation_of_reactive_libraries_before_reactor_3_5_3]]\n=== Before Reactor 3.5.3\n\nThe preferred way of propagating elements through the Flux using Reactor is not via ``ThreadLocal``s but through Reactor Context. Reactor however gives you two operators, `tap()` and `handle()` where, if https://micrometer.io/docs/contextPropagation[Micrometer Context Propagation] library is on the classpath, it will set thread local values for you.\n\nLet\'s look at the following example.\n\n[source,java,subs=+attributes]\n-----\n// This snippet shows an example of how to wrap code that is using Reactor\n\n// Let\'s assume that we have a parent observation\nObservation parent = Observation.start("parent", registry);\n\n// We want to create a child observation for a Reactor stream\nObservation child = Observation.start("child", registry)\n // There\'s no thread local entry, so we will pass parent observation\n // manually. If we put the Observation in scope we could then call\n // <.contextCapture()> method from Reactor to capture all thread locals\n // and store them in Reactor Context.\n .parentObservation(parent);\nInteger block = Mono.just(1)\n // Example of not propagating context by default\n .doOnNext(integer -> {\n log.info(\n "No context propagation happens by default in Reactor - there will be no Observation in thread local here ["\n + registry.getCurrentObservation() + "]");\n then(registry.getCurrentObservation()).isNull();\n })\n // Example of having entries in thread local for <tap()> operator\n .tap(() -> new DefaultSignalListener<Integer>() {\n @Override\n public void doFirst() throws Throwable {\n log.info("We\'re using tap() -> there will be Observation in thread local here ["\n + registry.getCurrentObservation() + "]");\n then(registry.getCurrentObservation()).isNotNull();\n }\n })\n .flatMap(integer -> Mono.just(integer).map(monoInteger -> monoInteger + 1))\n // Example of retrieving ThreadLocal entries via ReactorContext\n .transformDeferredContextual((integerMono, contextView) -> integerMono.doOnNext(integer -> {\n try (ContextSnapshot.Scope scope = ContextSnapshot.setAllThreadLocalsFrom(contextView)) {\n log.info(\n "We\'re retrieving thread locals from Reactor Context - there will be Observation in thread local here ["\n + registry.getCurrentObservation() + "]");\n then(registry.getCurrentObservation()).isNotNull();\n }\n }))\n // Example of having entries in thread local for <handle()> operator\n .handle((BiConsumer<Integer, SynchronousSink<Integer>>) (integer, synchronousSink) -> {\n log.info("We\'re using handle() -> There will be Observation in thread local here ["\n + registry.getCurrentObservation() + "]");\n then(registry.getCurrentObservation()).isNotNull();\n synchronousSink.next(integer);\n })\n // Remember to stop the child Observation!\n .doFinally(signalType -> child.stop())\n // When using Reactor we ALWAYS search for\n // ObservationThreadLocalAccessor.KEY entry in the Reactor Context to\n // search for an Observation\n .contextWrite(context -> context.put(ObservationThreadLocalAccessor.KEY, child))\n // If there were ThreadLocal entries that are using Micrometer Context\n // Propagation they would be caught here. All implementations of\n // <ThreadLocalAccessor> will store their thread local entries under their\n // keys in Reactor Context\n .contextCapture()\n .block();\n\n// We didn\'t have any observations in thread local\nthen(registry.getCurrentObservation()).isNull();\n\n// We need to stop the parent\nparent.stop();\n\nthen(block).isEqualTo(2);\n-----\n\n[[instrumentation_of_http_communication]]\n== Instrumentation of HTTP Communication\n\nIn order to instrument an HTTP-based communication we need to use the `RequestReplySenderContext` and `RequestReplyReceiverContext` for the client and server side respectively.\n\nAs an example for the client side we will use a handler that instruments the HTTP request by adding a `foo:bar` header (if you have Micrometer Tracing on the classpath you could reuse the `PropagatingSenderTracingObservationHandler` and `PropagatingReceiverTracingObservationHandler` to propagate tracing context over the wire). Let\'s look at the example of such a handler.\n\n[source,java,subs=+attributes]\n-----\nstatic class HeaderPropagatingHandler implements ObservationHandler<SenderContext<Object>> {\n\n @Override\n public void onStart(SenderContext<Object> context) {\n context.getSetter().set(context.getCarrier(), "foo", "bar");\n }\n\n @Override\n public boolean supportsContext(Observation.Context context) {\n return context instanceof SenderContext;\n }\n\n}\n-----\n\nLet\'s look at the following of HTTP client side instrumentation that reuses the handler.\n\n[source,java,subs=+attributes]\n-----\n// This example can be combined with the idea of ObservationConvention to allow\n// users to easily customize the key values. Please read the rest of the\n// documentation on how to do it.\n\n// In Micrometer Tracing we would have predefined\n// PropagatingSenderTracingObservationHandler but for the sake of this demo we\n// create our own handler that puts "foo":"bar" headers into the request\nregistry.observationConfig().observationHandler(new HeaderPropagatingHandler());\n\n// We\'re using WireMock to stub the HTTP GET call to "/foo" with a response "OK"\nstubFor(get("/foo").willReturn(ok().withBody("OK")));\n\n// RequestReplySenderContext is a special type of context used for request-reply\n// communication. It requires to define what the Request type is and how we can\n// instrument it. It also needs to know what the Response type is\nRequestReplySenderContext<HttpUriRequestBase, ClassicHttpResponse> context = new RequestReplySenderContext<>(\n (carrier, key, value) -> Objects.requireNonNull(carrier).addHeader(key, value));\n\n// We\'re instrumenting the Apache HTTPClient\ntry (CloseableHttpClient httpclient = HttpClients.createDefault()) {\n // The HttpGet is our carrier (we can mutate it to instrument the headers)\n HttpGet httpget = new HttpGet(info.getHttpBaseUrl() + "/foo");\n // We must set the carrier BEFORE we run <Observation#start>\n context.setCarrier(httpget);\n // You can set the remote service address to provide more debugging\n // information\n context.setRemoteServiceAddress(info.getHttpBaseUrl());\n // Examples of setting key values from the request\n Observation observation = Observation.createNotStarted("http.client.requests", () -> context, registry)\n .contextualName("HTTP " + httpget.getMethod())\n .lowCardinalityKeyValue("http.url", info.getHttpBaseUrl() + "/{name}")\n .highCardinalityKeyValue("http.full-url", httpget.getRequestUri());\n observation.observeChecked(() -> {\n String response = httpclient.execute(httpget, classicHttpResponse -> {\n // We should set the response before we stop the observation\n context.setResponse(classicHttpResponse);\n // Example of setting key values from the response\n observation.highCardinalityKeyValue("http.content.length",\n String.valueOf(classicHttpResponse.getEntity().getContentLength()));\n return EntityUtils.toString(classicHttpResponse.getEntity());\n });\n\n then(response).isEqualTo("OK");\n });\n}\n\n// We want to be sure that we have successfully enriched the HTTP headers\nverify(getRequestedFor(urlEqualTo("/foo")).withHeader("foo", equalTo("bar")));\n-----\n\nAs an example for the server side we will use a handler that instruments the Observation by adding the `foo` low cardinality key with the value being the matched path from the HTTP request. Let\'s look at the example of such a handler.\n\n[source,java,subs=+attributes]\n-----\nstatic class HeaderReadingHandler implements ObservationHandler<ReceiverContext<Context>> {\n\n @Override\n public void onStart(ReceiverContext<Context> context) {\n String fooHeader = context.getGetter().get(context.getCarrier(), "foo");\n // We\'re setting the value of the <foo> header as a low cardinality key value\n context.addLowCardinalityKeyValue(KeyValue.of("foo", fooHeader));\n }\n\n @Override\n public boolean supportsContext(Observation.Context context) {\n return context instanceof ReceiverContext;\n }\n\n}\n-----\n\nLet\'s look at the following of HTTP server side instrumentation that reuses the handler.\n\n[source,java,subs=+attributes]\n-----\n// This example can be combined with the idea of ObservationConvention to allow\n// users to easily customize the key values. Please read the rest of the\n// documentation on how to do it.\n\n// In Micrometer Tracing we would have predefined\n// PropagatingReceiverTracingObservationHandler but for the sake of this demo we\n// create our own handler that will reuse the <foo> header from the request as a\n// low cardinality key value\nregistry.observationConfig().observationHandler(new HeaderReadingHandler());\n\ntry (Javalin javalin = Javalin.create().before("/hello/{name}", ctx -> {\n // We\'re creating the special RequestReplyReceiverContext that will reuse the\n // information from the HTTP headers\n RequestReplyReceiverContext<Context, Context> receiverContext = new RequestReplyReceiverContext<>(\n Context::header);\n // Remember to set the carrier!!!\n receiverContext.setCarrier(ctx);\n String remoteServiceAddress = ctx.scheme() + "://" + ctx.host();\n receiverContext.setRemoteServiceAddress(remoteServiceAddress);\n // We\'re starting an Observation with the context\n Observation observation = Observation\n .createNotStarted("http.server.requests", () -> receiverContext, registry)\n .contextualName("HTTP " + ctx.method() + " " + ctx.matchedPath())\n .lowCardinalityKeyValue("http.url", remoteServiceAddress + ctx.matchedPath())\n .highCardinalityKeyValue("http.full-url", remoteServiceAddress + ctx.path())\n .lowCardinalityKeyValue("http.method", ctx.method())\n .start();\n // Let\'s be consistent and always set the Observation related objects under\n // the same key\n ctx.attribute(ObservationThreadLocalAccessor.KEY, observation);\n}).get("/hello/{name}", ctx -> {\n // We need to be thread-safe - we\'re not using ThreadLocals, we\'re retrieving\n // information from the attributes\n Observation observation = ctx.attribute(ObservationThreadLocalAccessor.KEY);\n observation.scoped(() -> {\n // If we need thread locals (e.g. MDC entries) we can use <scoped()>\n log.info("We\'re using scoped - Observation in thread local here [" + registry.getCurrentObservation()\n + "]");\n then(registry.getCurrentObservation()).isNotNull();\n });\n // We\'re returning body\n ctx.result("Hello World [" + observation.getContext().getLowCardinalityKeyValue("foo").getValue() + "]");\n}).after("/hello/{name}", ctx -> {\n // After sending the response we want to stop the Observation\n Observation observation = ctx.attribute(ObservationThreadLocalAccessor.KEY);\n observation.stop();\n}).start(0)) {\n // We\'re sending an HTTP request with a <foo:bar> header. We\'re expecting that\n // it will be reused in the response\n String response = sendRequestToHelloEndpointWithHeader(javalin.port(), "foo", "bar");\n\n // The response must contain the value from the header\n then(response).isEqualTo("Hello World [bar]");\n}\n-----\n\n== Instrumentation of Messaging Communication\n\nTo instrument messaging components you should proceed in the same way as you would with <<instrumentation_of_http_communication,HTTP-based communication>>, however instead of `RequestReplySenderContext` and `RequestReplyReceiverContext` you would use `SenderContext` and `ReceiverContext`. You can also set the `remoteServiceName` on a context to suggest the name of the broker (e.g. `kafka` or `rabbitmq`).\n\n:leveloffset!:\n\n== Testing\n\n:leveloffset: +1\n\nMicrometer Observation comes with `micrometer-observation-test` module that allows you to unit-test your Observations.\n\n== Installing\n\nThe following example shows the required dependency in Gradle (assuming that Micrometer BOM has been added):\n\n[source,groovy,subs=+attributes]\n-----\ntestImplementation \'io.micrometer:micrometer-observation-test\'\n-----\n\nThe following example shows the required dependency in Maven (assuming that Micrometer BOM has been added):\n\n[source,xml,subs=+attributes]\n-----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-observation-test</artifactId>\n <scope>test</scope>\n</dependency>\n-----\n\n== Running Observation Unit Tests\n\nLet\'s say that you have the following production code. It will create an observation with 2 tags (low and high cardinality) and then call `observe` that will start the observation, put it in scope, close the scope and stop the observation.\n\n[source,java,subs=+attributes]\n-----\nstatic class Example {\n\n private final ObservationRegistry registry;\n\n Example(ObservationRegistry registry) {\n this.registry = registry;\n }\n\n void run() {\n Observation.createNotStarted("foo", registry)\n .lowCardinalityKeyValue("lowTag", "lowTagValue")\n .highCardinalityKeyValue("highTag", "highTagValue")\n .observe(() -> System.out.println("Hello"));\n }\n\n}\n-----\n\nTo unit-test this code you can use the `TestObservationRegistry` class.\n\n[source,java,subs=+attributes]\n-----\n@Test\nvoid should_assert_your_observation() {\n // create a test registry in your tests\n TestObservationRegistry registry = TestObservationRegistry.create();\n\n // run your production code with the TestObservationRegistry\n new Example(registry).run();\n\n // check your observation\n TestObservationRegistryAssert.assertThat(registry)\n .doesNotHaveAnyRemainingCurrentObservation()\n .hasObservationWithNameEqualTo("foo")\n .that()\n .hasHighCardinalityKeyValue("highTag", "highTagValue")\n .hasLowCardinalityKeyValue("lowTag", "lowTagValue")\n .hasBeenStarted()\n .hasBeenStopped();\n}\n-----\n\n:leveloffset!:\n\n== Documentation Generation\n\n:leveloffset: +1\n\n== Automated Documentation Generation\n\nBy using the https://github.com/micrometer-metrics/micrometer-docs-generator[Micrometer Docs Generator] project and by implementing the `ObservationDocumentation`, `SpanDocumentation` or `MeterDocumentation` interfaces as an `enum` we can scan your sources and generate Asciidoctor documentation. This allows you to maintain the docuemntation for your observability instrumentation in code, and as long as you use the `enum` implementation in your instrumentation, it will ensure that your documentation stays in-sync with the instrumentation.\n\nBelow you can find an example of a Maven `pom.xml` with the Micrometer Docs Generator project.\n\n.pom.xml\n[source,xml,subs=+attributes]\n-----\n<?xml version="1.0" encoding="UTF-8"?>\n<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n\t\t xmlns="http://maven.apache.org/POM/4.0.0"\n\t\t xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">\n\t<modelVersion>4.0.0</modelVersion>\n\t<groupId>com.example</groupId>\n\t<artifactId>micrometer-docs-generator-example</artifactId>\n\t<packaging>jar</packaging>\n\t<name>micrometer-docs-generator-example</name>\n\t<description>micrometer-docs-generator-example</description>\n\t<properties>\n\t\t<micrometer-docs-generator.version>1.0.0</micrometer-docs-generator.version>\n\t\t<micrometer-docs-generator.inputPath>${maven.multiModuleProjectDirectory}/folder-with-sources-to-scan/</micrometer-docs-generator.inputPath>\n\t\t<micrometer-docs-generator.inclusionPattern>.*</micrometer-docs-generator.inclusionPattern>\n\t\t<micrometer-docs-generator.outputPath>${maven.multiModuleProjectDirectory}/target/output-folder-with-adocs/\'</micrometer-docs-generator.outputPath>\n\t</properties>\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.codehaus.mojo</groupId>\n\t\t\t\t<artifactId>exec-maven-plugin</artifactId>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>generate-docs</id>\n\t\t\t\t\t\t<phase>prepare-package</phase>\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>java</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t\t<configuration>\n\t\t\t\t\t\t\t<mainClass>io.micrometer.docs.DocsGeneratorCommand</mainClass>\n\t\t\t\t\t\t\t<includePluginDependencies>true</includePluginDependencies>\n\t\t\t\t\t\t\t<arguments>\n\t\t\t\t\t\t\t\t<argument>${micrometer-docs-generator.inputPath}</argument>\n\t\t\t\t\t\t\t\t<argument>${micrometer-docs-generator.inclusionPattern}</argument>\n\t\t\t\t\t\t\t\t<argument>${micrometer-docs-generator.outputPath}</argument>\n\t\t\t\t\t\t\t</arguments>\n\t\t\t\t\t\t</configuration>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t\t<dependencies>\n\t\t\t\t\t<dependency>\n\t\t\t\t\t\t<groupId>io.micrometer</groupId>\n\t\t\t\t\t\t<artifactId>micrometer-docs-generator</artifactId>\n\t\t\t\t\t\t<version>${micrometer-docs-generator.version}</version>\n\t\t\t\t\t\t<type>jar</type>\n\t\t\t\t\t</dependency>\n\t\t\t\t</dependencies>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n\t<repositories>\n\t\t<repository>\n\t\t\t<id>spring-snapshots</id>\n\t\t\t<name>Spring Snapshots</name>\n\t\t\t<url>https://repo.spring.io/snapshot</url> \x3c!-- For Snapshots --\x3e\n\t\t\t<snapshots>\n\t\t\t\t<enabled>true</enabled>\n\t\t\t</snapshots>\n\t\t\t<releases>\n\t\t\t\t<enabled>false</enabled>\n\t\t\t</releases>\n\t\t</repository>\n\t\t<repository>\n\t\t\t<id>spring-milestones</id>\n\t\t\t<name>Spring Milestones</name>\n\t\t\t<url>https://repo.spring.io/milestone</url> \x3c!-- For Milestones --\x3e\n\t\t\t<snapshots>\n\t\t\t\t<enabled>false</enabled>\n\t\t\t</snapshots>\n\t\t</repository>\n\t</repositories>\n</project>\n-----\n\nBelow you can find an example of a Gradle `build.gradle` with the Micrometer Docs Generator project.\n\n.build.gradle\n[source,groovy,subs=+attributes]\n-----\nrepositories {\n\tmaven { url \'https://repo.spring.io/snapshot\' } // for snapshots\n\tmaven { url \'https://repo.spring.io/milestone\' } // for milestones\n\tmavenCentral() // for GA\n}\n\next {\n\tmicrometerDocsVersion="1.0.2"\n}\n\nconfigurations {\n\tadoc\n}\n\ndependencies {\n\tadoc "io.micrometer:micrometer-docs-generator:$micrometerDocsVersion"\n}\n\ntask generateObservabilityDocs(type: JavaExec) {\n\tmainClass = "io.micrometer.docs.DocsGeneratorCommand"\n\tclasspath configurations.adoc\n\t// input folder, inclusion pattern, output folder\n\targs project.rootDir.getAbsolutePath(), ".*", project.rootProject.buildDir.getAbsolutePath()\n}\n-----\n\nRunning these tasks would lead to generation of adoc files similar to these ones.\n\n._metrics.adoc\n[source,adoc,subs=+attributes]\n-----\n[[observability-metrics]]\n=== Observability - Metrics\n\nBelow you can find a list of all samples declared by this project.\n\n[[observability-metrics-task-runner-observation]]\n==== Task Runner Observation\n\n> Observation created when a task runner is executed.\n\n**Metric name** `spring.cloud.task.runner` (defined by convention class `org.springframework.cloud.task.configuration.observation.DefaultTaskObservationConvention`). **Type** `timer` and **base unit** `seconds`.\n\nFully qualified name of the enclosing class `org.springframework.cloud.task.configuration.observation.TaskDocumentedObservation`.\n\nIMPORTANT: All tags must be prefixed with `spring.cloud.task` prefix!\n\n.Low cardinality Keys\n|===\n|Name | Description\n|`spring.cloud.task.runner.bean-name`|Name of the bean that was executed by Spring Cloud Task.\n|===\n-----\n\n._spans.adoc\n[source,adoc,subs=+attributes]\n-----\n[[observability-spans]]\n=== Observability - Spans\n\nBelow you can find a list of all spans declared by this project.\n\n[[observability-spans-task-runner-observation]]\n==== Task Runner Observation Span\n\n> Observation created when a task runner is executed.\n\n**Span name** `spring.cloud.task.runner` (defined by convention class `org.springframework.cloud.task.configuration.observation.DefaultTaskObservationConvention`).\n\nFully qualified name of the enclosing class `org.springframework.cloud.task.configuration.observation.TaskDocumentedObservation`.\n\nIMPORTANT: All tags and event names must be prefixed with `spring.cloud.task` prefix!\n\n.Tag Keys\n|===\n|Name | Description\n|`spring.cloud.task.runner.bean-name`|Name of the bean that was executed by Spring Cloud Task.\n|===\n-----\n\n=== Options\n\nThe main entry class for the docs generation is `DocsGeneratorCommand` class.\nThis class takes following options.\n\n.Optional parameters\n[cols="1,1"]\n|===\n| `--metrics`\n| Generate metrics documentation.\n\n| `--spans`\n| Generate spans documentation.\n\n| `--conventions`\n| Generate observation conventions documentation.\n\n| `--metrics-template=<location>`\n| Handlebars template file location. This can be a path in the classpath or file system. +\ne.g. `templates/metrics.adoc.hbs`, `/home/foo/bar.hbs`\n\n| `--spans-template=<location>`\n| Handlebars template file location. This can be a path in the classpath or file system. +\ne.g. `templates/spans.adoc.hbs`, `/home/foo/bar.hbs`\n\n| `--conventions-template=<location>`\n| Handlebars template file location. This can be a path in the classpath or file system. +\ne.g. `templates/conventions.adoc.hbs`, `/home/foo/bar.hbs`\n\n| `--metrics-output=<location>`\n| Generated metrics doc file location. This can be an absolute path or relative path to the output directory. +\nDefault: `_metrics.adoc`\n\n| `--spans-output=<location>`\n| Generated spans doc file location. This can be an absolute path or relative path to the output directory. +\nDefault: `_spans.adoc`\n| `--conventions-output=<location>`\n| Generated observation convention doc file location. This can be an absolute path or relative path to the output directory. +\nDefault: `_conventions.adoc`\n|===\n\n:leveloffset!:\n\n== Existing Instrumentations\n\n:leveloffset: +1\n\nMicrometer Observation is used to instrument various projects. Below you can find a table of projects that are using Micrometer Observation to _"instrument once and have multiple benefits out of it"_.\n\n.External Project Instrumentations\n|===\n|Project Name |Link\n\n| Apache Camel | https://issues.apache.org/jira/browse/CAMEL-19023[Issue]\n| Apache CXF | https://github.com/apache/cxf/pull/1346#event-10091735987[PR]\n| Apache Dubbo | https://github.com/apache/dubbo/pull/11021[PR]\n| Apache HttpComponents | https://github.com/micrometer-metrics/micrometer/tree/main/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/httpcomponents[Repo]\n| Apache Skywalking | https://github.com/apache/skywalking-java/pull/401[PR], https://skywalking.apache.org/docs/skywalking-java/next/en/setup/service-agent/java-agent/application-toolkit-micrometer-1.10/[Docs]\n| Armeria | https://github.com/line/armeria/pull/4980[PR]\n| Appsmith | https://github.com/appsmithorg/appsmith/commit/5e46a2f4b7bf184aba03b4b93038edce8a615366[Commit]\n| gRPC | https://github.com/micrometer-metrics/micrometer/pull/3427[PR]\n| Halo | https://github.com/halo-dev/halo/commit/d192b8c956887e4701b94e3ed302fb88e4771583[Commit]\n| JDBC | https://github.com/jdbc-observations/datasource-micrometer[Repo]\n| JDK Http Client | https://github.com/micrometer-metrics/micrometer/blob/main/micrometer-core/src/main/java11/io/micrometer/core/instrument/binder/jdk/MicrometerHttpClient.java[Repo]\n| Jetty | https://github.com/micrometer-metrics/micrometer/pull/3416[PR]\n| Jersey | https://github.com/micrometer-metrics/micrometer/tree/main/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jersey/server[Repo]\n| JMS | https://github.com/micrometer-metrics/micrometer/blob/main/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jms/JmsInstrumentation.java[Repo]\n| Kotlin Coroutines | https://github.com/micrometer-metrics/micrometer/pull/3256[PR]\n| Lettuce | https://github.com/lettuce-io/lettuce-core/commit/6604fbe9e9cff476806c50716e17803e11d1e0ca[Commit]\n| Micronaut | https://github.com/micronaut-projects/micronaut-micrometer/issues/492[Issue]\n| OkHttp | https://github.com/micrometer-metrics/micrometer/tree/main/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/okhttp3[Repo]\n| OpenFeign | https://github.com/OpenFeign/feign/pull/1760[PR]\n| RabbitMQ | https://github.com/rabbitmq/rabbitmq-java-client/issues/952[Issue]\n| RabbitMQ Stream | https://github.com/rabbitmq/rabbitmq-stream-java-client/pull/384[PR]\n| Resilience4j | https://github.com/resilience4j/resilience4j/pull/1698[PR]\n| R2DBC | https://github.com/r2dbc/r2dbc-proxy/issues/122[Issue]\n| Reactor | https://micrometer.io/docs/observation#instrumentation_of_reactive_libraries[Docs]\n| Reactor Netty | https://projectreactor.io/docs/netty/release/reference/index.html#_tracing_3[Docs]\n| Redisson | https://github.com/redisson/redisson/issues/4976[Issue],\nhttps://github.com/redisson/redisson/wiki/16.-Observability#162-tracing[Docs]\n| RSocket | https://github.com/rsocket/rsocket-java/tree/master/rsocket-micrometer/src/main/java/io/rsocket/micrometer/observation[Repo]\n| Spring Amqp | https://docs.spring.io/spring-amqp/docs/current/reference/html/index.html#observation[Docs]\n| Spring Batch | https://docs.spring.io/spring-batch/docs/current/reference/html/monitoring-and-metrics.html#tracing[Docs]\n| Spring Cloud Config | https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#observability[Docs]\n| Spring Cloud CircuitBreaker | https://github.com/spring-cloud/spring-cloud-circuitbreaker/commit/4aa6883274a26b4c01b2c38e256d0b985978052e[Commit]\n| Spring Cloud Function | https://github.com/spring-cloud/spring-cloud-function/tree/main/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/observability[Repo]\n| Spring Cloud Gateway | https://github.com/spring-cloud/spring-cloud-gateway/tree/main/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/headers/observation[Repo]\n| Spring Cloud OpenFeign | https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/#micrometer-support[Docs]\n| Spring Cloud Task | https://docs.spring.io/spring-cloud-task/docs/current/reference/html/#enabling-observations-for-applicationrunner-and-commandlinerunner[Docs]\n| Spring Cloud Vault | https://github.com/spring-cloud/spring-cloud-vault/commit/1116f81971f16f9f9e42ad0994ee12a24404610e[Commit]\n| Spring Data Cassandra | https://docs.spring.io/spring-data/cassandra/docs/current/reference/html/#cassandra.observability[Docs]\n| Spring Data MongoDB | https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongodb.observability[Docs]\n| Spring Data Redis | https://docs.spring.io/spring-data-redis/docs/current/reference/html/#redis.observability[Docs]\n| Spring GraphQL | https://docs.spring.io/spring-graphql/docs/current/reference/html/#observability[Docs]\n| Spring Integration | https://docs.spring.io/spring-integration/reference/metrics.html#micrometer-observation[Docs]\n| Spring Kafka | https://docs.spring.io/spring-kafka/reference/html/#x30-obs[Docs]\n| Spring Security | https://docs.spring.io/spring-security/reference/reactive/integrations/observability.html[Docs]\n| Spring Modulith | https://docs.spring.io/spring-modulith/docs/current/reference/html/#observability[Docs]\n| Spring MVC | https://docs.spring.io/spring-framework/reference/integration/observability.html[Docs]\n| Spring Pulsar | https://docs.spring.io/spring-pulsar/docs/current/reference/html/#micrometer[Docs]\n| Spring WebFlux | https://docs.spring.io/spring-framework/reference/integration/observability.html[Docs]\n|===\n\nIf your project is instrumented using Micrometer Observation, and it\'s not listed in the table above, https://github.com/micrometer-metrics/micrometer-docs/edit/main/src/docs/observation/observation-projects.adoc[please file a PR] to our documentation! If you want to instrument your project and need our help just mention us in your issue - https://github.com/shakuzen/[@shakuzen], https://github.com/jonatan-ivanov/[@jonatan-ivanov], https://github.com/marcingrzejszczak/[@marcingrzejszczak].\n\n:leveloffset!:\n'},function(e,t,n){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Tracing support\n:toc:\n:sectnums:\n:dimensional: true\n\n== Purpose\n\nThe problem of tracing is not new.\nApplication developers have been creating ways to track the state of their applications for a long time.\nFor much of that time, developers had to create the necessary tracing framework themselves.\n\nIn 2016, the Spring Cloud team created a tracing library that could help a lot of developers.\nIt was called https://github.com/spring-cloud/spring-cloud-sleuth[Spring Cloud Sleuth].\nThe Spring team realized that tracing could be separated from Spring Cloud and created the Micrometer Tracing project, which is, essentially, a Spring-agnostic copy of Spring Cloud Sleuth.\nMicrometer Tracing had its 1.0.0 GA release in November 2022 and has been getting steadily better ever since.\n\nhttps://github.com/micrometer-metrics/tracing[Micrometer Tracing] provides a simple facade for the most popular tracer libraries, letting you instrument your JVM-based application code without vendor lock-in.\nIt is designed to add little to no overhead to your tracing collection activity while maximizing the portability of your tracing effort.\n\nIt also provides a tracing extension to Micrometer's `ObservationHandler` (from Micrometer 1.10.0).\nWhenever an `Observation` is used, a corresponding span will be created, started, stopped and reported.\n\n== Installing\n\nMicrometer Tracing comes with a Bill of Materials (BOM) which is a project that contains all the project versions for you.\n\nThe following example shows the required dependency in Gradle:\n\n[source,groovy,subs=+attributes]\n----\nimplementation platform('io.micrometer:micrometer-tracing-bom:latest.release')\nimplementation 'io.micrometer:micrometer-tracing'\n----\n\nThe following example shows the required dependency in Maven:\n\n[source,xml,subs=+attributes]\n----\n<dependencyManagement>\n <dependencies>\n <dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-tracing-bom</artifactId>\n <version>${micrometer-tracing.version}</version>\n <type>pom</type>\n <scope>import</scope>\n </dependency>\n </dependencies>\n</dependencyManagement>\n\n<dependencies>\n <dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-tracing</artifactId>\n </dependency>\n</dependencies>\n----\n\nYou should add a tracing bridge you want to use, such as `micrometer-tracing-bridge-brave` or `micrometer-tracing-bridge-otel` and span exporters / reporters.\nIn case of adding a bridge the `micrometer-tracing` library is added transitively.\n\n== Glossary\n\n:leveloffset: +1\n\nMicrometer Tracing contains a core module with an instrumentation https://en.wikipedia.org/wiki/Service_provider_interface[SPI], a set of modules containing bridges to various tracers, a set of modules containing dedicated span reporting mechanisms, and a test kit.\nYou need to understand the following definitions for distributed tracing:\n\nMicrometer Tracing borrows https://research.google.com/pubs/pub36356.html[Dapper's] terminology.\n\n*Span*: The basic unit of work.\nFor example, sending an RPC is a new span, as is sending a response to an RPC.\nSpans also have other data, such as descriptions, timestamped events, key-value annotations (tags), the ID of the span that caused them, and process IDs (normally IP addresses).\n\nSpans can be started and stopped, and they keep track of their timing information.\nOnce you create a span, you must stop it at some point in the future.\n\n*Trace*: A set of spans forming a tree-like structure.\nFor example, if you run a distributed big-data store, a trace might be formed by a `PUT` request.\n\n*Annotation/Event*: Used to record the existence of an event in time.\n\n*Tracer*: A library that handles the lifecycle of a span.\nIt can create, start, stop and report spans to an external system via reporters / exporters.\n\n*Tracing context*: For distributed tracing to work the tracing context (trace identifier, span identifier, etc.) must be propagated through the process (e.g. over threads) and over the network.\n\n*Log correlation*: Parts of the tracing context (e.g. trace identifier, span identifier) can be populated to the logs of a given application.\nOne can then collect all logs in a single storage and group them via trace id.\nThat way one can get all logs, for a single business operation (trace) from all services put in a chronological order.\n\n*Latency analysis tools*: A tool that collects exported spans and visualizes the whole trace.\nAllows easy latency analysis.\n\nThe following image shows how *Span* and *Trace* look in a system.\n\nimage::"+n(82)+"[Trace Info propagation]\n\nEach color of a note signifies a span (there are seven spans - from *A* to *G*).\nConsider the following note:\n\n[source]\n----\nTrace Id = X\nSpan Id = D\nClient Sent\n----\n\nThis note indicates that the current span has *Trace Id* set to *X* and *Span Id* set to *D*.\nAlso, from the RPC perspective, the `Client Sent` event took place.\n\nLet's consider more notes:\n\n[source]\n----\nTrace Id = X\nSpan Id = A\n(no custom span)\n\nTrace Id = X\nSpan Id = C\n(custom span)\n----\n\nYou can continue with a created span (example with `no custom span` indication) or you can create child spans manually (example with `custom span` indication).\n\nThe following image shows how parent-child relationships of spans look:\n\nimage::"+n(83)+'[Parent child relationship]\n\n:leveloffset!:\n\n== Supported Tracers\n\n:leveloffset: +1\n\nMicrometer Tracing supports the following Tracers.\n\n* https://github.com/openzipkin/brave[*OpenZipkin Brave*]\n* https://opentelemetry.io/[*OpenTelemetry*]\n\n== Installing\n\nThe following example shows the required dependency in Gradle (assuming that Micrometer Tracing BOM has been added):\n\n.Brave Tracer\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.micrometer:micrometer-tracing-bridge-brave\'\n----\n\n.OpenTelemetry Tracer\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.micrometer:micrometer-tracing-bridge-otel\'\n----\n\nThe following example shows the required dependency in Maven (assuming that Micrometer Tracing BOM has been added):\n\n.Brave Tracer\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-tracing-bridge-brave</artifactId>\n</dependency>\n----\n\n.OpenTelemetry Tracer\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-tracing-bridge-otel</artifactId>\n</dependency>\n----\n\nIMPORTANT: Remember to pick *only one* bridge.\nYou *shouldn\'t have* two bridges on the classpath.\n\n:leveloffset!:\n\n== Supported Reporters\n\n:leveloffset: +1\n\nMicrometer Tracing supports directly the following Reporters.\n\n* https://tanzu.vmware.com/observability[*Tanzu Observability by Wavefront*]\n* https://zipkin.io[*OpenZipkin Zipkin*]\n\n== Installing\n\nThe following example shows the required dependency in Gradle (assuming that Micrometer Tracing BOM has been added):\n\n.Tanzu Observability by Wavefront\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.micrometer:micrometer-tracing-reporter-wavefront\'\n----\n\n.OpenZipkin Zipkin with Brave\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.zipkin.reporter2:zipkin-reporter-brave\'\n----\n\n.OpenZipkin Zipkin with OpenTelemetry\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.opentelemetry:opentelemetry-exporter-zipkin\'\n----\n\n.An OpenZipkin URL sender dependency to send out spans to Zipkin via a `URLConnectionSender`\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.zipkin.reporter2:zipkin-sender-urlconnection\'\n----\n\nThe following example shows the required dependency in Maven (assuming that Micrometer Tracing BOM has been added):\n\n.Tanzu Observability by Wavefront\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-tracing-reporter-wavefront</artifactId>\n</dependency>\n----\n\n.OpenZipkin Zipkin with Brave\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.zipkin.reporter2</groupId>\n <artifactId>zipkin-reporter-brave</artifactId>\n</dependency>\n----\n\n.OpenZipkin Zipkin with OpenTelemetry\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.opentelemetry</groupId>\n <artifactId>opentelemetry-exporter-zipkin</artifactId>\n</dependency>\n----\n\n.An OpenZipkin URL sender dependency to send out spans to Zipkin via a `URLConnectionSender`\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.zipkin.reporter2</groupId>\n <artifactId>zipkin-sender-urlconnection</artifactId>\n</dependency>\n----\n\nIMPORTANT: Remember that Brave by default adds Zipkin as a dependency. If you want to use just Wavefront and you\'re using classpath dependant solutions such as Spring Boot, you might be required to exclude the transitive dependency on Zipkin when using Brave (e.g. via exlcuding the `io.zipkin.reporter2` group).\n\n:leveloffset!:\n\n== Using Micrometer Tracing Directly\n\n:leveloffset: +1\n\nIn this section we will describe how to use the Micrometer Tracing API directly to create and report spans.\n\n== Micrometer Tracing Examples\n\nBelow you can see basic operations on a span. Please read the comments in the snippet for details.\n\n[source,java,subs=+attributes]\n-----\n// Create a span. If there was a span present in this thread it will become\n// the `newSpan`\'s parent.\nSpan newSpan = this.tracer.nextSpan().name("calculateTax");\n// Start a span and put it in scope. Putting in scope means putting the span\n// in thread local\n// and, if configured, adjust the MDC to contain tracing information\ntry (Tracer.SpanInScope ws = this.tracer.withSpan(newSpan.start())) {\n // ...\n // You can tag a span - put a key value pair on it for better debugging\n newSpan.tag("taxValue", taxValue);\n // ...\n // You can log an event on a span - an event is an annotated timestamp\n newSpan.event("taxCalculated");\n}\nfinally {\n // Once done remember to end the span. This will allow collecting\n // the span to send it to a distributed tracing system e.g. Zipkin\n newSpan.end();\n}\n-----\n\nBelow you can see how to continue a span in a new thread, that was started in another thread.\n\n[source,java,subs=+attributes]\n-----\nSpan spanFromThreadX = this.tracer.nextSpan().name("calculateTax");\ntry (Tracer.SpanInScope ws = this.tracer.withSpan(spanFromThreadX.start())) {\n executorService.submit(() -> {\n // Pass the span from thread X\n Span continuedSpan = spanFromThreadX;\n // ...\n // You can tag a span\n continuedSpan.tag("taxValue", taxValue);\n // ...\n // You can log an event on a span\n continuedSpan.event("taxCalculated");\n }).get();\n}\nfinally {\n spanFromThreadX.end();\n}\n-----\n\nBelow you can see how to create a child span when explicitly knowing who the parent span is.\n\n[source,java,subs=+attributes]\n-----\n// let\'s assume that we\'re in a thread Y and we\'ve received\n// the `initialSpan` from thread X. `initialSpan` will be the parent\n// of the `newSpan`\nSpan newSpan = this.tracer.nextSpan(initialSpan).name("calculateCommission");\n// ...\n// You can tag a span\nnewSpan.tag("commissionValue", commissionValue);\n// ...\n// You can log an event on a span\nnewSpan.event("commissionCalculated");\n// Once done remember to end the span. This will allow collecting\n// the span to send it to e.g. Zipkin. The tags and events set on the\n// newSpan will not be present on the parent\nnewSpan.end();\n-----\n\n== Micrometer Tracing Brave Setup\n\nIn this subsection we will set up Micrometer Tracing with Brave.\n\nBelow you can see how to create a Micrometer Tracing `Tracer` using Brave components that would send completed spans to Zipkin.\n\n[source,java,subs=+attributes]\n-----\n// [Brave component] Example of using a SpanHandler. SpanHandler is a component\n// that gets called when a span is finished. Here we have an example of setting it\n// up with sending spans\n// in a Zipkin format to the provided location via the UrlConnectionSender\n// (through the <io.zipkin.reporter2:zipkin-sender-urlconnection> dependency)\n// Another option could be to use a TestSpanHandler for testing purposes.\nSpanHandler spanHandler = ZipkinSpanHandler\n .create(AsyncReporter.create(URLConnectionSender.create("http://localhost:9411/api/v2/spans")));\n\n// [Brave component] CurrentTraceContext is a Brave component that allows you to\n// retrieve the current TraceContext.\nThreadLocalCurrentTraceContext braveCurrentTraceContext = ThreadLocalCurrentTraceContext.newBuilder()\n .addScopeDecorator(MDCScopeDecorator.get()) // Example of Brave\'s\n // automatic MDC setup\n .build();\n\n// [Micrometer Tracing component] A Micrometer Tracing wrapper for Brave\'s\n// CurrentTraceContext\nCurrentTraceContext bridgeContext = new BraveCurrentTraceContext(this.braveCurrentTraceContext);\n\n// [Brave component] Tracing is the root component that allows to configure the\n// tracer, handlers, context propagation etc.\nTracing tracing = Tracing.newBuilder()\n .currentTraceContext(this.braveCurrentTraceContext)\n .supportsJoin(false)\n .traceId128Bit(true)\n // For Baggage to work you need to provide a list of fields to propagate\n .propagationFactory(BaggagePropagation.newFactoryBuilder(B3Propagation.FACTORY)\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create("from_span_in_scope 1")))\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create("from_span_in_scope 2")))\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create("from_span")))\n .build())\n .sampler(Sampler.ALWAYS_SAMPLE)\n .addSpanHandler(this.spanHandler)\n .build();\n\n\n// [Brave component] Tracer is a component that handles the life-cycle of a span\nbrave.Tracer braveTracer = this.tracing.tracer();\n\n// [Micrometer Tracing component] A Micrometer Tracing wrapper for Brave\'s Tracer\nTracer tracer = new BraveTracer(this.braveTracer, this.bridgeContext, new BraveBaggageManager());\n\n-----\n\n== Micrometer Tracing OpenTelemetry Setup\n\nIn this subsection we will set up Micrometer Tracing with OpenTelemetry (OTel).\n\nBelow you can see how to create a Micrometer Tracing `Tracer` using OTel components that would send completed spans to Zipkin.\n\n[source,java,subs=+attributes]\n-----\n// [OTel component] Example of using a SpanExporter. SpanExporter is a component\n// that gets called when a span is finished. Here we have an example of setting it\n// up with sending spans\n// in a Zipkin format to the provided location via the UrlConnectionSender\n// (through the <io.opentelemetry:opentelemetry-exporter-zipkin> and\n// <io.zipkin.reporter2:zipkin-sender-urlconnection> dependencies)\n// Another option could be to use an ArrayListSpanProcessor for testing purposes\nSpanExporter spanExporter = new ZipkinSpanExporterBuilder()\n .setSender(URLConnectionSender.create("http://localhost:9411/api/v2/spans"))\n .build();\n\n// [OTel component] SdkTracerProvider is an SDK implementation for TracerProvider\nSdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()\n .setSampler(alwaysOn())\n .addSpanProcessor(BatchSpanProcessor.builder(spanExporter).build())\n .build();\n\n// [OTel component] The SDK implementation of OpenTelemetry\nOpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder()\n .setTracerProvider(sdkTracerProvider)\n .setPropagators(ContextPropagators.create(B3Propagator.injectingSingleHeader()))\n .build();\n\n// [OTel component] Tracer is a component that handles the life-cycle of a span\nio.opentelemetry.api.trace.Tracer otelTracer = openTelemetrySdk.getTracerProvider()\n .get("io.micrometer.micrometer-tracing");\n\n// [Micrometer Tracing component] A Micrometer Tracing wrapper for OTel\nOtelCurrentTraceContext otelCurrentTraceContext = new OtelCurrentTraceContext();\n\n// [Micrometer Tracing component] A Micrometer Tracing listener for setting up MDC\nSlf4JEventListener slf4JEventListener = new Slf4JEventListener();\n\n// [Micrometer Tracing component] A Micrometer Tracing listener for setting\n// Baggage in MDC. Customizable\n// with correlation fields (currently we\'re setting empty list)\nSlf4JBaggageEventListener slf4JBaggageEventListener = new Slf4JBaggageEventListener(Collections.emptyList());\n\n// [Micrometer Tracing component] A Micrometer Tracing wrapper for OTel\'s Tracer.\n// You can consider\n// customizing the baggage manager with correlation and remote fields (currently\n// we\'re setting empty lists)\nOtelTracer tracer = new OtelTracer(otelTracer, otelCurrentTraceContext, event -> {\n slf4JEventListener.onEvent(event);\n slf4JBaggageEventListener.onEvent(event);\n}, new OtelBaggageManager(otelCurrentTraceContext, Collections.emptyList(), Collections.emptyList()));\n\n-----\n\n== Micrometer Tracing Baggage API\n\nTraces connect from service to service using header propagation. Besides trace identifiers, other properties (called `Baggage`) can also be passed along with the request.\n\nBelow you can find an example on how to use the Tracer API (version `1.0.x`) to create and extract baggage.\n\n[source,java,subs=+attributes]\n-----\n// ---------------------------------------------------------------------------\n// Example for Tracing 1.0.x\n// ---------------------------------------------------------------------------\nSpan span = tracer.nextSpan().name("parent").start();\n\n// Assuming that there\'s a span in scope...\ntry (Tracer.SpanInScope ws = tracer.withSpan(span)) {\n\n // Not passing a TraceContext explicitly will bind the baggage to the\n // current TraceContext\n // If you want to retrieve the baggage value you should make it current\n // first\n try (BaggageInScope baggage = tracer.createBaggage("from_span_in_scope 1", "value 1").makeCurrent()) {\n // This is how you retrieve the baggage\n String baggageValue = baggage.get();\n then(baggageValue).as("[In scope] Baggage 1").isEqualTo("value 1");\n\n String baggageValueViaTracer = tracer.getBaggage("from_span_in_scope 1").get();\n then(baggageValueViaTracer).as("[In scope] Baggage 1").isEqualTo("value 1");\n }\n\n try (BaggageInScope baggage = tracer.createBaggage("from_span_in_scope 2", "value 2").makeCurrent()) {\n then(baggage.get()).as("[In scope] Baggage 2").isEqualTo("value 2");\n then(tracer.getBaggage("from_span_in_scope 2").get()).as("[In scope] Baggage 2")\n .isEqualTo("value 2");\n }\n}\n\n// Assuming that you have a handle to the span\ntry (BaggageInScope baggage = tracer.createBaggage("from_span")\n .set(span.context(), "value 3")\n .makeCurrent()) {\n String baggageValueFromATraceContext = baggage.get(span.context());\n then(baggageValueFromATraceContext).as("[Span passed explicitly] Baggage 3").isEqualTo("value 3");\n\n String baggageValueFromATraceContextThroughTracer = tracer.getBaggage("from_span").get(span.context());\n then(baggageValueFromATraceContextThroughTracer).as("[Span passed explicitly] Baggage 3")\n .isEqualTo("value 3");\n}\n\n// Assuming that there\'s no span in scope\n// When there\'s no span in scope, there will never be any baggage - even if\n// you make it current\ntry (BaggageInScope baggage = tracer.createBaggage("from_span_in_scope 1", "value 1").makeCurrent()) {\n then(baggage.get()).as("[Out of span scope] Baggage 1").isNull();\n then(tracer.getBaggage("from_span_in_scope 1").get()).as("[Out of span scope] Baggage 1").isNull();\n}\nthen(tracer.getBaggage("from_span_in_scope 1").get()).as("[Out of scope] Baggage 1").isNull();\nthen(tracer.getBaggage("from_span_in_scope 2").get()).as("[Out of scope] Baggage 2").isNull();\nthen(tracer.getBaggage("from_span").get()).as("[Out of scope] Baggage 3").isNull();\nthen(tracer.getBaggage("from_span").get(span.context())).as("[Out of scope - with context] Baggage 3")\n .isNull();\n-----\n\nBelow you can find an example on how to use the Tracer API (version `1.1.x`) to create and extract baggage.\n\n[source,java,subs=+attributes]\n-----\n// ---------------------------------------------------------------------------\n// Example for Tracing 1.1.x\n// ---------------------------------------------------------------------------\n\nSpan span = tracer.nextSpan().name("parent").start();\n\n// Assuming that there\'s a span in scope...\ntry (Tracer.SpanInScope ws = tracer.withSpan(span)) {\n\n // Not passing a TraceContext explicitly will bind the baggage to the\n // current TraceContext\n try (BaggageInScope baggage = tracer.createBaggageInScope("from_span_in_scope 1", "value 1")) {\n // This is how you retrieve the baggage\n String baggageValue = baggage.get();\n then(baggageValue).as("[In scope] Baggage 1").isEqualTo("value 1");\n\n String baggageValueViaTracer = tracer.getBaggage("from_span_in_scope 1").get();\n then(baggageValueViaTracer).as("[In scope] Baggage 1").isEqualTo("value 1");\n }\n\n try (BaggageInScope baggage = tracer.createBaggageInScope("from_span_in_scope 2", "value 2")) {\n then(baggage.get()).as("[In scope] Baggage 2").isEqualTo("value 2");\n then(tracer.getBaggage("from_span_in_scope 2").get()).as("[In scope] Baggage 2")\n .isEqualTo("value 2");\n }\n}\n\n// Assuming that you have a handle to the span\ntry (BaggageInScope baggage = tracer.createBaggageInScope(span.context(), "from_span", "value 3")) {\n String baggageValueFromATraceContext = baggage.get(span.context());\n then(baggageValueFromATraceContext).as("[Span passed explicitly] Baggage 3").isEqualTo("value 3");\n\n String baggageValueFromATraceContextThroughTracer = tracer.getBaggage("from_span").get(span.context());\n then(baggageValueFromATraceContextThroughTracer).as("[Span passed explicitly] Baggage 3")\n .isEqualTo("value 3");\n}\n\n// Assuming that there\'s no span in scope\n// When there\'s no span in scope, there will never be any baggage - even if\n// you make it current\ntry (BaggageInScope baggage = tracer.createBaggageInScope("from_span_in_scope 1", "value 1")) {\n then(baggage.get()).as("[Out of span scope] Baggage 1").isNull();\n then(tracer.getBaggage("from_span_in_scope 1").get()).as("[Out of span scope] Baggage 1").isNull();\n}\nthen(tracer.getBaggage("from_span_in_scope 1").get()).as("[Out of scope] Baggage 1").isNull();\nthen(tracer.getBaggage("from_span_in_scope 2").get()).as("[Out of scope] Baggage 2").isNull();\nthen(tracer.getBaggage("from_span").get()).as("[Out of scope] Baggage 3").isNull();\nthen(tracer.getBaggage("from_span").get(span.context())).as("[Out of scope - with context] Baggage 3")\n .isNull();\n-----\n\nIMPORTANT: For Brave, remember to set up the `PropagationFactory` so that it contains the baggage fields that you will be using in your code. Check the example below for details.\n\n[source,java,subs=+attributes]\n-----\nTracing tracing = Tracing.newBuilder()\n .currentTraceContext(this.braveCurrentTraceContext)\n .supportsJoin(false)\n .traceId128Bit(true)\n // For Baggage to work you need to provide a list of fields to propagate\n .propagationFactory(BaggagePropagation.newFactoryBuilder(B3Propagation.FACTORY)\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create("from_span_in_scope 1")))\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create("from_span_in_scope 2")))\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create("from_span")))\n .build())\n .sampler(Sampler.ALWAYS_SAMPLE)\n .addSpanHandler(this.spanHandler)\n .build();\n\n-----\n\n== Aspect Oriented Programming (starting from Micrometer Tracing 1.1.0)\n\nIMPORTANT: This section is applicable from Micrometer Tracing 1.1.0.\n\nMicrometer Tracing contains a `@NewSpan`, `@ContinueSpan` and `@SpanTag` annotations that frameworks can use to create or customize spans for either specific types of methods such as those serving web request endpoints or, more generally, to all methods.\n\nWARNING: Micrometer\'s Spring Boot configuration does _not_ recognize these aspects on arbitrary methods.\n\nAn AspectJ aspect is included. You can use it in your application either through compile/load time AspectJ weaving or through framework facilities that interpret AspectJ aspects and proxy targeted methods in some other way, such as Spring AOP. Here is a sample Spring AOP configuration:\n\n[source,java,subs=+attributes]\n-----\n@Configuration\npublic class SpanAspectConfiguration {\n\n @Bean\n NewSpanParser newSpanParser() {\n return new DefaultNewSpanParser();\n }\n\n // You can provide your own resolvers - here we go with a noop example.\n @Bean\n ValueResolver valueResolver() {\n return new NoOpValueResolver();\n }\n\n // Example of a SpEL resolver\n @Bean\n ValueExpressionResolver valueExpressionResolver() {\n return new SpelTagValueExpressionResolver();\n }\n\n @Bean\n MethodInvocationProcessor methodInvocationProcessor(NewSpanParser newSpanParser, Tracer tracer,\n BeanFactory beanFactory) {\n return new ImperativeMethodInvocationProcessor(newSpanParser, tracer, beanFactory::getBean,\n beanFactory::getBean);\n }\n\n @Bean\n SpanAspect spanAspect(MethodInvocationProcessor methodInvocationProcessor) {\n return new SpanAspect(methodInvocationProcessor);\n }\n\n}\n\n// Example of using SpEL to resolve expressions in @SpanTag\nstatic class SpelTagValueExpressionResolver implements ValueExpressionResolver {\n\n private static final Log log = LogFactory.getLog(SpelTagValueExpressionResolver.class);\n\n @Override\n public String resolve(String expression, Object parameter) {\n try {\n SimpleEvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();\n ExpressionParser expressionParser = new SpelExpressionParser();\n Expression expressionToEvaluate = expressionParser.parseExpression(expression);\n return expressionToEvaluate.getValue(context, parameter, String.class);\n }\n catch (Exception ex) {\n log.error("Exception occurred while tying to evaluate the SpEL expression [" + expression + "]", ex);\n }\n return parameter.toString();\n }\n\n}\n-----\n\nApplying `SpanAspect` makes `@NewSpan` and `@ContinueSpan` usable on any arbitrary method in an AspectJ proxied instance, as the following example shows:\n\n[source,java,subs=+attributes]\n-----\n// In Sleuth @NewSpan and @ContinueSpan annotations would be taken into\n// consideration. In Micrometer Tracing due to limitations of @Aspect\n// we can\'t do that. The @SpanTag annotation will work well though.\nprotected interface TestBeanInterface {\n\n void testMethod2();\n\n void testMethod3();\n\n void testMethod10(@SpanTag("testTag10") String param);\n\n void testMethod10_v2(@SpanTag("testTag10") String param);\n\n}\n\n// Example of an implementation class\nprotected static class TestBean implements TestBeanInterface {\n\n @NewSpan\n @Override\n public void testMethod2() {\n }\n\n @NewSpan(name = "customNameOnTestMethod3")\n @Override\n public void testMethod3() {\n }\n\n @ContinueSpan(log = "customTest")\n @Override\n public void testMethod10(@SpanTag("customTestTag10") String param) {\n\n }\n\n @ContinueSpan(log = "customTest")\n @Override\n public void testMethod10_v2(String param) {\n\n }\n\n}\n\n// --------------------------\n// ----- USAGE EXAMPLE ------\n// --------------------------\n\n\n// Creates a new span with\ntestBean().testMethod2();\nthen(createdSpanViaAspect()).isEqualTo("test-method2");\n\n// Uses the name from the annotation\ntestBean().testMethod3();\nthen(createdSpanViaAspect()).isEqualTo("custom-name-on-test-method3");\n\n// Continues the previous span\nSpan span = this.tracer.nextSpan().name("foo");\ntry (Tracer.SpanInScope ws = this.tracer.withSpan(span.start())) {\n\n // Adds tags and events to an existing span\n testBean().testMethod10("tagValue");\n SimpleSpan continuedSpan = modifiedSpanViaAspect();\n then(continuedSpan.getName()).isEqualTo("foo");\n then(continuedSpan.getTags()).containsEntry("customTestTag10", "tagValue");\n then(continuedSpan.getEvents()).extracting("value").contains("customTest.before", "customTest.after");\n}\nspan.end();\n\n// Continues the previous span\nspan = this.tracer.nextSpan().name("foo");\ntry (Tracer.SpanInScope ws = this.tracer.withSpan(span.start())) {\n\n // Adds tags and events to an existing span (reusing setup from the parent\n // interface)\n testBean().testMethod10_v2("tagValue");\n SimpleSpan continuedSpan = modifiedSpanViaAspect();\n then(continuedSpan.getName()).isEqualTo("foo");\n then(continuedSpan.getTags()).containsEntry("testTag10", "tagValue");\n then(continuedSpan.getEvents()).extracting("value").contains("customTest.before", "customTest.after");\n}\nspan.end();\n\n\n-----\n\n\n:leveloffset!:\n\n== Configuring with Micrometer Observation\n\n:leveloffset: +1\n\n== Handler Configuration\n\n// TODO: We need to separately document that Micrometer provides a TimerObservationHandler\n\nFor Micrometer Tracing to work with Micrometer Observation, you need to add a tracing related `ObservationHandler`.\nCheck the example below for an example of adding and using a single `DefaultTracingObservationHandler`.\n\n[source,java,subs=+attributes]\n-----\nTracer tracer = Tracer.NOOP; // The real tracer will come from your tracer\n // implementation (Brave /\n// OTel)\nPropagator propagator = Propagator.NOOP; // The real propagator will come from\n // your tracer implementation (Brave /\n // OTel)\nMeterRegistry meterRegistry = new SimpleMeterRegistry();\n\nObservationRegistry registry = ObservationRegistry.create();\nregistry.observationConfig()\n // assuming that micrometer-core is on the classpath\n .observationHandler(new DefaultMeterObservationHandler(meterRegistry))\n // we set up a first matching handler that creates spans - it comes from\n // Micrometer\n // Tracing. We set up spans for sending and receiving data over the wire\n // and a default one\n .observationHandler(new ObservationHandler.FirstMatchingCompositeObservationHandler(\n new PropagatingSenderTracingObservationHandler<>(tracer, propagator),\n new PropagatingReceiverTracingObservationHandler<>(tracer, propagator),\n new DefaultTracingObservationHandler(tracer)));\n\n// Creating and starting a new observation\n// via the `DefaultTracingObservationHandler` that will create a new Span and\n// start it\nObservation observation = Observation.start("my.operation", registry)\n .contextualName("This name is more readable - we can reuse it for e.g. spans")\n .lowCardinalityKeyValue("this.tag", "will end up as a meter tag and a span tag")\n .highCardinalityKeyValue("but.this.tag", "will end up as a span tag only");\n\n// Put the observation in scope\n// This will result in making the previously created Span, the current Span - it\'s\n// in ThreadLocal\ntry (Observation.Scope scope = observation.openScope()) {\n // Run your code that you want to measure - still the attached Span is the\n // current one\n // This means that e.g. logging frameworks could inject to e.g. MDC tracing\n // information\n yourCodeToMeasure();\n}\nfinally {\n // The corresponding Span will no longer be in ThreadLocal due to\n // try-with-resources block (Observation.Scope is an AutoCloseable)\n // Stop the Observation\n // The corresponding Span will be stopped and reported to an external system\n observation.stop();\n}\n-----\n\nYou can also use a shorter version to perform measurements via the `observe` method.\n\n[source,java,subs=+attributes]\n-----\nObservationRegistry registry = ObservationRegistry.create();\n\nObservation.createNotStarted("my.operation", registry)\n .contextualName("This name is more readable - we can reuse it for e.g. spans")\n .lowCardinalityKeyValue("this.tag", "will end up as a meter tag and a span tag")\n .highCardinalityKeyValue("but.this.tag", "will end up as a span tag only")\n .observe(this::yourCodeToMeasure);\n-----\n\nThis will result in the following Micrometer Metrics:\n\n```\nGathered the following metrics\n Meter with name <my.operation> and type <TIMER> has the following measurements\n <[\n Measurement{statistic=\'COUNT\', value=1.0},\n Measurement{statistic=\'TOTAL_TIME\', value=1.011949454},\n Measurement{statistic=\'MAX\', value=1.011949454}\n ]>\n and has the following tags <[tag(this.tag=will end up as a meter tag and a span tag)]>\n```\n\nAnd the following trace view in e.g. Zipkin\n\nimage::'+n(84)+'[Trace Info propagation]\n\n=== Ordered Handler Configuration\n\nMicrometer Tracing comes with multiple `ObservationHandler` implementations.\nTo introduce ordering, you can use the `ObservationHandler.AllMatchingCompositeObservationHandler` to run logic for all ``ObservationHandler``s that are matching the given predicate and `ObservationHandler.FirstMatchingCompositeObservationHandler` to run logic only for the first `ObservationHandler` that matches the predicate.\nThe former can group handlers and the latter can be chosen to e.g. run only one matching `TracingObservationHandler`.\n\n== Context Propagation with Micrometer Tracing\n\nIn order to make https://micrometer.io/docs/contextPropagation[Context Propagation] work with Micrometer Tracing you need to manually register the proper `ThreadLocalAccessor` as presented below.\n\n[source,java,subs=+attributes]\n-----\nContextRegistry.getInstance().registerThreadLocalAccessor(new ObservationAwareSpanThreadLocalAccessor(tracer));\n-----\n\n== Exemplars\n\nTo add support for https://grafana.com/docs/grafana/latest/fundamentals/exemplars/[exemplars] instead of using the `DefaultMeterObservationHandler` you should use the `TracingAwareMeterObservationHandler` like presented below.\n\n[source,java,subs=+attributes]\n-----\nObservationRegistry registry = ObservationRegistry.create();\nregistry.observationConfig()\n // Don\'t register the DefaultMeterObservationHandler...\n // .observationHandler(new DefaultMeterObservationHandler(meterRegistry))\n // ...instead register the tracing aware version\n .observationHandler(new TracingAwareMeterObservationHandler<>(\n new DefaultMeterObservationHandler(meterRegistry), tracer));\n-----\n\n:leveloffset!:\n\n== Testing\n\n:leveloffset: +1\n\nMicrometer Tracing comes with `micrometer-tracing-test` and `micrometer-tracing-integration-test` modules.\n\nFor unit tests it provides a `SimpleTracer` that is a test implementation of a `Tracer`.\n\nFor the integration tests it provides a `SampleTestRunner` mechanism that you can hook into your samples.\nIt will\n\n* Configure an OpenZipkin Brave Tracer\n** Set it up with Tanzu Observability by Wavefront Reporter\n** Set it up with OpenZipkin Zipkin Reporter\n* Configure an OpenTelemetry Tracer\n** Set it up with Tanzu Observability by Wavefront Exporter\n** Set it up with OpenZipkin Zipkin Exporter\n* Run all the combinations above against the user code and running infrastructure\n\n== Installing\n\nThe following example shows the required dependency in Gradle (assuming that Micrometer Tracing BOM has been added):\n\n[source,groovy,subs=+attributes]\n-----\ntestImplementation \'io.micrometer:micrometer-tracing-test\' // for unit tests\ntestImplementation \'io.micrometer:micrometer-tracing-integration-test\' // for integration tests\n-----\n\nThe following example shows the required dependency in Maven (assuming that Micrometer Tracing BOM has been added):\n\n[source,xml,subs=+attributes]\n-----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-tracing-test</artifactId> \x3c!-- For unit tests --\x3e\n <scope>test</scope>\n</dependency>\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-tracing-integration-test</artifactId> \x3c!-- For integration tests --\x3e\n <scope>test</scope>\n</dependency>\n-----\n\n== Running Tracing Unit Tests\n\nTo run unit tests of your custom handler you may want to use the `SimpleTracer` test `Tracer` implementation. Let\'s assume the following custom `TracingObservationHandler`.\n\n[source,java,subs=+attributes]\n-----\nstatic class MyTracingObservationHandler implements TracingObservationHandler<CustomContext> {\n\n private final Tracer tracer;\n\n MyTracingObservationHandler(Tracer tracer) {\n this.tracer = tracer;\n }\n\n @Override\n public void onStart(CustomContext context) {\n String databaseName = context.getDatabaseName();\n Span.Builder builder = this.tracer.spanBuilder().kind(Span.Kind.CLIENT).remoteServiceName(databaseName);\n getTracingContext(context).setSpan(builder.start());\n }\n\n @Override\n public void onError(CustomContext context) {\n getTracingContext(context).getSpan().error(context.getError());\n }\n\n @Override\n public void onStop(CustomContext context) {\n Span span = getRequiredSpan(context);\n span.name(context.getContextualName() != null ? context.getContextualName() : context.getName());\n tagSpan(context, span);\n span.end();\n }\n\n @Override\n public boolean supportsContext(Observation.Context context) {\n return context instanceof CustomContext;\n }\n\n @Override\n public Tracer getTracer() {\n return this.tracer;\n }\n\n}\n-----\n\nTo verify whether the spans got properly created we can use the `SimpleTracer` as follows:\n\n[source,java,subs=+attributes]\n-----\nclass SomeComponentThatIsUsingMyTracingObservationHandlerTests {\n\n ObservationRegistry registry = ObservationRegistry.create();\n\n SomeComponent someComponent = new SomeComponent(registry);\n\n SimpleTracer simpleTracer = new SimpleTracer();\n\n MyTracingObservationHandler handler = new MyTracingObservationHandler(simpleTracer);\n\n @BeforeEach\n void setup() {\n registry.observationConfig().observationHandler(handler);\n }\n\n @Test\n void should_store_a_span() {\n // this code will call actual Observation API\n someComponent.doSthThatShouldCreateSpans();\n\n TracerAssert.assertThat(simpleTracer)\n .onlySpan()\n .hasNameEqualTo("insert user")\n .hasKindEqualTo(Span.Kind.CLIENT)\n .hasRemoteServiceNameEqualTo("mongodb-database")\n .hasTag("mongodb.command", "insert")\n .hasTag("mongodb.collection", "user")\n .hasTagWithKey("mongodb.cluster_id")\n .assertThatThrowable()\n .isInstanceOf(IllegalStateException.class)\n .backToSpan()\n .hasIpThatIsBlank()\n .hasPortThatIsNotSet();\n }\n\n}\n-----\n\n== Running integration tests\n\nThe following example shows how you can run your code to test your integrations\n\n* by asserting spans that were stored without emitting them to a reporting system\n* against running Tanzu Observability by Wavefront instance (this option turns on when you have passed the Wavefront related configuration in the constructor - otherwise the test will be disabled)\n* against running Zipkin instance (this option turns on when Zipkin is running - otherwise the test will be disabled)\n\n[source,java,subs=+attributes]\n-----\nclass ObservabilitySmokeTest extends SampleTestRunner {\n\n ObservabilitySmokeTest() {\n super(SampleRunnerConfig.builder().wavefrontApplicationName("my-app").wavefrontServiceName("my-service")\n .wavefrontToken("...")\n .wavefrontUrl("...")\n .zipkinUrl("...") // defaults to localhost:9411\n .build());\n }\n\n @Override\n public BiConsumer<BuildingBlocks, Deque<ObservationHandler<? extends Observation.Context>>> customizeObservationHandlers() {\n return (bb, handlers) -> {\n ObservationHandler defaultHandler = handlers.removeLast();\n handlers.addLast(new MyTracingObservationHandler(bb.getTracer()));\n handlers.addLast(defaultHandler);\n };\n }\n\n @Override\n public SampleTestRunnerConsumer yourCode() {\n return (bb, meterRegistry) -> {\n // here you would be running your code\n yourCode();\n\n SpansAssert.assertThat(bb.getFinishedSpans())\n .haveSameTraceId()\n .hasNumberOfSpansEqualTo(8)\n .hasNumberOfSpansWithNameEqualTo("handle", 4)\n .forAllSpansWithNameEqualTo("handle", span -> span.hasTagWithKey("rsocket.request-type"))\n .hasASpanWithNameIgnoreCase("request_stream")\n .thenASpanWithNameEqualToIgnoreCase("request_stream")\n .hasTag("rsocket.request-type", "REQUEST_STREAM")\n .backToSpans()\n .hasASpanWithNameIgnoreCase("request_channel")\n .thenASpanWithNameEqualToIgnoreCase("request_channel")\n .hasTag("rsocket.request-type", "REQUEST_CHANNEL")\n .backToSpans()\n .hasASpanWithNameIgnoreCase("request_fnf")\n .thenASpanWithNameEqualToIgnoreCase("request_fnf")\n .hasTag("rsocket.request-type", "REQUEST_FNF")\n .backToSpans()\n .hasASpanWithNameIgnoreCase("request_response")\n .thenASpanWithNameEqualToIgnoreCase("request_response")\n .hasTag("rsocket.request-type", "REQUEST_RESPONSE");\n\n MeterRegistryAssert.assertThat(meterRegistry)\n .hasTimerWithNameAndTags("rsocket.response", Tags.of(Tag.of("error", "none"), Tag.of("rsocket.request-type", "REQUEST_RESPONSE")))\n .hasTimerWithNameAndTags("rsocket.fnf", Tags.of(Tag.of("error", "none"), Tag.of("rsocket.request-type", "REQUEST_FNF")))\n .hasTimerWithNameAndTags("rsocket.request", Tags.of(Tag.of("error", "none"), Tag.of("rsocket.request-type", "REQUEST_RESPONSE")))\n .hasTimerWithNameAndTags("rsocket.channel", Tags.of(Tag.of("error", "none"), Tag.of("rsocket.request-type", "REQUEST_CHANNEL")))\n .hasTimerWithNameAndTags("rsocket.stream", Tags.of(Tag.of("error", "none"), Tag.of("rsocket.request-type", "REQUEST_STREAM")));\n };\n }\n\n}\n-----\n\n:leveloffset!:\n'},function(e,t,n){"use strict";n.r(t),t.default=n.p+"7043f6f1d0731de0cc0943e896c32fca.jpg"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"e4aa3da5f34dc789ae92d1f759a97b85.jpg"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"b8a4008ab6f119930854d422d6bd39b9.jpg"},function(e,t){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Context Propagation support\n:toc:\n:sectnums:\n:dimensional: true\n\n== Purpose\n\nhttps://github.com/micrometer-metrics/context-propagation[A library] that assists with context propagation across different types of context\nmechanisms such as `ThreadLocal`, Reactor https://projectreactor.io/docs/core/release/reference/#context[Context]\nand others.\n\nAbstractions:\n\n* `ThreadLocalAccessor` - contract to assist with access to a `ThreadLocal` value.\n* `ContextAccessor` - contract to assist with access to a `Map`-like context.\n* `ContextRegistry` - registry for instances of `ThreadLocalAccessor` and `ContextAccessor`.\n* `ContextSnapshot` - holder of contextual values, that provides methods to capture and to propagate.\n\nExample Scenarios:\n\n* In imperative code, e.g. Spring MVC controller, capture `ThreadLocal` values into a\n`ContextSnapshot`. After that use the snapshot to populate a Reactor `Context` with the\ncaptured values, or to wrap a task (e.g. `Runnable`, `Callable`, etc) or an `Executor`\nwith a decorator that restores `ThreadLocal` values when the task executes.\n* In reactive code, e.g. Spring WebFlux controller, create a `ContextSnapshot` from\nReactor `Context` values. After that use the snapshot to restore `ThreadLocal` values\nwithin a specific stage (operator) of the reactive chain.\n\nContext values can originate from any context mechanism and propagate to any other, any\nnumber of times. For example, a value in a `Reactor` context may originate as a\n`ThreadLocal`, and may yet become a `ThreadLocal` again, and so on.\n\nGenerally, imperative code should interact with `ThreadLocal` values as usual, and\nlikewise Reactor code should interact with the Reactor `Context` as usual. The Context\nPropagation library is not intended to replace those, but to assist with propagation when\ncrossing from one type of context to another, e.g. when imperative code invokes a Reactor\nchain, or when a Reactor chain invokes an imperative component that expects\n`ThreadLocal` values.\n\nThe library is not limited to context propagation from imperative to reactive. It can\nassist in asynchronous scenarios to propagate `ThreadLocal` values from one thread to\nanother. It can also propagate to any other type of context for which there is a\nregistered `ContextAccesor` instance.\n\n== Installing\n\nSnapshots are published to https://repo.spring.io/snapshot for every successful build on the `main` branch and maintenance branches.\n\nMilestone releases are published to https://repo.spring.io/milestone. Include that as a Maven repository in your build\nconfiguration to use milestone releases. Note that milestone releases are for testing purposes and are not intended for\nproduction use.\n\nThe following example shows the required dependency in Gradle:\n\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.micrometer:context-propagation:latest.integration\'\n----\n\nThe following example shows the required dependency in Maven:\n\n[source,xml,subs=+attributes]\n----\n<dependencies>\n <dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>context-propagation</artifactId>\n <version>${micrometer-context-propagation.version}</version>\n </dependency>\n</dependencies>\n----\n\n== Usage Examples\n\n:leveloffset: +1\n\n== `ThreadLocal` Population\n\nBelow you can find a holder for `ThreadLocal` values.\n\n.ObservationThreadLocalHolder\n[source,java,subs=+attributes]\n-----\n/**\n * Example of a wrapper around ThreadLocal values.\n */\npublic class ObservationThreadLocalHolder {\n\n private static final ThreadLocal<String> holder = new ThreadLocal<>();\n\n public static void setValue(String value) {\n holder.set(value);\n }\n\n public static String getValue() {\n return holder.get();\n }\n\n public static void reset() {\n holder.remove();\n }\n\n}\n-----\n\nBelow you can find a `ThreadLocalAccessor` that interacts with the holder.\n\n.ObservationThreadLocalAccessor\n[source,java,subs=+attributes]\n-----\n/**\n * Example {@link ThreadLocalAccessor} implementation.\n */\npublic class ObservationThreadLocalAccessor implements ThreadLocalAccessor<String> {\n\n public static final String KEY = "micrometer.observation";\n\n @Override\n public Object key() {\n return KEY;\n }\n\n @Override\n public String getValue() {\n return ObservationThreadLocalHolder.getValue();\n }\n\n @Override\n public void setValue(String value) {\n ObservationThreadLocalHolder.setValue(value);\n }\n\n @Override\n public void setValue() {\n ObservationThreadLocalHolder.reset();\n }\n\n}\n-----\n\nBelow you can find an example of how to store and restore thread local values via `ThreadLocalAccessor`, `ContextSnapshot` and `ContextRegistry`.\n\n[source,java,subs=+attributes]\n-----\n// Create a new Context Registry (you can use a global too)\nContextRegistry registry = new ContextRegistry();\n// Register thread local accessors (you can use SPI too)\nregistry.registerThreadLocalAccessor(new ObservationThreadLocalAccessor());\n\n// When you set a thread local value...\nObservationThreadLocalHolder.setValue("hello");\n// ... we can capture it using ContextSnapshot\nContextSnapshot snapshot = ContextSnapshotFactory.builder().contextRegistry(registry).build().captureAll();\n\n// After capturing if you change the thread local value again ContextSnapshot will\n// not see it\nObservationThreadLocalHolder.setValue("hola");\ntry {\n // We\'re populating the thread local values with what we had in\n // ContextSnapshot\n try (Scope scope = snapshot.setThreadLocals()) {\n // Within this scope you will see the stored thread local values\n then(ObservationThreadLocalHolder.getValue()).isEqualTo("hello");\n }\n // After the scope is closed we will come back to the previously present\n // values in thread local\n then(ObservationThreadLocalHolder.getValue()).isEqualTo("hola");\n}\nfinally {\n // We\'re clearing the thread local values so that we don\'t pollute the thread\n ObservationThreadLocalHolder.reset();\n}\n-----\n\n:leveloffset!:\n'},function(e,t,n){var r={"./appOptics.adoc":87,"./atlas.adoc":90,"./azure-monitor.adoc":94,"./cloudwatch.adoc":95,"./datadog.adoc":96,"./dynatrace.adoc":97,"./elastic.adoc":98,"./ganglia.adoc":99,"./graphite.adoc":101,"./hierarchical-name-mapping.adoc":103,"./humio.adoc":104,"./influx.adoc":106,"./install.adoc":107,"./instana.adoc":108,"./jmx.adoc":109,"./kairos.adoc":111,"./new-relic.adoc":112,"./otlp.adoc":117,"./prometheus.adoc":118,"./signalFx.adoc":124,"./stackdriver.adoc":130,"./statsD.adoc":131,"./wavefront.adoc":132};function a(e){var t=i(e);return n(t)}function i(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=i,e.exports=a,a.id=86},function(e,t,n){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer AppOptics\n:toc:\n:sectnums:\n:system: appoptics\n\nAppOptics is a dimensional time-series SaaS with built-in dashboarding.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThe following example configures an AppOptics instance:\n\n[source,java]\n----\nAppOpticsConfig appopticsConfig = new AppOpticsConfig() {\n @Override\n public String apiToken() {\n return MY_TOKEN;\n }\n\n @Override\n @Nullable\n public String get(String k) {\n return null;\n }\n};\nMeterRegistry registry = new AppOpticsMeterRegistry(appopticsConfig, Clock.SYSTEM);\n----\n\n`AppOpticsConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.appoptics` directly to the `AppOpticsConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.appoptics:\n api-token: YOURKEY\n\n # You will probably want disable AppOptics publishing in a local development profile.\n enabled: true\n\n # The interval at which metrics are sent to AppOptics. The default is 1 minute.\n step: 1m\n----\n\n== Graphing\n\nThis section serves as a quick start to rendering useful representations in AppOptics for metrics that originate in Micrometer.\n\n=== Timers\n\nThe AppOptics implementation of `Timer` produces three fields in AppOptics:\n\n* `sum`: Rate of calls per second.\n* `count`: Rate of total time per second.\n* `max`: A sliding window maximum amount recorded.\n\n.Dimensionally aggregable average in AppOptics.\nimage::"+n(88)+"[AppOptics timer average]\n\nAppOptics performs the `sum/count` division dimensionally to generate aggregable averages on your behalf.\n\n.Timer over a simulated service.\nimage::"+n(89)+"[AppOptics-rendered timer]\n"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"0592f647d85fc092e402fdfb77234e24.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"6bf5cf6071710d129ffaadb50d2b0874.png"},function(e,t,n){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Atlas\n:toc:\n:sectnums:\n:system: atlas\n\nAtlas is an in-memory dimensional time series database with built-in graphing, a custom stack-based query language, and advanced math operations. Atlas originated at Netflix, where it remains the operational metrics solution.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\n[source,java]\n----\nAtlasConfig atlasConfig = new AtlasConfig() {\n @Override\n public Duration step() {\n return Duration.ofSeconds(10);\n }\n\n @Override\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\nMeterRegistry registry = new AtlasMeterRegistry(atlasConfig, Clock.SYSTEM);\n----\n\nMicrometer uses Netflix's https://github.com/netflix/spectator[Spectator] as the underlying instrumentation library when recording metrics destined for Atlas. `AtlasConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties prefixed with `management.metrics.export.atlas` directly to the `AtlasConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.atlas:\n # The location of your Atlas server\n uri: http://localhost:7101/api/v1/publish\n\n # You will probably want to conditionally disable Atlas publishing in local development.\n enabled: true\n\n # The interval at which metrics are sent to Atlas. The default is 1 minute.\n step: 1m\n----\n\n== Graphing\n\nThis section serves as a quick start to rendering useful representations in Atlas for metrics originating in Micrometer. See the https://github.com/netflix/atlas/wiki[Atlas wiki] for a far more complete reference of what is possible in Atlas.\n\n=== Counters\n\nAtlas serves up graphs in the form of PNG images (and other https://github.com/Netflix/atlas/wiki/Output-Formats[output formats] as well).\n\nWe use the following query to visualize the counter from Atlas. Note that the value is rate-normalized over the step interval rather than monotonically increasing. Atlas always expects link:/docs/concepts#_client_side[rate-aggregated] data for counters from Micrometer.\n\n.Counter over a positive-biased random walk.\nimage::"+n(91)+'[Atlas-rendered counter]\n\n[source,http]\n----\nGET /api/v1/graph?\n q=\n name,counter,:eq,\n 2,:lw\n &tz=US/Central\n &s=e-15m <1>\n &w=400 <2>\n &l=0 <3>\nHost: localhost:7101\n----\n<1> The range of time we want to visualize along the x-axis. `e` represents the end time or "`now`". This graph\'s axis is from 15 minutes ago until now. Atlas automatically chooses the finest grained step interval available from the data that would render at least 1px wide on the resultant image.\n<2> The overall width of the PNG image returned should be 400px.\n<3> Set the y-axis lower limit to 0 so that random perturbation in the walk does not look so dramatic.\n\n=== Timers\n\nWhile reading directly from a `Timer` returns a `double`, the underlying value is\nstored in https://github.com/netflix/spectator[Spectator] as a nanosecond-precise `long`. What precision is lost by\nconverting to a `double` in the `Timer` interface does not affect a system like\nAtlas, because it has been configured to read measurements from the underlying\nSpectator `Timer` that Micrometer is hiding from you.\n\nThe Spectator Atlas `Timer` produces four time series, each with a different `statistic` tag:\n\n* `count`: Rate of calls per second.\n* `totalTime`: Rate of total time per second.\n* `totalOfSquares`: Rate of total time squared per second (useful for standard deviation).\n* `max`: The maximum amount recorded.\n\nTherefore, you can achieve a throughput (requests/second) line with the following query:\n\n```http\nname,timer,:eq,statistic,count,:eq,:and\n```\n\nNotice that `statistic` is just a dimension that can be drilled down and selected like any other.\n\nFurthermore, `totalTime/count` represents average latency and can be selected with a short-hand `:dist-avg` query, which selects the `totalTime` and `count` time series and performs the division for us:\n\n```http\nname,timer,:eq,:dist-avg\n```\n\nIn the preceding example, you can see these two lines plotted on a single dual-axis graph.\n\n.Timer over a simulated service.\nimage::'+n(92)+"[Atlas-rendered timer]\n\n\n=== Long task timers\n\nSuppose we had a task that took two minutes to complete when it was expected to complete in less than 70 seconds. A key benefit of long task timers is the ability to receive an alert at the first reporting interval after we have exceeded the threshold. With a regular timer, we would not receive an alert until the first reporting interval after the process completed. If we had a ten-second publishing interval, the regular timer alert would arrive almost a minute after the long task timer alert.\n\n.Simulated back-to-back long tasks.\nimage::"+n(93)+"[Atlas-rendered long task timer]\n\n[source, http]\n----\nGET /api/v1/graph?\n q=\n name,longTaskTimer,:eq,statistic,duration,:eq,:and, <1>\n :dup,\n 70,:gt,:vspan,f00,:color,40,:alpha,alerted,:legend, <2>\n 70,f00,:color,alert+threshold,:legend <3>\n &tz=US/Central\n &s=e-15m\n &w=400\n &l=0\n &title=Peaks+of+Long+Tasks\n &ylabel=time\nHost: localhost:7101\n----\n<1> A representation of long tasks that are happening back-to-back.\n<2> A vertical span that appears whenever the long task exceeds our threshold of 70 seconds. So that it does not overwhelm the graph, we also decrease the opacity of the vspan.\n<3> Plot the threshold of 70 seconds as a separate line.\n"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"b22351bea254b10bef1c26d3cc3ef397.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"4ce8699a76d05ed4311151acc1772b1f.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"1127e78d5d7524b0c0540de3d2a732b2.png"},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Azure Monitor\n:toc:\n:sectnums:\n:system: azure-monitor\n\nAzure Monitor is a dimensional time-series SaaS with built-in dashboarding.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThe following example configures a Micrometer Azure Monitor:\n\n[source,java]\n----\nAzureMonitorConfig azureMonitorConfig = new AzureMonitorConfig() {\n @Override\n public String instrumentationKey() {\n return MY_KEY;\n }\n\n @Override\n public String get(String key) {\n return null;\n }\n};\nMeterRegistry registry = new AzureMonitorMeterRegistry(azureMonitorConfig, Clock.SYSTEM);\n----\n\n`AzureMonitorConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.azure-monitor` directly to the `AzureMonitorConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.azure-monitor:\n instrumentation-key: YOURKEY\n\n # You will probably want disable Azure Monitor publishing in a local development profile.\n enabled: true\n\n # The interval at which metrics are sent to Azure Monitor. The default is 1 minute.\n step: 1m\n----\n"},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer CloudWatch\nTommy Ludwig <tludwig@vmware.com>\n:toc:\n:sectnums:\n:system: cloudwatch2\n\nhttps://aws.amazon.com/cloudwatch/[Amazon CloudWatch] is a dimensional time-series SaaS on Amazon's cloud.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\nNOTE: The `micrometer-registry-cloudwatch2` module uses AWS SDK v2. `micrometer-registry-cloudwatch` is for AWS SDK v1.\n\n== Configuring\n\nThe following example configures Micrometer CloudWatch:\n\n[source,java]\n----\nCloudWatchConfig cloudWatchConfig = new CloudWatchConfig() {\n @Override\n public String get(String s) {\n return null;\n }\n\n @Override\n public String namespace() {\n return \"mynamespace\";\n }\n};\nMeterRegistry meterRegistry = new CloudWatchMeterRegistry(cloudWatchConfig, Clock.SYSTEM, CloudWatchAsyncClient.create());\n----\n\nYou can provide your own `CloudWatchAsyncClient` to the constructor of the registry.\n\n`CloudWatchConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, https://docs.awspring.io/spring-cloud-aws/docs/current/reference/html/index.html#cloudwatch-metrics[Micrometer support in Spring Cloud AWS] binds properties prefixed with `management.metrics.export.cloudwatch` directly to the `CloudWatchConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.cloudwatch:\n namespace: YOURNAMESPACE\n\n # You will probably want to disable publishing in a local development profile.\n enabled: true\n\n # The interval at which metrics are sent to CloudWatch. The default is 1 minute.\n step: 1m\n----\n"},function(e,t){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Datadog\n:toc:\n:sectnums:\n:system: datadog\n\nDatadog is a dimensional time-series SaaS with built-in dashboarding and alerting.\n\n== Installation and Configuration\n\nMicrometer supports shipping metrics to Datadog directly by using its HTTP API or by using DogStatsD through the link:/docs/registry/statsD[StatsD registry].\nThe API approach is far more efficient if you need to choose between the two.\n\n=== Direct to Datadog API Approach\n\nFor Gradle, add the following implementation:\n\n[source,groovy]\n----\nimplementation \'io.micrometer:micrometer-registry-datadog:latest.release\'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-datadog</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\nMetrics are rate-aggregated and pushed to `datadoghq` on a periodic interval. Rate aggregation performed by the registry yields datasets that are similar to those produced by `dogstatsd`.\n\n[source, java]\n----\nDatadogConfig config = new DatadogConfig() {\n @Override\n public Duration step() {\n return Duration.ofSeconds(10);\n }\n\n @Override\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\nMeterRegistry registry = new DatadogMeterRegistry(config, Clock.SYSTEM);\n----\n\n`DatadogConfig` is an interface with a set of default methods.\nIf, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration through properties.\nFor example, Spring Boot\'s Micrometer support binds properties directly to the `DatadogConfig`.\nSee the https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.metrics.export.datadog[Datadog] section in the Spring Boot reference documentation.\n\n`DatadogConfig.hostTag()` specifies a tag key that is mapped to https://docs.datadoghq.com/api/v1/metrics/#submit-metrics[the `host` field] when shipping metrics to Datadog.\nFor example, if `DatadogConfig.hostTag()` returns `host`, the tag having `host` as its key is used.\nYou can set the tag by using common tags, as follows:\n\n[source,java]\n----\nregistry.config().commonTags("host", "my-host");\n----\n\n`uri` is an important property to configure.\nThe default value is `https://api.datadoghq.com`.\nDepending on the Datadog site (region), the api endpoint will be different.\nTo find your the correct `uri` for your account, do the following:\n\n1. Read about https://docs.datadoghq.com/getting_started/site/[Datadog site].\n2. Go to https://docs.datadoghq.com/api/latest/metrics/[Metrics API reference] and select your own option from the "DATADOG SITE" dropdown.\n3. Check any API request\'s endpoint.\n\nE.g. For `US5` site, the correct API endpoint is `https://api.us5.datadoghq.com` while for `US3` site, it is `https://api.us3.datadoghq.com/`.\n\n=== Through DogStatsD Approach\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.micrometer:micrometer-registry-statsd:latest.release\'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-statsd</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\nMetrics are immediately shipped to DogStatsD using Datadog\'s flavor of the StatsD line protocol. `java-dogstatsd-client` is _not_ needed on the classpath for this to work, as Micrometer uses its own implementation.\n\n[source,java]\n----\nStatsdConfig config = new StatsdConfig() {\n @Override\n public String get(String k) {\n return null;\n }\n\n @Override\n public StatsdFlavor flavor() {\n return StatsdFlavor.DATADOG;\n }\n};\n\nMeterRegistry registry = new StatsdMeterRegistry(config, Clock.SYSTEM);\n----\n\nMicrometer supports DogStatsD\'s https://docs.datadoghq.com/developers/dogstatsd/?tab=kubernetes#origin-detection-over-udp[origin detection over UDP] feature on Kubernetes if the `DD_ENTITY_ID` environment variable is properly set.\n\nMicrometer, by default, publishes `Timer` meters to DogStatsD as the StatsD "timing" metric type `ms`,\nwhich are sent to Datadog as https://docs.datadoghq.com/metrics/types/?tab=histogram#metric-types[histogram] type metrics.\nMicrometer publishes `DistributionSummary` meters as histogram type metrics by default, also.\n\nWhen `percentileHistogram` is enabled for the meter, Micrometer sends `Timer` and `DistributionSummary` meters as Datadog https://docs.datadoghq.com/metrics/distributions[Distributions] to DogStatsD.\nYou can make a `DistributionSummary` with `percentileHistogram` enabled as follows:\n\n[source,java]\n----\nDistributionSummary responseSizeSummary = DistributionSummary.builder("http.server.response.size")\n .baseUnit("bytes")\n .publishPercentileHistogram()\n .register(registry);\n----\n'},function(e,t){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Dynatrace\n:toc:\n:sectnums:\n:system: dynatrace\n\nhttps://www.dynatrace.com/[*Dynatrace*] is a Software Intelligence Platform featuring application performance monitoring (APM), artificial intelligence for operations (AIOps), IT infrastructure monitoring, digital experience management (DEM), and digital business analytics capabilities.\nIt can ingest multi-purpose dimensional time-series data and has built-in dashboarding.\nBoth SaaS and self-hosted (Managed) deployments are offered.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.micrometer:micrometer-registry-{system}:latest.release\'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nFor setting up new integrations with Dynatrace, it is recommended to use the latest version of the https://docs.dynatrace.com/docs/shortlink/api-metrics-v2[Dynatrace Metrics API] (v2).\nIf you are using Micrometer with Spring Boot, please also refer to the https://docs.dynatrace.com/docs/shortlink/micrometer-metrics-ingest[Dynatrace documentation] and/or the https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.metrics.export.dynatrace[Spring Boot documentation].\nDynatrace provides different ways of setting up integrations:\n\n=== Using Dynatrace auto-configuration (preferred) [[bookmark-auto-configuration]]\n\nDynatrace auto-configuration is available for hosts that are monitored by a OneAgent or by the Dynatrace Operator for Kubernetes.\n\nIf a Dynatrace OneAgent is installed on the host running Micrometer, metrics can be exported directly using the OneAgent without having to specify an endpoint URI or API token.\nIf running in Kubernetes with the Dynatrace operator installed, the registry will pick up your endpoint URI and API token from the operator instead.\nIn this case there is no need to configure anything, so you can use the following code in your project to export Micrometer metrics to Dynatrace:\n\n[source,java]\n----\nDynatraceConfig dynatraceConfig = new DynatraceConfig() {\n @Override\n @Nullable\n public String get(String k) {\n // This method of the interface is used by the other configuration methods and needs to be\n // implemented here. Returning null accepts the defaults for the other configuration items.\n return null;\n }\n};\nMeterRegistry registry = new DynatraceMeterRegistry(dynatraceConfig, Clock.SYSTEM);\n----\n\nIf you are using Micrometer 1.10.0 or above, you can also use the DEFAULT config to achieve the same with less code:\n\n[source,java]\n----\nMeterRegistry registry = new DynatraceMeterRegistry(DynatraceConfig.DEFAULT, Clock.SYSTEM);\n----\n\nIt is also possible to change other properties by creating an instance of the `DynatraceConfig` and overwriting the respective methods.\nFor example, you can specify the exporter version, which defaults to `v2` unless a deviceId is set:\n\n[source,java]\n----\nDynatraceConfig dynatraceConfig = new DynatraceConfig() {\n @Override\n public DynatraceApiVersion apiVersion() {\n return DynatraceApiVersion.V2;\n }\n\n @Override\n @Nullable\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\nMeterRegistry registry = new DynatraceMeterRegistry(dynatraceConfig, Clock.SYSTEM);\n----\n\n`DynatraceConfig` is an interface with a set of default methods.\nSpring Boot\'s Micrometer support binds properties prefixed with `management.dynatrace.metrics.export` directly to the `DynatraceConfig`.\n\nNOTE: Property names for binding attributes from Spring Boot have changed in Spring Boot version 3.0.0. If you use a Spring Boot version before 3.0.0, use `management.metrics.export.dynatrace` instead of `management.dynatrace.metrics.export`.\n\nUsing Spring Boot Micrometer support allows configuring the Dynatrace exporter by using <<bookmark-available-properties, the available properties>>.\nWhen using Micrometer with Spring Boot, you don\'t have to instantiate the `DynatraceMeterRegistry` manually as Spring Boot will do it automatically for you.\nAll configuration options that can be set by overwriting methods can also be set via Spring Boot properties, and adding a separate MeterRegistry can lead to metrics not being exported as auto-configuration might break.\n\nTo use the Dynatrace metrics exporter for Micrometer in your Spring Boot project, it is enough to include the `runtimeOnly \'io.micrometer:micrometer-registry-dynatrace\'` dependency.\nIn this default configuration, metrics will be exported to the local OneAgent or Kubernetes operator-provided endpoint.\n\n=== Using a custom endpoint\n\nIf auto-configuration is not available on the host, both the Dynatrace Metrics API v2 endpoint and an API token have to be specified.\nThe https://docs.dynatrace.com/docs/shortlink/api-authentication[Dynatrace API token documentation] contains more information on how to create an API token.\nThe \'Ingest metrics\' (`metrics.ingest`) permission is required on the token in order to ingest metrics.\nIt is recommended to limit scope to only this permission.\n\n[source,java]\n----\nDynatraceConfig dynatraceConfig = new DynatraceConfig() {\n @Override\n public DynatraceApiVersion apiVersion() {\n // not strictly required, but makes the code more clear/explicit\n return DynatraceApiVersion.V2;\n }\n\n @Override\n public String uri() {\n // The endpoint of the Dynatrace Metrics API v2 including path, e.g.:\n // "https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest"\n String endpoint = System.getenv("ENVVAR_METRICS_INGEST_URL");\n return endpoint != null ? endpoint : DynatraceConfig.super.uri();\n }\n\n @Override\n public String apiToken() {\n // should be read from a secure source\n String token = System.getenv("ENVVAR_METRICS_INGEST_TOKEN");\n return token != null ? token : "";\n }\n\n @Override\n @Nullable\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\nMeterRegistry registry = new DynatraceMeterRegistry(dynatraceConfig, Clock.SYSTEM);\n----\n\nThese properties can also be set via Spring Boot, using property or yaml files.\nIt is also possible to reference environment variables using the Spring property placeholders (e.g.: `management.dynatrace.metrics.export.uri: ${DT_METRICS_INGEST_URL}`).\n\nNOTE: `v2` is used as the default API version unless a `deviceId` is set (<<bookmark-apiv1, see below>>).\n\n[source,yml]\n----\n# For Spring Boot 3.0.0 and above:\nmanagement.dynatrace.metrics.export:\n# For Spring Boot versions below 3.0.0, use the line below instead of the line above:\n# management.metrics.export.dynatrace:\n # for SaaS: https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest\n # for managed deployments: https://{your-domain}/e/{your-environment-id}/api/v2/metrics/ingest\n uri: YOUR_METRICS_INGEST_URL\n\n # should be read from a secure source\n api-token: YOUR_METRICS_INGEST_TOKEN\n----\n\n=== Meter metadata\n\nStarting with Micrometer 1.12.0, the Dynatrace registry v2 exports meter metadata to Dynatrace.\nCurrently supported types of metadata are *unit* (called "base unit" in Micrometer) and *description*.\nNo changes are required to start exporting Metadata to Dynatrace - upgrading to version 1.12.0 or above is enough.\nFind more information about metrics metadata in the https://docs.dynatrace.com/docs/shortlink/metric-ingestion-protocol#metadata[Dynatrace documentation].\n\nThe export of metrics metadata can be disabled by setting the `exportMeterMetadata` property on the `DynatraceConfig` (see <<bookmark-available-properties, the section on available properties>> below) to `false`.\n\n== API Versions\n\n=== API v2 [[bookmark-apiv2]]\n\nWhen the API version is configured to `v2`, the registry will send data using the https://docs.dynatrace.com/docs/shortlink/api-metrics-v2[Metrics API v2].\nIn order to maintain backwards compatibility, when a `deviceId` is set (which is required for `v1` and not used in `v2`), `v1` is used as the default.\nOtherwise, the version defaults to `v2`, and does not have to be set explicitly.\nWith no endpoint URI and token set, metrics will be exported to the local OneAgent endpoint or, if running in Kubernetes with the Dynatrace operator installed, to the endpoint provided by the operator.\nIf no auto-configuration is desired, it is possible to specify endpoint and token explicitly, in order to export metrics to that specific endpoint.\nExplicitly specifying these will overwrite auto-configuration.\n\n*Minimal configuration with Dynatrace auto-configuration*\n\nIn the minimal configuration <<bookmark-auto-configuration, shown above>> (no URI or API token), the v2 registry will attempt to retrieve the endpoint provided by the Dynatrace Kubernetes operator.\nIf the operator is not set up or does not provide this information, the exporter will attempt to send metrics to the https://docs.dynatrace.com/docs/shortlink/local-api[local OneAgent metrics ingest endpoint].\nNote that this only works if a OneAgent is running on the host and the https://docs.dynatrace.com/docs/shortlink/local-api#enable-the-oneagent-metric-api[local OneAgent Metric API] is available.\nIf the ingestion port for the local OneAgent was changed to a custom one, the full endpoint URI has to be provided for the URI property (with API token left empty).\n\n*Configuration with URI and API token*\n\nIf no auto-configuration is available or the metrics should be sent to a different endpoint (e.g. a different tenant), the Dynatrace v2 exporter can be configured with an explicit endpoint URI and an https://docs.dynatrace.com/docs/shortlink/api-authentication[API token].\nThe https://docs.dynatrace.com/docs/shortlink/api-authentication[API token] must have the https://docs.dynatrace.com/docs/dynatrace-api/basics/dynatrace-api-authentication#token-scopes["Ingest metrics"] (`metrics.ingest`) permission set.\nIt is recommended to limit scope to only this permission.\n\nThe entire Metrics v2 API endpoint URI has to be specified including its path, i.e.: with the path `/api/v2/metrics/ingest` on SaaS and managed deployments, or `/metrics/ingest` for OneAgent endpoints as mentioned in the https://docs.dynatrace.com/docs/shortlink/api-metrics-v2-post-datapoints[documentation].\n\n*Properties available in the v2 exporter* [[bookmark-available-properties]]\n\nWhen using the https://docs.dynatrace.com/docs/shortlink/api-metrics-v2[Dynatrace metrics API v2], the following properties can be set:\n\n[source,java]\n----\nDynatraceConfig dynatraceConfig = new DynatraceConfig() {\n @Override\n public DynatraceApiVersion apiVersion() {\n return DynatraceApiVersion.V2;\n }\n\n @Override\n public String uri() {\n // The endpoint of the Dynatrace Metrics API v2 including path, e.g.:\n // "https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest".\n String endpoint = System.getenv("ENVVAR_METRICS_INGEST_URL");\n return endpoint != null ? endpoint : DynatraceConfig.super.uri();\n }\n\n @Override\n public String apiToken() {\n // should be read from a secure source\n String token = System.getenv("ENVVAR_METRICS_INGEST_TOKEN");\n return token != null ? token : "";\n }\n\n @Override\n public String metricKeyPrefix() {\n // will be prepended to all metric keys\n return "your.desired.prefix";\n }\n\n @Override\n public boolean enrichWithDynatraceMetadata() {\n return true;\n }\n\n @Override\n public Map<String, String> defaultDimensions() {\n // create and return a map containing the desired key-value pairs.\n Map<String, String> dims = new HashMap<>();\n dims.put("dimensionKey", "dimensionValue");\n return dims;\n }\n\n // Only available in Micrometer 1.9.0 and above\n @Override\n public boolean useDynatraceSummaryInstruments() {\n return false;\n }\n\n // Only available in Micrometer 1.12.0 and above\n @Override\n public boolean exportMeterMetadata() {\n return true;\n }\n\n @Override\n @Nullable\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\n----\n\nThese properties can also be set in Spring Boot configuration files:\n\n[source,yml]\n----\nmanagement.dynatrace.metrics.export:\n # Required only if not using the OneAgent endpoint\n # For SaaS: https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest\n # For managed deployments: https://{your-domain}/e/{your-environment-id}/api/v2/metrics/ingest\n uri: YOUR_METRICS_INGEST_URL\n\n # should be read from a secure source\n api-token: YOUR_METRICS_INGEST_TOKEN\n\n # These properties can only be used with the v2 exporter.\n v2:\n # Sets a prefix that is prepended to each exported metric key.\n metric-key-prefix: my.metric.key.prefix\n\n # If set to true and a local OneAgent or operator is running, retrieves metadata\n # and adds it as additional dimensions to all data points (default: true)\n enrich-with-dynatrace-metadata: true\n\n # Sets an arbitrary number of key-value pairs as default dimensions.\n # Micrometer tags will overwrite these dimensions, if they have the same key.\n # Each exported metric will contain these dimensions.\n default-dimensions:\n key1: "value1"\n key2: "value2"\n\n # (since 1.9.0) Whether or not to use the Dynatrace-specific summary instruments. (default: true)\n # This should only be disabled if problems with existing instrumentation are discovered after upgrading to 1.9.0.\n # Set to false, this will restore the previous (1.8.x) behavior for Timers and DistributionSummaries.\n use-dynatrace-summary-instruments: true\n\n # (since 1.12.0) Determines whether meter metadata (unit, description) should be exported.\n export-meter-metadata: true\n\n # The export interval in which metrics are sent to Dynatrace (default: 60s).\n step: 60s\n----\n\nFor more information about the metadata picked up by the Dynatrace metadata enrichment feature, see https://docs.dynatrace.com/docs/shortlink/enrichment-files[the Dynatrace documentation].\n\nIn Micrometer 1.9.0, Dynatrace-specific summary instruments (`DynatraceTimer` and `DynatraceDistributionSummary`) were introduced.\nThese specialized instruments are tailored to the Dynatrace metrics ingest, and prevent the creation of invalid metrics.\nThey are available from version 1.9.0 and are used as a drop-in replacement by default.\nNo action is needed from users upgrading to 1.9.0. If there is a discrepancy in the observed metrics, it is possible to return to the previous behavior by setting the `useDynatraceSummaryInstruments` toggle to `false`.\n\n=== API v1 (Legacy) [[bookmark-apiv1]]\n\nWhen the apiVersion is configured to `v1`, the registry will send data using the https://docs.dynatrace.com/docs/shortlink/api-custom-metrics[Dynatrace Timeseries API v1 for custom metrics].\nIf a `deviceId` is specified, it will default to `v1` for backwards compatibility with earlier setups.\nThe `device-id` property is required for `v1` and not used in `v2`.\nExisting setups will continue to work when updating to newer versions of Micrometer.\nThe reported metrics will be assigned to https://docs.dynatrace.com/docs/shortlink/api-custom-device-report-metric[custom devices] in Dynatrace.\n\nFor the v1 API, do not specify the ingest path, but only the base URL of your environment, e.g.: `uri: https://{your-environment-id}.live.dynatrace.com`\n\n[source,java]\n----\nDynatraceConfig dynatraceConfig = new DynatraceConfig() {\n @Override\n public String uri() {\n // The Dynatrace environment URI without any path, e.g.:\n // https://{your-environment-id}.live.dynatrace.com\n return MY_DYNATRACE_URI;\n }\n\n @Override\n public String apiToken() {\n // should be read from a secure source\n return MY_TOKEN;\n }\n\n @Override\n public String deviceId() {\n return MY_DEVICE_ID;\n }\n\n @Override\n @Nullable\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\nMeterRegistry registry = new DynatraceMeterRegistry(dynatraceConfig, Clock.SYSTEM);\n----\n\n[source,yml]\n----\nmanagement.dynatrace.metrics.export:\n # For v1 export, do not append a path to the endpoint URL, e.g.:\n # For SaaS: https://{your-environment-id}.live.dynatrace.com\n # For managed deployments: https://{your-domain}/e/{your-environment-id}\n uri: https://{your-environment-id}.live.dynatrace.com\n\n # should be read from a secure source\n api-token: MY_TOKEN\n\n # When setting the device id, metrics will be exported to the v1 timeseries endpoint\n # Using just device-id (without the v1 prefix) is deprecated, but will work to maintain backwards compatibility.\n v1:\n device-id: sample\n\n # To disable Dynatrace publishing, e.g. in a local development profile, use:\n # enabled: false\n\n # The interval at which metrics are sent to Dynatrace. The default is 1 minute.\n step: 1m\n----\n'},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Elastic\n:toc:\n:sectnums:\n:system: elastic\n\nElasticsearch is an open source search and analytics platform. Metrics stored in Elasticsearch can be visualized in Kibana.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThe following example configures an ElasticSearch instance:\n\n[source,java]\n----\nElasticConfig elasticConfig = new ElasticConfig() {\n @Override\n @Nullable\n public String get(String k) {\n return null;\n }\n};\nMeterRegistry registry = new ElasticMeterRegistry(elasticConfig, Clock.SYSTEM);\n----\n\n`ElasticConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.elastic` directly to the `ElasticConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.elastic:\n # You will probably want disable Elastic publishing in a local development profile.\n enabled: true\n\n # The interval at which metrics are sent to Elastic. The default is 1 minute.\n step: 1m\n\n # The index to store metrics in, defaults to \"micrometer-metrics\"\n index: micrometer-metrics\n----\n\n== Elastic APM agent integration\n\nIf you are using the Elastic APM agent, it can collect metrics from Micrometer `MeterRegistry` instances automatically. You can use the `SimpleMeterRegistry` if you only want metrics collected by the Elastic APM agent and not shipped anywhere else. See the https://www.elastic.co/guide/en/apm/agent/java/current/metrics.html#metrics-micrometer[Elastic docs] for more details.\n"},function(e,t,n){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Ganglia\n:toc:\n:sectnums:\n:system: ganglia\n\nGanglia is an aging hierarchical metrics system which enjoyed wide popularity in Linux system monitoring and is still in place in many organizations. It originated in the early 2000s at the University of California, Berkeley.\n\nNOTE: The `micrometer-registry-ganglia` module uses the https://github.com/ganglia/gmetric4j[gmetric4j] library, which contains classes generated by the LGPL licensed https://sourceforge.net/projects/remotetea/[remotetea project].\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThe following example configures a Ganglia instance:\n\n[source,java]\n----\nGangliaConfig gangliaConfig = new GangliaConfig() {\n @Override\n public String host() {\n return \"mygraphitehost\";\n }\n\n @Override\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\n\nMeterRegistry registry = new GangliaMeterRegistry(gangliaConfig, Clock.SYSTEM);\n----\n\nMicrometer uses Dropwizard Metrics as the underlying instrumentation library when recording metrics destined for Ganglia. `GangliaConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.ganglia` directly to the `GangliaConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.ganglia:\n # The location of your Ganglia server\n host: mygraphitehost\n\n # You will probably want to conditionally disable Ganglia publishing in local development.\n enabled: true\n\n # The interval at which metrics are sent to Ganglia. The default is 1 minute.\n step: 1m\n----\n\n== Hierarchical name mapping\n\nMicrometer provides a `HierarchicalNameMapper` interface that governs how a dimensional meter ID is mapped to flat hierarchical names.\n\nThe default (`HierarchicalNameMapper.DEFAULT`) sorts tags alphabetically by key and appends tag key/value pairs to the base meter name with '.' -- for example, `http_server_requests.method.GET.response.200`. The name and tag keys have the registry's naming convention applied to them first.\n\nIf there is something special about your naming scheme that you need to honor, you can provide your own `HierarchicalNameMapper` implementation. The most common cause of a custom mapper comes from a need to prefix something to the front of every metric (generally something like `app.<name>.http_server_requests.method.GET.response.200`).\n\n== Graphing\n\nThis section serves as a quick start to rendering useful representations in Ganglia for metrics originating in Micrometer.\n\n=== Counters\n\nGanglia counters measure mean throughput and one-, five-, and fifteen-minute exponentially-weighted moving average throughputs.\n\n.A Ganglia rendered graph of the random walk counter.\nimage::"+n(100)+"[Ganglia-rendered counter]\n"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"80865a7f65d47863b3b264a9ed09629a.png"},function(e,t,n){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Graphite\n:toc:\n:sectnums:\n:system: graphite\n\nGraphite is one of the most popular current hierarchical metrics systems backed by a fixed-size database, similar in design and purpose to RRDtool. It originated at Orbitz in 2006 and was open sourced in 2008.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.micrometer:micrometer-registry-{system}:latest.release\'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThe following example configures a Graphite instance:\n\n[source,java]\n----\nGraphiteConfig graphiteConfig = new GraphiteConfig() {\n @Override\n public String host() {\n return "mygraphitehost";\n }\n\n @Override\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\n\nMeterRegistry registry = new GraphiteMeterRegistry(graphiteConfig, Clock.SYSTEM, HierarchicalNameMapper.DEFAULT);\n----\n\nMicrometer uses Dropwizard Metrics as the underlying instrumentation library when recording metrics destined for Graphite. `GraphiteConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer\'s Spring Boot support binds properties that are prefixed with `management.metrics.export.graphite` directly to the `GraphiteConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.graphite:\n # The location of your Graphite server\n host: mygraphitehost\n\n # You will probably want to conditionally disable Graphite publishing in local development.\n enabled: true\n\n # The interval at which metrics are sent to Graphite. The default is 1 minute.\n step: 1m\n----\n\n== Graphite Tag Support\n\nAs of Micrometer version 1.4.0, Micrometer supports exporting Graphite metrics by using tags instead of the traditional hierarchical format. By default, metrics are exported by using the tag format, unless any `tagsAsPrefix` values are configured.\nhttps://graphite.readthedocs.io/en/latest/tags.html[Tag support] was added to Graphite in the 1.1.0 Graphite release.\nIf you wish to revert to the traditional hierarchical format, ensure that the `graphiteTagsEnabled` config value is set to `false`.\nThe following documentation sections on hierarchical name mapping and metrics prefixing are only applicable if tag support is disabled.\n\n== Hierarchical name mapping\n\nMicrometer provides a `HierarchicalNameMapper` interface that governs how a dimensional meter ID is mapped to flat hierarchical names.\n\nThe default (`HierarchicalNameMapper.DEFAULT`) sorts tags alphabetically by key and appends tag key/value pairs to the base meter name with \'.\' -- for example, `http_server_requests.method.GET.response.200`. The name and tag keys have the registry\'s naming convention applied to them first.\n\nIf there is something special about your naming scheme that you need to honor, you can provide your own `HierarchicalNameMapper` implementation. The most common cause of a custom mapper comes from a need to prefix something to the front of every metric (generally something like `app.<name>.http_server_requests.method.GET.response.200`).\n\n== Prefixing your metrics\n\nTo add a prefix to all metrics that go to graphite, use the `GraphiteConfig#tagsAsPrefix` configuration option. This option applies the tag value of a set of common tags as a prefix. For example, if `tagsAsPrefix` contains `application`, and a meter named `myTimer` is created with a tag of `application=APPNAME`, it appears in Graphite as `APPNAME.myTimer`.\n\nGenerally, when you use `tagsAsPrefix`, you should add common tags to the registry so that the tags are present on all meters that belong to that registry:\n\n[source,java]\n----\n@Bean\npublic MeterRegistryCustomizer<MeterRegistry> commonTags() {\n return r -> r.config().commonTags("application", "APPNAME");\n}\n----\n\nWe do it this way because, generally, a tag prefix in Graphite is correlated to a common tag elsewhere. Prefixes tend to be something like app name or host. By applying those values as common tags, you make your metrics more portable (that is, if you ever switch to a dimensional monitoring system, you are set).\n\nYou can use this when the order of the prefix matters. Micrometer always sorts tags, but the order of tag keys in `tagsAsPrefix` is preserved, so adding `host` and `application` to `tagsAsPrefix` results in a prefixed metric, such as `HOST.APP.myCounter`.\n\nTo meet your specific naming needs, you can also provide a custom hierarchical name mapper when creating `GraphiteMeterRegistry`, as follows:\n\n[source,java]\n----\nGraphiteMeterRegistry r = new GraphiteMeterRegistry(\n GraphiteConfig.DEFAULT,\n Clock.SYSTEM,\n (id, convention) -> "prefix." + HierarchicalNameMapper.DEFAULT.toHierarchicalName(id, convention));\n----\n\nNOTE: If you use a custom `HierarchicalNameMapper`, `tagsAsPrefix` is ignored.\n\n== Further Customizing the `GraphiteReporter`\n\nWe give you the option to configure `GraphiteReporter` yourself if you need further customization. To do so, use this constructor and provide your own `GraphiteReporter`:\n\n[source,java]\n----\nGraphiteMeterRegistry(GraphiteConfig config, Clock clock, HierarchicalNameMapper nameMapper,\n MetricRegistry metricRegistry, GraphiteReporter reporter)\n----\n\n== Graphing\n\nThis section serves as a quick start to rendering useful representations in Graphite for metrics originating in Micrometer.\n\n=== Counters\n\nGraphite counters measure mean throughput and one-, five-, and fifteen-minute exponentially-weighted moving average throughputs.\n\n.A Graphite rendered graph of the random walk counter.\nimage::'+n(102)+"[Graphite-rendered counter]\n"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"cd6b0314737fa94a81e42689517fd7fb.png"},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n== Hierarchical name mapping\n\nMicrometer provides a `HierarchicalNameMapper` interface that governs how a dimensional meter ID is mapped to flat hierarchical names.\n\nThe default (`HierarchicalNameMapper.DEFAULT`) sorts tags alphabetically by key and appends tag key/value pairs to the base meter name with '.' -- for example, `http_server_requests.method.GET.response.200`. The name and tag keys have the registry's naming convention applied to them first.\n\nIf there is something special about your naming scheme that you need to honor, you can provide your own `HierarchicalNameMapper` implementation. The most common cause of a custom mapper comes from a need to prefix something to the front of every metric (generally something like `app.<name>.http_server_requests.method.GET.response.200`).\n"},function(e,t,n){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Humio\n:toc:\n:sectnums:\n:system: humio\n\nHumio is a dimensional time-series SaaS with built-in dashboarding.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThe following example configures a Humio instance:\n\n[source,java]\n----\nHumioConfig humioConfig = new HumioConfig() {\n @Override\n public String apiToken() {\n return MY_TOKEN;\n }\n\n @Override\n @Nullable\n public String get(String k) {\n return null;\n }\n};\nMeterRegistry registry = new HumioMeterRegistry(humioConfig, Clock.SYSTEM);\n----\n\n`HumioConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.humio` directly to the `HumioConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.humio:\n api-token: YOURKEY\n\n # You will probably want disable Humio publishing in a local development profile.\n enabled: true\n\n # The interval at which metrics are sent to Humio. The default is 1 minute.\n step: 1m\n\n # The cluster Micrometer will send metrics to. The default is \"https://cloud.humio.com\"\n uri: https://myhumiohost\n----\n\n== Graphing\n\nThis section serves as a quick start to rendering useful representations in Humio for metrics originating in Micrometer.\n\n=== Timers\n\nThe Humio implementation of `Timer` produces four fields in Humio:\n\n* `sum`: Rate of calls per second.\n* `count`: Rate of total time per second.\n* `max`: A sliding window maximum amount recorded.\n* `avg`: A non-aggregable average for only this set of tag values.\n\nThe following query constructs a dimensionally aggregable average latency per URI:\n\n[source, text]\n----\nname = http_server_requests\n| timechart(uri, function=max(avg))\n----\n\n.Timer over a simulated service.\nimage::"+n(105)+"[Humio-rendered timer]\n"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"6584fae5a94c66dd29f69056b031d7e3.png"},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Influx\n:toc:\n:sectnums:\n:system: influx\n\nThe InfluxData suite of tools supports real-time stream processing and storage of time-series data. It supports downsampling, automatically expiring and deleting unwanted data, as well as backup and restore.\n\nThe InfluxMeterRegistry supports the 1.x InfluxDB API as well as the v2 API.\n\n== Configuring\n\nMicrometer supports shipping metrics to InfluxDB directly or through Telegraf through the StatsD registry.\n\n=== Direct to InfluxDB\n\nThe following example adds the required library in Gradle:\n\n[source,groovy]\n----\nimplementation 'io.micrometer:micrometer-registry-influx:latest.release'\n----\n\nThe following example adds the required library in Maven:\n\n[source,xml]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-influx</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\nMetrics are rate-aggregated and pushed to InfluxDB on a periodic interval. Rate aggregation performed by the registry yields datasets that are quite similar to those produced by Telegraf. The following example configures a meter registry for InfluxDB:\n\n.InfluxDB 1.x configuration example\n[source, java]\n----\nInfluxConfig config = new InfluxConfig() {\n @Override\n public Duration step() {\n return Duration.ofSeconds(10);\n }\n\n @Override\n public String db() {\n return \"mydb\";\n }\n\n @Override\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\nMeterRegistry registry = new InfluxMeterRegistry(config, Clock.SYSTEM);\n----\n\nTo ship metrics to InfluxDB 2.x, make sure to configure the `org` and `bucket` to which to write the metrics, as well as the authentication `token`.\n\n.InfluxDB v2 configuration example\n[source, java]\n----\nInfluxConfig config = new InfluxConfig() {\n\n @Override\n public String org() {\n return \"myorg\";\n }\n\n @Override\n public String bucket() {\n return \"app-metrics\";\n }\n\n @Override\n public String token() {\n return \"auth_token_here\"; // FIXME: This should be securely bound rather than hard-coded, of course.\n }\n\n @Override\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\nMeterRegistry registry = new InfluxMeterRegistry(config, Clock.SYSTEM);\n----\n\n`InfluxConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.influx` directly to the `InfluxConfig`:\n\n[source, yaml]\n----\nmanagement.metrics.export.influx:\n api-version: v2 # API version of InfluxDB to use. Defaults to 'v1' unless an org is configured. If an org is configured, defaults to 'v2'.\n auto-create-db: true # Whether to create the InfluxDB database if it does not exist before attempting to publish metrics to it. InfluxDB v1 only. (Default: true)\n batch-size: 10000 # Number of measurements per request to use for this backend. If more measurements are found, then multiple requests will be made. (Default: 10000)\n bucket: mybucket # Bucket for metrics. Use either the bucket name or ID. Defaults to the value of the db property if not set. InfluxDB v2 only.\n compressed: true # Whether to enable GZIP compression of metrics batches published to InfluxDB. (Default: true)\n connect-timeout: 1s # Connection timeout for requests to this backend. (Default: 1s)\n consistency: one # Write consistency for each point. (Default: one)\n db: mydb # Database to send metrics to. InfluxDB v1 only. (Default: mydb)\n enabled: true # Whether exporting of metrics to this backend is enabled. (Default: true)\n num-threads: 2 # Number of threads to use with the metrics publishing scheduler. (Default: 2)\n org: myorg # Org to write metrics to. InfluxDB v2 only.\n password: mysecret # Login password of the InfluxDB server. InfluxDB v1 only.\n read-timeout: 10s # Read timeout for requests to this backend. (Default: 10s)\n retention-policy: my_rp # Retention policy to use (InfluxDB writes to the DEFAULT retention policy if one is not specified). InfluxDB v1 only.\n step: 1m # Step size (i.e. reporting frequency) to use. (Default: 1m)\n token: AUTH_TOKEN_HERE # Authentication token to use with calls to the InfluxDB backend. For InfluxDB v1, the Bearer scheme is used. For v2, the Token scheme is used.\n uri: http://localhost:8086 # URI of the InfluxDB server. (Default: http://localhost:8086)\n user-name: myusername # Login user of the InfluxDB server. InfluxDB v1 only.\n----\n\n=== Through Telegraf\n\nTelegraf is a StatsD agent that expects a modified flavor of the StatsD line protocol.\n\nThe following listing adds the relevant library in Gradle:\n\n[source,groovy]\n----\nimplementation 'io.micrometer:micrometer-registry-statsd:latest.release'\n----\n\nThe following listing adds the relevant library in Maven:\n\n[source,xml]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-statsd</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\nMetrics are shipped immediately over UDP to Telegraf by using Telegraf's flavor of the StatsD line protocol.\n\n[source,java]\n----\nStatsdConfig config = new StatsdConfig() {\n @Override\n public String get(String k) {\n return null;\n }\n\n @Override\n public StatsdFlavor flavor() {\n return StatsdFlavor.Telegraf;\n }\n};\n\nMeterRegistry registry = new StatsdMeterRegistry(config, Clock.SYSTEM);\n----\n"},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n"},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Instana\nFabian Lange <fabian.lange@instana.com>\n:toc:\n:sectnums:\n:system: instana\n\nInstana is an automatic application performance management and infrastructure monitoring system.\n\n== Installation and Configuration\n\nInstana automatically detects and reports all metrics without the need of any additional dependency or configuration.\nIt does so by detecting all instances of `io.micrometer.core.instrument.MeterRegistry` and collecting all registered `io.micrometer.core.instrument.Meter` instances from them.\n\nYou can run the Instana agent alongside your application by using Micrometer, and the Instana agent automatically monitors it.\n\n== Supported Metrics\n\n* **Timer**: The total time of recorded events, scaled to milliseconds.\n* **Counter**: The cumulative count since this counter was created.\n* **Gauge**: The current value.\n* **DistributionSummary**: The total number of all recorded events.\n* **LongTaskTimer**: The current number of tasks being executed.\n* **FunctionCounter**: The cumulative count since this counter was created.\n* **FunctionTimer**: The total time of all occurrences of the timed event.\n* **TimeGauge**: The current value, scaled to the appropriate base unit.\n\nThe metrics show up on the Java Virtual Machine dashboard in Instana. You can configure alerting based on these metrics.\n"},function(e,t,n){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer JMX\n:toc:\n:sectnums:\n:system: jmx\n\nMicrometer provides a hierarchical mapping to JMX, primarily as a cheap and portable way to view metrics locally. Where JMX exporting is found in production, the same metrics are generally exported to another, more purpose-fit monitoring system.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\nMicrometer also sometimes scrapes data from JMX beans for use in reporting metrics. This registry implementation is not needed for these uses. Rather, this module is strictly used to _export_ data to JMX.\n\n== Hierarchical name mapping\n\nMicrometer provides a `HierarchicalNameMapper` interface that governs how a dimensional meter ID is mapped to flat hierarchical names.\n\nThe default (`HierarchicalNameMapper.DEFAULT`) sorts tags alphabetically by key and appends tag key/value pairs to the base meter name with '.' -- for example, `http_server_requests.method.GET.response.200`. The name and tag keys have the registry's naming convention applied to them first.\n\nIf there is something special about your naming scheme that you need to honor, you can provide your own `HierarchicalNameMapper` implementation. The most common cause of a custom mapper comes from a need to prefix something to the front of every metric (generally something like `app.<name>.http_server_requests.method.GET.response.200`).\n\n== Counters\n\nJMX counters measure mean throughput and one-, five-, and fifteen-minute exponentially-weighted moving average throughputs.\n\n.The JMX rendered values of the random walk counter.\nimage::"+n(110)+"[JMX-rendered counter]\n"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"8077bd6e31e279e04a38e631b2d61a1e.png"},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer KairosDB\n:toc:\n:sectnums:\n:system: kairos\n\nKairosDB is a dimensional time-series database built on top of Cassandra. Charting can be accomplished in Grafana by using a link:https://docs.grafana.org/v4.0/datasources/kairosdb/[Kairos datasource].\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThe following example configures KairosDB:\n\n[source,java]\n----\nKairosConfig kairosConfig = new KairosConfig() {\n @Override\n @Nullable\n public String get(String k) {\n return null;\n }\n};\nMeterRegistry registry = new KairosMeterRegistry(kairosConfig, Clock.SYSTEM);\n----\n\n`KairosConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.kairos` directly to the `KairosConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.kairos:\n # You will probably want disable Kairos publishing in a local development profile.\n enabled: true\n\n # The interval at which metrics are sent to Kairos. The default is 1 minute.\n step: 1m\n\n # Authentication may be required, depending on how you have Kairos configured\n user-name: MYUSER\n password: MYPASSWORD\n----\n"},function(e,t,n){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer New Relic\n:toc:\n:sectnums:\n:system: new-relic\n\nNew Relic offers a dimensional monitoring system product called Insights. It includes a full UI and a query language called NRQL. New Relic Insights operates on a push model. Some features of NRQL assume that Insights receives a distinct event payload for every timing, count, and so on. Micrometer instead ships aggregates at a prescribed interval, letting your app's throughput scale without concern for event propagation to Insights becoming a bottleneck.\n\nNOTE: New Relic provides its own Micrometer `MeterRegistry` implementation based on dimensional metrics.\nIt intends to supersede Micrometer's `NewRelicMeterRegistry` (which uses custom events in New Relic), because New Relic's dimensional metrics are a better fit for metrics than custom events.\nYou can find more details in https://github.com/newrelic/micrometer-registry-newrelic[its GitHub repository].\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThe following example configures New Relic:\n\n[source,java]\n----\nNewRelicConfig newRelicConfig = new NewRelicConfig() {\n @Override\n public String accountId() {\n return \"MYACCOUNT\";\n }\n\n @Override\n public String apiKey() {\n return \"MY_INSIGHTS_API_KEY\";\n }\n\n @Override\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\n\nMeterRegistry registry = new NewRelicMeterRegistry(newRelicConfig, Clock.SYSTEM);\n----\n\nThere are two distinct sources of API keys in New Relic.\n\n`NewRelicConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.newrelic` directly to the `NewRelicConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.newrelic:\n account-id: MYACCOUNT\n api-key: MY_INSIGHTS_API_KEY\n\n # The interval at which metrics are sent to New Relic. See Duration.parse for the expected format.\n # The default is 1 minute.\n step: 1m\n----\n\n== Graphing\n\nThis section serves as a quick start to rendering useful representations in New Relic for metrics originating in Micrometer. See the https://docs.newrelic.com/docs/insights/nrql-new-relic-query-language/using-nrql/introduction-nrql[New Relic NRQL docs] for a far more complete reference of what is possible in New Relic.\n\n=== Timers\n\nAt each publishing interval, the New Relic `Timer` produces a single event with the timer's name and several attributes:\n\n* `avg`: A mean latency for the publishing interval.\n* `count`: Throughput per second over the publishing interval.\n* `totalTime`: Total time per second over the publishing interval (used with `count`) to create aggregable means.\n\nAdditionally, if any percentiles or SLO buckets are defined on the timer, additional events are produced:\n\n* `${name}.percentiles`: Micrometer calculated percentiles for the publishing interval. One event is produced for each percentile, with a tag of `phi` in the range of [0,1].\n* `${name}.histogram`: One event is produced for each SLO boundary with a tag of 'le', indicating that it represents a cumulative count of events less than or equal to SLO boundaries over the publishing interval.\n\nTo generate an aggregable view of latency in New Relic, divide `totalTime` by `count`:\n\n[source,sql]\n----\nSELECT sum(totalTime)/sum(count) as 'Average Latency', max(max) as 'Max' FROM timer since 30 minutes ago TIMESERIES auto\n----\n\n.Timer latency.\nimage::"+n(113)+"[New Relic-rendered timer]\n\nTo generate a throughput chart:\n\n[source,sql]\n----\nSELECT average(count) as 'Average Throughput' FROM timer since 30 minutes ago TIMESERIES auto\n----\n\n.Timer throughput.\nimage::"+n(114)+"[New Relic-rendered timer throughput]\n\nTo generate a plot of client-side percentiles:\n\n[source,sql]\n----\nSELECT latest(value) from timerPercentile FACET phi since 30 minutes ago TIMESERIES auto\n----\n\n.Timer Percentiles.\nimage::"+n(115)+"[New Relic-rendered percentiles]\n\nNote how these percentiles are _not aggregable_. We have selected the `latest(value)` function to display this chart (it isn't correct to `average(value)` on a percentile value). The more dimensions you add to a timer, the less useful these values become.\n\nFinally, if you define SLO boundaries with the fluent builder for `Timer`, you can view throughput below certain SLO boundaries. In this example, we set SLO boundaries at 275 (yellow), 300 (red), and 500 (blue) milliseconds for a simulated `Timer` that is recording samples normally distributed around 250 ms. These counts represent the rate/second of samples less than or equal to each SLO boundary.\n\n[source,sql]\n----\nSELECT sum(value) from timerHistogram FACET le since 30 minutes ago TIMESERIES auto\n----\n\n.Timer SLO boundaries.\nimage::"+n(116)+"[New Relic-rendered SLO boundaries]\n\nWhere the lines converge at various points, it is evident that no sample exceeded the 275 ms SLO boundary.\n"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"4d25b7833c033d6e2380ec4ecc988d66.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"02f1215f99df0a7a03ac1d5986ace874.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"03797aa9d08a216ed90efab2b59e0114.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"e1fdf4994baf8640b183e76694d53390.png"},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer OTLP\n:toc:\n:sectnums:\n:system: otlp\n\nOpenTelemetry is a CNCF incubating project for providing standards for telemetry data. OpenTelemetry protocol (OTLP) is a vendor neutral protocol that can be used to send data to various backends which support it. You can read the corresponding docs on how the metrics are ingested and can be visualized in the respective vendor docs.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\nThe following example configures an OTLP registry:\n\n[source,java]\n----\nOtlpConfig otlpConfig = new OtlpConfig() {\n @Override\n public String get(final String key) {\n return null;\n }\n};\n\nMeterRegistry registry = new OtlpMeterRegistry(otlpConfig, Clock.SYSTEM);\n----\n\n`OtlpConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source (e.g.: a simple `Map` can work), you can override the default configuration through properties. For example, Micrometer's Spring Boot support binds properties prefixed with `management.otlp.metrics.export` directly to the `OtlpConfig`:\n\n[source, yaml]\n----\nmanagement:\n otlp:\n metrics:\n export:\n # Supported configs\n url: \"https://otlp.example.com:4318/v1/metrics\"\n aggregationTemporality: \"cumulative\"\n headers:\n header1: value1\n resourceAttributes:\n key1: value1\n----\n\n1. `url` - The URL to which data will be reported. Defaults to `http://localhost:4318/v1/metrics`\n2. `aggregationTemporality` - https://opentelemetry.io/docs/specs/otel/metrics/data-model/#temporality[Aggregation temporality, window=_blank] determines how the additive quantities are expressed, in relation to time. The supported values are `cumulative` or `delta`. Defaults to `cumulative`. +\n*Note*: This config was introduced in version 1.11.0.\n3. `headers` - Additional headers to send with exported metrics. This can be used for authorization headers. By default, headers will be loaded from the config. If that is not set, they can be taken from the environment variables `OTEL_EXPORTER_OTLP_HEADERS` and `OTEL_EXPORTER_OTLP_METRICS_HEADERS`. If a header is set in both the environmental variables, the header in the latter will override the former.\n4. `resourceAttributes` - https://opentelemetry.io/docs/specs/otel/resource/semantic_conventions/#service[Resource attributes, window=_blank] that will be used for all metrics published. By default, Micrometer adds the following resource attributes:\n\n[%autowidth]\n|===\n|Key | Default value\n\n|telemetry.sdk.name\n|io.micrometer\n\n|telemetry.sdk.language\n|java\n\n|telemetry.sdk.version\n|<micrometer-core-version> (e.g.: 1.11.0)\n\n|service.name\n|unknown_service\n|===\n\nIf this config is empty, then resource attributes will be loaded from the environmental variable `OTEL_RESOURCE_ATTRIBUTES`. `service.name` can be overridden by the environmental variable `OTEL_SERVICE_NAME` and this takes precedence over other configs.\n\n== Supported metrics\nhttps://opentelemetry.io/docs/specs/otel/metrics/data-model/#metric-points[Metric points, window=_blank] define the different data points that are supported in OTLP. Micrometer supports exporting the below data points in OTLP format,\n\n1. https://opentelemetry.io/docs/specs/otel/metrics/data-model/#sums[Sums, window=_blank]\n2. https://opentelemetry.io/docs/specs/otel/metrics/data-model/#gauge[Gauge, window=_blank]\n3. https://opentelemetry.io/docs/specs/otel/metrics/data-model/#histogram[Histogram, window=_blank]\n4. https://opentelemetry.io/docs/specs/otel/metrics/data-model/#summary-legacy[Summary, window=_blank]\n\nThe below table maps OTLP data points and the Micrometer meters:\n\n[%autowidth]\n|===\n|OTLP data point | Micrometer meter type\n\n|Sums\n|Counter, FunctionCounter\n\n|Gauge\n|Gauge, TimeGauge, MultiGauge\n\n|Histogram\n|Timer, DistributionSummary, LongTaskTimer, FunctionTimer (only sum and count are set)\n\n|Summary\n|Timer, DistributionSummary, LongTaskTimer\n|===\n\n*Note*:\n\n1. `max` on Histogram data point is only supported in delta aggregation temporality. This is because the values represented by cumulative min and max will stabilize as more events are recorded and are less useful when recorded over application's lifecycle.\n2. Currently, Micrometer only exports metadata for type `Meter` to OTLP.\n\n== Histograms and Percentiles\nMicrometer `Timer` and `DistributionSummary` support configuring link:/docs/concepts#_histograms_and_percentiles[client-side percentiles and percentile histograms]. OTLP specification terms Summary data point (client-side percentiles) as legacy and not recommended for new applications. Summary data point also cannot have min/max associated with it. Due to these reasons Micrometer prefers exporting Timers and DistributionSummary as Histogram data point. By default, a Timer/DistributionSummary without any additional percentile/histogram config will be exported as Histogram data point. However, by configuring the timer to generate only client-side percentiles using `publishPercentiles` this can be changed to a Summary data point exporting pre-calculated percentiles. When both `publishPercentiles` and (`publishPercentileHistogram` or `serviceLevelObjectives`) are configured, Histogram data point is preferred and pre-calculated percentiles *will not* be generated. See the below table on which data point will be used with different configurations:\n\n[%autowidth]\n|===\n|Configuration | OTLP data point\n\n| publishPercentiles\n| Summary\n\n| publishPercentileHistogram\n| Histogram\n\n| serviceLevelObjectives\n| Histogram\n\n| publishPercentiles and (publishPercentileHistogram/serviceLevelObjectives)\n| Histogram\n|===\n\nAlternatively, if you are using Spring Boot, you can use the https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.metrics.customizing.per-meter-properties[per-meter properties, window=_blank] to configure this behaviour.\n\nIf you want to generate Histogram data point for a Timer with name `test.timer` and default buckets generated by Micrometer, use:\n\n[source,properties]\n----\nmanagement.metrics.distribution.percentiles-histogram.test.timer=true\n----\n\nand for buckets with customized SLO, use:\n\n[source,properties]\n----\nmanagement.metrics.distribution.slo.test.timer=10.0,100.0,500.0,1000.0\n----\n\nAlternatively, if you want to generate Summary data point for a timer with name `test.timer` and 90th and 99th percentiles, you can use the below config:\n\n[source,properties]\n----\nmanagement.metrics.distribution.percentiles.test.timer=0.9,0.99\n----\n"},function(e,t,n){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Prometheus\n:toc:\n:sectnums:\n:system: prometheus\n\nPrometheus is a dimensional time series database with a built-in UI, a custom query language, and math operations.\nPrometheus is designed to operate on a pull model, periodically scraping metrics from application instances, based on service discovery.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nPrometheus expects to scrape or poll individual application instances for metrics.\nIn addition to creating a Prometheus registry, you also need to expose an HTTP endpoint to Prometheus' scraper.\nIn a Spring Boot application, a https://docs.spring.io/spring-boot/docs/current/actuator-api/htmlsingle/#prometheus[Prometheus actuator endpoint] is auto-configured in the presence of Spring Boot Actuator.\nOtherwise, you can use any JVM-based HTTP server implementation to expose scrape data to Prometheus.\n\nThe following example uses the JDK's `com.sun.net.httpserver.HttpServer` to expose a scrape endpoint:\n\n[source,java]\n----\nPrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);\n\ntry {\n HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);\n server.createContext(\"/prometheus\", httpExchange -> {\n String response = prometheusRegistry.scrape(); <1>\n httpExchange.sendResponseHeaders(200, response.getBytes().length);\n try (OutputStream os = httpExchange.getResponseBody()) {\n os.write(response.getBytes());\n }\n });\n\n new Thread(server::start).start();\n} catch (IOException e) {\n throw new RuntimeException(e);\n}\n----\n<1> The `PrometheusMeterRegistry` has a `scrape()` function that knows how to supply the String data necessary for the scrape. All you have to do is wire it to an endpoint.\n\nYou can alternatively use `io.prometheus.client.exporter.HTTPServer` that you can find in `io.prometheus:simpleclient_httpserver`:\n[source,java]\n----\nPrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);\n// you can set the daemon flag to false if you want the server to block\nnew HTTPServer(new InetSocketAddress(8080), prometheusRegistry.getPrometheusRegistry(), true);\n----\n\nAnother alternative can be `io.prometheus.client.exporter.MetricsServlet` that you can find in `io.prometheus:simpleclient_servlet` in case your app is running in a servlet container (e.g.: Tomcat):\n[source,java]\n----\nPrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);\nHttpServlet metricsServlet = new MetricsServlet(prometheusRegistry.getPrometheusRegistry());\n----\n\n=== Scrape format\n\nBy default, the https://prometheus.io/docs/instrumenting/exposition_formats/#text-based-format[Prometheus text format] is returned from the `PrometheusMeterRegistry` `scrape()` method.\n\nThe https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md[OpenMetrics] format can also be produced.\nTo specify the format to be returned, you can pass a content type to the `scrape` method.\nFor example, to get the OpenMetrics 1.0.0 format scrape, you could use the Prometheus Java client constant for it, as follows:\n\n[source,java]\n----\nString openMetricsScrape = registry.scrape(TextFormat.CONTENT_TYPE_OPENMETRICS_100);\n----\n\nIn Spring Boot applications, the https://docs.spring.io/spring-boot/docs/current/actuator-api/htmlsingle/#prometheus[Prometheus Actuator endpoint] supports scraping in either format, defaulting to the Prometheus text format in absence of a specific `Accept` header.\n\n=== The Prometheus Rename Filter\n\nIn some cases, Micrometer provides instrumentation that overlaps with commonly used Prometheus simple client modules but has chosen a different naming scheme for consistency and portability.\nIf you wish to use the Prometheus \"standard\" names, add the following filter:\n\n[source,java]\n----\nprometheusRegistry.config().meterFilter(new PrometheusRenameFilter());\n----\n\n== Graphing\n\nThis section serves as a quick start to rendering useful representations in Prometheus for metrics originating in Micrometer.\nSee the https://prometheus.io/docs/querying/basics[Prometheus docs] for a far more complete reference of what is possible in Prometheus.\n\n=== Grafana Dashboard\n\nA publicly available Grafana dashboard for Micrometer-sourced JVM and Tomcat metrics is available https://grafana.com/grafana/dashboards/4701-jvm-micrometer/[here].\n\nimage::"+n(119)+'[Grafana dashboard for JVM and Tomcat binders]\n\nThe dashboard features:\n\n* JVM memory\n* Process memory (provided by https://github.com/mweirauch/micrometer-jvm-extras[micrometer-jvm-extras])\n* CPU-Usage, Load, Threads, File Descriptors, and Log Events\n* JVM Memory Pools (Heap, Non-Heap)\n* Garbage Collection\n* Classloading\n* Direct/Mapped buffer sizes\n\nInstead of using the `job` tag to distinguish different applications, this dashboard makes use of a common tag called `application`, which is applied to every metric.\nYou can apply the common tag as follows:\n\n[source,java]\n----\nregistry.config().commonTags("application", "MYAPPNAME");\n----\n\nIn Spring Boot applications, you can use the https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.metrics.customizing.common-tags[property support for common tags]:\n\n[source,properties]\n----\nmanagement.metrics.tags.application=MYAPPNAME\n----\n\n=== Counters\n\nThe query that generates a graph for the random-walk counter is\n`rate(counter[10s])`.\n\n.A Grafana rendered graph of the random walk counter.\nimage::'+n(120)+"[Grafana-rendered Prometheus counter]\n\nRepresenting a counter without rate normalization over some time window is rarely useful, as the representation is a function of both the rapidity with which the counter is incremented and the longevity of the service. It is generally most useful to rate-normalize these time series to reason about them. Since Prometheus keeps track of discrete events across all time, it has the advantage of allowing for the selection of an arbitrary time window across which to normalize at query time (for example, `rate(counter[10s])` provides a notion of requests per second over 10 second windows). The rate-normalized graph in the preceding image would return back to a value around 55 as soon as the new instance (say on a production deployment) was in service.\n\n.Counter over the same random walk, no rate normalization.\nimage::"+n(121)+"[Grafana-rendered Prometheus counter (no rate)]\n\nIn contrast, without rate normalization, the counter drops back to zero on service restart, and the count increases without bound for the duration of the service's uptime.\n\n=== Timers\n\nThe Prometheus `Timer` produces two counter time series with different names:\n\n* `${name}_count`: Total number of all calls.\n* `${name}_sum`: Total time of all calls.\n\nRepresenting a counter without rate normalization over some time window is rarely useful, as the representation is a function of both the rapidity with which the counter is incremented and the longevity of the service.\n\nUsing the following Prometheus queries, we can graph the most commonly used statistics about timers:\n\n* Average latency: `rate(timer_sum[10s])/rate(timer_count[10s])`\n* Throughput (requests per second): `rate(timer_count[10s])`\n\n.Timer over a simulated service.\nimage::"+n(122)+"[Grafana-rendered Prometheus timer]\n\n=== Long task timers\n\nThe Prometheus query to plot the duration of a long task timer for a serial task is `long_task_timer_sum`. In Grafana, we can set an alert threshold at some fixed point.\n\n.Simulated back-to-back long tasks with a fixed alert threshold.\nimage::"+n(123)+"[Grafana-rendered Prometheus long task timer]\n"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"39fa40459993be394ab40488bf8c6a8f.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"594dce115710525d7771ebe3ab82db19.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"439c0eea1918ef143002cf62a9393e2a.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"fc8d290e3f5356fad7d93f76c6abe188.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"fb6c59cc88b85301c5bbb890afc71593.png"},function(e,t,n){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer SignalFx\n:toc:\n:sectnums:\n:system: signalfx\n\nSignalFx is a dimensional monitoring system SaaS with a full UI that operates on a push model. It has a rich set of alert \"`detectors`\".\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThe following example configures SignalFx:\n\n[source,java]\n----\nSignalFxConfig signalFxConfig = new SignalFxConfig() {\n @Override\n public String accessToken() {\n return \"MYTOKEN\";\n }\n\n @Override\n public String get(String k) {\n return null; // accept the rest of the defaults\n }\n};\n\nMeterRegistry registry = new SignalFxMeterRegistry(signalFxConfig, Clock.SYSTEM);\n----\n\nThere are two distinct sources of API keys in SignalFx.\n\n`SignalFxConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.signalfx` directly to the `SignalFxConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.signalfx:\n access-token: MYTOKEN\n\n # The interval at which metrics are sent to Ganglia. See Duration.parse for the expected format.\n # The default is 1 minute.\n step: 1m\n----\n\n== Graphing\n\nThis section serves as a quick start to rendering useful representations in SignalFx for metrics originating in Micrometer. See the https://docs.signalfx.com/en/latest/charts/index.html[SignalFx docs] for a far more complete reference of what is possible in SignalFx.\n\n=== Timers\n\nAt each publishing interval, the SignalFx `Timer` produces several time series in SignalFx:\n\n* `${name}.avg`: A mean latency for the publishing interval.\n* `${name}.count`: Throughput per second over the publishing interval.\n* `${name}.totalTime`: Total time per second over the publishing interval (used with `count`) to create aggregable means.\n* `${name}.percentiles`: Micrometer calculated percentiles for the publishing interval. One time series is produced for each percentile, with a tag of `phi` in the range of [0,1].\n* `${name}.histogram`: One event is produced for each SLO boundary with a tag of 'le', indicating that it represents a cumulative count of events less than or equal to SLO boundaries over the publishing interval.\n\nTo generate an aggregable view of latency in SignalFx, divide `totalTime` by `count`:\n\nimage::"+n(125)+"[SignalFx-aggregable latency query]\n\nThis is accomplished by adding signals for `${name}.totalTime` and `${name}.count`, adding a formula that divides them, and hiding the inputs to the formula.\n\n.Timer latency.\nimage::"+n(126)+"[SignalFx-rendered timer]\n\nTo generate a throughput chart, use the `${name}.count` signal:\n\n.Timer throughput.\nimage::"+n(127)+"[SignalFx-rendered timer throughput]\n\nTo generate a plot of client-side percentiles, use the `${name}.percentiles` signal:\n\n.Timer Percentiles.\nimage::"+n(128)+"[SignalFx-rendered percentiles]\n\nNote that these percentiles are _not aggregable_. The more dimensions you add to a timer, the less useful these values become.\n\nFinally, if you define SLO boundaries with the fluent builder for `Timer`, you can view throughput below certain SLO boundaries by using the `${name}.histogram` signal. In this example, we set SLO boundaries at 275 (green), 300 (blue), and 500 (purple) milliseconds for a simulated `Timer` that is recording samples normally distributed around 250 ms. These counts represent the rate/second of samples less than or equal to each SLO boundary.\n\n.Timer SLO boundaries.\nimage::"+n(129)+"[SignalFx-rendered SLO boundaries]\n\nWhere the lines converge at various points it is evident that no sample exceeded the 275 ms SLO boundary.\n"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"d77cd7a4fea8c37d7dc37e7bbe069b5e.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"beec842accba1a667e0e288745191070.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"02141ef2139e0de5d180b5b76dff1982.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"a165f31f4506fa9b07f0f2319dd58aa0.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"b19ccbd241a3bfd9377d4066961b1620.png"},function(e,t){e.exports="////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Stackdriver Monitoring\nRay Tsang <saturnism@gmail.com>\n:toc:\n:sectnums:\n:system: stackdriver\n\nStackdriver Monitoring is a dimensional time-series SaaS with built-in dashboarding.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThe following example configures Stackdriver:\n\n[source,java]\n----\nStackdriverConfig stackdriverConfig = new StackdriverConfig() {\n @Override\n public String projectId() {\n return MY_PROJECT_ID;\n }\n\n @Override\n public String get(String key) {\n return null;\n }\n}\n\nMeterRegistry registry = StackdriverMeterRegistry.builder(stackdriverConfig).build();\n----\n\n`StackdriverConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.stackdriver` directly to the `StackdriverConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.stackdriver:\n project-id: MY_PROJECT_ID\n resource-type: global\n\n # You will probably want to disable Stackdriver Monitoring publishing in a local development profile.\n enabled: true\n\n # The interval at which metrics are sent to Stackdriver Monitoring. The default is 1 minute.\n step: 1m\n----\n\nFor most environments, you need to create and configure credentials to push metrics to Stackdriver Monitoring.\nIn most cases, you should create a service account with Stackdriver Monitoring permissions and configure a\n`GOOGLE_APPLICATION_CREDENTIALS` environmental variable to the path of the service account key file.\nThe following example shows how to do so:\n\n[source]\n----\nexport PROJECT_ID=MY_PROJECT_ID\nexport APP_NAME=MY_APP\n\n# Create a service account\ngcloud iam service-accounts create $APP_NAME\n\n# Grant the service account Stackdriver Monitoring writer permission\ngcloud projects add-iam-policy-binding $PROJECT_ID \\\n --member serviceAccount:$APP_NAME@$PROJECT_ID.iam.gserviceaccount.com \\\n --role roles/monitoring.metricWriter\n\n# Create a key JSON file\ngcloud iam service-accounts keys create $HOME/$APP_NAME-key.json \\\n --iam-account $APP_NAME@$PROJECT_ID.iam.gserviceaccount.com\n\n# Configure GOOGLE_APPLICATION_CREDENTIALS env var\nexport GOOGLE_APPLICATION_CREDENTIALS=$HOME/$APP_NAME-key.json\n----\n\nWhen running in managed environments (such as Google App Engine, Google Cloud Run, Google Cloud Function)\nyou need not configure this environmental variable. In those environments, a service account is\nautomatically associated with the application instance. The underlying Stackdriver Monitoring client\nlibrary can automatically detect and use those credentials.\n\n== Stackdriver Labels\n\nMicrometer metrics tags are mapped to https://cloud.google.com/monitoring/api/v3/metrics-details#intro-time-series[Stackdriver metrics labels]. With tags and labels, you can further filter or group\nby the tag or label. See link:/docs/concepts#_tag_naming[Micrometer Concepts] for more information on tags.\nThe following example filters by tags:\n\n[source,java]\n----\nMeterRegistry registry = StackdriverMeterRegistry.builder(stackdriverConfig).build();\nregistry.config().commonTags(\"application\", \"my-application\");\n----\n\nYou can also configure resource labels with the `StackdriverConfig` method `resourceLabels`. Depending on the configured `resourceType`, there will be required resource labels. See the documentation on https://cloud.google.com/monitoring/custom-metrics/creating-metrics#which-resource[choosing a monitored resource type].\n\nIMPORTANT: When using Micrometer across multiple applications/instances, it is necessary that Stackdriver labels are unique per application/instance. Otherwise, you will see errors like `One or more TimeSeries could not be written: One or more points were written more frequently than the maximum sampling period configured`. If using a resource type other than `global`, the resource labels may already make metrics unique per application instance. If not, a common tag with the hostname or platform-provided instance ID may be a good candidate for achieving this.\n\n== Spring Boot\n\nSpring Boot provides auto-configuration for Micrometer's StackdriverMeterRegistry. For more information, see the https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready-metrics-export-stackdriver[Spring Boot documentation].\n\nYou can manually configure or register the `StackdriverMeterRegistry`.\nIn addition to using Spring Boot Actuator, make sure you create the `StackdriverMeterRegistry` bean:\n\n[source,java]\n----\n@Bean\nStackdriverConfig stackdriverConfig() {\n return new StackdriverConfig() {\n @Override\n public String projectId() {\n return MY_PROJECT_ID;\n }\n\n @Override\n public String get(String key) {\n return null;\n }\n }\n}\n\n@Bean\nStackdriverMeterRegistry meterRegistry(StackdriverConfig stackdriverConfig) {\n return StackdriverMeterRegistry.builder(stackdriverConfig).build();\n}\n----\n\nYou can also use https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-metrics-common-tags[Spring Boot Actuator Common Tags configuration] to configure common tags:\n\n[source]\n----\nspring.application.name=my-application\nmanagement.metrics.tags.application=${spring.application.name}\n----\n\n== GraalVM native image compilation\n\nTo compile an application using `micrometer-registry-stackdriver` to a https://www.graalvm.org/reference-manual/native-image/[native image using GraalVM], add the https://github.com/GoogleCloudPlatform/native-image-support-java[native-image-support-java] library as a dependency. This will ensure the correct native image configuration is available and avoid errors like `Classes that should be initialized at run time got initialized during image building`.\n"},function(e,t){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer StatsD\n:toc:\n:sectnums:\n:system: statsd\n\nStatsD is a UDP-based sidecar-driven metrics collection system. The maintainer of the original StatsD line protocol specification is Etsy. Datadog\'s DogStatsD and Influx\'s Telegraf each accept a modified version of the line protocol, having each enriched the original specification with dimensionality in different ways.\n\nIf you intend to use the Datadog or Telegraf flavors, see the documentation for Micrometer\'s link:/docs/registry/datadog[Datadog] or link:/docs/registry/influx[Influx] support.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.micrometer:micrometer-registry-{system}:latest.release\'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThis configuration is used to ship metrics to a StatsD agent that is compatible with the original Etsy protocol. Metrics are shipped immediately over UDP to the agent.\n\n[source,java]\n----\nStatsdConfig config = new StatsdConfig() {\n @Override\n public String get(String k) {\n return null;\n }\n\n\n @Override\n public StatsdFlavor flavor() {\n return StatsdFlavor.Etsy;\n }\n};\n\nMeterRegistry registry = new StatsdMeterRegistry(config, Clock.SYSTEM);\n----\n\nNOTE: You can also configure Telegraf to accept the dogstatsd format. If you use Telegraf, configuring Micrometer to ship Telegraf-formatted StatsD lines eases the requirements of your Telegraf configuration.\n\n`StatsdConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer\'s Spring Boot support binds properties that are prefixed with `management.metrics.export.statsd` directly to the `StatsdConfig`:\n\n[source,yml]\n----\nmanagement.metrics.export.statsd:\n flavor: etsy\n\n # You will probably want to conditionally disable StatsD publishing in local development.\n enabled: true\n\n # The interval at which metrics are sent to StatsD. The default is 1 minute.\n step: 1m\n----\n\n== Customizing the Metrics Sink\n\nBy default, Micrometer publishes StatsD line protocol over UDP, as the vast majority of existing StatsD agents are UDP servers. It is possible to fully customize how the line protocol is shipped by modifying the builder for `StatsdMeterRegistry`:\n\n[source,java]\n----\nConsumer<String> lineLogger = line -> logger.info(line); <1>\n\nMeterRegistry registry = StatsdMeterRegistry.builder(StatsdConfig.DEFAULT) <2>\n .clock(clock)\n .lineSink(lineLogger)\n .build();\n----\n<1> Define what to do with lines.\n<2> The flavor configuration option determines the structure of the line for the default line builder. It has no effect if you override the line builder with a customization.\n\n=== Using Apache Kafka for Line Sink\n\nYou can also use Apache Kafka for line sink, as follows:\n\n[source,java]\n----\nProperties properties = new Properties();\nproperties.setProperty(BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");\nproperties.setProperty(KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());\nproperties.setProperty(VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());\n\nProducer<String, String> producer = new KafkaProducer<>(properties);\n\nStatsdMeterRegistry.builder(statsdConfig)\n .lineSink((line) -> producer.send(new ProducerRecord<>("my-metrics", line)))\n .build();\n----\n\nNow Micrometer produces lines for metrics to the `my-metrics` topic and you can consume the lines on the topic.\n\n== Customizing the Line Format\n\nThe built-in Etsy, dogstatsd, and Telegraf flavors cover most known public StatsD agents, but you can completely customize the line format to satisfy closed, proprietary agents. Again, we use the `StatsdMeterRegistry` builder to establish a line builder for each ID. Providing an instance of the builder _per ID_ offers you the opportunity to eagerly cache the serialization of the ID\'s name and tags to optimize the serialization of a StatsD line based on that ID as samples are recorded. The following listing defines a fictional format:\n\n[source,java]\n----\nFunction<Meter.Id, StatsdLineBuilder> nameAndUnits = id -> new StatsdLineBuilder() {\n String name = id.getName() + "/" + (id.getBaseUnit() == null ? "unknown" : id.getBaseUnit());\n\n @Override\n public String count(long amount, Statistic stat) {\n return name + ":" + amount + "|c";\n }\n\n ... // implement gauge, histogram, and timing similarly\n}\n\nMeterRegistry registry = StatsdMeterRegistry.builder(StatsdConfig.DEFAULT) <1>\n .clock(clock)\n .lineBuilder(nameAndUnits)\n .build();\n----\n<1> Because you have taken control of line building, the flavor is ignored.\n'},function(e,t,n){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\n= Micrometer Wavefront\n:toc:\n:sectnums:\n:system: wavefront\n\nWavefront is a dimensional monitoring system offered as a SaaS with a full UI, custom query language, and advanced math operations. Wavefront operates on a push model. Metrics may either be pushed through a sidecar process running on the same host (called the Wavefront proxy) or directly to the Wavefront API.\n\n== Installing\n\nFor Gradle, add the following implementation:\n\n[source,groovy,subs=+attributes]\n----\nimplementation \'io.micrometer:micrometer-registry-{system}:latest.release\'\n----\n\nFor Maven, add the following dependency:\n\n[source,xml,subs=+attributes]\n----\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-{system}</artifactId>\n <version>${micrometer.version}</version>\n</dependency>\n----\n\n== Configuring\n\nThis section describes how to configure Wavefront when you send data:\n\n* <<configuring-directly-to-wavefront>>\n* <<configuring-through-a-wavefront-proxy-sidecar>>\n\n[[configuring-directly-to-wavefront]]\n=== Directly to Wavefront\n\nThe following example configures sending directly to Wavefront:\n\n[source,java]\n----\nWavefrontConfig config = new WavefrontConfig() {\n @Override\n public String uri() {\n return "https://longboard.wavefront.com"; <1>\n }\n\n @Override\n public String apiToken() {\n return "MYAPIKEY"; <2>\n }\n\n @Override\n public String get(String key) {\n return null; <3>\n }\n};\nMeterRegistry registry = new WavefrontMeterRegistry(config, Clock.SYSTEM);\n----\n<1> `longboard` is the name of the co-tenant instance on which most organizations start. Once you reach a sufficient scale, Wavefront may move you\nto a dedicated host.\n<2> This is required when pushing directly to Wavefront\'s API.\n<3> Accept the rest of the defaults.\n\n[[configuring-through-a-wavefront-proxy-sidecar]]\n=== Through a Wavefront Proxy Sidecar\n\nThe following example configures sending through a Wavefront proxy sidecar:\n\n[source,java]\n----\nMeterRegistry registry = new WavefrontMeterRegistry(WavefrontConfig.DEFAULT_PROXY, Clock.SYSTEM);\n----\n\nThe default proxy configuration pushs metrics and histogram distributions to a Wavefront proxy sitting on `localhost:2878`.\n\nNOTE: If publishing metrics to a Wavefront proxy, the URI must be expressed in the form of `proxy://HOST:PORT`.\n\n== Graphing\n\nThis section serves as a quick start to rendering useful representations in Wavefront for metrics originating in Micrometer. See the https://docs.wavefront.com/query_language_getting_started.html[Wavefront docs] for a far more complete reference of what is possible in Wavefront.\n\n=== Counters\n\nThe query that generates a graph for a random-walk counter is `rate(ts(counter))`.\n\n.A Wavefront rendered graph of the random walk counter.\nimage::'+n(133)+"[Wavefront-rendered counter]\n\nRepresenting a counter without rate normalization over some time window is rarely useful, as the\nrepresentation is a function of both the rapidity with which the counter is incremented and the\nlongevity of the service. It is generally most useful to rate-normalize these time series to\nreason about them.\n\nBecause Wavefront keeps track of cumulative counts across all time, it has the\nadvantage of allowing for the selection of a particular time function at query time (for example,\n`rate(ts(counter))` to compute the per-second rate of change).\n\n=== Timers\n\nThe Wavefront `Timer` produces different time series depending on whether or not\n`publishPercentileHistogram` is enabled.\n\nIf `publishPercentileHistogram` is enabled, the Wavefront `Timer` produces histogram distributions\nthat let you query for the latency at any percentile using `hs()` queries. For example, you can\nvisualize latency at the 95th percentile (`percentile(95, hs(timer.m))`) or the 99.9th percentile\n(`percentile(99.9, hs(timer.m))`). For more information on histogram distributions, see\n<<wavefront-histograms>>, later in this section.\n\nIf `publishPercentileHistogram` is disabled, the Wavefront `Timer` produces several\ntime series:\n\n* `${name}.avg`: Mean latency across all calls.\n* `${name}.count`: Total number of all calls.\n* `${name}.sum`: Total time of all calls.\n* `${name}.max`: Max latency over the publishing interval.\n* `${name}.percentiles`: Micrometer-calculated percentiles for the publishing interval. These\ncannot be aggregated across dimensions.\n\nYou can use these time series to generate a quick view of latency in Wavefront:\n\n.Timer latency.\nimage::"+n(134)+'[Wavefront-rendered timer]\n\nThe preceding chart shows the average latency (`rate(ts(timer.sum))/rate(ts(timer.count))` in\ngreen), 95th percentile (`ts(timer.percentile, phi="0.95")` in orange), and max (`ts(timer.max)`\nin blue).\n\nAdditionally, `rate(ts(timer.count))` represents a rate/second throughput of events being timed:\n\n.Timer throughput.\nimage::'+n(135)+"[Wavefront-rendered timer throughput]\n\n[[wavefront-histograms]]\n=== Wavefront Histograms\n\nWavefront's histogram implementation stores an actual distribution of metrics, as opposed to single metrics. This lets you apply any percentile and aggregation function on the distribution at query time without having to specify specific percentiles and metrics to keep during metric collection.\n\nWavefront histogram distributions are collected and reported for any `Timer` or `DistributionSummary` that has `publishPercentileHistogram` enabled.\n\nBy default, distributions that are reported to Wavefront get aggregated by the minute, providing you with a histogram distribution for each minute. You also have the option of aggregating by hour or day. You can customize this with the following configuration options:\n\n* `reportMinuteDistribution`: Boolean specifying whether to aggregate by minute. Enabled by default. Metric name in Wavefront has `.m` suffix.\n* `reportHourDistribution`: Boolean specifying whether to aggregate by hour. Disabled by default. Metric name in Wavefront has `.h` suffix.\n* `reportDayDistribution`: Boolean specifying whether to aggregate by day. Disabled by default. Metric name in Wavefront has `.d` suffix.\n\nIf you are sending to a Wavefront proxy, by default, both metrics and histogram distributions are published to the same port: 2878 in the default proxy configuration. If your proxy is configured to listen for histogram distributions on a different port, you can specify the port to which to publish by using the `distributionPort` configuration option.\n\nYou can query histogram distributions in Wavefront by using `hs()` queries. For example, `percentile(98, hs(${name}.m))` returns the 98th percentile for a particular histogram aggregated over each minute. Each histogram metric name has a suffix (`.m`, `.h`, or `.d`), depending on the histogram's aggregation interval.\n\nSee the https://docs.wavefront.com/proxies_histograms.html[Wavefront Histograms documentation] for more information.\n"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"105c9d351e5cabcc4504a9b863032ca3.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"10ee7658d93746e240978c7ca9b3467b.png"},function(e,t,n){"use strict";n.r(t),t.default=n.p+"9cc263d6b012a89bad0374b418540a31.png"},function(e,t){e.exports='////\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\nManual changes to this file will be lost when it is generated again.\nEdit the files in the src/docs/ directory instead.\n////\n\n\nMicrometer\'s open source support policy is defined as follows for different types of releases. Release versions follow a MAJOR.MINOR.PATCH convention, as defined in https://semver.org/[semantic versioning].\n\n* *Major release lines* (such as 1.x or 2.x) are supported with patch releases for a minimum of 3 years from the date the major release (such as `1.0.0` or `2.0.0`) was made available for download.\n* *Minor release lines* (such as 1.1.x or 1.2.x) are supported with patch releases for a minimum of 12 months from the date the minor release (such as `1.1.0` or `1.2.0`) was made available for download.\n* Any confirmed security vulnerabilities on supported release lines should result in a patch release to Maven Central.\n\nCommercial support that extends beyond the OSS support period described on this page is https://tanzu.vmware.com/spring-runtime[available from VMware].\n\nWe generally plan to release a new major or minor version every 6 months (in May and November).\n\n## Released versions\n\nThe following releases are actively maintained:\n\n.Supported minor releases\n[width="35%",options="header"]\n|===========\n| Minor release | OSS Support Until\n| 1.12.x | November 2024\n| 1.11.x | May 2024\n|===========\n\nThe following releases are out of OSS support:\n\n.Out of OSS support minor releases\n[width="35%",options="header"]\n|===========\n| Minor release | Final patch\n| 1.10.x | `1.10.13`\n| 1.9.x | `1.9.17`\n| 1.8.x | `1.8.13`\n| 1.7.x | `1.7.12`\n| 1.6.x | `1.6.13`\n| 1.5.x | `1.5.17`\n| 1.4.x | `1.4.2`\n| 1.3.x | `1.3.20`\n| 1.2.x | `1.2.2`\n| 1.1.x | `1.1.19`\n| 1.0.x | `1.0.11`\n|===========\n\n## Examples\n\nThe following examples demonstrate how the support policy applies:\n\n** Micrometer 1.0.0 was released in February 2018. At a minimum, support for the 1.x line extends through February 2021 (Major Releases statement). Practically, the Micrometer 1.x line is supported for at least as long as Spring Boot 2.x and major versions of other dependent web frameworks are supported.\n** Micrometer 1.1.0 was released in October 2018, minimally extending support through October 2019 (Minor Releases statement). Practically, the Micrometer 1.1.x line is supported for at least as long as the Spring Boot 2.1.x line is supported.\n** If Micrometer 1.2.x were to be released, support for the 1.x line would be extended another 12 months from the 1.2.x release date.\n** Patch releases, such as Micrometer 1.0.7, do not increase the support obligations for the 1.0.x release line.\n'},,function(e,t,n){},function(e,t,n){"use strict";n.r(t);var r=n(1),a=n(13),i=n.n(a),o=n(148),s=n(147),c=n(30),l=n(146),u=n(22),d=n.p+"static/media/logo.e2f91fdb.svg",m=(n(36),n(37),n(144)),g=n(145),h=n(0);function p(){return Object(h.jsxs)(m.a,{collapseOnSelect:!0,expand:"lg",bg:"dark",variant:"dark",style:{borderTop:"8px solid #1ba89c"},children:[Object(h.jsx)(m.a.Brand,{as:u.a,to:"/",children:Object(h.jsx)("img",{src:d,className:"img-fluid",style:{maxHeight:80},alt:"Micrometer"})}),Object(h.jsx)(m.a.Toggle,{"aria-controls":"responsive-navbar-nav"}),Object(h.jsx)(m.a.Collapse,{id:"responsive-navbar-nav",children:Object(h.jsxs)(g.a,{className:"ml-auto mt-2 mt-lg-0",children:[Object(h.jsx)(g.a.Item,{href:"/docs",children:Object(h.jsxs)(g.a.Link,{as:u.a,to:"/docs",children:[Object(h.jsx)("i",{className:"fa fa-lg fa-book"})," Documentation"]})}),Object(h.jsx)(g.a.Item,{children:Object(h.jsxs)(g.a.Link,{href:"https://github.com/micrometer-metrics/micrometer",children:[Object(h.jsx)("i",{className:"fa fa-lg fa-github-alt"})," GitHub"]})}),Object(h.jsx)(g.a.Item,{children:Object(h.jsxs)(g.a.Link,{href:"https://twitter.com/micrometerio",children:[Object(h.jsx)("i",{className:"fa fa-lg fa-twitter"})," Twitter"]})}),Object(h.jsx)(g.a.Item,{children:Object(h.jsxs)(g.a.Link,{href:"https://slack.micrometer.io",children:[Object(h.jsx)("i",{className:"fa fa-lg fa-slack"})," Slack"]})})]})})]})}function f(){return Object(h.jsx)("div",{className:"bg-dark text-center",children:Object(h.jsx)("div",{className:"col-12",style:{padding:10,color:"white"},children:Object(h.jsxs)("p",{children:['Copyright \xa9 2005 - 2023 Broadcom. All Rights Reserved. The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. See ',Object(h.jsx)("a",{href:"https://www.vmware.com/help/legal.html",children:"Terms of Use"})," and ",Object(h.jsx)("a",{href:"https://www.vmware.com/help/privacy.html",children:"Privacy Policy"}),"."]})})})}var b=n.p+"static/media/logo-no-title.c52ef844.svg",y=n.p+"static/media/playback-latency.b7cc768a.png";function v(){return Object(h.jsxs)("div",{children:[Object(h.jsx)("div",{className:"jumbotron text-center",style:{background:"url(".concat(y,") no-repeat center center")},children:Object(h.jsxs)("div",{className:"container",children:[Object(h.jsx)("img",{src:b,className:"img-fluid",alt:""}),Object(h.jsx)("h1",{className:"jumbotron-heading mt-3",style:{color:"white",background:"rgba(52, 48, 45, 0.8)"},children:"Vendor-neutral application observability facade"}),Object(h.jsx)("p",{className:"lead",style:{padding:8,color:"white",background:"rgba(52, 48, 45, 0.8)"},children:"Micrometer provides a simple facade over the instrumentation clients for the most popular observability systems, allowing you to instrument your JVM-based application code without vendor lock-in. Think SLF4J, but for observability."})]})}),Object(h.jsxs)("div",{className:"container-fluid",children:[Object(h.jsxs)("div",{className:"row",style:{background:"rgba(17, 122, 113, 0.8)",color:"white",padding:30},children:[Object(h.jsxs)("div",{className:"col-lg-4 text-center",children:[Object(h.jsx)("i",{className:"fa fa-4x fa-database","aria-hidden":"true"}),Object(h.jsx)("h2",{children:"Dimensional Metrics"}),Object(h.jsxs)("p",{children:["Micrometer provides vendor-neutral interfaces for ",Object(h.jsx)("strong",{children:"timers"}),", ",Object(h.jsx)("strong",{children:"gauges"}),", ",Object(h.jsx)("strong",{children:"counters"}),", ",Object(h.jsx)("strong",{children:"distribution summaries"}),", and ",Object(h.jsx)("strong",{children:"long task timers"})," with a dimensional data model that, when paired with a dimensional monitoring system, allows for efficient access to a particular named metric with the ability to drill down across its dimensions."]})]}),Object(h.jsxs)("div",{className:"col-lg-4 text-center",children:[Object(h.jsx)("i",{className:"fa fa-4x fa-area-chart","aria-hidden":"true"}),Object(h.jsx)("h2",{children:"Pre-configured Bindings"}),Object(h.jsx)("p",{children:"Out-of-the-box instrumentation of caches, the class loader, garbage collection, processor utilization, thread pools, and more tailored to actionable insight."})]}),Object(h.jsxs)("div",{className:"col-lg-4 text-center",children:[Object(h.jsx)("i",{className:"fa fa-4x fa-leaf","aria-hidden":"true"}),Object(h.jsx)("h2",{children:"Integrated into Spring"}),Object(h.jsx)("p",{children:"Micrometer is the instrumentation library powering the delivery of application observability from Spring Boot applications."})]})]}),Object(h.jsx)("div",{className:"row justify-content-center",style:{padding:30},children:Object(h.jsxs)("div",{className:"col-lg-6 col-md-12",children:[Object(h.jsx)("h2",{children:"Support for popular observability systems"}),Object(h.jsx)("p",{children:"As an instrumentation facade, Micrometer allows you to instrument your code with dimensional metrics, spans with a vendor-neutral interface and decide on the observability system as a last step. Instrumenting your core library code with Micrometer allows the libraries to be included in applications that ship data to different backends."}),Object(h.jsxs)("p",{children:["Contains built-in support for ",Object(h.jsx)("strong",{children:"AppOptics"}),", ",Object(h.jsx)("strong",{children:"Azure Monitor"}),", Netflix ",Object(h.jsx)("strong",{children:"Atlas"}),", ",Object(h.jsx)("strong",{children:"CloudWatch"}),", ",Object(h.jsx)("strong",{children:"Datadog"}),", ",Object(h.jsx)("strong",{children:"Dynatrace"}),", ",Object(h.jsx)("strong",{children:"Elastic"}),", ",Object(h.jsx)("strong",{children:"Ganglia"}),", ",Object(h.jsx)("strong",{children:"Graphite"}),", ",Object(h.jsx)("strong",{children:"Humio"}),", ",Object(h.jsx)("strong",{children:"Influx/Telegraf"}),", ",Object(h.jsx)("strong",{children:"JMX"}),", ",Object(h.jsx)("strong",{children:"KairosDB"}),", ",Object(h.jsx)("strong",{children:"New Relic"}),", ",Object(h.jsx)("strong",{children:"OpenTelemetry"})," Protocol (OTLP), ",Object(h.jsx)("strong",{children:"Prometheus"}),", ",Object(h.jsx)("strong",{children:"SignalFx"}),", Google ",Object(h.jsx)("strong",{children:"Stackdriver"}),", ",Object(h.jsx)("strong",{children:"StatsD"}),", and ",Object(h.jsx)("strong",{children:"Wavefront"}),"."]}),Object(h.jsxs)("p",{children:["Through ",Object(h.jsx)("strong",{children:"Micrometer Observation"})," and ",Object(h.jsx)("strong",{children:"Micrometer Tracing"})," you can ship your spans via ",Object(h.jsx)("strong",{children:"OpenZipkin Brave"})," or ",Object(h.jsx)("strong",{children:"OpenTelemetry"})," tracers to different backends (e.g. ",Object(h.jsx)("strong",{children:"OpenZipkin"})," or ",Object(h.jsx)("strong",{children:"Wavefront"}),")."]})]})})]})]})}var w=n(143);n(43);function T(){return Object(h.jsxs)("div",{className:"container-fluid mt-4",style:{paddingRight:30,paddingLeft:30},children:[Object(h.jsx)("h1",{children:"Micrometer Documentation"}),Object(h.jsx)("p",{children:"Micrometer provides a simple facade over the instrumentation clients for the most popular observability systems, allowing you to instrument your JVM-based application code without vendor lock-in. Think SLF4J, but for application observability! Data recorded by Micrometer are intended to be used to observe, alert, and react to the current/recent operational state of your environment."}),Object(h.jsxs)("p",{children:["Join the discussion with any comments and feature requests on Micrometer's public ",Object(h.jsxs)("a",{href:"https://slack.micrometer.io",children:[Object(h.jsx)("i",{className:"fa fa-lg fa-slack"})," Slack Workspace"]}),"."]}),Object(h.jsxs)("ol",{children:[Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/installing",children:"Installing"}),". Where to get the latest release and snapshot builds."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/concepts",children:"Concepts"}),". An introduction to the abstraction provided by Micrometer."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)("span",{className:"doc-section",children:"Setup"}),". Instructions for how to configure Micrometer for use with different monitoring systems. As a facade over multiple monitoring systems, the point of Micrometer is to allow you to instrument your code in the same way and be able to visualize the results in your monitoring system of choice.",Object(h.jsxs)("ul",{children:[Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/registry/appOptics",children:"AppOptics"}),". AppOptics is a dimensional time-series SAAS with built-in dashboarding. Micrometer supports shipping metrics to AppOptics directly via its API."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/registry/atlas",children:"Atlas"}),". An in-memory dimensional time series database with built-in graphing, a custom stack-based query language, and advanced math operations. Atlas originated at Netflix, where it remains the operational metrics solution."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/registry/cloudwatch",children:"CloudWatch"}),". CloudWatch is a dimensional time-series SaaS on Amazon's cloud."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/registry/datadog",children:"Datadog"}),". Datadog is a dimensional time-series SAAS with built-in dashboarding and alerting. Micrometer supports shipping metrics to Datadog directly via its API or through Dogstatsd via the StatsD registry."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/registry/dynatrace",children:"Dynatrace"}),". Dynatrace is a Software Intelligence Platform featuring application performance monitoring (APM), artificial intelligence for operations (AIOps), IT infrastructure monitoring, digital experience management (DEM), and digital business analytics capabilities. Micrometer supports shipping metrics to Dynatrace directly via its API."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/registry/elastic",children:"Elastic"}),". Elasticsearch is an open source search and analytics platform. Metrics stored in Elasticsearch can be visualized in Kibana."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/registry/ganglia",children:"Ganglia"}),". An aging hierarchical metrics system which enjoyed wide popularity in Linux system monitoring and is still in place in many organizations. It originated in the early 2000s at the University of California, Berkeley."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/registry/graphite",children:"Graphite"}),". One of the most popular current hierarchical metrics systems backed by a fixed-size database, similar in design and purpose to RRD. It originated at Orbitz in 2006 and was open sourced in 2008."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/registry/humio",children:"Humio"}),". Humio is a dimensional time-series SAAS with built-in dashboarding. Micrometer supports shipping metrics to Humio directly via its API."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/registry/influx",children:"Influx"}),". The InfluxData suite of tools supports real-time stream processing and storage of time-series data. It supports downsampling, automatically expiring and deleting unwanted data, as well as backup and restore. Analysis of data is done via a SQL-like query language."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/registry/instana",children:"Instana"}),". Instana is an automatic application performance management and infrastructure monitoring system."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/registry/jmx",children:"JMX"}),". Micrometer provides a hierarchical mapping to JMX, primarily as a cheap and portable way to view metrics locally. Where JMX exporting is found in production, the same metrics are generally exported to another, more purpose-fit monitoring system."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/registry/kairos",children:"KairosDB"}),". KairosDB is a dimensional time-series database built on top of Cassandra. Charting can be accomplished in Grafana."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/registry/new-relic",children:"New Relic"}),". Micrometer publishes to New Relic Insights, a SaaS offering with a full UI and a query language called NRQL. New Relic Insights operates on a push model."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/registry/otlp",children:"OpenTelemetry Protocol (OTLP)"}),". OpenTelemetry is a CNCF incubating project for providing standards for telemetry data. Micrometer can publish metrics using the OpenTelemetry protocol (OTLP) to the backends that support it."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/registry/prometheus",children:"Prometheus"}),". An in-memory dimensional time series database with a simple built-in UI, a custom query language, and math operations. Prometheus is designed to operate on a pull model, scraping metrics from application instances periodically based on service discovery."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/registry/signalFx",children:"SignalFx"}),'. SignalFx is a dimensional monitoring system SaaS with a full UI operating on a push model. It has a rich set of alert "detectors".']}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/registry/stackdriver",children:"Stackdriver"}),". Stackdriver Monitoring is a dimensional time-series SAAS with built-in dashboarding and alerting. Micrometer supports shipping metrics to Stackdriver directly via its API using a push model. Alternatively, you can export Micrometer metrics via Prometheus and use a Prometheus to Stackdriver sidecar."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/registry/statsD",children:"StatsD"}),". Micrometer supports three flavors of StatsD: the original Etsy format plus the Datadog and Telegraf (Influx) extensions of StatsD that add dimensional support. Use this registry if you prefer to publish metrics to a StatsD agent. Also use this registry with Datadog flavor to publish metrics to Splunk."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/registry/wavefront",children:"Wavefront"}),". Wavefront is a SaaS-based metrics monitoring and analytics platform that lets you visualize, query, and alert over data from across your entire stack (infrastructure, network, custom app metrics, business KPIs, etc.)"]})]})]}),Object(h.jsxs)("li",{children:[Object(h.jsx)("span",{className:"doc-section",children:"Reference"}),". Detailed list of out-of-the-box instrumentation provided by Micrometer.",Object(h.jsxs)("ul",{children:[Object(h.jsxs)("li",{children:[Object(h.jsx)("a",{className:"doc-section",href:"https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready-metrics",children:"Spring Boot"}),". Micrometer is the instrumentation library powering the delivery of application metrics from Spring."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/ref/jvm",children:"JVM"}),". Metrics on classloaders, memory, garbage collection, threads, etc."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/ref/cache",children:"Cache"}),". Instrumentation for the most popular caching frameworks."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/ref/okhttpclient",children:"OkHttpClient"}),". Instrumentation for OkHttpClient."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/ref/jetty",children:"Jetty and Jersey"}),". Instrumentation for Jetty and Jersey."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/ref/netty",children:"Netty"}),". Instrumentation for Netty."]})]})]}),Object(h.jsxs)("li",{children:[Object(h.jsx)("span",{className:"doc-section",children:"Guides"}),".",Object(h.jsx)("ul",{children:Object(h.jsx)("li",{children:Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/guide/consoleReporter",children:"Passing through to Dropwizard's console reporter"})})}),Object(h.jsx)("ul",{children:Object(h.jsx)("li",{children:Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/guide/httpSenderResilience4jRetry",children:"HttpSender with Resilience4j retry"})})}),Object(h.jsx)("ul",{children:Object(h.jsx)("li",{children:Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/guide/customMeterRegistry",children:"Custom meter registry"})})})]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/observation",children:"Micrometer Observation"}),". An introduction to the Micrometer Observation API."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/tracing",children:"Micrometer Tracing"}),". An introduction to the abstraction provided by Micrometer Tracing."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/contextPropagation",children:"Micrometer Context Propagation"}),". An introduction to the abstraction provided by Micrometer Context Propagation."]}),Object(h.jsxs)("li",{children:[Object(h.jsx)(w.a,{className:"doc-section",to:"/docs/support",children:"Support policy"}),". Micrometer's support policy for releases."]})]})]})}var x=n(26),S=n(27),O=n(17),M=n(31),C=n(29),I=(n(45),n(28)),k=n.n(I),E=(n(54),n(55)());E.Extensions.register((function(){this.treeProcessor((function(){this.process((function(e){return e.findBy({context:"image"}).forEach((function(e){var t=e.getAttribute("alt");e.setAttribute("alt",t+'" class="img-fluid',!0)})),e}))}))}));var R=function(e){Object(M.a)(n,e);var t=Object(C.a)(n);function n(e){var r;return Object(x.a)(this,n),(r=t.call(this,e)).highlightCode=r.highlightCode.bind(Object(O.a)(r)),r}return Object(S.a)(n,[{key:"componentDidMount",value:function(){this.highlightCode()}},{key:"componentDidUpdate",value:function(){this.highlightCode()}},{key:"highlightCode",value:function(){this.root.querySelectorAll("pre code").forEach((function(e){return k.a.highlightBlock(e)}))}},{key:"render",value:function(){var e=this,t=E.convert(this.props.source,{attributes:this.props.attrs,safe:"safe"});return Object(h.jsx)("div",{ref:function(t){e.root=t},dangerouslySetInnerHTML:{__html:t}})}}]),n}(r.Component);n(63);function A(e){var t=e.title,n=e.content,r=e.attrs;return Object(h.jsxs)("div",{className:"container-fluid mt-4 ml-3 mr-3",children:[Object(h.jsx)("h1",{children:t}),Object(h.jsx)("hr",{}),Object(h.jsx)(R,{source:n,attrs:r})]})}A.defaultProps={attrs:{}};var j=n(64),D=n(65),N=n(69),P=n(70),_=n(74),L=n(75),B=n(76),H=n(77),F=n(78),G=n(79),q=n(80),W=n(81),U=n(85),V=["appOptics","atlas","azure-monitor","cloudwatch","datadog","dynatrace","elastic","ganglia","graphite","humio","influx","instana","jmx","kairos","new-relic","otlp","prometheus","signalFx","stackdriver","statsD","wavefront"],z={};function Y(){return Object(h.jsxs)("div",{children:[Object(h.jsx)(c.a,{exact:!0,path:"/docs",component:T}),Object(h.jsx)(c.a,{path:"/docs/installing",render:function(){return Object(h.jsx)(A,{title:"Installing",content:j})}}),Object(h.jsx)(c.a,{exact:!0,path:"/docs/concepts",render:function(){return Object(h.jsx)(A,{title:"Concepts",content:D})}}),Object(h.jsx)(c.a,{path:"/docs/registry/:system",render:function(e){var t=e.match.params.system;return V.includes(t)?Object(h.jsx)(A,{title:"Micrometer ".concat(t.split("-").map((function(e){return e[0].toUpperCase()+e.slice(1)})).join(" ")),content:z[t]}):Object(h.jsx)(l.a,{to:"/docs"})}}),Object(h.jsx)(c.a,{path:"/docs/ref/jvm",render:function(){return Object(h.jsx)(A,{title:"JVM and System Metrics",content:N})}}),Object(h.jsx)(c.a,{path:"/docs/ref/cache",render:function(){return Object(h.jsx)(A,{title:"Cache Metrics",content:P})}}),Object(h.jsx)(c.a,{path:"/docs/ref/okhttpclient",render:function(){return Object(h.jsx)(A,{title:"OkHttpClient Metrics",content:_})}}),Object(h.jsx)(c.a,{path:"/docs/ref/jetty",render:function(){return Object(h.jsx)(A,{title:"Jetty and Jersey Metrics",content:L})}}),Object(h.jsx)(c.a,{path:"/docs/ref/netty",render:function(){return Object(h.jsx)(A,{title:"Netty Metrics",content:B})}}),Object(h.jsx)(c.a,{path:"/docs/guide/consoleReporter",render:function(){return Object(h.jsx)(A,{title:"Passing through to Dropwizard's console reporter",content:H})}}),Object(h.jsx)(c.a,{path:"/docs/guide/httpSenderResilience4jRetry",render:function(){return Object(h.jsx)(A,{title:"HttpSender with Resilience4j retry",content:F})}}),Object(h.jsx)(c.a,{path:"/docs/guide/customMeterRegistry",render:function(){return Object(h.jsx)(A,{title:"Custom meter registry",content:G})}}),Object(h.jsx)(c.a,{path:"/docs/observation",render:function(){return Object(h.jsx)(A,{title:"Observation",content:q})}}),Object(h.jsx)(c.a,{path:"/docs/tracing",render:function(){return Object(h.jsx)(A,{title:"Tracing",content:W})}}),Object(h.jsx)(c.a,{path:"/docs/contextPropagation",render:function(){return Object(h.jsx)(A,{title:"Context Propagation",content:U})}})]})}V.forEach((function(e){return z[e]=n(86)("./".concat(e,".adoc"))}));var K=n(136);function J(){return Object(h.jsxs)("div",{children:[Object(h.jsx)(p,{}),Object(h.jsxs)(s.a,{children:[Object(h.jsx)(c.a,{exact:!0,path:"/",component:v}),Object(h.jsx)(c.a,{exact:!0,path:"/support",render:function(){return Object(h.jsx)(A,{title:"Micrometer Support Policy",content:K})}}),Object(h.jsx)(c.a,{exact:!0,path:"/docs/support",render:function(){return Object(h.jsx)(l.a,{to:"/support"})}}),Object(h.jsx)(c.a,{path:"/security-policy",component:function(){return window.location.href="https://tanzu.vmware.com/security",null}}),Object(h.jsx)(Y,{}),Object(h.jsx)(c.a,{path:"**",render:function(){return Object(h.jsx)(l.a,{to:"/"})}})]}),Object(h.jsx)("div",{className:"container-fluid",style:{paddingRight:0,paddingLeft:0},children:Object(h.jsx)(f,{className:"row"})})]})}Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));var $=n(11),Z=(n(137),n(138),Object($.a)());i.a.render(Object(h.jsx)(o.a,{history:Z,children:Object(h.jsx)(J,{})}),document.getElementById("root")),"serviceWorker"in navigator&&navigator.serviceWorker.ready.then((function(e){e.unregister()})).catch((function(e){console.error(e.message)}))}]),[[139,1,2]]]); -//# sourceMappingURL=main.d5237926.chunk.js.map \ No newline at end of file diff --git a/static/js/main.d5237926.chunk.js.map b/static/js/main.d5237926.chunk.js.map deleted file mode 100644 index a1af321f..00000000 --- a/static/js/main.d5237926.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["components/Asciidoc/highlight/index.js","components/Asciidoc/highlight/highlight.js","components/Asciidoc/highlight/languages/gradle.js","components/Asciidoc/highlight/languages/groovy.js","components/Asciidoc/highlight/languages/http.js","components/Asciidoc/highlight/languages/java.js","components/Asciidoc/highlight/languages/xml.js","components/Asciidoc/highlight/languages/yaml.js","components/Asciidoc/highlight/languages/json.js","generated-docs/installing/index.adoc","generated-docs/concepts/index.adoc","generated-docs/concepts/img/prometheus-counter-norate.png","generated-docs/concepts/img/prometheus-counter.png","generated-docs/concepts/img/rate-normalizing.png","generated-docs/jvm/index.adoc","generated-docs/cache/index.adoc","generated-docs/cache/img/prometheus-guava-cache.png","generated-docs/cache/img/prometheus-guava-cache-ratio.png","generated-docs/cache/img/grafana-guava-miss-ratio.png","generated-docs/okhttpclient/index.adoc","generated-docs/jetty/index.adoc","generated-docs/netty/index.adoc","generated-docs/guide/console-reporter.adoc","generated-docs/guide/http-sender-resilience4j-retry.adoc","generated-docs/guide/custom-meter-registry.adoc","generated-docs/observation/index.adoc","generated-docs/tracing/index.adoc","generated-docs/tracing/img/trace-id.jpg","generated-docs/tracing/img/parents.jpg","generated-docs/tracing/img/zipkin.jpg","generated-docs/contextpropagation/index.adoc","../ /^/.//.*/.adoc$","generated-docs/implementations/appOptics.adoc","generated-docs/implementations/img/appoptics-timer-average.png","generated-docs/implementations/img/appoptics-timer.png","generated-docs/implementations/atlas.adoc","generated-docs/implementations/img/atlas-counter.png","generated-docs/implementations/img/atlas-timer.png","generated-docs/implementations/img/atlas-long-task-timer.png","generated-docs/implementations/azure-monitor.adoc","generated-docs/implementations/cloudwatch.adoc","generated-docs/implementations/datadog.adoc","generated-docs/implementations/dynatrace.adoc","generated-docs/implementations/elastic.adoc","generated-docs/implementations/ganglia.adoc","generated-docs/implementations/img/ganglia-counter.png","generated-docs/implementations/graphite.adoc","generated-docs/implementations/img/graphite-counter.png","generated-docs/implementations/hierarchical-name-mapping.adoc","generated-docs/implementations/humio.adoc","generated-docs/implementations/img/humio-timer.png","generated-docs/implementations/influx.adoc","generated-docs/implementations/install.adoc","generated-docs/implementations/instana.adoc","generated-docs/implementations/jmx.adoc","generated-docs/implementations/img/jmx-counter.png","generated-docs/implementations/kairos.adoc","generated-docs/implementations/new-relic.adoc","generated-docs/implementations/img/new-relic-timer-latency.png","generated-docs/implementations/img/new-relic-timer-throughput.png","generated-docs/implementations/img/new-relic-timer-percentiles.png","generated-docs/implementations/img/new-relic-timer-sla.png","generated-docs/implementations/otlp.adoc","generated-docs/implementations/prometheus.adoc","generated-docs/implementations/img/prometheus-dashboard.png","generated-docs/implementations/img/prometheus-counter.png","generated-docs/implementations/img/prometheus-counter-norate.png","generated-docs/implementations/img/prometheus-timer.png","generated-docs/implementations/img/prometheus-long-task-timer.png","generated-docs/implementations/signalFx.adoc","generated-docs/implementations/img/signalfx-timer-latency-query.png","generated-docs/implementations/img/signalfx-timer-latency.png","generated-docs/implementations/img/signalfx-timer-throughput.png","generated-docs/implementations/img/signalfx-timer-percentiles.png","generated-docs/implementations/img/signalfx-timer-sla.png","generated-docs/implementations/stackdriver.adoc","generated-docs/implementations/statsD.adoc","generated-docs/implementations/wavefront.adoc","generated-docs/implementations/img/wavefront-counter-rate.png","generated-docs/implementations/img/wavefront-timer-latency.png","generated-docs/implementations/img/wavefront-timer-throughput.png","generated-docs/support/index.adoc","img/logo.svg","components/MyNavbar/index.js","components/Footer/index.js","img/logo-no-title.svg","img/playback-latency.png","components/Home/index.js","components/DocRoot/index.js","components/Asciidoc/index.js","components/DocSection/index.js","components/DocRoutes/index.js","components/App/App.js","registerServiceWorker.js","index.js"],"names":["hljs","require","registerLanguage","module","exports","factory","window","self","ArrayProto","objectKeys","Object","keys","languages","aliases","noHighlightRe","languagePrefixRe","fixMarkupRe","spanEndTag","options","classPrefix","tabReplace","useBR","undefined","escape","value","replace","tag","node","nodeName","toLowerCase","testRe","re","lexeme","match","exec","index","isNotHighlighted","language","test","blockLanguage","block","i","length","_class","classes","className","parentNode","getLanguage","split","inherit","parent","key","result","objects","Array","prototype","slice","call","arguments","forEach","obj","nodeStream","_nodeStream","offset","child","firstChild","nextSibling","nodeType","nodeValue","push","event","mergeStreams","original","highlighted","processed","nodeStack","selectStream","open","attr_str","a","map","attributes","join","close","render","stream","substring","reverse","splice","pop","substr","expand_mode","mode","variants","cached_variants","variant","endsWithParent","compileLanguage","reStr","source","langRe","global","RegExp","case_insensitive","compileMode","compiled","keywords","beginKeywords","compiled_keywords","flatten","str","kw","pair","Number","lexemesRe","lexemes","begin","beginRe","end","endRe","terminator_end","illegal","illegalRe","relevance","contains","concat","apply","c","starts","terminators","filter","Boolean","highlight","name","ignore_illegals","continuation","subMode","endOfMode","endsParent","isIllegal","keywordMatch","match_str","hasOwnProperty","buildSpan","classname","insideSpan","leaveOpen","noPrefix","openSpan","processKeywords","keyword_match","last_index","top","mode_buffer","lastIndex","processSubLanguage","explicit","subLanguage","continuations","highlightAuto","processBuffer","startNewMode","create","processLexeme","buffer","new_mode","skip","excludeBegin","returnBegin","end_mode","origin","returnEnd","excludeEnd","Error","current","count","e","message","indexOf","text","languageSubset","second_best","fixMarkup","p1","buildClassName","prevClassName","currentLang","resultLang","trim","highlightBlock","originalStream","resultNode","document","createElementNS","innerHTML","textContent","configure","user_options","initHighlighting","called","blocks","querySelectorAll","initHighlightingOnLoad","addEventListener","lang","alias","listLanguages","IDENT_RE","UNDERSCORE_IDENT_RE","NUMBER_RE","C_NUMBER_RE","BINARY_NUMBER_RE","RE_STARTERS_RE","BACKSLASH_ESCAPE","APOS_STRING_MODE","QUOTE_STRING_MODE","PHRASAL_WORDS_MODE","COMMENT","inherits","C_LINE_COMMENT_MODE","C_BLOCK_COMMENT_MODE","HASH_COMMENT_MODE","NUMBER_MODE","C_NUMBER_MODE","BINARY_NUMBER_MODE","CSS_NUMBER_MODE","REGEXP_MODE","TITLE_MODE","UNDERSCORE_TITLE_MODE","METHOD_GUARD","keyword","literal","VERSION","KEYWORDS","JAVA_NUMBER_MODE","TAG_INTERNALS","LITERALS","keyPrefix","keyName","KEY","STRING","TYPES","VALUE_CONTAINER","OBJECT","ARRAY","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","code","resolve","MyNavbar","Navbar","collapseOnSelect","expand","bg","style","borderTop","Brand","as","Link","to","src","logo","maxHeight","alt","Toggle","Collapse","Nav","Item","href","Footer","padding","color","Home","background","logoNoTitle","DocRoot","paddingRight","paddingLeft","NavLink","asciidoctor","Extensions","register","this","treeProcessor","process","doc","findBy","img","getAttribute","setAttribute","Asciidoc","props","highlightCode","bind","root","converted","convert","attrs","safe","ref","dangerouslySetInnerHTML","__html","Component","DocSection","title","content","defaultProps","docsInstalling","docsConcepts","docsJvm","docsCache","docsOkHttpClient","docsJetty","docsNetty","docsConsoleReporter","docsHttpSenderResilience4jRetry","docsCustomMeterRegistry","docsObservation","docsTracing","docsContextPropagation","systems","docsBySystem","DocRoutes","Route","exact","path","component","system","params","includes","part","toUpperCase","Redirect","sys","docsSupport","App","Switch","location","hostname","history","createBrowserHistory","ReactDOM","Router","getElementById","navigator","serviceWorker","ready","then","registration","unregister","catch","error","console"],"mappings":"0HAAA,IAAIA,EAAOC,EAAQ,IAEnBD,EAAKE,iBAAiB,SAAUD,EAAQ,KACxCD,EAAKE,iBAAiB,SAAUD,EAAQ,KACxCD,EAAKE,iBAAiB,OAAQD,EAAQ,KACtCD,EAAKE,iBAAiB,OAAQD,EAAQ,KACtCD,EAAKE,iBAAiB,MAAOD,EAAQ,KACrCD,EAAKE,iBAAiB,OAAQD,EAAQ,KACtCD,EAAKE,iBAAiB,OAAQD,EAAQ,KAEtCE,EAAOC,QAAUJ,G,oECAhB,SAASK,GAG6B,kBAAXC,QAAuBA,QACd,kBAATC,MAAqBA,MAmB/C,SAASP,GAET,IAAIQ,EAAa,GACbC,EAAaC,OAAOC,KAGpBC,EAAY,GACZC,EAAY,GAGZC,EAAmB,gCACnBC,EAAmB,8BACnBC,EAAmB,+BAEnBC,EAAa,UAIbC,EAAU,CACZC,YAAa,QACbC,WAAY,KACZC,OAAO,EACPT,eAAWU,GAMb,SAASC,EAAOC,GACd,OAAOA,EAAMC,QAAQ,KAAM,SAASA,QAAQ,KAAM,QAAQA,QAAQ,KAAM,QAG1E,SAASC,EAAIC,GACX,OAAOA,EAAKC,SAASC,cAGvB,SAASC,EAAOC,EAAIC,GAClB,IAAIC,EAAQF,GAAMA,EAAGG,KAAKF,GAC1B,OAAOC,GAAyB,IAAhBA,EAAME,MAGxB,SAASC,EAAiBC,GACxB,OAAOvB,EAAcwB,KAAKD,GAG5B,SAASE,EAAcC,GACrB,IAAIC,EAAGR,EAAOS,EAAQC,EAClBC,EAAUJ,EAAMK,UAAY,IAMhC,GAJAD,GAAWJ,EAAMM,WAAaN,EAAMM,WAAWD,UAAY,GAG3DZ,EAAQlB,EAAiBmB,KAAKU,GAE5B,OAAOG,EAAYd,EAAM,IAAMA,EAAM,GAAK,eAK5C,IAAKQ,EAAI,EAAGC,GAFZE,EAAUA,EAAQI,MAAM,QAEKN,OAAQD,EAAIC,EAAQD,IAG/C,GAAIL,EAFJO,EAASC,EAAQH,KAEeM,EAAYJ,GAC1C,OAAOA,EAKb,SAASM,EAAQC,GACf,IAAIC,EACAC,EAAS,GACTC,EAAUC,MAAMC,UAAUC,MAAMC,KAAKC,UAAW,GAEpD,IAAKP,KAAOD,EACVE,EAAOD,GAAOD,EAAOC,GAKvB,OAJAE,EAAQM,SAAQ,SAASC,GACvB,IAAKT,KAAOS,EACVR,EAAOD,GAAOS,EAAIT,MAEfC,EAKT,SAASS,EAAWlC,GAClB,IAAIyB,EAAS,GA0Bb,OAzBA,SAAUU,EAAYnC,EAAMoC,GAC1B,IAAK,IAAIC,EAAQrC,EAAKsC,WAAYD,EAAOA,EAAQA,EAAME,YAC9B,IAAnBF,EAAMG,SACRJ,GAAUC,EAAMI,UAAU1B,OACA,IAAnBsB,EAAMG,WACbf,EAAOiB,KAAK,CACVC,MAAO,QACPP,OAAQA,EACRpC,KAAMqC,IAERD,EAASD,EAAYE,EAAOD,GAIvBrC,EAAIsC,GAAO/B,MAAM,oBACpBmB,EAAOiB,KAAK,CACVC,MAAO,OACPP,OAAQA,EACRpC,KAAMqC,KAKd,OAAOD,EAvBT,CAwBGpC,EAAM,GACFyB,EAGT,SAASmB,EAAaC,EAAUC,EAAajD,GAC3C,IAAIkD,EAAY,EACZtB,EAAS,GACTuB,EAAY,GAEhB,SAASC,IACP,OAAKJ,EAAS9B,QAAW+B,EAAY/B,OAGjC8B,EAAS,GAAGT,SAAWU,EAAY,GAAGV,OAChCS,EAAS,GAAGT,OAASU,EAAY,GAAGV,OAAUS,EAAWC,EAkBnC,UAAzBA,EAAY,GAAGH,MAAoBE,EAAWC,EArB5CD,EAAS9B,OAAS8B,EAAWC,EAwBxC,SAASI,EAAKlD,GACZ,SAASmD,EAASC,GAAI,MAAO,IAAMA,EAAEnD,SAAW,KAAOL,EAAOwD,EAAEvD,OAAOC,QAAQ,IAAK,UAAY,IAChG2B,GAAU,IAAM1B,EAAIC,GAAQnB,EAAWwE,IAAIvB,KAAK9B,EAAKsD,WAAYH,GAAUI,KAAK,IAAM,IAGxF,SAASC,EAAMxD,GACbyB,GAAU,KAAO1B,EAAIC,GAAQ,IAG/B,SAASyD,EAAOd,IACG,UAAhBA,EAAMA,MAAoBO,EAAOM,GAAOb,EAAM3C,MAGjD,KAAO6C,EAAS9B,QAAU+B,EAAY/B,QAAQ,CAC5C,IAAI2C,EAAST,IAGb,GAFAxB,GAAU7B,EAAOC,EAAM8D,UAAUZ,EAAWW,EAAO,GAAGtB,SACtDW,EAAYW,EAAO,GAAGtB,OAClBsB,IAAWb,EAAU,CAOvBG,EAAUY,UAAU5B,QAAQwB,GAC5B,GACEC,EAAOC,EAAOG,OAAO,EAAG,GAAG,IAC3BH,EAAST,UACFS,IAAWb,GAAYa,EAAO3C,QAAU2C,EAAO,GAAGtB,SAAWW,GACtEC,EAAUY,UAAU5B,QAAQkB,OAEJ,UAApBQ,EAAO,GAAGf,MACZK,EAAUN,KAAKgB,EAAO,GAAG1D,MAEzBgD,EAAUc,MAEZL,EAAOC,EAAOG,OAAO,EAAG,GAAG,IAG/B,OAAOpC,EAAS7B,EAAOC,EAAMkE,OAAOhB,IAKtC,SAASiB,EAAYC,GAMnB,OALIA,EAAKC,WAAaD,EAAKE,kBACzBF,EAAKE,gBAAkBF,EAAKC,SAASb,KAAI,SAASe,GAChD,OAAO9C,EAAQ2C,EAAM,CAACC,SAAU,MAAOE,OAGpCH,EAAKE,iBAAoBF,EAAKI,gBAAkB,CAAC/C,EAAQ2C,KAAW,CAACA,GAG9E,SAASK,EAAgB5D,GAEvB,SAAS6D,EAAMnE,GACX,OAAQA,GAAMA,EAAGoE,QAAWpE,EAGhC,SAASqE,EAAO5E,EAAO6E,GACrB,OAAO,IAAIC,OACTJ,EAAM1E,GACN,KAAOa,EAASkE,iBAAmB,IAAM,KAAOF,EAAS,IAAM,KAInE,SAASG,EAAYZ,EAAM1C,GACzB,IAAI0C,EAAKa,SAAT,CAKA,GAHAb,EAAKa,UAAW,EAEhBb,EAAKc,SAAWd,EAAKc,UAAYd,EAAKe,cAClCf,EAAKc,SAAU,CACjB,IAAIE,EAAoB,GAEpBC,EAAU,SAAShE,EAAWiE,GAC5BzE,EAASkE,mBACXO,EAAMA,EAAIjF,eAEZiF,EAAI9D,MAAM,KAAKW,SAAQ,SAASoD,GAC9B,IAAIC,EAAOD,EAAG/D,MAAM,KACpB4D,EAAkBI,EAAK,IAAM,CAACnE,EAAWmE,EAAK,GAAKC,OAAOD,EAAK,IAAM,OAI5C,kBAAlBpB,EAAKc,SACdG,EAAQ,UAAWjB,EAAKc,UAExBjG,EAAWmF,EAAKc,UAAU/C,SAAQ,SAAUd,GAC1CgE,EAAQhE,EAAW+C,EAAKc,SAAS7D,OAGrC+C,EAAKc,SAAWE,EAElBhB,EAAKsB,UAAYd,EAAOR,EAAKuB,SAAW,OAAO,GAE3CjE,IACE0C,EAAKe,gBACPf,EAAKwB,MAAQ,OAASxB,EAAKe,cAAc3D,MAAM,KAAKkC,KAAK,KAAO,QAE7DU,EAAKwB,QACRxB,EAAKwB,MAAQ,SACfxB,EAAKyB,QAAUjB,EAAOR,EAAKwB,OACtBxB,EAAK0B,KAAQ1B,EAAKI,iBACrBJ,EAAK0B,IAAM,SACT1B,EAAK0B,MACP1B,EAAK2B,MAAQnB,EAAOR,EAAK0B,MAC3B1B,EAAK4B,eAAiBtB,EAAMN,EAAK0B,MAAQ,GACrC1B,EAAKI,gBAAkB9C,EAAOsE,iBAChC5B,EAAK4B,iBAAmB5B,EAAK0B,IAAM,IAAM,IAAMpE,EAAOsE,iBAEtD5B,EAAK6B,UACP7B,EAAK8B,UAAYtB,EAAOR,EAAK6B,UACT,MAAlB7B,EAAK+B,YACP/B,EAAK+B,UAAY,GACd/B,EAAKgC,WACRhC,EAAKgC,SAAW,IAElBhC,EAAKgC,SAAWtE,MAAMC,UAAUsE,OAAOC,MAAM,GAAIlC,EAAKgC,SAAS5C,KAAI,SAAS+C,GAC1E,OAAOpC,EAAkB,SAANoC,EAAenC,EAAOmC,OAE3CnC,EAAKgC,SAASjE,SAAQ,SAASoE,GAAIvB,EAAYuB,EAAGnC,MAE9CA,EAAKoC,QACPxB,EAAYZ,EAAKoC,OAAQ9E,GAG3B,IAAI+E,EACFrC,EAAKgC,SAAS5C,KAAI,SAAS+C,GACzB,OAAOA,EAAEpB,cAAgB,QAAUoB,EAAEX,MAAQ,QAAUW,EAAEX,SAE1DS,OAAO,CAACjC,EAAK4B,eAAgB5B,EAAK6B,UAClCzC,IAAIkB,GACJgC,OAAOC,SACVvC,EAAKqC,YAAcA,EAAYvF,OAAS0D,EAAO6B,EAAY/C,KAAK,MAAM,GAAQ,CAAChD,KAAM,WAAiB,OAAO,QAG/GsE,EAAYnE,GAYd,SAAS+F,EAAUC,EAAM7G,EAAO8G,EAAiBC,GAE/C,SAASC,EAAQxG,EAAQ4D,GACvB,IAAInD,EAAGC,EAEP,IAAKD,EAAI,EAAGC,EAASkD,EAAKgC,SAASlF,OAAQD,EAAIC,EAAQD,IACrD,GAAIX,EAAO8D,EAAKgC,SAASnF,GAAG4E,QAASrF,GACnC,OAAO4D,EAAKgC,SAASnF,GAK3B,SAASgG,EAAU7C,EAAM5D,GACvB,GAAIF,EAAO8D,EAAK2B,MAAOvF,GAAS,CAC9B,KAAO4D,EAAK8C,YAAc9C,EAAK1C,QAC7B0C,EAAOA,EAAK1C,OAEd,OAAO0C,EAET,GAAIA,EAAKI,eACP,OAAOyC,EAAU7C,EAAK1C,OAAQlB,GAIlC,SAAS2G,EAAU3G,EAAQ4D,GACzB,OAAQ0C,GAAmBxG,EAAO8D,EAAK8B,UAAW1F,GAGpD,SAAS4G,EAAahD,EAAM3D,GAC1B,IAAI4G,EAAYxG,EAASkE,iBAAmBtE,EAAM,GAAGJ,cAAgBI,EAAM,GAC3E,OAAO2D,EAAKc,SAASoC,eAAeD,IAAcjD,EAAKc,SAASmC,GAGlE,SAASE,EAAUC,EAAWC,EAAYC,EAAWC,GACnD,IACIC,EAAc,iBADAD,EAAW,GAAKjI,EAAQC,aAM1C,OAFAiI,GAAYJ,EAAY,MAENC,GAJAC,EAAY,GAAKjI,GAOrC,SAASoI,IACP,IAAIC,EAAeC,EAAYtH,EAAOmB,EAEtC,IAAKoG,EAAI9C,SACP,OAAOnF,EAAOkI,GAOhB,IALArG,EAAS,GACTmG,EAAa,EACbC,EAAItC,UAAUwC,UAAY,EAC1BzH,EAAQuH,EAAItC,UAAUhF,KAAKuH,GAEpBxH,GACLmB,GAAU7B,EAAOkI,EAAYnE,UAAUiE,EAAYtH,EAAME,SACzDmH,EAAgBV,EAAaY,EAAKvH,KAEhC0F,GAAa2B,EAAc,GAC3BlG,GAAU2F,EAAUO,EAAc,GAAI/H,EAAOU,EAAM,MAEnDmB,GAAU7B,EAAOU,EAAM,IAEzBsH,EAAaC,EAAItC,UAAUwC,UAC3BzH,EAAQuH,EAAItC,UAAUhF,KAAKuH,GAE7B,OAAOrG,EAAS7B,EAAOkI,EAAY/D,OAAO6D,IAG5C,SAASI,IACP,IAAIC,EAAsC,kBAApBJ,EAAIK,YAC1B,GAAID,IAAahJ,EAAU4I,EAAIK,aAC7B,OAAOtI,EAAOkI,GAGhB,IAAIrG,EAASwG,EACAxB,EAAUoB,EAAIK,YAAaJ,GAAa,EAAMK,EAAcN,EAAIK,cAChEE,EAAcN,EAAaD,EAAIK,YAAYnH,OAAS8G,EAAIK,iBAAcvI,GAYnF,OANIkI,EAAI7B,UAAY,IAClBA,GAAavE,EAAOuE,WAElBiC,IACFE,EAAcN,EAAIK,aAAezG,EAAOoG,KAEnCT,EAAU3F,EAAOf,SAAUe,EAAO5B,OAAO,GAAO,GAGzD,SAASwI,IACP5G,GAA8B,MAAnBoG,EAAIK,YAAsBF,IAAuBN,IAC5DI,EAAc,GAGhB,SAASQ,EAAarE,GACpBxC,GAAUwC,EAAK/C,UAAWkG,EAAUnD,EAAK/C,UAAW,IAAI,GAAO,GAC/D2G,EAAM9I,OAAOwJ,OAAOtE,EAAM,CAAC1C,OAAQ,CAAC1B,MAAOgI,KAG7C,SAASW,EAAcC,EAAQpI,GAI7B,GAFAyH,GAAeW,EAED,MAAVpI,EAEF,OADAgI,IACO,EAGT,IAAIK,EAAW7B,EAAQxG,EAAQwH,GAC/B,GAAIa,EAaF,OAZIA,EAASC,KACXb,GAAezH,GAEXqI,EAASE,eACXd,GAAezH,GAEjBgI,IACKK,EAASG,aAAgBH,EAASE,eACrCd,EAAczH,IAGlBiI,EAAaI,EAAUrI,GAChBqI,EAASG,YAAc,EAAIxI,EAAOU,OAG3C,IAAI+H,EAAWhC,EAAUe,EAAKxH,GAC9B,GAAIyI,EAAU,CACZ,IAAIC,EAASlB,EACTkB,EAAOJ,KACTb,GAAezH,GAET0I,EAAOC,WAAaD,EAAOE,aAC/BnB,GAAezH,GAEjBgI,IACIU,EAAOE,aACTnB,EAAczH,IAGlB,GACMwH,EAAI3G,YACNO,GAAUnC,GAEPuI,EAAIc,MAASd,EAAIK,cACpBlC,GAAa6B,EAAI7B,WAEnB6B,EAAMA,EAAItG,aACHsG,IAAQiB,EAASvH,QAI1B,OAHIuH,EAASzC,QACXiC,EAAaQ,EAASzC,OAAQ,IAEzB0C,EAAOC,UAAY,EAAI3I,EAAOU,OAGvC,GAAIiG,EAAU3G,EAAQwH,GACpB,MAAM,IAAIqB,MAAM,mBAAqB7I,EAAS,gBAAkBwH,EAAI3G,WAAa,aAAe,KAQlG,OADA4G,GAAezH,EACRA,EAAOU,QAAU,EAG1B,IAAIL,EAAWU,EAAYsF,GAC3B,IAAKhG,EACH,MAAM,IAAIwI,MAAM,sBAAwBxC,EAAO,KAGjDpC,EAAgB5D,GAChB,IAEiByI,EAFbtB,EAAMjB,GAAgBlG,EACtByH,EAAgB,GAChB1G,EAAS,GACb,IAAI0H,EAAUtB,EAAKsB,IAAYzI,EAAUyI,EAAUA,EAAQ5H,OACrD4H,EAAQjI,YACVO,EAAS2F,EAAU+B,EAAQjI,UAAW,IAAI,GAAQO,GAGtD,IAAIqG,EAAc,GACd9B,EAAY,EAChB,IAEE,IADA,IAAI1F,EAAO8I,EAAO5I,EAAQ,EAExBqH,EAAIvB,YAAYyB,UAAYvH,EAC5BF,EAAQuH,EAAIvB,YAAY/F,KAAKV,IAG7BuJ,EAAQZ,EAAc3I,EAAM8D,UAAUnD,EAAOF,EAAME,OAAQF,EAAM,IACjEE,EAAQF,EAAME,MAAQ4I,EAGxB,IADAZ,EAAc3I,EAAMkE,OAAOvD,IACvB2I,EAAUtB,EAAKsB,EAAQ5H,OAAQ4H,EAAUA,EAAQ5H,OAC/C4H,EAAQjI,YACVO,GAAUnC,GAGd,MAAO,CACL0G,UAAWA,EACXnG,MAAO4B,EACPf,SAAUgG,EACVmB,IAAKA,GAEP,MAAOwB,GACP,GAAIA,EAAEC,UAA6C,IAAlCD,EAAEC,QAAQC,QAAQ,WACjC,MAAO,CACLvD,UAAW,EACXnG,MAAOD,EAAOC,IAGhB,MAAMwJ,GAgBZ,SAASjB,EAAcoB,EAAMC,GAC3BA,EAAiBA,GAAkBlK,EAAQN,WAAaH,EAAWG,GACnE,IAAIwC,EAAS,CACXuE,UAAW,EACXnG,MAAOD,EAAO4J,IAEZE,EAAcjI,EAelB,OAdAgI,EAAelD,OAAOnF,GAAaY,SAAQ,SAAS0E,GAClD,IAAIyC,EAAU1C,EAAUC,EAAM8C,GAAM,GACpCL,EAAQzI,SAAWgG,EACfyC,EAAQnD,UAAY0D,EAAY1D,YAClC0D,EAAcP,GAEZA,EAAQnD,UAAYvE,EAAOuE,YAC7B0D,EAAcjI,EACdA,EAAS0H,MAGTO,EAAYhJ,WACde,EAAOiI,YAAcA,GAEhBjI,EAUT,SAASkI,EAAU9J,GACjB,OAASN,EAAQE,YAAcF,EAAQG,MAEnCG,EAAMC,QAAQT,GAAa,SAASiB,EAAOsJ,GACzC,OAAIrK,EAAQG,OAAmB,OAAVY,EACZ,OACEf,EAAQE,WACVmK,EAAG9J,QAAQ,MAAOP,EAAQE,YAE5B,MAPTI,EAWN,SAASgK,EAAeC,EAAeC,EAAaC,GAClD,IAAItJ,EAAWqJ,EAAc7K,EAAQ6K,GAAeC,EAChDvI,EAAW,CAACqI,EAAcG,QAU9B,OARKH,EAAcxJ,MAAM,aACvBmB,EAAOiB,KAAK,SAG2B,IAArCoH,EAAcP,QAAQ7I,IACxBe,EAAOiB,KAAKhC,GAGPe,EAAO8B,KAAK,KAAK0G,OAO1B,SAASC,EAAerJ,GACtB,IAAIb,EAAMmK,EAAgB1I,EAAQ2I,EAAYZ,EAC1C9I,EAAWE,EAAcC,GAEzBJ,EAAiBC,KAGjBnB,EAAQG,OACVM,EAAOqK,SAASC,gBAAgB,+BAAgC,QAC3DC,UAAY1J,EAAM0J,UAAUzK,QAAQ,MAAO,IAAIA,QAAQ,cAAe,MAE3EE,EAAOa,EAET2I,EAAOxJ,EAAKwK,YACZ/I,EAASf,EAAW+F,EAAU/F,EAAU8I,GAAM,GAAQpB,EAAcoB,IAEpEW,EAAiBjI,EAAWlC,IACTe,UACjBqJ,EAAaC,SAASC,gBAAgB,+BAAgC,QAC3DC,UAAY9I,EAAO5B,MAC9B4B,EAAO5B,MAAQ+C,EAAauH,EAAgBjI,EAAWkI,GAAaZ,IAEtE/H,EAAO5B,MAAQ8J,EAAUlI,EAAO5B,OAEhCgB,EAAM0J,UAAY9I,EAAO5B,MACzBgB,EAAMK,UAAY2I,EAAehJ,EAAMK,UAAWR,EAAUe,EAAOf,UACnEG,EAAMY,OAAS,CACbf,SAAUe,EAAOf,SACjBN,GAAIqB,EAAOuE,WAETvE,EAAOiI,cACT7I,EAAM6I,YAAc,CAClBhJ,SAAUe,EAAOiI,YAAYhJ,SAC7BN,GAAIqB,EAAOiI,YAAY1D,aAQ7B,SAASyE,EAAUC,GACjBnL,EAAU+B,EAAQ/B,EAASmL,GAM7B,SAASC,IACP,IAAIA,EAAiBC,OAArB,CAEAD,EAAiBC,QAAS,EAE1B,IAAIC,EAASR,SAASS,iBAAiB,YACvCjM,EAAWmD,QAAQF,KAAK+I,EAAQX,IAMlC,SAASa,IACPC,iBAAiB,mBAAoBL,GAAkB,GACvDK,iBAAiB,OAAQL,GAAkB,GAG7C,SAASpM,EAAiBmI,EAAMhG,GAC9B,IAAIuK,EAAOhM,EAAUyH,GAAQhG,EAASrC,GAClC4M,EAAK/L,SACP+L,EAAK/L,QAAQ8C,SAAQ,SAASkJ,GAAQhM,EAAQgM,GAASxE,KAI3D,SAASyE,IACP,OAAOrM,EAAWG,GAGpB,SAASmC,EAAYsF,GAEnB,OADAA,GAAQA,GAAQ,IAAIxG,cACbjB,EAAUyH,IAASzH,EAAUC,EAAQwH,IAK9CrI,EAAKoI,UAAYA,EACjBpI,EAAK+J,cAAgBA,EACrB/J,EAAKsL,UAAYA,EACjBtL,EAAK6L,eAAiBA,EACtB7L,EAAKoM,UAAYA,EACjBpM,EAAKsM,iBAAmBA,EACxBtM,EAAK0M,uBAAyBA,EAC9B1M,EAAKE,iBAAmBA,EACxBF,EAAK8M,cAAgBA,EACrB9M,EAAK+C,YAAcA,EACnB/C,EAAKiD,QAAUA,EAGfjD,EAAK+M,SAAW,eAChB/M,EAAKgN,oBAAsB,gBAC3BhN,EAAKiN,UAAY,oBACjBjN,EAAKkN,YAAc,yEACnBlN,EAAKmN,iBAAmB,eACxBnN,EAAKoN,eAAiB,+IAGtBpN,EAAKqN,iBAAmB,CACtBjG,MAAO,eAAgBO,UAAW,GAEpC3H,EAAKsN,iBAAmB,CACtBzK,UAAW,SACXuE,MAAO,IAAME,IAAK,IAClBG,QAAS,MACTG,SAAU,CAAC5H,EAAKqN,mBAElBrN,EAAKuN,kBAAoB,CACvB1K,UAAW,SACXuE,MAAO,IAAKE,IAAK,IACjBG,QAAS,MACTG,SAAU,CAAC5H,EAAKqN,mBAElBrN,EAAKwN,mBAAqB,CACxBpG,MAAO,8IAETpH,EAAKyN,QAAU,SAAUrG,EAAOE,EAAKoG,GACnC,IAAI9H,EAAO5F,EAAKiD,QACd,CACEJ,UAAW,UACXuE,MAAOA,EAAOE,IAAKA,EACnBM,SAAU,IAEZ8F,GAAY,IAQd,OANA9H,EAAKgC,SAASvD,KAAKrE,EAAKwN,oBACxB5H,EAAKgC,SAASvD,KAAK,CACjBxB,UAAW,SACXuE,MAAO,+BACPO,UAAW,IAEN/B,GAET5F,EAAK2N,oBAAsB3N,EAAKyN,QAAQ,KAAM,KAC9CzN,EAAK4N,qBAAuB5N,EAAKyN,QAAQ,OAAQ,QACjDzN,EAAK6N,kBAAoB7N,EAAKyN,QAAQ,IAAK,KAC3CzN,EAAK8N,YAAc,CACjBjL,UAAW,SACXuE,MAAOpH,EAAKiN,UACZtF,UAAW,GAEb3H,EAAK+N,cAAgB,CACnBlL,UAAW,SACXuE,MAAOpH,EAAKkN,YACZvF,UAAW,GAEb3H,EAAKgO,mBAAqB,CACxBnL,UAAW,SACXuE,MAAOpH,EAAKmN,iBACZxF,UAAW,GAEb3H,EAAKiO,gBAAkB,CACrBpL,UAAW,SACXuE,MAAOpH,EAAKiN,UAALjN,kGASP2H,UAAW,GAEb3H,EAAKkO,YAAc,CACjBrL,UAAW,SACXuE,MAAO,KAAME,IAAK,aAClBG,QAAS,KACTG,SAAU,CACR5H,EAAKqN,iBACL,CACEjG,MAAO,KAAME,IAAK,KAClBK,UAAW,EACXC,SAAU,CAAC5H,EAAKqN,qBAItBrN,EAAKmO,WAAa,CAChBtL,UAAW,QACXuE,MAAOpH,EAAK+M,SACZpF,UAAW,GAEb3H,EAAKoO,sBAAwB,CAC3BvL,UAAW,QACXuE,MAAOpH,EAAKgN,oBACZrF,UAAW,GAEb3H,EAAKqO,aAAe,CAElBjH,MAAO,UAAYpH,EAAKgN,oBACxBrF,UAAW,IA7xBXtH,CAAQD,GATX,I,cCVDD,EAAOC,QAAU,SAASJ,GACxB,MAAO,CACLuG,kBAAkB,EAClBG,SAAU,CACR4H,QACE,mxCAkBJ1G,SAAU,CACR5H,EAAK2N,oBACL3N,EAAK4N,qBACL5N,EAAKsN,iBACLtN,EAAKuN,kBACLvN,EAAK8N,YACL9N,EAAKkO,gB,cC3BX/N,EAAOC,QAAU,SAASJ,GACtB,MAAO,CACH0G,SAAU,CACN6H,QAAU,kBACVD,QACA,wUASJ1G,SAAU,CACN5H,EAAKyN,QACD,UACA,OACA,CACI9F,UAAY,EACZC,SAAW,CACT,CAEIR,MAAO,OAAQO,UAAW,GAE9B,CACI9E,UAAY,SACZuE,MAAQ,iBAKtBpH,EAAK2N,oBACL3N,EAAK4N,qBACL,CACI/K,UAAW,SACXuE,MAAO,MAAOE,IAAK,OAEvB,CACIzE,UAAW,SACXuE,MAAO,MAAOE,IAAK,OAEvB,CACIzE,UAAW,SACXuE,MAAO,OAAQE,IAAK,OACpBK,UAAW,IAEf3H,EAAKsN,iBACL,CACIzK,UAAW,SACXuE,MAAO,iBACPQ,SAAU,CACN5H,EAAKqN,mBAGbrN,EAAKuN,kBACL,CACI1K,UAAW,OACXuE,MAAO,kBAAmBE,IAAK,IAC/BG,QAAS,MAEbzH,EAAKgO,mBACL,CACInL,UAAW,QACX8D,cAAe,6BAA8BW,IAAK,IAClDG,QAAS,IACTG,SAAU,CACN,CAACjB,cAAe,sBAChB3G,EAAKoO,wBAGbpO,EAAK+N,cACL,CACIlL,UAAW,OAAQuE,MAAO,cAE9B,CAEIvE,UAAW,SAAUuE,MAAO,6BAEhC,CAGIA,MAAO,KAAME,IAAK,MAEtB,CAEIzE,UAAW,SAAUuE,MAAO,uBAC5BO,UAAW,IAGnBF,QAAS,W,cC5FjBtH,EAAOC,QAAU,SAASJ,GACxB,IAAIwO,EAAU,iBACd,MAAO,CACL3N,QAAS,CAAC,SACV4G,QAAS,MACTG,SAAU,CACR,CACER,MAAO,IAAMoH,EAASlH,IAAK,IAC3BM,SAAU,CAAC,CAAC/E,UAAW,SAAUuE,MAAO,kBAE1C,CACEA,MAAO,iBAAmBoH,EAAU,IAAKhE,aAAa,EAAMlD,IAAK,IACjEM,SAAU,CACR,CACE/E,UAAW,SACXuE,MAAO,IAAKE,IAAK,IACjBiD,cAAc,EAAMK,YAAY,GAElC,CACExD,MAAOoH,GAET,CACE3L,UAAW,UACXuE,MAAO,YAIb,CACEvE,UAAW,YACXuE,MAAO,OAAQE,IAAK,KAAMsD,YAAY,EACtCnD,QAAS,YACTO,OAAQ,CAACV,IAAK,IAAKK,UAAW,IAEhC,CACEP,MAAO,SACPY,OAAQ,CAAC6B,YAAa,GAAI7D,gBAAgB,Q,cCjClD7F,EAAOC,QAAU,SAASJ,GACxB,IAEIyO,EACF,6VAqBEC,EAAmB,CACrB7L,UAAW,SACXuE,MAhBmB,uNAiBnBO,UAAW,GAGb,MAAO,CACL9G,QAAS,CAAC,OACV6F,SAAU+H,EACVhH,QAAS,QACTG,SAAU,CACR5H,EAAKyN,QACH,UACA,OACA,CACE9F,UAAY,EACZC,SAAW,CACT,CAEER,MAAO,OAAQO,UAAW,GAE5B,CACE9E,UAAY,SACZuE,MAAQ,iBAKhBpH,EAAK2N,oBACL3N,EAAK4N,qBACL5N,EAAKsN,iBACLtN,EAAKuN,kBACL,CACE1K,UAAW,QACX8D,cAAe,kBAAmBW,IAAK,QAASsD,YAAY,EAC5DlE,SAAU,kBACVe,QAAS,WACTG,SAAU,CACR,CAACjB,cAAe,sBAChB3G,EAAKoO,wBAGT,CAGEzH,cAAe,wBACfgB,UAAW,GAEb,CACE9E,UAAW,WACXuE,MAAO,qKAAoCpH,EAAKgN,oBAAsB,UAAWxC,aAAa,EAAMlD,IAAK,QACzGsD,YAAY,EACZlE,SAAU+H,EACV7G,SAAU,CACR,CACER,MAAOpH,EAAKgN,oBAAsB,UAAWxC,aAAa,EAC1D7C,UAAW,EACXC,SAAU,CAAC5H,EAAKoO,wBAElB,CACEvL,UAAW,SACXuE,MAAO,KAAME,IAAK,KAClBZ,SAAU+H,EACV9G,UAAW,EACXC,SAAU,CACR5H,EAAKsN,iBACLtN,EAAKuN,kBACLvN,EAAK+N,cACL/N,EAAK4N,uBAGT5N,EAAK2N,oBACL3N,EAAK4N,uBAGTc,EACA,CACE7L,UAAW,OAAQuE,MAAO,kB,cCtGlCjH,EAAOC,QAAU,SAASJ,GACxB,IACI2O,EAAgB,CAClB3I,gBAAgB,EAChByB,QAAS,IACTE,UAAW,EACXC,SAAU,CACR,CACE/E,UAAW,OACXuE,MARa,qBASbO,UAAW,GAEb,CACEP,MAAO,OACPO,UAAW,EACXC,SAAU,CACR,CACE/E,UAAW,SACX6F,YAAY,EACZ7C,SAAU,CACR,CAACuB,MAAO,IAAKE,IAAK,KAClB,CAACF,MAAO,IAAKE,IAAK,KAClB,CAACF,MAAO,sBAOpB,MAAO,CACLvG,QAAS,CAAC,OAAQ,QAAS,MAAO,OAAQ,MAAO,MAAO,MAAO,SAC/D0F,kBAAkB,EAClBqB,SAAU,CACR,CACE/E,UAAW,OACXuE,MAAO,YAAaE,IAAK,IACzBK,UAAW,GACXC,SAAU,CAAC,CAACR,MAAO,MAAOE,IAAK,SAEjCtH,EAAKyN,QACH,UACA,SACA,CACE9F,UAAW,KAGf,CACEP,MAAO,kBAAmBE,IAAK,UAC/BK,UAAW,IAEb,CACE9E,UAAW,OACXuE,MAAO,SAAUE,IAAK,MAAOK,UAAW,IAE1C,CACEP,MAAO,YAAaE,IAAK,MACzBuC,YAAa,MACbjC,SAAU,CAAC,CAACR,MAAO,OAAQE,IAAK,OAAQgD,MAAM,KAEhD,CACEzH,UAAW,MAOXuE,MAAO,oBAAqBE,IAAK,IACjCZ,SAAU,CAAC2B,KAAM,SACjBT,SAAU,CAAC+G,GACX3G,OAAQ,CACNV,IAAK,WAAYqD,WAAW,EAC5Bd,YAAa,CAAC,MAAO,SAGzB,CACEhH,UAAW,MAEXuE,MAAO,qBAAsBE,IAAK,IAClCZ,SAAU,CAAC2B,KAAM,UACjBT,SAAU,CAAC+G,GACX3G,OAAQ,CACNV,IAAK,aAAgBqD,WAAW,EAChCd,YAAa,CAAC,eAAgB,aAAc,aAAc,SAG9D,CACEhH,UAAW,MACXuE,MAAO,MAAOE,IAAK,MACnBM,SAAU,CACR,CACE/E,UAAW,OAAQuE,MAAO,aAAcO,UAAW,GAErDgH,Q,cC5FVxO,EAAOC,QAAU,SAASJ,GACxB,IAAI4O,EAAW,yBAEXC,EAAY,WACZC,EAAW,qBACXC,EAAM,CACRlM,UAAW,OACXgD,SAAU,CACR,CAAEuB,MAAOyH,EAAYC,EAAU,KAC/B,CAAE1H,MAAOyH,YAAkBC,EAAlBD,MACT,CAAEzH,MAAOyH,YAAkBC,EAAlBD,QAWTG,EAAS,CACXnM,UAAW,SACX8E,UAAW,EACX9B,SAAU,CACR,CAACuB,MAAO,IAAKE,IAAK,KAClB,CAACF,MAAO,IAAKE,IAAK,KAClB,CAACF,MAAO,QAEVQ,SAAU,CACR5H,EAAKqN,iBAhBgB,CACvBxK,UAAW,oBACXgD,SAAU,CACR,CAAEuB,MAAO,KAAQE,IAAK,MACtB,CAAEF,MAAO,KAAOE,IAAK,SAiBzB,MAAO,CACLf,kBAAkB,EAClB1F,QAAS,CAAC,MAAO,OAAQ,QACzB+G,SAAU,CACRmH,EACA,CACElM,UAAW,OACXuE,MAAO,UACPO,UAAW,IAEb,CACE9E,UAAW,SACXuE,MAAO,YACPuD,WAAW,EACX/C,SAAUoH,EAAOpH,SAEjBN,IAAKyH,EAAIlJ,SAAS,GAAGuB,OAEvB,CACEvE,UAAW,OACXuE,MAAO,KAAOpH,EAAKgN,qBAErB,CACEnK,UAAW,OACXuE,MAAO,IAAMpH,EAAKgN,oBAAsB,KAE1C,CACEnK,UAAW,OACXuE,MAAO,MAAQpH,EAAKgN,oBAAsB,KAE5C,CACEnK,UAAW,SACXuE,MAAO,OACPO,UAAW,GAEb3H,EAAK6N,kBACL,CACElH,cAAeiI,EACflI,SAAU,CAAC6H,QAASK,IAEtB5O,EAAK+N,cACLiB,M,cC/EN7O,EAAOC,QAAU,SAASJ,GACxB,IAAI4O,EAAW,CAACL,QAAS,mBACrBU,EAAQ,CACVjP,EAAKuN,kBACLvN,EAAK+N,eAEHmB,EAAkB,CACpB5H,IAAK,IAAKtB,gBAAgB,EAAM4E,YAAY,EAC5ChD,SAAUqH,EACVvI,SAAUkI,GAERO,EAAS,CACX/H,MAAO,IAAKE,IAAK,IACjBM,SAAU,CACR,CACE/E,UAAW,OACXuE,MAAO,IAAKE,IAAK,IACjBM,SAAU,CAAC5H,EAAKqN,kBAChB5F,QAAS,OAEXzH,EAAKiD,QAAQiM,EAAiB,CAAC9H,MAAO,OAExCK,QAAS,OAEP2H,EAAQ,CACVhI,MAAO,MAAOE,IAAK,MACnBM,SAAU,CAAC5H,EAAKiD,QAAQiM,IACxBzH,QAAS,OAGX,OADAwH,EAAMzJ,OAAOyJ,EAAMvM,OAAQ,EAAGyM,EAAQC,GAC/B,CACLxH,SAAUqH,EACVvI,SAAUkI,EACVnH,QAAS,S,0DCjCbtH,EAAOC,QAAU,qrE,gBCAjBD,EAAOC,QAAU,w0pBAA05pB,EAAQ,IAAsD,6dAA+d,EAAQ,IAA+C,26CAA+6C,EAAQ,IAA6C,29uC,6BCAn+tB,OAAe,cAA0B,wC,6BCAzC,OAAe,cAA0B,wC,6BCAzC,OAAe,cAA0B,wC,cCAzCD,EAAOC,QAAU,swE,gBCAjBD,EAAOC,QAAU,yiDAA6iD,EAAQ,IAAmD,qWAAuW,EAAQ,IAAyD,uoBAA2oB,EAAQ,IAAqD,sC,6BCAzuF,OAAe,cAA0B,wC,6BCAzC,OAAe,cAA0B,wC,6BCAzC,OAAe,cAA0B,wC,cCAzCD,EAAOC,QAAU,s0C,cCAjBD,EAAOC,QAAU,6oC,cCAjBD,EAAOC,QAAU,gtD,cCAjBD,EAAOC,QAAU,+8F,cCAjBD,EAAOC,QAAU,4iD,cCAjBD,EAAOC,QAAU,k0E,cCAjBD,EAAOC,QAAU,m+3D,gBCAjBD,EAAOC,QAAU,6wJAA+wJ,EAAQ,IAAqC,2vBAA6vB,EAAQ,IAAoC,s22BAA6j3B,EAAQ,IAAmC,0pT,6BCA9tiC,OAAe,cAA0B,wC,6BCAzC,OAAe,cAA0B,wC,6BCAzC,OAAe,cAA0B,wC,cCAzCD,EAAOC,QAAU,kuM,gBCAjB,IAAI4E,EAAM,CACT,mBAAoB,GACpB,eAAgB,GAChB,uBAAwB,GACxB,oBAAqB,GACrB,iBAAkB,GAClB,mBAAoB,GACpB,iBAAkB,GAClB,iBAAkB,GAClB,kBAAmB,IACnB,mCAAoC,IACpC,eAAgB,IAChB,gBAAiB,IACjB,iBAAkB,IAClB,iBAAkB,IAClB,aAAc,IACd,gBAAiB,IACjB,mBAAoB,IACpB,cAAe,IACf,oBAAqB,IACrB,kBAAmB,IACnB,qBAAsB,IACtB,gBAAiB,IACjB,mBAAoB,KAIrB,SAASqK,EAAeC,GACvB,IAAIC,EAAKC,EAAsBF,GAC/B,OAAOG,EAAoBF,GAE5B,SAASC,EAAsBF,GAC9B,IAAIG,EAAoBC,EAAE1K,EAAKsK,GAAM,CACpC,IAAItE,EAAI,IAAIH,MAAM,uBAAyByE,EAAM,KAEjD,MADAtE,EAAE2E,KAAO,mBACH3E,EAEP,OAAOhG,EAAIsK,GAEZD,EAAe1O,KAAO,WACrB,OAAOD,OAAOC,KAAKqE,IAEpBqK,EAAeO,QAAUJ,EACzBrP,EAAOC,QAAUiP,EACjBA,EAAeE,GAAK,I,gBC5CpBpP,EAAOC,QAAU,8wEAAgxE,EAAQ,IAAoD,sLAAwL,EAAQ,IAA4C,gC,6BCAzkF,OAAe,cAA0B,wC,6BCAzC,OAAe,cAA0B,wC,gBCAzCD,EAAOC,QAAU,m3FAAq3F,EAAQ,IAA0C,miEAAsiE,EAAQ,IAAwC,ylBAA2lB,EAAQ,IAAkD,suB,6BCAnqL,OAAe,cAA0B,wC,6BCAzC,OAAe,cAA0B,wC,6BCAzC,OAAe,cAA0B,wC,cCAzCD,EAAOC,QAAU,45D,cCAjBD,EAAOC,QAAU,swE,cCAjBD,EAAOC,QAAU,soK,cCAjBD,EAAOC,QAAU,+7iB,cCAjBD,EAAOC,QAAU,4xE,gBCAjBD,EAAOC,QAAU,whHAA0hH,EAAQ,KAA4C,gC,6BCA/lH,OAAe,cAA0B,wC,gBCAzCD,EAAOC,QAAU,6oMAAipM,EAAQ,KAA6C,iC,6BCAvtM,OAAe,cAA0B,wC,cCAzCD,EAAOC,QAAU,49B,gBCAjBD,EAAOC,QAAU,2iFAA6iF,EAAQ,KAAwC,4B,6BCA9mF,OAAe,cAA0B,wC,cCAzCD,EAAOC,QAAU,q4L,cCAjBD,EAAOC,QAAU,mnB,cCAjBD,EAAOC,QAAU,ggD,gBCAjBD,EAAOC,QAAU,mmEAAqmE,EAAQ,KAAwC,4B,6BCAtqE,OAAe,cAA0B,wC,cCAzCD,EAAOC,QAAU,28D,gBCAjBD,EAAOC,QAAU,+sIAAitI,EAAQ,KAAoD,0NAA4N,EAAQ,KAAuD,gPAAkP,EAAQ,KAAwD,80BAAg1B,EAAQ,KAAgD,uJ,6BCAnvL,OAAe,cAA0B,wC,6BCAzC,OAAe,cAA0B,wC,6BCAzC,OAAe,cAA0B,wC,6BCAzC,OAAe,cAA0B,wC,cCAzCD,EAAOC,QAAU,6pO,gBCAjBD,EAAOC,QAAU,g/JAAk/J,EAAQ,KAAiD,gmCAAsmC,EAAQ,KAA+C,q2BAAu2B,EAAQ,KAAsD,i5BAAm5B,EAAQ,KAA6C,wTAA0T,EAAQ,KAAuD,mD,6BCA/7Q,OAAe,cAA0B,wC,6BCAzC,OAAe,cAA0B,wC,6BCAzC,OAAe,cAA0B,wC,6BCAzC,OAAe,cAA0B,wC,6BCAzC,OAAe,cAA0B,wC,gBCAzCD,EAAOC,QAAU,kiGAAoiG,EAAQ,KAAyD,mOAAqO,EAAQ,KAAmD,8HAAgI,EAAQ,KAAsD,+JAAiK,EAAQ,KAAuD,qoBAAuoB,EAAQ,KAA+C,qJ,6BCAl/I,OAAe,cAA0B,wC,6BCAzC,OAAe,cAA0B,wC,6BCAzC,OAAe,cAA0B,wC,6BCAzC,OAAe,cAA0B,wC,6BCAzC,OAAe,cAA0B,wC,cCAzCD,EAAOC,QAAU,ohN,cCAjBD,EAAOC,QAAU,4qK,gBCAjBD,EAAOC,QAAU,u+FAA0+F,EAAQ,KAAmD,irDAAmrD,EAAQ,KAAoD,8WAAkX,EAAQ,KAAuD,4/D,6BCAttK,OAAe,cAA0B,wC,6BCAzC,OAAe,cAA0B,wC,6BCAzC,OAAe,cAA0B,wC,cCAzCD,EAAOC,QAAU,yvF,8HCAF,MAA0B,iC,uCCO1B,SAASyP,IACtB,OACE,eAACC,EAAA,EAAD,CAAQC,kBAAgB,EAACC,OAAO,KAAKC,GAAG,OAAOlK,QAAQ,OAAOmK,MAAO,CAAEC,UAAW,qBAAlF,UACE,cAACL,EAAA,EAAOM,MAAR,CAAcC,GAAIC,IAAMC,GAAG,IAA3B,SACE,qBAAKC,IAAKC,EAAM5N,UAAU,YAAYqN,MAAO,CAAEQ,UAAW,IAAMC,IAAI,iBAEtE,cAACb,EAAA,EAAOc,OAAR,CAAe,gBAAc,0BAC7B,cAACd,EAAA,EAAOe,SAAR,CAAiBtB,GAAG,wBAApB,SACE,eAACuB,EAAA,EAAD,CAAKjO,UAAU,uBAAf,UACE,cAACiO,EAAA,EAAIC,KAAL,CAAUC,KAAK,QAAf,SACE,eAACF,EAAA,EAAIR,KAAL,CAAUD,GAAIC,IAAMC,GAAG,QAAvB,UAA+B,mBAAG1N,UAAU,qBAA5C,sBAEF,cAACiO,EAAA,EAAIC,KAAL,UACE,eAACD,EAAA,EAAIR,KAAL,CAAUU,KAAK,mDAAf,UAAkE,mBAAGnO,UAAU,2BAA/E,eAEF,cAACiO,EAAA,EAAIC,KAAL,UACE,eAACD,EAAA,EAAIR,KAAL,CAAUU,KAAK,mCAAf,UAAkD,mBAAGnO,UAAU,wBAA/D,gBAEF,cAACiO,EAAA,EAAIC,KAAL,UACE,eAACD,EAAA,EAAIR,KAAL,CAAUU,KAAK,8BAAf,UAA6C,mBAAGnO,UAAU,sBAA1D,sBCxBG,SAASoO,IACtB,OACE,qBAAKpO,UAAU,sBAAf,SACE,qBAAKA,UAAU,SAASqN,MAAO,CAACgB,QAAS,GAAIC,MAAO,SAApD,SACE,oKAAmI,mBAAGH,KAAK,yCAAR,0BAAnI,QAAyM,mBAAGA,KAAK,2CAAR,4BAAzM,WCNO,UAA0B,0CCA1B,MAA0B,6CCI1B,SAASI,IACtB,OACE,gCACE,qBAAKvO,UAAU,wBAAwBqN,MAAO,CAAEmB,WAAW,OAAD,OAASA,EAAT,8BAA1D,SACE,sBAAKxO,UAAU,YAAf,UACE,qBAAK2N,IAAKc,EAAazO,UAAU,YAAY8N,IAAI,KACjD,oBAAI9N,UAAU,yBAAyBqN,MAAO,CAAEiB,MAAO,QAASE,WAAY,yBAA5E,6DAGA,mBAAGxO,UAAU,OAAOqN,MAAO,CAAEgB,QAAS,EAAGC,MAAO,QAASE,WAAY,yBAArE,0PAOJ,sBAAKxO,UAAU,kBAAf,UACE,sBAAKA,UAAU,MAAMqN,MAAO,CAAEmB,WAAY,0BAA2BF,MAAO,QAASD,QAAS,IAA9F,UACE,sBAAKrO,UAAU,uBAAf,UACE,mBAAGA,UAAU,uBAAuB,cAAY,SAChD,qDACA,mFAAqD,4CAArD,KAA8E,4CAA9E,KAAuG,8CAAvG,KAAkI,4DAAlI,SAA+K,sDAA/K,8MAEF,sBAAKA,UAAU,uBAAf,UACE,mBAAGA,UAAU,yBAAyB,cAAY,SAClD,yDACA,iMAIF,sBAAKA,UAAU,uBAAf,UACE,mBAAGA,UAAU,mBAAmB,cAAY,SAC5C,wDACA,kKAIJ,qBAAKA,UAAU,6BAA6BqN,MAAO,CAAEgB,QAAS,IAA9D,SACE,sBAAKrO,UAAU,qBAAf,UACE,2EACA,kXAIA,+DACgC,+CADhC,KAC4D,mDAD5D,aACoG,2CADpG,KAC4H,gDAD5H,KACyJ,6CADzJ,KACmL,+CADnL,KAC+M,6CAD/M,KACyO,6CADzO,KACmQ,8CADnQ,KAC8R,2CAD9R,KACsT,qDADtT,KACwV,yCADxV,KAC8W,8CAD9W,KACyY,+CADzY,KACqa,mDADra,qBACqd,gDADrd,KACkf,8CADlf,YACohB,iDADphB,KACkjB,4CADljB,SAC+kB,+CAD/kB,OAGA,yCACU,4DADV,QACsD,wDADtD,gCACsH,sDADtH,OAC2J,mDAD3J,wCAC8N,gDAD9N,OAC6P,+CAD7P,mB,mBC9CG,SAAS0O,IACtB,OACE,sBAAK1O,UAAU,uBAAuBqN,MAAO,CAAEsB,aAAc,GAAIC,YAAa,IAA9E,UACE,0DAEA,kaAOA,mHAES,oBAAGT,KAAK,8BAAR,UAAsC,mBAAGnO,UAAU,sBAAnD,sBAFT,OAKA,+BACE,+BAAI,cAAC6O,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,mBAApC,wBAAJ,4DAGA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,iBAApC,sBAAJ,kEAGA,+BAAI,sBAAM1N,UAAU,cAAhB,mBAAJ,oSAIE,+BACE,+BAAI,cAAC6O,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,2BAApC,uBAAJ,uJAKA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,uBAApC,mBAAJ,gOAMA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,4BAApC,wBAAJ,uEAIA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,yBAApC,qBAAJ,6MAKA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,2BAApC,uBAAJ,iVAOA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,yBAApC,qBAAJ,mIAIA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,yBAApC,qBAAJ,8NAKA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,0BAApC,sBAAJ,yMAKA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,uBAApC,mBAAJ,+IAKA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,wBAApC,oBAAJ,+QAMA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,yBAApC,qBAAJ,wGAIA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,qBAApC,iBAAJ,6PAMA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,wBAApC,sBAAJ,0HAIA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,2BAApC,uBAAJ,iKAKA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,sBAApC,2CAAJ,sMAIA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,4BAApC,wBAAJ,sQAMA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,0BAApC,sBAAJ,0IAKA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,6BAApC,yBAAJ,mTAMA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,wBAApC,oBAAJ,sTAMA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,2BAApC,uBAAJ,sOAOJ,+BAAI,sBAAM1N,UAAU,cAAhB,uBAAJ,4EAEE,+BACE,+BAAI,mBAAGA,UAAU,cACVmO,KAAK,iGADR,yBAAJ,2GAIA,+BAAI,cAACU,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,gBAApC,iBAAJ,0EAGA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,kBAApC,mBAAJ,gEAGA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,yBAApC,0BAAJ,yCAEA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,kBAApC,8BAAJ,6CAEA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,kBAApC,mBAAJ,wCAIJ,+BAAI,sBAAM1N,UAAU,cAAhB,oBAAJ,IACE,6BACE,6BAAI,cAAC6O,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,8BAApC,kEAEN,6BACE,6BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,0CAApC,oDAEN,6BACE,6BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,kCAApC,0CAGR,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,oBAApC,oCAAJ,0DAGA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,gBAApC,gCAAJ,0EAGA,+BAAI,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,2BAApC,4CAAJ,sFAGA,+BACE,cAACmB,EAAA,EAAD,CAAS7O,UAAU,cAAc0N,GAAG,gBAApC,4BADF,uD,qECzKJoB,G,MAAc1R,EAAQ,GAARA,IAElB0R,EAAYC,WAAWC,UAAS,WAC9BC,KAAKC,eAAc,WACND,KACNE,SAAQ,SAAUC,GAMrB,OALAA,EAAIC,OAAO,CAAC,QAAW,UAAUvO,SAAQ,SAASwO,GAEhD,IAAIxB,EAAMwB,EAAIC,aAAa,OAC3BD,EAAIE,aAAa,MAAO1B,EAAM,sBAAsB,MAE/CsB,W,IAKQK,E,kDACnB,WAAYC,GAAQ,IAAD,8BACjB,cAAMA,IACDC,cAAgB,EAAKA,cAAcC,KAAnB,gBAFJ,E,qDAKnB,WACEX,KAAKU,kB,gCAGP,WACEV,KAAKU,kB,2BAGP,WACEV,KAAKY,KAAKjG,iBAAiB,YAAY9I,SAAQ,SAAAhC,GAAI,OAAI3B,IAAK6L,eAAelK,Q,oBAG7E,WAAU,IAAD,OACHgR,EAAYhB,EAAYiB,QAAQd,KAAKS,MAAMpM,OAAQ,CAAElB,WAAY6M,KAAKS,MAAMM,MAAOC,KAAM,SAE7F,OACE,qBACEC,IAAK,SAACL,GAAW,EAAKA,KAAOA,GAC7BM,wBAAyB,CAAEC,OAAQN,S,GAxBLO,a,MCrBvB,SAASC,EAAT,GAAgD,IAA1BC,EAAyB,EAAzBA,MAAOC,EAAkB,EAAlBA,QAASR,EAAS,EAATA,MACnD,OACE,sBAAKhQ,UAAU,iCAAf,UACE,6BAAKuQ,IACL,uBACA,cAAC,EAAD,CACEjN,OAAQkN,EACRR,MAAOA,OAKfM,EAAWG,aAAe,CACxBT,MAAO,ICZT,IAAIU,EAAiBtT,EAAQ,IACzBuT,EAAevT,EAAQ,IACvBwT,EAAUxT,EAAQ,IAClByT,EAAYzT,EAAQ,IACpB0T,EAAmB1T,EAAQ,IAC3B2T,EAAY3T,EAAQ,IACpB4T,EAAY5T,EAAQ,IACpB6T,EAAsB7T,EAAQ,IAC9B8T,EAAkC9T,EAAQ,IAC1C+T,EAA0B/T,EAAQ,IAClCgU,EAAkBhU,EAAQ,IAC1BiU,EAAcjU,EAAQ,IACtBkU,EAAyBlU,EAAQ,IAE/BmU,EAAU,CAAC,YAAa,QAAS,gBAAiB,aAAc,UAAW,YAAa,UAAW,UAAW,WAAY,QAAS,SAAU,UAAW,MAAO,SAAU,YAAa,OAAQ,aAAc,WAAY,cAAe,SAAU,aAEnPC,EAAe,GAGJ,SAASC,IACtB,OACE,gCACE,cAACC,EAAA,EAAD,CAAOC,OAAK,EAACC,KAAK,QAAQC,UAAWnD,IAErC,cAACgD,EAAA,EAAD,CAAOE,KAAK,mBAAmBrP,OAAQ,kBACrC,cAAC+N,EAAD,CAAYC,MAAM,aAAaC,QAASE,OAG1C,cAACgB,EAAA,EAAD,CAAOC,OAAK,EAACC,KAAK,iBAAiBrP,OAAQ,kBACzC,cAAC+N,EAAD,CAAYC,MAAM,WAAWC,QAASG,OAExC,cAACe,EAAA,EAAD,CAAOE,KAAK,yBAAyBrP,OAAQ,YAAgB,IACvDuP,EADsD,EAAZ1S,MAC3B2S,OAAOD,OAC1B,OAAOP,EAAQS,SAASF,GACtB,cAACxB,EAAD,CAAYC,MAAK,qBAAgBuB,EAAO3R,MAAM,KAAKgC,KAAI,SAAA8P,GAAI,OAAIA,EAAK,GAAGC,cAAgBD,EAAKtR,MAAM,MAAI0B,KAAK,MAC/FmO,QAASgB,EAAaM,KAClC,cAACK,EAAA,EAAD,CAAUzE,GAAG,aAGjB,cAACgE,EAAA,EAAD,CAAOE,KAAK,gBAAgBrP,OAAQ,kBAClC,cAAC+N,EAAD,CAAYC,MAAM,yBAAyBC,QAASI,OAGtD,cAACc,EAAA,EAAD,CAAOE,KAAK,kBAAkBrP,OAAQ,kBACpC,cAAC+N,EAAD,CAAYC,MAAM,gBAAgBC,QAASK,OAG7C,cAACa,EAAA,EAAD,CAAOE,KAAK,yBAAyBrP,OAAQ,kBAC3C,cAAC+N,EAAD,CAAYC,MAAM,uBAAuBC,QAASM,OAGpD,cAACY,EAAA,EAAD,CAAOE,KAAK,kBAAkBrP,OAAQ,kBACpC,cAAC+N,EAAD,CAAYC,MAAM,2BAA2BC,QAASO,OAGxD,cAACW,EAAA,EAAD,CAAOE,KAAK,kBAAkBrP,OAAQ,kBACpC,cAAC+N,EAAD,CAAYC,MAAM,gBAAgBC,QAASQ,OAG7C,cAACU,EAAA,EAAD,CAAOE,KAAK,8BAA8BrP,OAAQ,kBAChD,cAAC+N,EAAD,CAAYC,MAAM,mDAAmDC,QAASS,OAGhF,cAACS,EAAA,EAAD,CAAOE,KAAK,0CAA0CrP,OAAQ,kBAC5D,cAAC+N,EAAD,CAAYC,MAAM,qCAAqCC,QAASU,OAGlE,cAACQ,EAAA,EAAD,CAAOE,KAAK,kCAAkCrP,OAAQ,kBACpD,cAAC+N,EAAD,CAAYC,MAAM,wBAAwBC,QAASW,OAGrD,cAACO,EAAA,EAAD,CAAOE,KAAK,oBAAoBrP,OAAQ,kBACtC,cAAC+N,EAAD,CAAYC,MAAM,cAAcC,QAASY,OAG3C,cAACM,EAAA,EAAD,CAAOE,KAAK,gBAAgBrP,OAAQ,kBAClC,cAAC+N,EAAD,CAAYC,MAAM,UAAUC,QAASa,OAGvC,cAACK,EAAA,EAAD,CAAOE,KAAK,2BAA2BrP,OAAQ,kBAC7C,cAAC+N,EAAD,CAAYC,MAAM,sBAAsBC,QAASc,UA/DzDC,EAAQzQ,SAAQ,SAAAsR,GAAG,OAAIZ,EAAaY,GAAOhV,MAAQ,YAAyDgV,EAA1D,aCflD,IAAIC,EAAcjV,EAAQ,KAEX,SAASkV,IACtB,OACE,gCACE,cAACtF,EAAD,IAEA,eAACuF,EAAA,EAAD,WACE,cAACb,EAAA,EAAD,CAAOC,OAAK,EAACC,KAAK,IAAIC,UAAWtD,IAEjC,cAACmD,EAAA,EAAD,CAAOC,OAAK,EAACC,KAAK,WAAWrP,OAAQ,kBACjC,cAAC+N,EAAD,CAAYC,MAAM,4BAA4BC,QAAS6B,OAG3D,cAACX,EAAA,EAAD,CAAOC,OAAK,EAACC,KAAK,gBAAgBrP,OAAQ,kBAAM,cAAC4P,EAAA,EAAD,CAAUzE,GAAG,gBAE7D,cAACgE,EAAA,EAAD,CAAOE,KAAK,mBAAmBC,UAAW,WAExC,OADApU,OAAO+U,SAASrE,KAAK,oCACd,QAIT,cAACsD,EAAD,IAEA,cAACC,EAAA,EAAD,CAAOE,KAAK,KAAKrP,OAAQ,kBAAM,cAAC4P,EAAA,EAAD,CAAUzE,GAAG,YAG9C,qBAAK1N,UAAU,kBAAkBqN,MAAO,CAAEsB,aAAc,EAAGC,YAAa,GAAxE,SACE,cAACR,EAAD,CAAQpO,UAAU,aCzBNsF,QACW,cAA7B7H,OAAO+U,SAASC,UAEe,UAA7BhV,OAAO+U,SAASC,UAEhBhV,OAAO+U,SAASC,SAASrT,MAAM,2D,YCH7BsT,G,cAAUC,eAEhBC,IAASrQ,OAAO,cAACsQ,EAAA,EAAD,CAAQH,QAASA,EAAjB,SAA0B,cAACJ,EAAD,MAAiBnJ,SAAS2J,eAAe,SD+G7E,kBAAmBC,WACrBA,UAAUC,cAAcC,MACrBC,MAAK,SAACC,GACLA,EAAaC,gBAEdC,OAAM,SAACC,GACNC,QAAQD,MAAMA,EAAMlL,e","file":"static/js/main.d5237926.chunk.js","sourcesContent":["var hljs = require('./highlight');\n\nhljs.registerLanguage('gradle', require('./languages/gradle'));\nhljs.registerLanguage('groovy', require('./languages/groovy'));\nhljs.registerLanguage('http', require('./languages/http'));\nhljs.registerLanguage('java', require('./languages/java'));\nhljs.registerLanguage('xml', require('./languages/xml'));\nhljs.registerLanguage('yaml', require('./languages/yaml'));\nhljs.registerLanguage('json', require('./languages/json'));\n\nmodule.exports = hljs;","/*\nSyntax highlighting with language autodetection.\nhttps://highlightjs.org/\n*/\n\n/* eslint no-restricted-globals: off */\n/* eslint no-undef: off */\n/* eslint no-mixed-operators: off */\n/* eslint no-useless-escape: off */\n\n(function(factory) {\n\n // Find the global object for export to both the browser and web workers.\n var globalObject = typeof window === 'object' && window ||\n typeof self === 'object' && self;\n\n // Setup highlight.js for different environments. First is Node.js or\n // CommonJS.\n if(typeof exports !== 'undefined') {\n factory(exports);\n } else if(globalObject) {\n // Export hljs globally even when using AMD for cases when this script\n // is loaded with others that may still expect a global hljs.\n globalObject.hljs = factory({});\n\n // Finally register the global hljs with AMD.\n if(typeof define === 'function' && define.amd) {\n define([], function() {\n return globalObject.hljs;\n });\n }\n }\n\n}(function(hljs) {\n // Convenience variables for build-in objects\n var ArrayProto = [],\n objectKeys = Object.keys;\n\n // Global internal variables used within the highlight.js library.\n var languages = {},\n aliases = {};\n\n // Regular expressions used throughout the highlight.js library.\n var noHighlightRe = /^(no-?highlight|plain|text)$/i,\n languagePrefixRe = /\\blang(?:uage)?-([\\w-]+)\\b/i,\n fixMarkupRe = /((^(<[^>]+>|\\t|)+|(?:\\n)))/gm;\n\n var spanEndTag = '</span>';\n\n // Global options used when within external APIs. This is modified when\n // calling the `hljs.configure` function.\n var options = {\n classPrefix: 'hljs-',\n tabReplace: null,\n useBR: false,\n languages: undefined\n };\n\n\n /* Utility functions */\n\n function escape(value) {\n return value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n }\n\n function tag(node) {\n return node.nodeName.toLowerCase();\n }\n\n function testRe(re, lexeme) {\n var match = re && re.exec(lexeme);\n return match && match.index === 0;\n }\n\n function isNotHighlighted(language) {\n return noHighlightRe.test(language);\n }\n\n function blockLanguage(block) {\n var i, match, length, _class;\n var classes = block.className + ' ';\n\n classes += block.parentNode ? block.parentNode.className : '';\n\n // language-* takes precedence over non-prefixed class names.\n match = languagePrefixRe.exec(classes);\n if (match) {\n return getLanguage(match[1]) ? match[1] : 'no-highlight';\n }\n\n classes = classes.split(/\\s+/);\n\n for (i = 0, length = classes.length; i < length; i++) {\n _class = classes[i]\n\n if (isNotHighlighted(_class) || getLanguage(_class)) {\n return _class;\n }\n }\n }\n\n function inherit(parent) { // inherit(parent, override_obj, override_obj, ...)\n var key;\n var result = {};\n var objects = Array.prototype.slice.call(arguments, 1);\n\n for (key in parent)\n result[key] = parent[key];\n objects.forEach(function(obj) {\n for (key in obj)\n result[key] = obj[key];\n });\n return result;\n }\n\n /* Stream merging */\n\n function nodeStream(node) {\n var result = [];\n (function _nodeStream(node, offset) {\n for (var child = node.firstChild; child; child = child.nextSibling) {\n if (child.nodeType === 3)\n offset += child.nodeValue.length;\n else if (child.nodeType === 1) {\n result.push({\n event: 'start',\n offset: offset,\n node: child\n });\n offset = _nodeStream(child, offset);\n // Prevent void elements from having an end tag that would actually\n // double them in the output. There are more void elements in HTML\n // but we list only those realistically expected in code display.\n if (!tag(child).match(/br|hr|img|input/)) {\n result.push({\n event: 'stop',\n offset: offset,\n node: child\n });\n }\n }\n }\n return offset;\n })(node, 0);\n return result;\n }\n\n function mergeStreams(original, highlighted, value) {\n var processed = 0;\n var result = '';\n var nodeStack = [];\n\n function selectStream() {\n if (!original.length || !highlighted.length) {\n return original.length ? original : highlighted;\n }\n if (original[0].offset !== highlighted[0].offset) {\n return (original[0].offset < highlighted[0].offset) ? original : highlighted;\n }\n\n /*\n To avoid starting the stream just before it should stop the order is\n ensured that original always starts first and closes last:\n\n if (event1 == 'start' && event2 == 'start')\n return original;\n if (event1 == 'start' && event2 == 'stop')\n return highlighted;\n if (event1 == 'stop' && event2 == 'start')\n return original;\n if (event1 == 'stop' && event2 == 'stop')\n return highlighted;\n\n ... which is collapsed to:\n */\n return highlighted[0].event === 'start' ? original : highlighted;\n }\n\n function open(node) {\n function attr_str(a) {return ' ' + a.nodeName + '=\"' + escape(a.value).replace('\"', '"') + '\"';}\n result += '<' + tag(node) + ArrayProto.map.call(node.attributes, attr_str).join('') + '>';\n }\n\n function close(node) {\n result += '</' + tag(node) + '>';\n }\n\n function render(event) {\n (event.event === 'start' ? open : close)(event.node);\n }\n\n while (original.length || highlighted.length) {\n var stream = selectStream();\n result += escape(value.substring(processed, stream[0].offset));\n processed = stream[0].offset;\n if (stream === original) {\n /*\n On any opening or closing tag of the original markup we first close\n the entire highlighted node stack, then render the original tag along\n with all the following original tags at the same offset and then\n reopen all the tags on the highlighted stack.\n */\n nodeStack.reverse().forEach(close);\n do {\n render(stream.splice(0, 1)[0]);\n stream = selectStream();\n } while (stream === original && stream.length && stream[0].offset === processed);\n nodeStack.reverse().forEach(open);\n } else {\n if (stream[0].event === 'start') {\n nodeStack.push(stream[0].node);\n } else {\n nodeStack.pop();\n }\n render(stream.splice(0, 1)[0]);\n }\n }\n return result + escape(value.substr(processed));\n }\n\n /* Initialization */\n\n function expand_mode(mode) {\n if (mode.variants && !mode.cached_variants) {\n mode.cached_variants = mode.variants.map(function(variant) {\n return inherit(mode, {variants: null}, variant);\n });\n }\n return mode.cached_variants || (mode.endsWithParent && [inherit(mode)]) || [mode];\n }\n\n function compileLanguage(language) {\n\n function reStr(re) {\n return (re && re.source) || re;\n }\n\n function langRe(value, global) {\n return new RegExp(\n reStr(value),\n 'm' + (language.case_insensitive ? 'i' : '') + (global ? 'g' : '')\n );\n }\n\n function compileMode(mode, parent) {\n if (mode.compiled)\n return;\n mode.compiled = true;\n\n mode.keywords = mode.keywords || mode.beginKeywords;\n if (mode.keywords) {\n var compiled_keywords = {};\n\n var flatten = function(className, str) {\n if (language.case_insensitive) {\n str = str.toLowerCase();\n }\n str.split(' ').forEach(function(kw) {\n var pair = kw.split('|');\n compiled_keywords[pair[0]] = [className, pair[1] ? Number(pair[1]) : 1];\n });\n };\n\n if (typeof mode.keywords === 'string') { // string\n flatten('keyword', mode.keywords);\n } else {\n objectKeys(mode.keywords).forEach(function (className) {\n flatten(className, mode.keywords[className]);\n });\n }\n mode.keywords = compiled_keywords;\n }\n mode.lexemesRe = langRe(mode.lexemes || /\\w+/, true);\n\n if (parent) {\n if (mode.beginKeywords) {\n mode.begin = '\\\\b(' + mode.beginKeywords.split(' ').join('|') + ')\\\\b';\n }\n if (!mode.begin)\n mode.begin = /\\B|\\b/;\n mode.beginRe = langRe(mode.begin);\n if (!mode.end && !mode.endsWithParent)\n mode.end = /\\B|\\b/;\n if (mode.end)\n mode.endRe = langRe(mode.end);\n mode.terminator_end = reStr(mode.end) || '';\n if (mode.endsWithParent && parent.terminator_end)\n mode.terminator_end += (mode.end ? '|' : '') + parent.terminator_end;\n }\n if (mode.illegal)\n mode.illegalRe = langRe(mode.illegal);\n if (mode.relevance == null)\n mode.relevance = 1;\n if (!mode.contains) {\n mode.contains = [];\n }\n mode.contains = Array.prototype.concat.apply([], mode.contains.map(function(c) {\n return expand_mode(c === 'self' ? mode : c)\n }));\n mode.contains.forEach(function(c) {compileMode(c, mode);});\n\n if (mode.starts) {\n compileMode(mode.starts, parent);\n }\n\n var terminators =\n mode.contains.map(function(c) {\n return c.beginKeywords ? '\\\\.?(' + c.begin + ')\\\\.?' : c.begin;\n })\n .concat([mode.terminator_end, mode.illegal])\n .map(reStr)\n .filter(Boolean);\n mode.terminators = terminators.length ? langRe(terminators.join('|'), true) : {exec: function(/*s*/) {return null;}};\n }\n\n compileMode(language);\n }\n\n /*\n Core highlighting function. Accepts a language name, or an alias, and a\n string with the code to highlight. Returns an object with the following\n properties:\n\n - relevance (int)\n - value (an HTML string with highlighting markup)\n\n */\n function highlight(name, value, ignore_illegals, continuation) {\n\n function subMode(lexeme, mode) {\n var i, length;\n\n for (i = 0, length = mode.contains.length; i < length; i++) {\n if (testRe(mode.contains[i].beginRe, lexeme)) {\n return mode.contains[i];\n }\n }\n }\n\n function endOfMode(mode, lexeme) {\n if (testRe(mode.endRe, lexeme)) {\n while (mode.endsParent && mode.parent) {\n mode = mode.parent;\n }\n return mode;\n }\n if (mode.endsWithParent) {\n return endOfMode(mode.parent, lexeme);\n }\n }\n\n function isIllegal(lexeme, mode) {\n return !ignore_illegals && testRe(mode.illegalRe, lexeme);\n }\n\n function keywordMatch(mode, match) {\n var match_str = language.case_insensitive ? match[0].toLowerCase() : match[0];\n return mode.keywords.hasOwnProperty(match_str) && mode.keywords[match_str];\n }\n\n function buildSpan(classname, insideSpan, leaveOpen, noPrefix) {\n var classPrefix = noPrefix ? '' : options.classPrefix,\n openSpan = '<span class=\"' + classPrefix,\n closeSpan = leaveOpen ? '' : spanEndTag\n\n openSpan += classname + '\">';\n\n return openSpan + insideSpan + closeSpan;\n }\n\n function processKeywords() {\n var keyword_match, last_index, match, result;\n\n if (!top.keywords)\n return escape(mode_buffer);\n\n result = '';\n last_index = 0;\n top.lexemesRe.lastIndex = 0;\n match = top.lexemesRe.exec(mode_buffer);\n\n while (match) {\n result += escape(mode_buffer.substring(last_index, match.index));\n keyword_match = keywordMatch(top, match);\n if (keyword_match) {\n relevance += keyword_match[1];\n result += buildSpan(keyword_match[0], escape(match[0]));\n } else {\n result += escape(match[0]);\n }\n last_index = top.lexemesRe.lastIndex;\n match = top.lexemesRe.exec(mode_buffer);\n }\n return result + escape(mode_buffer.substr(last_index));\n }\n\n function processSubLanguage() {\n var explicit = typeof top.subLanguage === 'string';\n if (explicit && !languages[top.subLanguage]) {\n return escape(mode_buffer);\n }\n\n var result = explicit ?\n highlight(top.subLanguage, mode_buffer, true, continuations[top.subLanguage]) :\n highlightAuto(mode_buffer, top.subLanguage.length ? top.subLanguage : undefined);\n\n // Counting embedded language score towards the host language may be disabled\n // with zeroing the containing mode relevance. Usecase in point is Markdown that\n // allows XML everywhere and makes every XML snippet to have a much larger Markdown\n // score.\n if (top.relevance > 0) {\n relevance += result.relevance;\n }\n if (explicit) {\n continuations[top.subLanguage] = result.top;\n }\n return buildSpan(result.language, result.value, false, true);\n }\n\n function processBuffer() {\n result += (top.subLanguage != null ? processSubLanguage() : processKeywords());\n mode_buffer = '';\n }\n\n function startNewMode(mode) {\n result += mode.className? buildSpan(mode.className, '', true): '';\n top = Object.create(mode, {parent: {value: top}});\n }\n\n function processLexeme(buffer, lexeme) {\n\n mode_buffer += buffer;\n\n if (lexeme == null) {\n processBuffer();\n return 0;\n }\n\n var new_mode = subMode(lexeme, top);\n if (new_mode) {\n if (new_mode.skip) {\n mode_buffer += lexeme;\n } else {\n if (new_mode.excludeBegin) {\n mode_buffer += lexeme;\n }\n processBuffer();\n if (!new_mode.returnBegin && !new_mode.excludeBegin) {\n mode_buffer = lexeme;\n }\n }\n startNewMode(new_mode, lexeme);\n return new_mode.returnBegin ? 0 : lexeme.length;\n }\n\n var end_mode = endOfMode(top, lexeme);\n if (end_mode) {\n var origin = top;\n if (origin.skip) {\n mode_buffer += lexeme;\n } else {\n if (!(origin.returnEnd || origin.excludeEnd)) {\n mode_buffer += lexeme;\n }\n processBuffer();\n if (origin.excludeEnd) {\n mode_buffer = lexeme;\n }\n }\n do {\n if (top.className) {\n result += spanEndTag;\n }\n if (!top.skip && !top.subLanguage) {\n relevance += top.relevance;\n }\n top = top.parent;\n } while (top !== end_mode.parent);\n if (end_mode.starts) {\n startNewMode(end_mode.starts, '');\n }\n return origin.returnEnd ? 0 : lexeme.length;\n }\n\n if (isIllegal(lexeme, top))\n throw new Error('Illegal lexeme \"' + lexeme + '\" for mode \"' + (top.className || '<unnamed>') + '\"');\n\n /*\n Parser should not reach this point as all types of lexemes should be caught\n earlier, but if it does due to some bug make sure it advances at least one\n character forward to prevent infinite looping.\n */\n mode_buffer += lexeme;\n return lexeme.length || 1;\n }\n\n var language = getLanguage(name);\n if (!language) {\n throw new Error('Unknown language: \"' + name + '\"');\n }\n\n compileLanguage(language);\n var top = continuation || language;\n var continuations = {}; // keep continuations for sub-languages\n var result = '', current;\n for(current = top; current !== language; current = current.parent) {\n if (current.className) {\n result = buildSpan(current.className, '', true) + result;\n }\n }\n var mode_buffer = '';\n var relevance = 0;\n try {\n var match, count, index = 0;\n while (true) {\n top.terminators.lastIndex = index;\n match = top.terminators.exec(value);\n if (!match)\n break;\n count = processLexeme(value.substring(index, match.index), match[0]);\n index = match.index + count;\n }\n processLexeme(value.substr(index));\n for(current = top; current.parent; current = current.parent) { // close dangling modes\n if (current.className) {\n result += spanEndTag;\n }\n }\n return {\n relevance: relevance,\n value: result,\n language: name,\n top: top\n };\n } catch (e) {\n if (e.message && e.message.indexOf('Illegal') !== -1) {\n return {\n relevance: 0,\n value: escape(value)\n };\n } else {\n throw e;\n }\n }\n }\n\n /*\n Highlighting with language detection. Accepts a string with the code to\n highlight. Returns an object with the following properties:\n\n - language (detected language)\n - relevance (int)\n - value (an HTML string with highlighting markup)\n - second_best (object with the same structure for second-best heuristically\n detected language, may be absent)\n\n */\n function highlightAuto(text, languageSubset) {\n languageSubset = languageSubset || options.languages || objectKeys(languages);\n var result = {\n relevance: 0,\n value: escape(text)\n };\n var second_best = result;\n languageSubset.filter(getLanguage).forEach(function(name) {\n var current = highlight(name, text, false);\n current.language = name;\n if (current.relevance > second_best.relevance) {\n second_best = current;\n }\n if (current.relevance > result.relevance) {\n second_best = result;\n result = current;\n }\n });\n if (second_best.language) {\n result.second_best = second_best;\n }\n return result;\n }\n\n /*\n Post-processing of the highlighted markup:\n\n - replace TABs with something more useful\n - replace real line-breaks with '<br>' for non-pre containers\n\n */\n function fixMarkup(value) {\n return !(options.tabReplace || options.useBR)\n ? value\n : value.replace(fixMarkupRe, function(match, p1) {\n if (options.useBR && match === '\\n') {\n return '<br>';\n } else if (options.tabReplace) {\n return p1.replace(/\\t/g, options.tabReplace);\n }\n return '';\n });\n }\n\n function buildClassName(prevClassName, currentLang, resultLang) {\n var language = currentLang ? aliases[currentLang] : resultLang,\n result = [prevClassName.trim()];\n\n if (!prevClassName.match(/\\bhljs\\b/)) {\n result.push('hljs');\n }\n\n if (prevClassName.indexOf(language) === -1) {\n result.push(language);\n }\n\n return result.join(' ').trim();\n }\n\n /*\n Applies highlighting to a DOM node containing code. Accepts a DOM node and\n two optional parameters for fixMarkup.\n */\n function highlightBlock(block) {\n var node, originalStream, result, resultNode, text;\n var language = blockLanguage(block);\n\n if (isNotHighlighted(language))\n return;\n\n if (options.useBR) {\n node = document.createElementNS('http://www.w3.org/1999/xhtml', 'div');\n node.innerHTML = block.innerHTML.replace(/\\n/g, '').replace(/<br[ \\/]*>/g, '\\n');\n } else {\n node = block;\n }\n text = node.textContent;\n result = language ? highlight(language, text, true) : highlightAuto(text);\n\n originalStream = nodeStream(node);\n if (originalStream.length) {\n resultNode = document.createElementNS('http://www.w3.org/1999/xhtml', 'div');\n resultNode.innerHTML = result.value;\n result.value = mergeStreams(originalStream, nodeStream(resultNode), text);\n }\n result.value = fixMarkup(result.value);\n\n block.innerHTML = result.value;\n block.className = buildClassName(block.className, language, result.language);\n block.result = {\n language: result.language,\n re: result.relevance\n };\n if (result.second_best) {\n block.second_best = {\n language: result.second_best.language,\n re: result.second_best.relevance\n };\n }\n }\n\n /*\n Updates highlight.js global options with values passed in the form of an object.\n */\n function configure(user_options) {\n options = inherit(options, user_options);\n }\n\n /*\n Applies highlighting to all <pre><code>..</code></pre> blocks on a page.\n */\n function initHighlighting() {\n if (initHighlighting.called)\n return;\n initHighlighting.called = true;\n\n var blocks = document.querySelectorAll('pre code');\n ArrayProto.forEach.call(blocks, highlightBlock);\n }\n\n /*\n Attaches highlighting to the page load event.\n */\n function initHighlightingOnLoad() {\n addEventListener('DOMContentLoaded', initHighlighting, false);\n addEventListener('load', initHighlighting, false);\n }\n\n function registerLanguage(name, language) {\n var lang = languages[name] = language(hljs);\n if (lang.aliases) {\n lang.aliases.forEach(function(alias) {aliases[alias] = name;});\n }\n }\n\n function listLanguages() {\n return objectKeys(languages);\n }\n\n function getLanguage(name) {\n name = (name || '').toLowerCase();\n return languages[name] || languages[aliases[name]];\n }\n\n /* Interface definition */\n\n hljs.highlight = highlight;\n hljs.highlightAuto = highlightAuto;\n hljs.fixMarkup = fixMarkup;\n hljs.highlightBlock = highlightBlock;\n hljs.configure = configure;\n hljs.initHighlighting = initHighlighting;\n hljs.initHighlightingOnLoad = initHighlightingOnLoad;\n hljs.registerLanguage = registerLanguage;\n hljs.listLanguages = listLanguages;\n hljs.getLanguage = getLanguage;\n hljs.inherit = inherit;\n\n // Common regexps\n hljs.IDENT_RE = '[a-zA-Z]\\\\w*';\n hljs.UNDERSCORE_IDENT_RE = '[a-zA-Z_]\\\\w*';\n hljs.NUMBER_RE = '\\\\b\\\\d+(\\\\.\\\\d+)?';\n hljs.C_NUMBER_RE = '(-?)(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)'; // 0x..., 0..., decimal, float\n hljs.BINARY_NUMBER_RE = '\\\\b(0b[01]+)'; // 0b...\n hljs.RE_STARTERS_RE = '!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~';\n\n // Common modes\n hljs.BACKSLASH_ESCAPE = {\n begin: '\\\\\\\\[\\\\s\\\\S]', relevance: 0\n };\n hljs.APOS_STRING_MODE = {\n className: 'string',\n begin: '\\'', end: '\\'',\n illegal: '\\\\n',\n contains: [hljs.BACKSLASH_ESCAPE]\n };\n hljs.QUOTE_STRING_MODE = {\n className: 'string',\n begin: '\"', end: '\"',\n illegal: '\\\\n',\n contains: [hljs.BACKSLASH_ESCAPE]\n };\n hljs.PHRASAL_WORDS_MODE = {\n 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/\n };\n hljs.COMMENT = function (begin, end, inherits) {\n var mode = hljs.inherit(\n {\n className: 'comment',\n begin: begin, end: end,\n contains: []\n },\n inherits || {}\n );\n mode.contains.push(hljs.PHRASAL_WORDS_MODE);\n mode.contains.push({\n className: 'doctag',\n begin: '(?:TODO|FIXME|NOTE|BUG|XXX):',\n relevance: 0\n });\n return mode;\n };\n hljs.C_LINE_COMMENT_MODE = hljs.COMMENT('//', '$');\n hljs.C_BLOCK_COMMENT_MODE = hljs.COMMENT('/\\\\*', '\\\\*/');\n hljs.HASH_COMMENT_MODE = hljs.COMMENT('#', '$');\n hljs.NUMBER_MODE = {\n className: 'number',\n begin: hljs.NUMBER_RE,\n relevance: 0\n };\n hljs.C_NUMBER_MODE = {\n className: 'number',\n begin: hljs.C_NUMBER_RE,\n relevance: 0\n };\n hljs.BINARY_NUMBER_MODE = {\n className: 'number',\n begin: hljs.BINARY_NUMBER_RE,\n relevance: 0\n };\n hljs.CSS_NUMBER_MODE = {\n className: 'number',\n begin: hljs.NUMBER_RE + '(' +\n '%|em|ex|ch|rem' +\n '|vw|vh|vmin|vmax' +\n '|cm|mm|in|pt|pc|px' +\n '|deg|grad|rad|turn' +\n '|s|ms' +\n '|Hz|kHz' +\n '|dpi|dpcm|dppx' +\n ')?',\n relevance: 0\n };\n hljs.REGEXP_MODE = {\n className: 'regexp',\n begin: /\\//, end: /\\/[gimuy]*/,\n illegal: /\\n/,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n {\n begin: /\\[/, end: /\\]/,\n relevance: 0,\n contains: [hljs.BACKSLASH_ESCAPE]\n }\n ]\n };\n hljs.TITLE_MODE = {\n className: 'title',\n begin: hljs.IDENT_RE,\n relevance: 0\n };\n hljs.UNDERSCORE_TITLE_MODE = {\n className: 'title',\n begin: hljs.UNDERSCORE_IDENT_RE,\n relevance: 0\n };\n hljs.METHOD_GUARD = {\n // excludes method names from keyword processing\n begin: '\\\\.\\\\s*' + hljs.UNDERSCORE_IDENT_RE,\n relevance: 0\n };\n\n return hljs;\n}));\n\n","module.exports = function(hljs) {\n return {\n case_insensitive: true,\n keywords: {\n keyword:\n 'task project allprojects subprojects artifacts buildscript configurations ' +\n 'dependencies repositories sourceSets description delete from into include ' +\n 'exclude source classpath destinationDir includes options sourceCompatibility ' +\n 'targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant ' +\n 'def abstract break case catch continue default do else extends final finally ' +\n 'for if implements instanceof native new private protected public return static ' +\n 'switch synchronized throw throws transient try volatile while strictfp package ' +\n 'import false null super this true antlrtask checkstyle codenarc copy boolean ' +\n 'byte char class double float int interface long short void compile runTime ' +\n 'file fileTree abs any append asList asWritable call collect compareTo count ' +\n 'div dump each eachByte eachFile eachLine every find findAll flatten getAt ' +\n 'getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods ' +\n 'isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter ' +\n 'newReader newWriter next plus pop power previous print println push putAt read ' +\n 'readBytes readLines reverse reverseEach round size sort splitEachLine step subMap ' +\n 'times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader ' +\n 'withStream withWriter withWriterAppend write writeLine'\n },\n contains: [\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE,\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n hljs.NUMBER_MODE,\n hljs.REGEXP_MODE\n\n ]\n }\n};","/* eslint no-useless-escape: off */\n\nmodule.exports = function(hljs) {\n return {\n keywords: {\n literal : 'true false null',\n keyword:\n 'byte short char int long boolean float double void ' +\n // groovy specific keywords\n 'def as in assert trait ' +\n // common keywords with Java\n 'super this abstract static volatile transient public private protected synchronized final ' +\n 'class interface enum if else for while switch case break default continue ' +\n 'throw throws try catch finally implements extends new import package return instanceof'\n },\n\n contains: [\n hljs.COMMENT(\n '/\\\\*\\\\*',\n '\\\\*/',\n {\n relevance : 0,\n contains : [\n {\n // eat up @'s in emails to prevent them to be recognized as doctags\n begin: /\\w+@/, relevance: 0\n },\n {\n className : 'doctag',\n begin : '@[A-Za-z]+'\n }\n ]\n }\n ),\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE,\n {\n className: 'string',\n begin: '\"\"\"', end: '\"\"\"'\n },\n {\n className: 'string',\n begin: \"'''\", end: \"'''\"\n },\n {\n className: 'string',\n begin: \"\\\\$/\", end: \"/\\\\$\",\n relevance: 10\n },\n hljs.APOS_STRING_MODE,\n {\n className: 'regexp',\n begin: /~?\\/[^\\/\\n]+\\//,\n contains: [\n hljs.BACKSLASH_ESCAPE\n ]\n },\n hljs.QUOTE_STRING_MODE,\n {\n className: 'meta',\n begin: \"^#!/usr/bin/env\", end: '$',\n illegal: '\\n'\n },\n hljs.BINARY_NUMBER_MODE,\n {\n className: 'class',\n beginKeywords: 'class interface trait enum', end: '{',\n illegal: ':',\n contains: [\n {beginKeywords: 'extends implements'},\n hljs.UNDERSCORE_TITLE_MODE\n ]\n },\n hljs.C_NUMBER_MODE,\n {\n className: 'meta', begin: '@[A-Za-z]+'\n },\n {\n // highlight map keys and named parameters as strings\n className: 'string', begin: /[^\\?]{0}[A-Za-z0-9_$]+ *:/\n },\n {\n // catch middle element of the ternary operator\n // to avoid highlight it as a label, named parameter, or map key\n begin: /\\?/, end: /\\:/\n },\n {\n // highlight labeled statements\n className: 'symbol', begin: '^\\\\s*[A-Za-z0-9_$]+:',\n relevance: 0\n }\n ],\n illegal: /#|<\\//\n }\n};","module.exports = function(hljs) {\n var VERSION = 'HTTP/[0-9\\\\.]+';\n return {\n aliases: ['https'],\n illegal: '\\\\S',\n contains: [\n {\n begin: '^' + VERSION, end: '$',\n contains: [{className: 'number', begin: '\\\\b\\\\d{3}\\\\b'}]\n },\n {\n begin: '^[A-Z]+ (.*?) ' + VERSION + '$', returnBegin: true, end: '$',\n contains: [\n {\n className: 'string',\n begin: ' ', end: ' ',\n excludeBegin: true, excludeEnd: true\n },\n {\n begin: VERSION\n },\n {\n className: 'keyword',\n begin: '[A-Z]+'\n }\n ]\n },\n {\n className: 'attribute',\n begin: '^\\\\w', end: ': ', excludeEnd: true,\n illegal: '\\\\n|\\\\s|=',\n starts: {end: '$', relevance: 0}\n },\n {\n begin: '\\\\n\\\\n',\n starts: {subLanguage: [], endsWithParent: true}\n }\n ]\n };\n};","/* eslint no-useless-escape: off */\n\nmodule.exports = function(hljs) {\n var JAVA_IDENT_RE = '[\\u00C0-\\u02B8a-zA-Z_$][\\u00C0-\\u02B8a-zA-Z_$0-9]*';\n var GENERIC_IDENT_RE = JAVA_IDENT_RE + '(<' + JAVA_IDENT_RE + '(\\\\s*,\\\\s*' + JAVA_IDENT_RE + ')*>)?';\n var KEYWORDS =\n 'false synchronized int abstract float private char boolean static null if const ' +\n 'for true while long strictfp finally protected import native final void ' +\n 'enum else break transient catch instanceof byte super volatile case assert short ' +\n 'package default double public try this switch continue throws protected public private ' +\n 'module requires exports do';\n\n // https://docs.oracle.com/javase/7/docs/technotes/guides/language/underscores-literals.html\n var JAVA_NUMBER_RE = '\\\\b' +\n '(' +\n '0[bB]([01]+[01_]+[01]+|[01]+)' + // 0b...\n '|' +\n '0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)' + // 0x...\n '|' +\n '(' +\n '([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+)(\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))?' +\n '|' +\n '\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+)' +\n ')' +\n '([eE][-+]?\\\\d+)?' + // octal, decimal, float\n ')' +\n '[lLfF]?';\n var JAVA_NUMBER_MODE = {\n className: 'number',\n begin: JAVA_NUMBER_RE,\n relevance: 0\n };\n\n return {\n aliases: ['jsp'],\n keywords: KEYWORDS,\n illegal: /<\\/|#/,\n contains: [\n hljs.COMMENT(\n '/\\\\*\\\\*',\n '\\\\*/',\n {\n relevance : 0,\n contains : [\n {\n // eat up @'s in emails to prevent them to be recognized as doctags\n begin: /\\w+@/, relevance: 0\n },\n {\n className : 'doctag',\n begin : '@[A-Za-z]+'\n }\n ]\n }\n ),\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE,\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n {\n className: 'class',\n beginKeywords: 'class interface', end: /[{;=]/, excludeEnd: true,\n keywords: 'class interface',\n illegal: /[:\"\\[\\]]/,\n contains: [\n {beginKeywords: 'extends implements'},\n hljs.UNDERSCORE_TITLE_MODE\n ]\n },\n {\n // Expression keywords prevent 'keyword Name(...)' from being\n // recognized as a function definition\n beginKeywords: 'new throw return else',\n relevance: 0\n },\n {\n className: 'function',\n begin: '(' + GENERIC_IDENT_RE + '\\\\s+)+' + hljs.UNDERSCORE_IDENT_RE + '\\\\s*\\\\(', returnBegin: true, end: /[{;=]/,\n excludeEnd: true,\n keywords: KEYWORDS,\n contains: [\n {\n begin: hljs.UNDERSCORE_IDENT_RE + '\\\\s*\\\\(', returnBegin: true,\n relevance: 0,\n contains: [hljs.UNDERSCORE_TITLE_MODE]\n },\n {\n className: 'params',\n begin: /\\(/, end: /\\)/,\n keywords: KEYWORDS,\n relevance: 0,\n contains: [\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n hljs.C_NUMBER_MODE,\n hljs.C_BLOCK_COMMENT_MODE\n ]\n },\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE\n ]\n },\n JAVA_NUMBER_MODE,\n {\n className: 'meta', begin: '@[A-Za-z]+'\n }\n ]\n };\n};","/* eslint no-useless-escape: off */\n\nmodule.exports = function(hljs) {\n var XML_IDENT_RE = '[A-Za-z0-9\\\\._:-]+';\n var TAG_INTERNALS = {\n endsWithParent: true,\n illegal: /</,\n relevance: 0,\n contains: [\n {\n className: 'attr',\n begin: XML_IDENT_RE,\n relevance: 0\n },\n {\n begin: /=\\s*/,\n relevance: 0,\n contains: [\n {\n className: 'string',\n endsParent: true,\n variants: [\n {begin: /\"/, end: /\"/},\n {begin: /'/, end: /'/},\n {begin: /[^\\s\"'=<>`]+/}\n ]\n }\n ]\n }\n ]\n };\n return {\n aliases: ['html', 'xhtml', 'rss', 'atom', 'xjb', 'xsd', 'xsl', 'plist'],\n case_insensitive: true,\n contains: [\n {\n className: 'meta',\n begin: '<!DOCTYPE', end: '>',\n relevance: 10,\n contains: [{begin: '\\\\[', end: '\\\\]'}]\n },\n hljs.COMMENT(\n '<!--',\n '-->',\n {\n relevance: 10\n }\n ),\n {\n begin: '<\\\\!\\\\[CDATA\\\\[', end: '\\\\]\\\\]>',\n relevance: 10\n },\n {\n className: 'meta',\n begin: /<\\?xml/, end: /\\?>/, relevance: 10\n },\n {\n begin: /<\\?(php)?/, end: /\\?>/,\n subLanguage: 'php',\n contains: [{begin: '/\\\\*', end: '\\\\*/', skip: true}]\n },\n {\n className: 'tag',\n /*\n The lookahead pattern (?=...) ensures that 'begin' only matches\n '<style' as a single word, followed by a whitespace or an\n ending braket. The '$' is needed for the lexeme to be recognized\n by hljs.subMode() that tests lexemes outside the stream.\n */\n begin: '<style(?=\\\\s|>|$)', end: '>',\n keywords: {name: 'style'},\n contains: [TAG_INTERNALS],\n starts: {\n end: '</style>', returnEnd: true,\n subLanguage: ['css', 'xml']\n }\n },\n {\n className: 'tag',\n // See the comment in the <style tag about the lookahead pattern\n begin: '<script(?=\\\\s|>|$)', end: '>',\n keywords: {name: 'script'},\n contains: [TAG_INTERNALS],\n starts: {\n end: '\\<\\/script\\>', returnEnd: true,\n subLanguage: ['actionscript', 'javascript', 'handlebars', 'xml']\n }\n },\n {\n className: 'tag',\n begin: '</?', end: '/?>',\n contains: [\n {\n className: 'name', begin: /[^\\/><\\s]+/, relevance: 0\n },\n TAG_INTERNALS\n ]\n }\n ]\n };\n};","/* eslint no-useless-escape: off */\n/* eslint no-useless-concat: off */\n\nmodule.exports = function(hljs) {\n var LITERALS = 'true false yes no null';\n\n var keyPrefix = '^[ \\\\-]*';\n var keyName = '[a-zA-Z_][\\\\w\\\\-]*';\n var KEY = {\n className: 'attr',\n variants: [\n { begin: keyPrefix + keyName + \":\"},\n { begin: keyPrefix + '\"' + keyName + '\"' + \":\"},\n { begin: keyPrefix + \"'\" + keyName + \"'\" + \":\"}\n ]\n };\n\n var TEMPLATE_VARIABLES = {\n className: 'template-variable',\n variants: [\n { begin: '\\{\\{', end: '\\}\\}' }, // jinja templates Ansible\n { begin: '%\\{', end: '\\}' } // Ruby i18n\n ]\n };\n var STRING = {\n className: 'string',\n relevance: 0,\n variants: [\n {begin: /'/, end: /'/},\n {begin: /\"/, end: /\"/},\n {begin: /\\S+/}\n ],\n contains: [\n hljs.BACKSLASH_ESCAPE,\n TEMPLATE_VARIABLES\n ]\n };\n\n return {\n case_insensitive: true,\n aliases: ['yml', 'YAML', 'yaml'],\n contains: [\n KEY,\n {\n className: 'meta',\n begin: '^---\\s*$',\n relevance: 10\n },\n { // multi line string\n className: 'string',\n begin: '[\\\\|>] *$',\n returnEnd: true,\n contains: STRING.contains,\n // very simple termination: next hash key\n end: KEY.variants[0].begin\n },\n { // data type\n className: 'type',\n begin: '!!' + hljs.UNDERSCORE_IDENT_RE,\n },\n { // fragment id &ref\n className: 'meta',\n begin: '&' + hljs.UNDERSCORE_IDENT_RE + '$',\n },\n { // fragment reference *ref\n className: 'meta',\n begin: '\\\\*' + hljs.UNDERSCORE_IDENT_RE + '$'\n },\n { // array listing\n className: 'bullet',\n begin: '^ *-',\n relevance: 0\n },\n hljs.HASH_COMMENT_MODE,\n {\n beginKeywords: LITERALS,\n keywords: {literal: LITERALS}\n },\n hljs.C_NUMBER_MODE,\n STRING\n ]\n };\n};","module.exports = function(hljs) {\n var LITERALS = {literal: 'true false null'};\n var TYPES = [\n hljs.QUOTE_STRING_MODE,\n hljs.C_NUMBER_MODE\n ];\n var VALUE_CONTAINER = {\n end: ',', endsWithParent: true, excludeEnd: true,\n contains: TYPES,\n keywords: LITERALS\n };\n var OBJECT = {\n begin: '{', end: '}',\n contains: [\n {\n className: 'attr',\n begin: /\"/, end: /\"/,\n contains: [hljs.BACKSLASH_ESCAPE],\n illegal: '\\\\n',\n },\n hljs.inherit(VALUE_CONTAINER, {begin: /:/})\n ],\n illegal: '\\\\S'\n };\n var ARRAY = {\n begin: '\\\\[', end: '\\\\]',\n contains: [hljs.inherit(VALUE_CONTAINER)], // inherit is a workaround for a bug that makes shared modes with endsWithParent compile only the ending of one of the parents\n illegal: '\\\\S'\n };\n TYPES.splice(TYPES.length, 0, OBJECT, ARRAY);\n return {\n contains: TYPES,\n keywords: LITERALS,\n illegal: '\\\\S'\n };\n};","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\nMicrometer contains a core library with the instrumentation SPI and an in-memory implementation that does not export data anywhere, a series of modules with implementations for various monitoring systems, and a test module.\\n\\nTo use Micrometer, add the dependency for your monitoring system.\\n\\nThe following example adds Prometheus in Gradle:\\n\\n[source,groovy]\\n----\\nimplementation 'io.micrometer:micrometer-registry-prometheus:latest.release'\\n----\\n\\nThe following example adds Prometheus in Maven:\\n\\n[source,xml]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-prometheus</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\nThrough Micrometer's composite meter registry (described in greater detail in link:/docs/concepts#_composite_registries[\\\"Concepts\\\"]), you may configure more than one registry implementation if you intend to publish metrics to more than one monitoring system.\\n\\nIf you have not decided on a monitoring system yet and want only to try out the instrumentation SPI, you can add a dependency on `micrometer-core` instead and configure the `SimpleMeterRegistry`.\\n\\n== Snapshots\\n\\nEvery successful https://app.circleci.com/pipelines/github/micrometer-metrics/micrometer[build] of Micrometer's `main` and maintenance branches (for example, `1.7.x`) results in the publication of a new snapshot version. You can use the latest snapshot by adding the Maven repository `https://repo.spring.io/snapshot` to your build and using the corresponding snapshot version -- for example, `1.8.0-SNAPSHOT`.\\n\\n== Milestones\\n\\nMilestone releases are made available for early testing purposes and are not intended for production use.\\nMilestone releases are published to https://repo.spring.io/milestone.\\nInclude that as a Maven repository in your build configuration to use milestone releases.\\nMilestones are marked as \\\"`pre-releases`\\\" on GitHub, and the version has a suffix, such as `-M1` or `-RC1` (milestone 1 or release candidate 1, respectively).\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Concepts\\n:toc:\\n:sectnums:\\n:dimensional: true\\n\\n== Purpose\\n\\nMicrometer is a metrics instrumentation library for JVM-based applications. It provides a simple facade over the instrumentation clients for the most popular monitoring systems, letting you instrument your JVM-based application code without vendor lock-in. It is designed to add little to no overhead to your metrics collection activity while maximizing the portability of your metrics effort.\\n\\nStarting from Micrometer 1.10, Micrometer provides the link:../docs/observation[Observation API] and a plugin mechanism that allows you to add capabilities including the tracing features. You can read more about this in the link:../docs/tracing[Micrometer Tracing documentation].\\n\\nFor better understanding the differences among these different types of systems (Metrics, Distributed Tracing, and Logging) we recommend Adrian Cole's talk, titled https://www.dotconferences.com/2017/04/adrian-cole-observability-3-ways-logging-metrics-tracing[Observability\\n3 Ways]. To learn more about Micrometer Observation API we recommend Tommy Ludwig's and Marcin Grzejszczak's talk, titled https://www.youtube.com/watch?v=fh3VbrPvAjg[Observability of Your Application].\\n\\n== Dependencies\\n\\nThe `micrometer-core` module aims to have minimal dependencies. It does not require any third-party (non-Micrometer) dependencies on the classpath at compile time for applications using Micrometer.\\n\\nUse of the link:#_pause_detection[pause detection] feature requires the https://github.com/LatencyUtils/LatencyUtils[LatencyUtils] dependency to be available on the classpath at runtime. If your application does not use the pause detection feature, you can exclude LatencyUtils from your runtime classpath.\\n\\nhttps://github.com/HdrHistogram/HdrHistogram[HdrHistogram] is needed on the classpath at runtime if you use link:#_histograms_and_percentiles[client-side percentiles]. If you are not using client-side percentiles, you may exclude HdrHistogram from your application's runtime classpath.\\n\\n== Supported Monitoring Systems\\n\\n:leveloffset: +1\\n\\nMicrometer contains a core module with an instrumentation https://en.wikipedia.org/wiki/Service_provider_interface[SPI], a set of modules containing implementations for various monitoring systems (each is called a registry), and a test kit. You need to understand three important characteristics of monitoring systems:\\n\\n* *Dimensionality*. Whether the system supports metric names to be enriched with tag key/value pairs. If a system is not _dimensional_, it is _hierarchical_, which means it supports only a flat metric name. When publishing metrics to hierarchical systems, Micrometer flattens the set of tag key/value pairs and adds them to the name.\\n\\n[cols=2*,options=\\\"header\\\"]\\n|===\\n|Dimensional\\n|Hierarchical\\n\\n|AppOptics, Atlas, Azure Monitor, Cloudwatch, Datadog, Datadog StatsD, Dynatrace, Elastic, Humio, Influx, KairosDB, New Relic, Prometheus, SignalFx, Sysdig StatsD, Telegraf StatsD, Wavefront\\n|Graphite, Ganglia, JMX, Etsy StatsD\\n|===\\n\\n\\n* *<<rate-aggregation>>*. In this context, we mean aggregation of a set of samples over a prescribed time interval. Some monitoring systems expect some types of discrete samples (such as counts) to be converted to a rate by the application prior to being published. Other systems expect cumulative values to always be sent. Still others have no opinion on it either way.\\n\\n[cols=2*,options=\\\"header\\\"]\\n|===\\n|Client-side\\n|Server-side\\n\\n|AppOptics, Atlas, Azure Monitor, Datadog, Dynatrace, Elastic, Graphite, Ganglia, Humio, Influx, JMX, Kairos, New Relic, all StatsD flavors, SignalFx\\n|Prometheus, Wavefront footnote:[As of 1.2.0, Micrometer sends cumulative values to Wavefront.]\\n|===\\n\\n* *Publishing*. Some systems expect to poll applications for metrics at their leisure, while others expect metrics to be pushed to them on a regular interval.\\n\\n[cols=2*,options=\\\"header\\\"]\\n|===\\n|Client pushes\\n|Server polls\\n\\n|AppOptics, Atlas, Azure Monitor, Datadog, Dynatrace, Elastic, Graphite, Ganglia, Humio, Influx, JMX, Kairos, New Relic, SignalFx, Wavefront\\n|Prometheus, all StatsD flavors\\n|===\\n\\nThere are other, more minor, variations in expectations from one monitoring system to another, such as their conception of base units of measurement (particularly time) and the canonical naming convention for metrics. Micrometer customizes your metrics to meet these demands on a per-registry basis.\\n\\n:leveloffset!:\\n\\n== Registry\\n\\n:leveloffset: +1\\n\\nA `Meter` is the interface for collecting a set of measurements (which we individually call metrics) about your application. Meters in Micrometer are created from and held in a `MeterRegistry`. Each supported monitoring system has an implementation of `MeterRegistry`. How a registry is created varies for each implementation.\\n\\nMicrometer includes a `SimpleMeterRegistry` that holds the latest value of each meter in memory and does not export the data anywhere. If you do not yet have a preferred monitoring system, you can get started playing with metrics by using the simple registry:\\n\\n====\\n[source,java]\\n----\\nMeterRegistry registry = new SimpleMeterRegistry();\\n----\\n====\\n\\nNOTE: A `SimpleMeterRegistry` is autowired for you in Spring-based applications.\\n\\n== Composite Registries\\n\\nMicrometer provides a `CompositeMeterRegistry` to which you can add multiple registries, letting you publish metrics to more than one monitoring system simultaneously:\\n\\n====\\n[source,java]\\n----\\nCompositeMeterRegistry composite = new CompositeMeterRegistry();\\n\\nCounter compositeCounter = composite.counter(\\\"counter\\\");\\ncompositeCounter.increment(); <1>\\n\\nSimpleMeterRegistry simple = new SimpleMeterRegistry();\\ncomposite.add(simple); <2>\\n\\ncompositeCounter.increment(); <3>\\n----\\n\\n1. Increments are NOOP'd until there is a registry in the composite. The counter's count still yields 0 at this point.\\n2. A counter named `counter` is registered to the simple registry.\\n3. The simple registry counter is incremented, along with counters for any other registries in the composite.\\n====\\n\\n== Global Registry\\n\\nMicrometer provides a static global registry `Metrics.globalRegistry` and a set of static builders for generating meters based on this registry (note that `globalRegistry` is a composite registry):\\n\\n====\\n[source,java]\\n----\\nclass MyComponent {\\n Counter featureCounter = Metrics.counter(\\\"feature\\\", \\\"region\\\", \\\"test\\\"); <1>\\n\\n void feature() {\\n featureCounter.increment();\\n }\\n\\n void feature2(String type) {\\n Metrics.counter(\\\"feature.2\\\", \\\"type\\\", type).increment(); <2>\\n }\\n}\\n\\nclass MyApplication {\\n void start() {\\n // wire your monitoring system to global static state\\n Metrics.addRegistry(new SimpleMeterRegistry()); <3>\\n }\\n}\\n----\\n\\n1. Wherever possible (and especially where instrumentation performance is critical), store `Meter` instances in fields to avoid a lookup on their name or tags on each use.\\n2. When tags need to be determined from local context, you have no choice but to construct or lookup the Meter inside your method body. The lookup cost is just a single hash lookup, so it is acceptable for most use cases.\\n3. It is OK to add registries _after_ meters have been created with code like `Metrics.counter(...)`. These meters are added to each registry, as it is bound to the global composite.\\n====\\n\\n:leveloffset!:\\n\\n== Meters\\n\\n:leveloffset: +1\\n\\nMicrometer supports a set of `Meter` primitives, including `Timer`, `Counter`, `Gauge`, `DistributionSummary`, `LongTaskTimer`, `FunctionCounter`, `FunctionTimer`, and `TimeGauge`. Different meter types result in a different number of time series metrics. For example, while there is a single metric that represents a `Gauge`, a `Timer` measures both the count of timed events and the total time of all timed events.\\n\\nA meter is uniquely identified by its name and dimensions. We use the terms, \\\"`dimensions`\\\" and \\\"`tags,`\\\" interchangeably, and the Micrometer interface is `Tag` simply because it is shorter. As a general rule, it should be possible to use the name as a pivot. Dimensions let a particular named metric be sliced to drill down and reason about the data. This means that, if only the name is selected, you can drill down by using other dimensions and reason about the value being shown.\\n\\n:leveloffset!:\\n\\n== Naming Meters\\n\\n:leveloffset: +1\\n\\nMicrometer employs a naming convention that separates lowercase words with a `.` (dot) character. Different monitoring systems have different recommendations regarding naming convention, and some naming conventions may be incompatible between one system and another. Each Micrometer implementation for a monitoring system comes with a naming convention that transforms lowercase dot notation names to the monitoring system's recommended naming convention. Additionally, this naming convention implementation removes special characters that are disallowed by the monitoring system from the metric names and tags. You can override the default naming convention for a registry by implementing `NamingConvention` and setting it on the registry:\\n\\n====\\n[source,java]\\n----\\nregistry.config().namingConvention(myCustomNamingConvention);\\n----\\n====\\n\\nWith naming conventions in place, the following timer registered in Micrometer looks good natively in a wide variety of monitoring systems:\\n\\n====\\n[source,java]\\n----\\nregistry.timer(\\\"http.server.requests\\\");\\n----\\n====\\n\\n. Prometheus - `http_server_requests_duration_seconds`\\n. Atlas - `httpServerRequests`\\n. Graphite - `http.server.requests`\\n. InfluxDB - `http_server_requests`\\n\\nBy adhering to Micrometer's lowercase dot notation convention, you guarantee the maximum degree of portability for your metric names across monitoring systems.\\n\\n== Tag Naming\\n\\nTIP: We recommend that you follow the same lowercase dot notation described for meter names when naming tags. Using this consistent naming convention for tags allows for better translation into the respective monitoring system's idiomatic naming schemes.\\n\\nSuppose we are trying to measure the number of http requests and the number of database calls.\\n\\n*Recommended Approach*\\n\\n====\\n[source,java]\\n----\\nregistry.counter(\\\"database.calls\\\", \\\"db\\\", \\\"users\\\")\\nregistry.counter(\\\"http.requests\\\", \\\"uri\\\", \\\"/api/users\\\")\\n----\\n====\\n\\nThis variant provides enough context so that, if only the name is selected, the value can be reasoned about and is at least potentially meaningful. For example if we select `database.calls`, we can see the total number of calls to all databases. Then we can group by or select by `db` to drill down further or perform comparative analysis on the contribution of calls to each database.\\n\\n*Bad Approach*\\n\\n====\\n[source,java]\\n----\\nregistry.counter(\\\"calls\\\",\\n \\\"class\\\", \\\"database\\\",\\n \\\"db\\\", \\\"users\\\");\\n\\nregistry.counter(\\\"calls\\\",\\n \\\"class\\\", \\\"http\\\",\\n \\\"uri\\\", \\\"/api/users\\\");\\n----\\n====\\n\\nIn this approach, if we select `calls`, we get a value that is an aggregate of the number of calls to the database and to our API endpoint. This time series is not useful without further dimensional drill-down.\\n\\n== Common Tags\\n\\nYou can define common tags at the registry level and add them to every metric reported to the monitoring system. This is generally used for dimensional drill-down on the operating environment, such as host, instance, region, stack, and others:\\n\\n====\\n[source,java]\\n----\\nregistry.config().commonTags(\\\"stack\\\", \\\"prod\\\", \\\"region\\\", \\\"us-east-1\\\");\\nregistry.config().commonTags(Arrays.asList(Tag.of(\\\"stack\\\", \\\"prod\\\"), Tag.of(\\\"region\\\", \\\"us-east-1\\\"))); // equivalently\\n----\\n====\\n\\nCalls to `commonTags` append additional common tags.\\n\\n[IMPORTANT]\\n====\\nCommon tags generally have to be added to the registry _before_ any (possibly autoconfigured) meter binders. Depending on your environment, there are different ways to achieve this.\\n\\nIf you use Spring Boot, you have two options:\\n\\n* Add your common tags with https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.metrics.customizing.common-tags[configuration properties]\\n* If you need more flexibility (for example, you have to add common tags to a registry defined in a shared library), register a `MeterRegistryCustomizer` callback interface as a bean to add your common tags. See the\\nhttps://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.metrics.getting-started[Spring Boot Reference Documentation] for more information.\\n====\\n\\n== Tag Values\\n\\nTag values must be non-null.\\n\\nWARNING: Beware of the potential for tag values coming from user-supplied sources to blow up the cardinality of a metric. You should always carefully normalize and add bounds to user-supplied input. Sometimes, the cause is sneaky. Consider the URI tag for recording HTTP requests on service endpoints. If we do not constrain 404's to a value like NOT_FOUND, the dimensionality of the metric would grow with each resource that cannot be found.\\n\\n:leveloffset!:\\n\\n== Meter Filters\\n\\n:leveloffset: +1\\n\\nYou can configure each registry with meter filters, which give you greater control over how and when meters are registered and what kinds of statistics they emit. Meter filters serve three basic functions:\\n\\n1. **Deny** (or **Accept**) meters being registered.\\n2. **Transform** meter IDs (for example, changing the name, adding or removing tags, and changing description or base units).\\n3. **Configure** distribution statistics for some meter types.\\n\\nImplementations of `MeterFilter` are added to the registry programmatically:\\n\\n====\\n[source, java]\\n----\\nregistry.config()\\n .meterFilter(MeterFilter.ignoreTags(\\\"too.much.information\\\"))\\n .meterFilter(MeterFilter.denyNameStartsWith(\\\"jvm\\\"));\\n----\\n====\\n\\nMeter filters are applied in order, and the results of transforming or configuring a meter are chained.\\n\\n== Deny or Accept Meters\\n\\nThe verbose form of an accept or deny filter is:\\n\\n====\\n[source, java]\\n----\\nnew MeterFilter() {\\n @Override\\n public MeterFilterReply accept(Meter.Id id) {\\n if(id.getName().contains(\\\"test\\\")) {\\n return MeterFilterReply.DENY;\\n }\\n return MeterFilterReply.NEUTRAL;\\n }\\n}\\n----\\n====\\n\\n`MeterFilterReply` has three possible states:\\n\\n* `DENY`: Do not let this meter be registered. When you try to register a meter against a registry and the filter returns `DENY`, the registry returns a NOOP version of that meter (for example, `NoopCounter` or `NoopTimer`). Your code can continue to interact with the NOOP meter, but anything recorded to it is discarded immediately with minimal overhead.\\n* `NEUTRAL`: If no other meter filter has returned `DENY`, registration of meters proceeds normally.\\n* `ACCEPT`: If a filter returns `ACCEPT`, the meter is immediately registered without interrogating the accept methods of any further filters.\\n\\n=== Convenience Methods\\n\\n`MeterFilter` provides several convenience static builders for deny and accept type filters:\\n\\n* `accept()`: Accept every meter, overriding the decisions of any filters that follow.\\n* `accept(Predicate<Meter.Id>)`: Accept any meter matching the predicate.\\n* `acceptNameStartsWith(String)`: Accept every meter with a matching prefix.\\n* `deny()`: Deny every meter, overriding the decisions of any filters that follow.\\n* `denyNameStartsWith(String)`: Deny every meter with a matching prefix. All `MeterBinder` implementations provided by Micrometer have names with common prefixes to allow for easy grouping visualization in UIs but also to make them easy to disable or enable as a group with a prefix. For example, you can deny all JVM metrics with `MeterFilter.denyNameStartsWith(\\\"jvm\\\")`.\\n* `deny(Predicate<Meter.Id>)`: Deny any meter that matches the predicate.\\n* `maximumAllowableMetrics(int)`: Deny any meter after the registry has reached a certain number of meters.\\n* `maximumAllowableTags(String meterNamePrefix, String tagKey, int maximumTagValues, MeterFilter onMaxReached)`: Places an upper bound on the number of tags produced by matching series.\\n\\n**Whitelisting** only a certain group of metrics is a particularly common case for monitoring systems that are _expensive_. This can be achieved with a static call:\\n\\n* `denyUnless(Predicate<Meter.Id>)`: Deny all meters that _do not_ match the predicate.\\n\\n=== Chaining Deny Accept Meters\\n\\nMeter filters are applied in the order in which they are configured on the registry, so it is possible to stack deny and accept filters to achieve more complex rules:\\n\\n====\\n[source, java]\\n----\\nregistry.config()\\n .meterFilter(MeterFilter.acceptNameStartsWith(\\\"http\\\"))\\n .meterFilter(MeterFilter.deny()); <1>\\n----\\n====\\n\\nThis achieves another form of whitelisting by stacking two filters together. Only `http` metrics are allowed to exist in this registry.\\n\\n== Transforming metrics\\n\\nThe following example shows a transform filter:\\n\\n====\\n[source, java]\\n----\\nnew MeterFilter() {\\n @Override\\n public Meter.Id map(Meter.Id id) {\\n if(id.getName().startsWith(\\\"test\\\")) {\\n return id.withName(\\\"extra.\\\" + id.getName()).withTag(\\\"extra.tag\\\", \\\"value\\\");\\n }\\n return id;\\n }\\n}\\n----\\n====\\n\\nThis filter adds a name prefix and an additional tag conditionally to meters starting with a name of `test`.\\n\\n`MeterFilter` provides convenience builders for many common transformation cases:\\n\\n* `commonTags(Iterable<Tag>)`: Adds a set of tags to all metrics. Adding common tags for application name, host, region, and others is a highly recommended practice.\\n* `ignoreTags(String...)`: Drops matching tag keys from every meter. This is particularly useful when a tag provably comes to have\\ntoo high cardinality and starts stressing your monitoring system or costing too much but you cannot change all the instrumentation points quickly.\\n* `replaceTagValues(String tagKey, Function<String, String> replacement, String... exceptions)`: Replace tag values according to the provided mapping for all matching tag keys. You can use this to reduce the total cardinality of a tag by mapping some portion of tag values to something else.\\n* `renameTag(String meterNamePrefix, String fromTagKey, String toTagKey)`: Rename a tag key for every metric that begins with a given prefix.\\n\\n== Configuring Distribution Statistics\\n\\n`Timer` and `DistributionSummary` contain a set of optional distribution statistics (in addition to the basics of count, total, and max) that you can configure through filters. These distribution statistics include pre-computed percentiles, SLOs, and histograms.\\n\\n====\\n[source, java]\\n----\\nnew MeterFilter() {\\n @Override\\n public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) {\\n if (id.getName().startsWith(prefix)) {\\n return DistributionStatisticConfig.builder()\\n .publishPercentiles(0.9, 0.95)\\n .build()\\n .merge(config);\\n }\\n return config;\\n }\\n};\\n----\\n====\\n\\nGenerally, you should create a new `DistributionStatisticConfig` with only the pieces you wish to configure and then `merge` it with the input configuration. This lets you drop down on registry-provided defaults for distribution statistics and to chain multiple filters together, each configuring some part of the distribution statistics (for example, you might want a 100ms SLO for all HTTP requests but only percentile histograms on a few critical endpoints).\\n\\n`MeterFilter` provides convenience builders for:\\n\\n* `maxExpected(Duration/long)`: Governs the upper bound of percentile histogram buckets shipped from a timer or summary.\\n* `minExpected(Duration/long)`: Governs the lower bound of percentile histogram buckets shipped from a timer or summary.\\n\\nSpring Boot offers property-based filters for configuring SLOs, percentiles, and percentile histograms by name prefix.\\n\\n:leveloffset!:\\n\\n[[rate-aggregation]]\\n== Rate Aggregation\\n\\n:leveloffset: +1\\n\\nMicrometer is aware of whether a particular monitoring system expects rate aggregation to happen client-side before metrics are published or ad-hoc as part of the query on the server. It accumulates metrics according to which style the monitoring system expects.\\n\\nNot all measurements are reported or best viewed as a rate. For example, gauge values and the active task count long task timers are not rates.\\n\\n== Server-side\\n\\nMonitoring systems that perform server-side rate math expect absolute values to be reported at each publishing interval. For example, the absolute count of all increments to a counter since the beginning of the application is sent on each publishing interval.\\n\\nSuppose we have a slightly positively biased random walk that chooses to increment a counter once every 10 milliseconds. If we view the raw counter value in a system like Prometheus, we see a step-wise monotonically increasing function (the width of the step is the interval at which Prometheus is polling or scraping for data).\\n\\nimage::\" + require(\"!file-loader!./img/prometheus-counter-norate.png\") + \"[Absolute counter value]\\n\\nRepresenting a counter without rate aggregation over some time window is rarely useful, as the representation is a function of both the rapidity with which the counter is incremented and the longevity of the service. In the preceding example, the counter drops back to zero on service restart. The rate-aggregated graph would return back to a value around 55 as soon as the new instance (say on a production deployment) was in service.\\n\\nimage::\" + require(\"!file-loader!./img/prometheus-counter.png\") + \"[Rate-aggregated counter]\\n\\nIf you have achieved zero-downtime deployments (for example, through red-black deployments), you should be able to comfortably set _minimum_ alert thresholds on the rate-aggregated graph without service restarts causing dips in the counter value.\\n\\nIMPORTANT: For most production purposes, whether it be alerting, automated canary analysis, or other use cases, base your automation off of rate-aggregated data.\\n\\n== Client-side\\n\\nTwo other classes of monitoring system either:\\n\\n. Expect rate-aggregated data. Given the key insight that for most production purposes, we should be basing our decisions off of rates rather than absolute values, such systems benefit from having to do less math to satisfy queries.\\n. Have relatively little or no math operations that would let us rate-aggregate data through our queries. For these systems, publishing pre-aggregated data is the only way to build meaningful representations.\\n\\nMicrometer efficiently maintains rate data by means of a step value that accumulates data for the current publishing interval. When the step value is polled (when publishing, for example), if the step value detects that the current interval has elapsed, it moves current data to \\\"`previous`\\\" state. This previous state is what is reported until the next time current data overwrites it. The following image shows the interaction of current and previous state, along with polling:\\n\\nimage::\" + require(\"!file-loader!./img/rate-normalizing.png\") + \"[Behavior of a step value,width=1200]\\n\\nThe value returned by the poll function is always _rate per second * interval_. If the step value shown in the preceding image represents the values of a counter, we could say that the counter saw \\\"`0.3 increments per second`\\\" in the first interval, which is reportable to the backend at any time during the second interval.\\n\\nMicrometer timers track at least a count and the total time as separate measurements. Suppose we configure publishing at 10-second intervals and we saw 20 requests that each took 100ms. Then, for the first interval:\\n\\n. `count` = 10 seconds * (20 requests / 10 seconds) = 20 requests\\n. `totalTime` = 10 seconds * (20 * 100 ms / 10 seconds) = 2 seconds\\n\\nThe `count` statistic is meaningful by itself: It is a measure of _throughput_. `totalTime` represents the total latency of all requests in the interval. Additionally:\\n\\n`totalTime / count` = 2 seconds / 20 requests = 0.1 seconds / request = 100 ms / request\\n\\nThis is a useful measure of _average latency_. When the same idea is applied to the `totalAmount` and `count` emanating from distribution summaries, the measure is called a _distribution average_. Average latency is just the distribution average for a distribution summary measured in time (a timer). Some monitoring systems (such as Atlas) provide facilities for computing the distribution average from these statistics, and Micrometer includes `totalTime` and `count` as separate statistics. Others, (such as Datadog) do not have this kind of operation built-in, and Micrometer calculates the distribution average client-side and ships that.\\n\\nShipping the rate for the publishing interval is sufficient to reason about the rate over any time window greater than or equal to the publishing interval. In our example, if a service continues to receive 20 requests that each take 100ms for every 10 second interval in a given minute, we could say:\\n\\n. Micrometer reported \\\"`20 requests`\\\" for `count` on every 10 second interval. The monitoring system sums these six 10 second intervals and arrives at the conclusion that there are 120 requests / minute. Note that it is the monitoring system doing this summation, not Micrometer.\\n. Micrometer reported \\\"`2 seconds`\\\" of `totalTime` on every 10 second interval. The monitoring system can sum all total time statistics over the minute to yield \\\"`12 seconds`\\\" of total time in the minute interval. Then, the average latency is as we expect: 12 seconds / 120 requests = 100 ms / request.\\n\\n:leveloffset!:\\n\\n== Counters\\n\\n:leveloffset: +1\\n\\nCounters report a single metric: a count. The `Counter` interface lets you increment by a fixed amount, which must be positive.\\n\\nTIP: Never count something you can time with a `Timer` or summarize with a `DistributionSummary`! Both `Timer` and `DistributionSummary` always publish a count of events in addition to other measurements.\\n\\nWhen building graphs and alerts off of counters, you should generally be most interested in measuring the rate at which some event occurs over a given time interval. Consider a simple queue. You could use counters to measure various things, such as the rate at which items are being inserted and removed.\\n\\nIt is tempting, at first, to conceive of visualizing absolute counts rather than a rate, but the absolute count is usually both a function of the rapidity with which something is used *and* the longevity of the application instance under instrumentation. Building dashboards and alerts of the rate of a counter per some interval of time disregards the longevity of the app, letting you see aberrant behavior long after the application has started.\\n\\nNOTE: Be sure to read through the timer section before jumping into using counters, as timers record a count of timed events as part of the suite of metrics that go into timing. For those pieces of code you intend to time, you do NOT need to add a separate counter.\\n\\nThe following code simulates a real counter whose rate exhibits some perturbation over a short time window:\\n\\n[source,java]\\n----\\nNormal rand = ...; // a random generator\\n\\nMeterRegistry registry = ...\\nCounter counter = registry.counter(\\\"counter\\\"); <1>\\n\\nFlux.interval(Duration.ofMillis(10))\\n .doOnEach(d -> {\\n if (rand.nextDouble() + 0.1 > 0) { <2>\\n counter.increment(); <3>\\n }\\n })\\n .blockLast();\\n----\\n<1> Most counters can be created off of the registry itself with a name and, optionally, a set of tags.\\n<2> A slightly positively biased random walk.\\n<3> This is how you interact with a counter. You could also call `counter.increment(n)` to increment by more than one in a single operation.\\n\\nA fluent builder for counters on the `Counter` interface itself provides access to less frequently used options, such as\\nbase units and description. You can register the counter as the last step of its construction by calling `register`:\\n\\n[source, java]\\n----\\nCounter counter = Counter\\n .builder(\\\"counter\\\")\\n .baseUnit(\\\"beans\\\") // optional\\n .description(\\\"a description of what this counter does\\\") // optional\\n .tags(\\\"region\\\", \\\"test\\\") // optional\\n .register(registry);\\n----\\n\\n== Function-tracking Counters\\n\\nMicrometer also provides a more infrequently used counter pattern that tracks a monotonically increasing function (a function that stays the same or increases over time but never decreases). Some monitoring systems, such as Prometheus, push cumulative values for counters to the backend, but others publish the rate at which a counter is incrementing over the push interval. By employing this pattern, you let the Micrometer implementation for your monitoring system choose whether to rate-normalize the counter, and your counter remains portable across different types of monitoring systems.\\n\\n[source, java]\\n-----\\nCache cache = ...; // suppose we have a Guava cache with stats recording on\\nregistry.more().counter(\\\"evictions\\\", tags, cache, c -> c.stats().evictionCount()); <1>\\n-----\\n\\n<1> `evictionCount()` is a monotonically increasing function that increments with every cache eviction from the beginning of its life.\\n\\nThe function-tracking counter, in concert with the monitoring system's rate normalizing functionality (whether this is an artifact of the query language or the way data is pushed to the system), adds a layer of richness on top of the cumulative value of the function itself. You can reason about the _rate_ at which the value is increasing, whether that rate is within an acceptable bound, is increasing or decreasing over time, and so on.\\n\\nWARNING: Micrometer cannot guarantee the monotonicity of the function for you. By using this signature, you are asserting its monotonicity based on what you know about its definition.\\n\\nA fluent builder for function counters on the `FunctionCounter` interface itself provides access to less frequently used options, such as base units and description. You can register the counter as the last step of its construction by calling `register(MeterRegistry)`.\\n\\n[source, java]\\n----\\nMyCounterState state = ...;\\n\\nFunctionCounter counter = FunctionCounter\\n .builder(\\\"counter\\\", state, state -> state.count())\\n .baseUnit(\\\"beans\\\") // optional\\n .description(\\\"a description of what this counter does\\\") // optional\\n .tags(\\\"region\\\", \\\"test\\\") // optional\\n .register(registry);\\n----\\n\\n:leveloffset!:\\n\\n== Gauges\\n\\n:leveloffset: +1\\n\\nA gauge is a handle to get the current value. Typical examples for gauges would be the size of a collection or map or number of threads in a running state.\\n\\nTIP: Gauges are useful for monitoring things with natural upper bounds. We do not recommend using a gauge to monitor things like request count, as they can grow without bound for the duration of an application instance's life.\\n\\nTIP: Never gauge something you can count with a `Counter`!\\n\\nMicrometer takes the stance that gauges should be sampled and not be set, so there is no information about what might have occurred between samples. Any intermediate values set on a gauge are lost by the time the gauge value is reported to a metrics backend, so there is little value in setting those intermediate values in the first place.\\n\\nThink of a `Gauge` as a \\\"`heisen-gauge`\\\": a meter that changes only when it is observed. Every other meter type accumulates intermediate counts toward the point where the data is sent to the metrics backend.\\n\\nThe `MeterRegistry` interface contains methods for building gauges to observe numeric values, functions, collections, and maps:\\n\\n[source, java]\\n----\\nList<String> list = registry.gauge(\\\"listGauge\\\", Collections.emptyList(), new ArrayList<>(), List::size); <1>\\nList<String> list2 = registry.gaugeCollectionSize(\\\"listSize2\\\", Tags.empty(), new ArrayList<>()); <2>\\nMap<String, Integer> map = registry.gaugeMapSize(\\\"mapGauge\\\", Tags.empty(), new HashMap<>());\\n----\\n<1> A slightly more common form of gauge is one that monitors some non-numeric object. The last argument establishes the function that is used to determine the value of the gauge when the gauge is observed.\\n<2> A more convenient form of (1) for when you want to monitor collection size.\\n\\nAll of the different forms of creating a gauge maintain only a _weak reference_ to the object being observed, so as not to prevent garbage collection of the object.\\n\\n== Manually Incrementing or Decrementing a Gauge\\n\\nA gauge can be made to track any `java.lang.Number` subtype that is settable, such as `AtomicInteger` and `AtomicLong` found in `java.util.concurrent.atomic` and similar types, such as Guava's `AtomicDouble`:\\n\\n[source,java]\\n----\\n// maintain a reference to myGauge\\nAtomicInteger myGauge = registry.gauge(\\\"numberGauge\\\", new AtomicInteger(0));\\n\\n// ... elsewhere you can update the value it holds using the object reference\\nmyGauge.set(27);\\nmyGauge.set(11);\\n----\\n\\nNote that, in this form, unlike other meter types, you do not get a reference to the `Gauge` when creating one. Rather, you get a reference to the thing being observed. This is because of the \\\"`heisen-gauge`\\\" principal: The gauge is self-sufficient once created, so you should never need to interact with it. This lets us give you back only the instrumented object, which allows for quick one-liners that both create the object to be observed and set up metrics around it.\\n\\nThis pattern should be less common than the `DoubleFunction` form. Remember that frequent setting of the observed `Number` results in a lot of intermediate values that never get published. Only the _instantaneous value_ of the gauge at publish time is ever sent to the monitoring system.\\n\\nWARNING: Attempting to construct a gauge with a primitive number or one of its `java.lang` object forms is always incorrect. These numbers are immutable. Thus, the gauge cannot ever be changed. Attempting to \\\"`re-register`\\\" the gauge with a different number does not work, as the registry maintains only one meter for each unique combination of name and tags.\\n\\n== Gauge Fluent Builder\\n\\nThe interface contains a fluent builder for gauges:\\n\\n[source, java]\\n----\\nGauge gauge = Gauge\\n .builder(\\\"gauge\\\", myObj, myObj::gaugeValue)\\n .description(\\\"a description of what this gauge does\\\") // optional\\n .tags(\\\"region\\\", \\\"test\\\") // optional\\n .register(registry);\\n----\\n\\nGenerally the returned `Gauge` instance is not useful except in testing, as the gauge is already set up to track a value automatically upon registration.\\n\\n== Why is My Gauge Reporting NaN or Disappearing?\\n\\nIt is your responsibility to hold a strong reference to the state object that you are measuring with a `Gauge`. Micrometer is careful to not create strong references to objects that would otherwise be garbage collected. Once the object being gauged is de-referenced and is garbage collected, Micrometer starts reporting a NaN or nothing for a gauge, depending on the registry implementation.\\n\\nIf you see your gauge reporting for a few minutes and then disappearing or reporting NaN, it almost certainly suggests that the underlying object being gauged has been garbage collected.\\n\\n== `TimeGauge`\\n\\n`TimeGauge` is a specialized gauge that tracks a time value, to be scaled to the base unit of time expected by each registry implementation.\\n\\n`TimeGauge` can be registered with `TimeUnit` as follows:\\n\\n[source, java]\\n----\\nAtomicInteger msTimeGauge = new AtomicInteger(4000);\\nAtomicInteger usTimeGauge = new AtomicInteger(4000);\\nTimeGauge.builder(\\\"my.gauge\\\", msTimeGauge, TimeUnit.MILLISECONDS, AtomicInteger::get).register(registry);\\nTimeGauge.builder(\\\"my.other.gauge\\\", usTimeGauge, TimeUnit.MICROSECONDS, AtomicInteger::get).register(registry);\\n----\\n\\nAnd for example, if the registry is Prometheus, they will be converted in seconds as follows:\\n\\n```\\n# HELP my_gauge_seconds\\n# TYPE my_gauge_seconds gauge\\nmy_gauge_seconds 4.0\\n# HELP my_other_gauge_seconds\\n# TYPE my_other_gauge_seconds gauge\\nmy_other_gauge_seconds 0.004\\n```\\n\\n== Multi-gauge\\n\\nMicrometer supports one last special type of `Gauge`, called a `MultiGauge`, to help manage gauging a growing or shrinking list of criteria.\\nThis feature lets you select a set of well-bounded but slightly changing set of criteria from something like an SQL query and report some metric for each row as a `Gauge`. The following example creates a `MultiGauge`:\\n\\n[source, java]\\n----\\n// SELECT count(*) from job group by status WHERE job = 'dirty'\\nMultiGauge statuses = MultiGauge.builder(\\\"statuses\\\")\\n .tag(\\\"job\\\", \\\"dirty\\\")\\n .description(\\\"The number of widgets in various statuses\\\")\\n .baseUnit(\\\"widgets\\\")\\n .register(registry);\\n\\n...\\n\\n// run this periodically whenever you re-run your query\\nstatuses.register(\\n resultSet.stream()\\n .map(result -> Row.of(Tags.of(\\\"status\\\", result.getAsString(\\\"status\\\")), result.getAsInt(\\\"count\\\")))\\n .collect(toList())\\n);\\n----\\n\\n:leveloffset!:\\n\\n== Timers\\n\\n:leveloffset: +1\\n\\nTimers are intended for measuring short-duration latencies and the frequency of such events. All implementations of `Timer` report at least the total time and the count of events as separate time series. While you can use timers for other use cases, note that negative values are not supported, and recording many longer durations could cause overflow of the total time at `Long.MAX_VALUE` nanoseconds (292.3 years).\\n\\nAs an example, consider a graph showing request latency to a typical web server. The server can be expected to respond to many requests quickly, so the timer gets updated many times per second.\\n\\nThe appropriate base unit for timers varies by metrics backend, and for good reason. Micrometer is decidedly un-opinionated about this. However, because of the potential for confusion, Micrometer requires a `TimeUnit` when interacting with `Timer` implementations. Micrometer is aware of the preferences of each implementation and publishes your timing in the appropriate base unit based on the implementation. The following listing shows part of the `Timer` interface:\\n\\n[source,java]\\n----\\npublic interface Timer extends Meter {\\n ...\\n void record(long amount, TimeUnit unit);\\n void record(Duration duration);\\n double totalTime(TimeUnit unit);\\n}\\n----\\n\\nThe interface contains a fluent builder for timers:\\n\\n[source,java]\\n----\\nTimer timer = Timer\\n .builder(\\\"my.timer\\\")\\n .description(\\\"a description of what this timer does\\\") // optional\\n .tags(\\\"region\\\", \\\"test\\\") // optional\\n .register(registry);\\n----\\n\\nNOTE: The maximum statistical value for basic `Timer` implementations, such as `CumulativeTimer` and `StepTimer`, is a time window maximum (`TimeWindowMax`).\\nIt means that its value is the maximum value during a time window.\\nIf no new values are recorded for the time window length, the max is reset to 0 as a new time window starts.\\nTime window size is the step size of the meter registry, unless expiry in `DistributionStatisticConfig` is explicitly set to other value.\\nA time window maximum is used to capture maximum latency in a subsequent interval after heavy resource pressure triggers the latency and prevents metrics from being published.\\nPercentiles are also time window percentiles (`TimeWindowPercentileHistogram`).\\n\\n== Recording Blocks of Code\\n\\nThe `Timer` interface exposes several convenience overloads for recording timings inline, including the following:\\n\\n[source,java]\\n----\\ntimer.record(() -> dontCareAboutReturnValue());\\ntimer.recordCallable(() -> returnValue());\\n\\nRunnable r = timer.wrap(() -> dontCareAboutReturnValue()); <1>\\nCallable c = timer.wrap(() -> returnValue());\\n----\\n<1> Wrap `Runnable` or `Callable` and return the instrumented version of it for use later.\\n\\nNOTE: A `Timer` is really a specialized distribution summary that is aware of how to scale durations to the base unit of time of each monitoring system and has an automatically\\ndetermined base unit. In every case where you want to measure time, you should use a `Timer` rather than a `DistributionSummary`.\\n\\n== Storing Start State in `Timer.Sample`\\n\\nYou may also store start state in a sample instance that can be stopped later. The sample records a start time based on the registry's clock. After starting a sample, execute the code to be timed and finish the operation by calling `stop(Timer)` on the sample:\\n\\n[source, java]\\n----\\nTimer.Sample sample = Timer.start(registry);\\n\\n// do stuff\\nResponse response = ...\\n\\nsample.stop(registry.timer(\\\"my.timer\\\", \\\"response\\\", response.status()));\\n----\\n\\nNote how we do not decide the timer to which to accumulate the sample until it is time to stop the sample. This lets us dynamically determine certain tags from the end state of the operation we are timing.\\n\\n== The `@Timed` annotation\\n\\nThe `micrometer-core` modules contains a `@Timed` annotation that frameworks can use to add timing support to either specific types of methods such as those serving web request endpoints or, more generally, to all methods.\\n\\nWARNING: Micrometer's Spring Boot configuration does _not_ recognize `@Timed` on arbitrary methods.\\n\\nAlso, an incubating AspectJ aspect is included in `micrometer-core`. You can use it in your application either through compile/load time AspectJ weaving or through framework facilities that interpret AspectJ aspects and proxy targeted methods in some other way, such as Spring AOP. Here is a sample Spring AOP configuration:\\n\\n[source,java]\\n----\\n@Configuration\\npublic class TimedConfiguration {\\n @Bean\\n public TimedAspect timedAspect(MeterRegistry registry) {\\n return new TimedAspect(registry);\\n }\\n}\\n----\\n\\nApplying `TimedAspect` makes `@Timed` usable on any arbitrary method in an AspectJ proxied instance, as the following example shows:\\n\\n[source,java]\\n----\\n@Service\\npublic class ExampleService {\\n\\n @Timed\\n public void sync() {\\n // @Timed will record the execution time of this method,\\n // from the start and until it exits normally or exceptionally.\\n ...\\n }\\n\\n @Async\\n @Timed\\n public CompletableFuture<?> async() {\\n // @Timed will record the execution time of this method,\\n // from the start and until the returned CompletableFuture\\n // completes normally or exceptionally.\\n return CompletableFuture.supplyAsync(...);\\n }\\n\\n}\\n----\\n\\n=== @MeterTag on Method Parameters\\n\\nTo support `@MeterTag` annotation on method parameters you need to configure the `@TimedAspect` to add the `MeterTagAnnotationHandler`.\\n\\n[source,java,subs=+attributes]\\n-----\\nValueResolver valueResolver = parameter -> \\\"Value from myCustomTagValueResolver [\\\" + parameter + \\\"]\\\";\\n\\n// Example of a ValueExpressionResolver that uses Spring Expression Language\\nValueExpressionResolver valueExpressionResolver = new SpelValueExpressionResolver();\\n\\n\\n// Setting the handler on the aspect\\ntimedAspect.setMeterTagAnnotationHandler(\\n new MeterTagAnnotationHandler(aClass -> valueResolver, aClass -> valueExpressionResolver));\\n-----\\n\\nLet's assume that we have the following interface.\\n\\n[source,java,subs=+attributes]\\n-----\\ninterface MeterTagClassInterface {\\n\\n @Timed\\n void getAnnotationForTagValueResolver(@MeterTag(key = \\\"test\\\", resolver = ValueResolver.class) String test);\\n\\n @Timed\\n void getAnnotationForTagValueExpression(\\n @MeterTag(key = \\\"test\\\", expression = \\\"'hello' + ' characters'\\\") String test);\\n\\n @Timed\\n void getAnnotationForArgumentToString(@MeterTag(\\\"test\\\") Long param);\\n\\n}\\n-----\\n\\nWhen its implementations would be called with different arguments (remember that the implementation needs to be annotated with `@Timed` annotation too) the following timers would be created:\\n\\n[source,java,subs=+attributes]\\n-----\\n// Example for returning <toString()> on the parameter\\nservice.getAnnotationForArgumentToString(15L);\\n\\nassertThat(registry.get(\\\"method.timed\\\").tag(\\\"test\\\", \\\"15\\\").timer().count()).isEqualTo(1);\\n\\n// Example for calling the provided <ValueResolver> on the parameter\\nservice.getAnnotationForTagValueResolver(\\\"foo\\\");\\n\\nassertThat(registry.get(\\\"method.timed\\\")\\n .tag(\\\"test\\\", \\\"Value from myCustomTagValueResolver [foo]\\\")\\n .timer()\\n .count()).isEqualTo(1);\\n\\n// Example for calling the provided <ValueExpressionResolver>\\nservice.getAnnotationForTagValueExpression(\\\"15L\\\");\\n\\nassertThat(registry.get(\\\"method.timed\\\").tag(\\\"test\\\", \\\"hello characters\\\").timer().count()).isEqualTo(1);\\n-----\\n\\n== Function-tracking Timers\\n\\nMicrometer also provides a more infrequently used timer pattern that tracks two monotonically increasing functions (a function that stays the same or increases over time but never decreases): a count function and a total time function. Some monitoring systems, such as Prometheus, push cumulative values for counters (which apply to both the count and total time functions in this case) to the backend, but others publish the rate at which a counter increments over the push interval. By employing this pattern, you let the Micrometer implementation for your monitoring system choose whether to rate normalize the timer, and your timer remains portable across different types of monitoring systems.\\n\\n[source, java]\\n-----\\nIMap<?, ?> cache = ...; // suppose we have a Hazelcast cache\\nregistry.more().timer(\\\"cache.gets.latency\\\", Tags.of(\\\"name\\\", cache.getName()), cache,\\n c -> c.getLocalMapStats().getGetOperationCount(), <1>\\n c -> c.getLocalMapStats().getTotalGetLatency(),\\n TimeUnit.NANOSECONDS <2>\\n);\\n-----\\n\\n<1> `getGetOperationCount()` is a monotonically increasing function incrementing with every cache get from the beginning of its life.\\n<2> This represents the unit of time represented by `getTotalGetLatency()`. Each registry implementation specifies what its expected base unit of time is, and the total time reported will be scaled to this value.\\n\\nThe function-tracking timer, in concert with the monitoring system's rate normalizing functionality (whether this is an artifact of the query language or the way data is pushed to the system), adds a layer of richness to the cumulative value of the functions themselves. You can reason about the _rate_ of throughput and latency, whether that rate is within an acceptable bound, is increasing or decreasing over time, and so on.\\n\\nWARNING: Micrometer cannot guarantee the monotonicity of the count and total time functions for you. By using this signature, you are asserting their monotonicity based on what you know about their definitions.\\n\\nThere is also a fluent builder for function timers on the `FunctionTimer` interface itself, providing access to less frequently used options, such as base units and description. You can register the timer as the last step of its construction by calling `register(MeterRegistry)`:\\n\\n[source, java]\\n----\\nIMap<?, ?> cache = ...\\n\\nFunctionTimer.builder(\\\"cache.gets.latency\\\", cache,\\n c -> c.getLocalMapStats().getGetOperationCount(),\\n c -> c.getLocalMapStats().getTotalGetLatency(),\\n TimeUnit.NANOSECONDS)\\n .tags(\\\"name\\\", cache.getName())\\n .description(\\\"Cache gets\\\")\\n .register(registry);\\n----\\n\\n== Pause Detection\\n\\nMicrometer uses the `LatencyUtils` package to compensate for https://highscalability.com/blog/2015/10/5/your-load-generator-is-probably-lying-to-you-take-the-red-pi.html[coordinated omission] -- extra latency arising from system and VM pauses that skew your latency statistics downward. Distribution statistics, such as percentiles and SLO counts, are influenced by a pause detector implementation that adds additional latency here and there to compensate for pauses.\\n\\nMicrometer supports two pause detector implementations: a clock-drift based detector and a no-op detector. Before Micrometer 1.0.10/1.1.4/1.2.0, a clock-drift detector was configured by default to report as-accurate-as-possible metrics without further configuration. Since 1.0.10/1.1.4/1.2.0, the no-op detector is configured by default, but the clock-drift detector can be configured as shown in the next example.\\n\\nThe clock-drift based detector has a configurable sleep interval and pause threshold. CPU consumption is inversely proportional to `sleepInterval`, as is pause detection accuracy. 100ms for both values is a reasonable default to offer decent detection of long pause events while consuming a negligible amount of CPU time.\\n\\nYou can customize the pause detector as follows:\\n\\n[source,java]\\n----\\nregistry.config().pauseDetector(new ClockDriftPauseDetector(sleepInterval, pauseThreshold));\\nregistry.config().pauseDetector(new NoPauseDetector());\\n----\\n\\nIn the future, we may provide further detector implementations. Some pauses may be able to be inferred from GC logging in some circumstances, for example, without requiring a constant CPU load, however minimal. Also, a future JDK may provide direct access to pause events.\\n\\n== Memory Footprint Estimation\\n\\nTimers are the most memory-consuming meter, and their total footprint can vary dramatically, depending on which options you choose. The following table of memory consumption is based on the use of various features. These figures assume no tags and a ring buffer length of 3. Adding tags adds somewhat to the total, as does increasing the buffer length. Total storage can also vary somewhat depending on the registry implementation.\\n\\n* R = Ring buffer length. We assume the default of 3 in all examples. R is set with `Timer.Builder#distributionStatisticBufferLength`.\\n* B = Total histogram buckets. Can be SLO boundaries or percentile histogram buckets. By default, timers are clamped to a minimum expected value of 1ms and a maximum expected value of 30 seconds, yielding 66 buckets for percentile histograms, when applicable.\\n* I = Interval estimator for pause compensation. 1.7 kb.\\n* M = Time-decaying max. 104 bytes.\\n* Fb = Fixed boundary histogram. 8b * B * R.\\n* Pp = Percentile precision. By default, it is 1. Generally in the range [0, 3]. Pp is set with `Timer.Builder#percentilePrecision`.\\n* Hdr(Pp) = High dynamic range histogram.\\n - When Pp = 0: 1.9kb * R + 0.8kb\\n - When Pp = 1: 3.8kb * R + 1.1kb\\n - When Pp = 2: 18.2kb * R + 4.7kb\\n - When Pp = 3: 66kb * R + 33kb\\n\\n[width=\\\"80%\\\",options=\\\"header\\\"]\\n|=========================================================\\n|Pause detection |Client-side percentiles |Histogram and/or SLOs |Formula | Example\\n\\n|Yes |No |No |I + M| ~1.8kb\\n|Yes |No |Yes |I + M + Fb|For default percentile histogram, ~7.7kb\\n|Yes |Yes |Yes |I + M + Hdr(Pp)|For the addition of a 0.95 percentile with defaults otherwise, ~14.3kb\\n|No |No |No |M| ~0.1kb\\n|No |No |Yes |M + Fb|For default percentile histogram, ~6kb\\n|No |Yes |Yes |M + Hdr(Pp)|For the addition of a 0.95 percentile with defaults otherwise, ~12.6kb\\n|=========================================================\\n\\nNOTE: For Prometheus, specifically, R is _always_ equal to 1, regardless of how you attempt to configure it through `Timer.Builder`. This special case exists because Prometheus expects cumulative histogram data that never rolls over.\\n\\n:leveloffset!:\\n\\n== Distribution Summaries\\n\\n:leveloffset: +1\\n\\nA distribution summary tracks the distribution of events. It is similar to a timer structurally, but records values that do not represent a unit of time. For example, you could use a distribution summary to measure the payload sizes of requests hitting a server.\\n\\nThe following example creates a distribution summary:\\n\\n[source, java]\\n----\\nDistributionSummary summary = registry.summary(\\\"response.size\\\");\\n----\\n\\nThe interface contains a fluent builder for distribution summaries:\\n\\n[source, java]\\n----\\nDistributionSummary summary = DistributionSummary\\n .builder(\\\"response.size\\\")\\n .description(\\\"a description of what this summary does\\\") // optional\\n .baseUnit(\\\"bytes\\\") // optional <1>\\n .tags(\\\"region\\\", \\\"test\\\") // optional\\n .scale(100) // optional <2>\\n .register(registry);\\n----\\n\\n<1> Add base units for maximum portability. Base units are part of the naming convention for some monitoring systems. Leaving it off and violating the naming convention has no adverse effect if you forget.\\n<2> Optionally, you can provide a scaling factor by which each recorded sample is multiplied as it is recorded.\\n\\nNOTE: The maximum (which is named `max`) for basic `DistributionSummary` implementations, such as `CumulativeDistributionSummary` and `StepDistributionSummary`, is a time window maximum (`TimeWindowMax`).\\nIt means that its value is the maximum value during a time window.\\nIf no new values are recorded for the time window length, the maximum is reset to 0 as a new time window starts.\\nTime window size is the step size of the meter registry, unless expiry in `DistributionStatisticConfig` is explicitly set to another value.\\nA time window max is used to capture the maximum latency in a subsequent interval after heavy resource pressure triggers the latency and prevents metrics from being published.\\nPercentiles are also time window percentiles (`TimeWindowPercentileHistogram`).\\n\\n== Scaling and Histograms\\n\\nMicrometer's preselected percentile histogram buckets are all integers from 1 to `Long.MAX_VALUE`. Currently, `minimumExpectedValue` and `maximumExpectedValue` serve to control the cardinality of the bucket set. If we try to detect that your min/max yields a small range and scale the preselected bucket domain to your summary's range, we do not have another lever to control bucket cardinality.\\n\\nInstead, if your summary's domain is more constrained, scale your summary's range by a fixed factor. The use case we have heard so far is for summaries of ratios whose domain is [0,1]. Given that scenario, we can use the following code to create values from 0 to 100:\\n\\n[source,java]\\n----\\nDistributionSummary.builder(\\\"my.ratio\\\").scale(100).register(registry)\\n----\\n\\nThis way, the ratio winds up in the range [0,100] and we can set `maximumExpectedValue` to 100. You can pair this with custom SLO boundaries if you care about particular ratios:\\n\\n[source,java]\\n----\\nDistributionSummary.builder(\\\"my.ratio\\\")\\n .scale(100)\\n .serviceLevelObjectives(70, 80, 90)\\n .register(registry)\\n----\\n\\n\\n== Memory Footprint Estimation\\n\\nThe total memory footprint of a distribution summary can vary dramatically, depending on which options you choose. The following table of memory consumption is based on the use of various features. These figures assume no tags and a ring buffer length of 3. Adding tags adds somewhat to the total, as does increasing the buffer length. Total storage can also vary somewhat depending on the registry implementation.\\n\\n* R = Ring buffer length. We assume the default of 3 in all examples. R is set with `DistributionSummary.Builder#distributionStatisticBufferLength`.\\n* B = Total histogram buckets. It can be SLO boundaries or percentile histogram buckets. By default, summaries have NO minimum and maximum expected value, so we ship all 276 predetermined histogram buckets. You should always clamp distribution summaries with a `minimumExpectedValue` and `maximumExpectedValue` when you intend to ship percentile histograms.\\n* M = Time-decaying max. 104 bytes.\\n* Fb = Fixed boundary histogram. 8b * B * R.\\n* Pp = Percentile precision. By default, it is 1. It is generally in the range of [0, 3]. Pp is set with `DistributionSummary.Builder#percentilePrecision`.\\n* Hdr(Pp) = High dynamic range histogram.\\n - When Pp = 0: 1.9kb * R + 0.8kb\\n - When Pp = 1: 3.8kb * R + 1.1kb\\n - When Pp = 2: 18.2kb * R + 4.7kb\\n - When Pp = 3: 66kb * R + 33kb\\n\\n\\n[width=\\\"80%\\\",options=\\\"header\\\"]\\n|=========================================================\\n|Client-side percentiles |Histogram and/or SLOs |Formula | Example\\n\\n|No |No |M| ~0.1kb\\n|No |Yes |M + Fb|For percentile histogram clamped to 66 buckets, ~6kb\\n|Yes |Yes |M + Hdr(Pp)|For the addition of a 0.95 percentile with defaults otherwise, ~12.6kb\\n|=========================================================\\n\\nNOTE: For Prometheus, R is _always_ equal to 1, regardless of how you attempt to configure it through `DistributionSummary.Builder`. This special case exists for Prometheus because it expects cumulative histogram data that never rolls over.\\n\\n:leveloffset!:\\n\\n== Long Task Timers\\n\\n:leveloffset: +1\\n\\nThe long task timer is a special type of timer that lets you measure time while an event being measured is *still running*. A normal Timer only records the duration *after* the task is complete.\\n\\nLong task timers publish at least the following statistics:\\n\\n* Active task count\\n* Total duration of active tasks\\n* The maximum duration of active tasks\\n\\nUnlike a regular `Timer`, a long task timer does not publish statistics about completed tasks.\\n\\nConsider a background process to refresh metadata from a data store. For example, https://github.com/Netflix/edda[Edda] caches AWS resources, such as instances, volumes, auto-scaling groups, and others. Normally all data can be refreshed in a few minutes. If the AWS services have problems, it can take much longer. A long task timer can be used to track the active time for refreshing the metadata.\\n\\nFor example, in a Spring application, it is common for such long running processes to be implemented with `@Scheduled`. Micrometer provides a special `@Timed` annotation for instrumenting these processes with a long task timer:\\n\\n[source, java]\\n----\\n@Timed(value = \\\"aws.scrape\\\", longTask = true)\\n@Scheduled(fixedDelay = 360000)\\nvoid scrapeResources() {\\n // find instances, volumes, auto-scaling groups, etc...\\n}\\n----\\n\\nIt is up to the application framework to make something happen with `@Timed`. If your framework of choice does not support it, you can still use the long task timer:\\n\\n[source, java]\\n----\\nLongTaskTimer scrapeTimer = registry.more().longTaskTimer(\\\"scrape\\\");\\nvoid scrapeResources() {\\n scrapeTimer.record(() => {\\n // find instances, volumes, auto-scaling groups, etc...\\n });\\n}\\n----\\n\\nIf we wanted to alert when this process exceeds a threshold, with a long task timer, we receive that alert at the first reporting interval after we have exceeded the threshold. With a regular timer, we would not receive the alert until the first reporting interval after the process completed, over an hour later!\\n\\nThe interface contains a fluent builder for long task timers:\\n\\n[source, java]\\n----\\nLongTaskTimer longTaskTimer = LongTaskTimer\\n .builder(\\\"long.task.timer\\\")\\n .description(\\\"a description of what this timer does\\\") // optional\\n .tags(\\\"region\\\", \\\"test\\\") // optional\\n .register(registry);\\n----\\n\\n:leveloffset!:\\n\\n== Histograms and Percentiles\\n\\n:leveloffset: +1\\n\\nTimers and distribution summaries support collecting data to observe their percentile distributions. There are two main approaches to viewing percentiles:\\n\\n* *Percentile histograms*: Micrometer accumulates values to an underlying histogram and ships a predetermined set of buckets to the monitoring system. The monitoring system's query language is responsible for calculating percentiles off of this histogram. Currently, only Prometheus, Atlas, and Wavefront support histogram-based percentile approximations, through `histogram_quantile`, `:percentile`, and `hs()`, respectively. If you target Prometheus, Atlas, or Wavefront, prefer this approach, since you can aggregate the histograms across dimensions (by summing the values of the buckets across a set of dimensions) and derive an aggregable percentile from the histogram.\\n* *Client-side percentiles*: Micrometer computes a percentile approximation for each meter ID (set of name and tags) and ships the percentile value to the monitoring system. This is not as flexible as a percentile histogram because it is not possible to aggregate percentile approximations across tags. Nevertheless, it provides some level of insight into percentile distributions for monitoring systems that do not support server-side percentile calculation based on a histogram.\\n\\nThe following example builds a timer with a histogram:\\n\\n[source,java]\\n----\\nTimer.builder(\\\"my.timer\\\")\\n .publishPercentiles(0.5, 0.95) // median and 95th percentile <1>\\n .publishPercentileHistogram() // <2>\\n .serviceLevelObjectives(Duration.ofMillis(100)) // <3>\\n .minimumExpectedValue(Duration.ofMillis(1)) // <4>\\n .maximumExpectedValue(Duration.ofSeconds(10))\\n----\\n\\n<1> `publishPercentiles`: Used to publish percentile values computed in your application. These values are non-aggregable across dimensions.\\n<2> `publishPercentileHistogram`: Used to publish a histogram suitable for computing aggregable (across dimensions) percentile approximations in Prometheus (by using `histogram_quantile`), Atlas (by using `:percentile`), and Wavefront (by using `hs()`). For Prometheus and Atlas, the buckets in the resulting histogram are preset by Micrometer based on a generator that has been determined empirically by Netflix to yield a reasonable error bound on most real world timers and distribution summaries. By default, the generator yields 276 buckets, but Micrometer includes only those that are within the range set by `minimumExpectedValue` and `maximumExpectedValue`, inclusive. Micrometer clamps timers by default to a range of 1 millisecond to 1 minute, yielding 73 histogram buckets per timer dimension. `publishPercentileHistogram` has no effect on systems that do not support aggregable percentile approximations. No histogram is shipped for these systems.\\n<3> `serviceLevelObjectives`: Used to publish a cumulative histogram with buckets defined by your SLOs. When used in concert with `publishPercentileHistogram` on a monitoring system that supports aggregable percentiles, this setting adds additional buckets to the published histogram. When used on a system that does not support aggregable percentiles, this setting causes a histogram to be published with only these buckets.\\n<4> `minimumExpectedValue`/`maximumExpectedValue`: Controls the number of buckets shipped by `publishPercentileHistogram` and controls the accuracy and memory footprint of the underlying HdrHistogram structure.\\n\\nSince shipping percentiles to the monitoring system generates additional time series, it is generally preferable to *not* configure them in core libraries that are included as dependencies in applications. Instead, applications can turn on this behavior for some set of timers and distribution summaries by using a meter filter.\\n\\nFor example, suppose we have a handful of timers in a common library. We have prefixed these timer names with `myservice`:\\n\\n[source,java]\\n----\\nregistry.timer(\\\"myservice.http.requests\\\").record(..);\\nregistry.timer(\\\"myservice.db.requests\\\").record(..);\\n----\\n\\nWe can turn on client-side percentiles for both timers by using a meter filter:\\n\\n[source,java]\\n----\\nregistry.config().meterFilter(\\n new MeterFilter() {\\n @Override\\n public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) {\\n if(id.getName().startsWith(\\\"myservice\\\")) {\\n return DistributionStatisticConfig.builder()\\n .percentiles(0.95)\\n .build()\\n .merge(config);\\n }\\n return config;\\n }\\n });\\n----\\n\\n:leveloffset!:\\n\"","export default __webpack_public_path__ + \"439c0eea1918ef143002cf62a9393e2a.png\";","export default __webpack_public_path__ + \"594dce115710525d7771ebe3ab82db19.png\";","export default __webpack_public_path__ + \"5cdb40b089820639454d90a5e4874aee.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\nMicrometer provides several binders for monitoring the JVM:\\n\\n[source, java]\\n----\\nnew ClassLoaderMetrics().bindTo(registry); <1>\\nnew JvmMemoryMetrics().bindTo(registry); <2>\\nnew JvmGcMetrics().bindTo(registry); <3>\\nnew ProcessorMetrics().bindTo(registry); <4>\\nnew JvmThreadMetrics().bindTo(registry); <5>\\n----\\n<1> Gauges loaded and unloaded classes.\\n<2> Gauges buffer and memory pool utilization.\\n<3> Gauges max and live data size, promotion and allocation rates, and times GC pauses (or concurrent phase time in the case of CMS).\\n<4> Gauges current CPU total and load average.\\n<5> Gauges thread peak, number of daemon threads, and live threads.\\n\\nMicrometer also provides a meter binder for `ExecutorService`. You can instrument your `ExecutorService` as follows:\\n\\n[source, java]\\n----\\nnew ExecutorServiceMetrics(executor, executorServiceName, tags).bindTo(registry);\\n----\\n\\nMetrics created from the binder vary based on the type of `ExecutorService`.\\n\\nFor `ThreadPoolExecutor`, the following metrics are provided:\\n\\n* `executor.completed` (`FunctionCounter`): The approximate total number of tasks that have completed execution.\\n* `executor.active` (`Gauge`): The approximate number of threads that are actively executing tasks.\\n* `executor.queued` (`Gauge`): The approximate number of tasks that are queued for execution.\\n* `executor.pool.size` (`Gauge`): The current number of threads in the pool.\\n\\nFor `ForkJoinPool`, the following metrics are provided:\\n\\n* `executor.steals` (`FunctionCounter`): Estimate of the total number of tasks stolen from one thread's work queue by\\nanother. The reported value underestimates the actual total number of steals when the pool is not quiescent.\\n* `executor.queued` (`Gauge`): An estimate of the total number of tasks currently held in queues by worker threads.\\n* `executor.active` (`Gauge`): An estimate of the number of threads that are currently stealing or executing tasks.\\n* `executor.running` (`Gauge`): An estimate of the number of worker threads that are not blocked but are waiting to join tasks or for other managed synchronization threads.\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\nMicrometer supports binding metrics to a variety of different popular caching libraries. Each implementation supports basic features, such as cache hits versus misses, from which you can derive basic information about the cache hit ratio over a period of time. Micrometer uses a function tracking counter to monitor such things as hits and misses, giving you a notion not only of hits and misses over the total life of the cache (the basic metric exposed from Guava's `CacheStats`, for example) but hits and misses inside a given interval.\\n\\nTo demonstrate the features of cache monitoring, we start with a simple program that uses `reactor-netty` to read the entirety of Mary Shelley's _Frankenstein_ and put each word in the cache if it has not yet been seen:\\n\\n====\\n[source,java]\\n----\\n// read all of Frankenstein\\nHttpClient.create(\\\"www.gutenberg.org\\\")\\n .get(\\\"/cache/epub/84/pg84.txt\\\")\\n .flatMapMany(res -> res.addHandler(wordDecoder()).receive().asString())\\n .delayElements(Duration.ofMillis(10)) // one word per 10 ms\\n .filter(word -> !word.isEmpty())\\n .doOnNext(word -> {\\n if (cache.getIfPresent(word) == null)\\n cache.put(word, 1);\\n })\\n .blockLast();\\n----\\n====\\n\\nThe following image shows the hits versus misses on a cache that has been tuned to hold a maximum of 10,000 entries:\\n\\n.Hits vs. misses, viewed in Prometheus\\nimage::\" + require(\"!file-loader!./img/prometheus-guava-cache.png\") + \"[Hits vs. misses,width=800]\\n\\n```\\nrate(book_guava_requests_total[10s])\\n```\\n\\nBy dividing the hits by the sum of all `get` operations (regardless of whether or not each one was a hit or a miss), we can arrive at a notion of the upper bound for the hit ratio for reading Frankenstein with only 10,000 words:\\n\\n.Hit ratio, viewed by Prometheus\\nimage::\" + require(\"!file-loader!./img/prometheus-guava-cache-ratio.png\") + \"[Hit ratio,width=800]\\n\\n```\\nsum(rate(book_guava_requests_total{result=\\\"hit\\\"}[1m])) / sum(rate(book_guava_requests_total[1m]))\\n```\\n\\nIn a real-world scenario, we tune caches according to how we evaluate the tradeoff between storage and load efficiency. You could create an alert based on some upper bound for the rate at which misses occur or on a lower bound for the hit ratio. Setting an upper bound on miss ratio is better than a lower bound on hit ratio. For both ratios, an absence of any activity drops the value to 0.\\nThe following image shows the miss ratio when it exceeds 10%:\\n\\n.Alerting when the miss ratio exceeds 10%\\nimage::\" + require(\"!file-loader!./img/grafana-guava-miss-ratio.png\") + \"[Miss ratio (alerted),width=800]\\n\"","export default __webpack_public_path__ + \"fd12bde9dc50409da244eb7ba80f6548.png\";","export default __webpack_public_path__ + \"aa70057042488eef46660369434e99d4.png\";","export default __webpack_public_path__ + \"3c191f6ce81fefe9b7d1980fc9d5b4fe.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\nMicrometer supports binding metrics to `OkHttpClient` through `EventListener`.\\n\\nYou can collect metrics from `OkHttpClient` by adding `OkHttpMetricsEventListener` as follows:\\n\\n[source,java]\\n----\\nOkHttpClient client = new OkHttpClient.Builder()\\n .eventListener(OkHttpMetricsEventListener.builder(registry, \\\"okhttp.requests\\\")\\n .tags(Tags.of(\\\"foo\\\", \\\"bar\\\"))\\n .build())\\n .build();\\n----\\n\\nNOTE: The `uri` tag is usually limited to URI patterns to mitigate tag cardinality explosion, but `OkHttpClient` does not\\nprovide URI patterns. We provide `URI_PATTERN` header to support `uri` tag, or you can configure a URI mapper to provide\\nyour own tag values for `uri` tag.\\n\\nTo configure a URI mapper, you can use `uriMapper()` as follows:\\n\\n[source,java]\\n----\\nOkHttpClient client = new OkHttpClient.Builder()\\n .eventListener(OkHttpMetricsEventListener.builder(registry, \\\"okhttp.requests\\\")\\n .uriMapper(req -> req.url().encodedPath())\\n .tags(Tags.of(\\\"foo\\\", \\\"bar\\\"))\\n .build())\\n .build();\\n----\\n\\nWARNING: The sample might trigger tag cardinality explosion, as a URI path itself is being used for tag values.\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\nMicrometer supports binding metrics to `Jetty` through `Connection.Listener`.\\n\\nYou can collect metrics from `Jetty` by adding `JettyConnectionMetrics` as follows:\\n\\n[source,java]\\n----\\n Server server = new Server(0);\\n Connector connector = new ServerConnector(server);\\n connector.addBean(new JettyConnectionMetrics(registry, connector, Tags.of(\\\"foo\\\", \\\"bar\\\"));\\n server.setConnectors(new Connector[] { connector });\\n----\\n\\nMicrometer also supports binding metrics to `Jersey` through `ApplicationEventListener`.\\n\\nYou can collect metrics from `Jersey` by adding `MetricsApplicationEventListener` as follows:\\n\\n[source,java]\\n----\\nResourceConfig resourceConfig = new ResourceConfig();\\nresourceConfig.register(new MetricsApplicationEventListener(\\n registry,\\n new DefaultJerseyTagsProvider(),\\n \\\"http.server.requests\\\",\\n true));\\nServletContainer servletContainer = new ServletContainer(resourceConfig);\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\nMicrometer supports binding metrics to `Netty`.\\n\\nYou can collect metrics from `ByteBuf` allocators and from `EventLoopGroup` instances.\\nInstrumentation can be done once at startup, if resources are already known:\\n\\n[source,java,subs=+attributes]\\n-----\\n// Create or get an existing resources\\nDefaultEventLoopGroup eventExecutors = new DefaultEventLoopGroup();\\nUnpooledByteBufAllocator unpooledByteBufAllocator = new UnpooledByteBufAllocator(false);\\n// Use binders to instrument them\\nnew NettyEventExecutorMetrics(eventExecutors).bindTo(this.registry);\\nnew NettyAllocatorMetrics(unpooledByteBufAllocator).bindTo(this.registry);\\n-----\\n\\nNetty infrastructure can be configured in many ways, so you can also instrument lazily at runtime as resources are used.\\nIf you do so, you must ensure that you will not bind metrics for the same resource multiple times as this can have runtime drawbacks:\\n\\n[source,java,subs=+attributes]\\n-----\\n@Override\\nprotected void initChannel(SocketChannel channel) throws Exception {\\n EventLoop eventLoop = channel.eventLoop();\\n if (!isEventLoopInstrumented(eventLoop)) {\\n new NettyEventExecutorMetrics(eventLoop).bindTo(this.meterRegistry);\\n }\\n ByteBufAllocator allocator = channel.alloc();\\n if (!isAllocatorInstrumented(allocator) && allocator instanceof ByteBufAllocatorMetricProvider) {\\n ByteBufAllocatorMetricProvider allocatorMetric = (ByteBufAllocatorMetricProvider) allocator;\\n new NettyAllocatorMetrics(allocatorMetric).bindTo(this.meterRegistry);\\n }\\n}\\n-----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Passing through to Dropwizard's Console Reporter\\n:toc:\\n\\nThis guide shows how to plug in less commonly used Dropwizard `Reporter` implementations -- in this case, the `ConsoleReporter`.\\n\\n[source,java]\\n----\\n @Bean\\n public MetricRegistry dropwizardRegistry() {\\n return new MetricRegistry();\\n }\\n\\n @Bean\\n public ConsoleReporter consoleReporter(MetricRegistry dropwizardRegistry) {\\n ConsoleReporter reporter = ConsoleReporter.forRegistry(dropwizardRegistry)\\n .convertRatesTo(TimeUnit.SECONDS)\\n .convertDurationsTo(TimeUnit.MILLISECONDS)\\n .build();\\n reporter.start(1, TimeUnit.SECONDS);\\n return reporter;\\n }\\n\\n @Bean\\n public MeterRegistry consoleLoggingRegistry(MetricRegistry dropwizardRegistry) {\\n DropwizardConfig consoleConfig = new DropwizardConfig() {\\n\\n @Override\\n public String prefix() {\\n return \\\"console\\\";\\n }\\n\\n @Override\\n public String get(String key) {\\n return null;\\n }\\n\\n };\\n\\n return new DropwizardMeterRegistry(consoleConfig, dropwizardRegistry, HierarchicalNameMapper.DEFAULT, Clock.SYSTEM) {\\n @Override\\n protected Double nullGaugeValue() {\\n return null;\\n }\\n };\\n }\\n----\\n\\nNote that, in a Spring environment, this registry is added to other implementations in a composite and is used for all metrics, both custom and\\nauto-configured.\\n\\n[source,java]\\n----\\nclass MyComponent {\\n private final MeterRegistry registry;\\n\\n public MyComponent(MeterRegistry registry) {\\n this.registry = registry;\\n }\\n\\n public void doSomeWork(String lowCardinalityInput) {\\n registry.timer(\\\"my.latency\\\", \\\"input\\\", lowCardinalityInput).record(() -> {\\n // do work\\n });\\n }\\n}\\n----\\n\\nThe following listing shows typical output for this custom timer:\\n\\n[source,txt]\\n----\\n3/2/18 10:14:27 AM =============================================================\\n\\n-- Timers ----------------------------------------------------------------------\\nmyLatency.lowCardinalityInput.INPUT\\n count = 1\\n mean rate = 1.02 calls/second\\n 1-minute rate = 0.00 calls/second\\n 5-minute rate = 0.00 calls/second\\n 15-minute rate = 0.00 calls/second\\n min = 100.00 milliseconds\\n max = 100.00 milliseconds\\n mean = 100.00 milliseconds\\n stddev = 0.00 milliseconds\\n median = 100.00 milliseconds\\n 75% <= 100.00 milliseconds\\n 95% <= 100.00 milliseconds\\n 98% <= 100.00 milliseconds\\n 99% <= 100.00 milliseconds\\n 99.9% <= 100.00 milliseconds\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= HttpSender with Resilience4j Retry\\n\\n`HttpSender` is an interface for HTTP clients that are used in meter registries for HTTP-based metrics publication. There\\nare two implementations:\\n\\n* `HttpUrlConnectionSender`: `HttpURLConnection`-based `HttpSender`\\n* `OkHttpSender`: OkHttp-based `HttpSender`\\n\\nThere is no out-of-the-box support for retry, but you can decorate it with Resilience4j retry, as follows:\\n\\n[source,java]\\n----\\n @Bean\\n public DatadogMeterRegistry datadogMeterRegistry(DatadogConfig datadogConfig, Clock clock) {\\n return DatadogMeterRegistry.builder(datadogConfig)\\n .clock(clock)\\n .httpClient(new RetryHttpClient())\\n .build();\\n }\\n\\n private static class RetryHttpClient extends HttpUrlConnectionSender {\\n\\n private final RetryConfig retryConfig = RetryConfig.custom()\\n .maxAttempts(2)\\n .waitDuration(Duration.ofSeconds(5))\\n .build();\\n\\n private final Retry retry = Retry.of(\\\"datadog-metrics\\\", this.retryConfig);\\n\\n @Override\\n public Response send(Request request) {\\n CheckedFunction0<Response> retryableSupplier = Retry.decorateCheckedSupplier(\\n this.retry,\\n () -> super.send(request));\\n return Try.of(retryableSupplier).get();\\n }\\n\\n }\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Custom Meter Registry\\n\\nMicrometer supports popular meter registries out of the box, so you should check those first.\\nFor an existing meter registry, if you think that your requirements are generally useful, consider creating an issue or PR against the Micrometer issue tracker.\\nFor a non-existent meter registry, if it is widely-used, consider creating an issue or PR for it.\\n\\nIf you need to create your own custom meter registry, you can create it by extending one of the base classes for meter registries: `MeterRegistry`, `PushMeterRegistry`, or `StepMeterRegistry`.\\n\\nThe most common way is to extend `StepMeterRegistry`.\\nYou can create your own custom `StepMeterRegistry`.\\n\\nFirst, define your own meter registry configuration by extending `StepRegistryConfig`, as follows:\\n\\n[source,java]\\n----\\npublic interface CustomRegistryConfig extends StepRegistryConfig {\\n\\n CustomRegistryConfig DEFAULT = k -> null;\\n\\n @Override\\n default String prefix() {\\n return \\\"custom\\\";\\n }\\n\\n}\\n----\\n\\nSecond, define your own meter registry by extending `StepMeterRegistry`, as follows:\\n\\n[source,java]\\n----\\npublic class CustomMeterRegistry extends StepMeterRegistry {\\n\\n public CustomMeterRegistry(CustomRegistryConfig config, Clock clock) {\\n super(config, clock);\\n\\n start(new NamedThreadFactory(\\\"custom-metrics-publisher\\\"));\\n }\\n\\n @Override\\n protected void publish() {\\n getMeters().stream().forEach(meter -> System.out.println(\\\"Publishing \\\" + meter.getId()));\\n }\\n\\n @Override\\n protected TimeUnit getBaseTimeUnit() {\\n return TimeUnit.MILLISECONDS;\\n }\\n\\n}\\n----\\n\\nFinally, create the meter registry configuration and the meter registry.\\nIf you use Spring Boot, you can do so as follows:\\n\\n[source,java]\\n----\\n@Configuration\\npublic class MetricsConfig {\\n\\n @Bean\\n public CustomRegistryConfig customRegistryConfig() {\\n return CustomRegistryConfig.DEFAULT;\\n }\\n\\n @Bean\\n public CustomMeterRegistry customMeterRegistry(CustomRegistryConfig customRegistryConfig, Clock clock) {\\n return new CustomMeterRegistry(customRegistryConfig, clock);\\n }\\n\\n}\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Observation\\n:toc:\\n:sectnums:\\n:dimensional: true\\n\\n== Purpose\\n\\nMicrometer Observation is part of the https://github.com/micrometer-metrics/micrometer[Micrometer] project and contains the Observation API. The main idea behind it is that you\\n\\n> Instrument code once, and get multiple benefits out of it\\n\\n== Installing\\n\\nMicrometer comes with a Bill of Materials (BOM) which is a project that manages all the project versions for consistency.\\n\\nThe following example shows the required dependency for Micrometer Observation in Gradle:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation platform('io.micrometer:micrometer-bom:latest.release')\\nimplementation 'io.micrometer:micrometer-observation'\\n----\\n\\nThe following example shows the required dependency in Maven:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependencyManagement>\\n <dependencies>\\n <dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-bom</artifactId>\\n <version>${micrometer.version}</version>\\n <type>pom</type>\\n <scope>import</scope>\\n </dependency>\\n </dependencies>\\n</dependencyManagement>\\n\\n<dependencies>\\n <dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-observation</artifactId>\\n </dependency>\\n</dependencies>\\n----\\n\\n== Introduction\\n\\n:leveloffset: +1\\n\\nFor any Observation to happen, you need to register `ObservationHandler` objects through an `ObservationRegistry`. An `ObservationHandler` reacts only to supported implementations of an `Observation.Context` and can create timers, spans, and logs by reacting to the lifecycle events of an Observation such as\\n\\n* `start` - Observation has been started. Happens when the `Observation#start()` method gets called.\\n* `stop` - Observation has been stopped. Happens when the `Observation#stop()` method gets called.\\n* `error` - An error occurred while observing. Happens when the `Observation#error(exception)` method gets called.\\n* `event` - An event happened when observing. Happens when the `Observation#event(event)` method gets called.\\n* `scope started` - Observation opens a Scope. The Scope must be closed when no longer used. Handlers can create thread local variables on start that are cleared upon closing of the scope. Happens when the `Observation#openScope()` method gets called.\\n* `scope stopped` - Observation stops a Scope. Happens when the `Observation.Scope#close()` method gets called.\\n\\nWhenever any of these methods is called, an `ObservationHandler` method (such as `onStart(T extends Observation.Context ctx)`, `onStop(T extends Observation.Context ctx)`, and so on) is called. To pass state between the handler methods, you can use the `Observation.Context`.\\n\\nThis is how Observation state diagram looks like:\\n\\n[source]\\n----\\n Observation Observation\\n Context Context\\nCreated ----------> Started ----------> Stopped\\n----\\n\\nThis is how Observation Scope state diagram looks like:\\n\\n[source]\\n----\\n Observation\\n Context\\nScope Started ----------> Scope Finished\\n----\\n\\nTo make it possible to debug production problems an Observation needs additional metadata such as key-value pairs (also known as tags). You can then query your metrics or distributed tracing backend by those tags to find the required data. Tags can be either of high or low cardinality.\\n\\nIMPORTANT: *High cardinality* means that a pair will have an unbounded number of possible values. An HTTP URL is a good\\nexample of such a key value (e.g. `/foo/user1234`, `/foo/user2345` etc.). *Low cardinality* means that a key value will have a bounded number of possible values. A *templated* HTTP URL is a good example of such a key value (e.g. `/foo/{userId}`).\\n\\nTo separate Observation lifecycle operations from an Observation configuration (such as names and low and high cardinality tags), you can use the `ObservationConvention` that provides an easy way of overriding the default naming conventions.\\n\\nBelow you can find an example of using the Observation API.\\n\\n[source,java,subs=+attributes]\\n-----\\nstatic class Example {\\n\\n private final ObservationRegistry registry;\\n\\n Example(ObservationRegistry registry) {\\n this.registry = registry;\\n }\\n\\n void run() {\\n Observation.createNotStarted(\\\"foo\\\", registry)\\n .lowCardinalityKeyValue(\\\"lowTag\\\", \\\"lowTagValue\\\")\\n .highCardinalityKeyValue(\\\"highTag\\\", \\\"highTagValue\\\")\\n .observe(() -> System.out.println(\\\"Hello\\\"));\\n }\\n\\n}\\n-----\\n\\nTIP: Calling `observe(() -> ...)` leads to starting the Observation, putting it in scope, running the lambda, putting an error on the Observation if one took place, closing the scope and stopping the Observation.\\n\\n:leveloffset!:\\n\\n== ObservationHandler\\n\\n:leveloffset: +1\\n\\nA popular way to record them is storing the start state in a `Timer.Sample` instance and stopping it when the event has ended.\\nRecording such measurements could look like this:\\n\\n[source,java,subs=+attributes]\\n-----\\nMeterRegistry registry = new SimpleMeterRegistry();\\nTimer.Sample sample = Timer.start(registry);\\ntry {\\n // do some work here\\n}\\nfinally {\\n sample.stop(Timer.builder(\\\"my.timer\\\").register(registry));\\n}\\n-----\\n\\nIf you want to have more observation options (such as metrics and tracing out of the box plus anything else you will plug in) then you'll need to rewrite that code to use the `Observation` API.\\n\\n[source,java,subs=+attributes]\\n-----\\nObservationRegistry registry = ObservationRegistry.create();\\nObservation.createNotStarted(\\\"my.operation\\\", registry).observe(this::doSomeWorkHere);\\n-----\\n\\nOne of the new features in Micrometer 1.10 is the ability to register \\\"handlers\\\" (`ObservationHandler`) that are notified about the lifecycle event of an observation (e.g.: you can run custom code when an observation is started/stopped).\\nUsing this feature lets you add tracing capabilities to your existing metrics instrumentation (see: `DefaultTracingObservationHandler`). The implementation of these handlers does not need to be tracing related, it is completely up to you how you are going to implement them (e.g.: you can add logging capabilities) if you want.\\n\\n=== Observation.Context\\n\\nIn order to pass information between the instrumented code and the handler (or between handler methods, e.g.: `onStart` and `onStop`), you can utilize an `Observation.Context`. An `Observation.Context` is a `Map`-like container that can store values for you while your handler can access the data inside the context.\\n\\n=== ObservationHandler Example\\n\\nBased on this, we can implement a simple handler that lets the users know about its invocations by printing them out to `stdout`.\\n\\n[source,java,subs=+attributes]\\n-----\\nstatic class SimpleHandler implements ObservationHandler<Observation.Context> {\\n\\n @Override\\n public void onStart(Observation.Context context) {\\n System.out.println(\\\"START \\\" + \\\"data: \\\" + context.get(String.class));\\n }\\n\\n @Override\\n public void onError(Observation.Context context) {\\n System.out.println(\\\"ERROR \\\" + \\\"data: \\\" + context.get(String.class) + \\\", error: \\\" + context.getError());\\n }\\n\\n @Override\\n public void onEvent(Observation.Event event, Observation.Context context) {\\n System.out.println(\\\"EVENT \\\" + \\\"event: \\\" + event + \\\" data: \\\" + context.get(String.class));\\n }\\n\\n @Override\\n public void onStop(Observation.Context context) {\\n System.out.println(\\\"STOP \\\" + \\\"data: \\\" + context.get(String.class));\\n }\\n\\n @Override\\n public boolean supportsContext(Observation.Context handlerContext) {\\n // you can decide if your handler should be invoked for this context object or\\n // not\\n return true;\\n }\\n\\n}\\n-----\\n\\nYou need to register the handler to the `ObservationRegistry`.\\n\\n[source,java,subs=+attributes]\\n-----\\nObservationRegistry registry = ObservationRegistry.create();\\nregistry.observationConfig().observationHandler(new SimpleHandler());\\n-----\\n\\nYou can use the `observe` method to instrument your codebase.\\n\\n[source,java,subs=+attributes]\\n-----\\nObservationRegistry registry = ObservationRegistry.create();\\nObservation.Context context = new Observation.Context().put(String.class, \\\"test\\\");\\n// using a context is optional, so you can call createNotStarted without it:\\n// Observation.createNotStarted(name, registry)\\nObservation.createNotStarted(\\\"my.operation\\\", () -> context, registry).observe(this::doSomeWorkHere);\\n-----\\n\\nYou can also take full control of the scoping mechanism.\\n\\n[source,java,subs=+attributes]\\n-----\\nObservationRegistry registry = ObservationRegistry.create();\\nObservation.Context context = new Observation.Context().put(String.class, \\\"test\\\");\\n// using a context is optional, so you can call start without it:\\n// Observation.start(name, registry)\\nObservation observation = Observation.start(\\\"my.operation\\\", () -> context, registry);\\ntry (Observation.Scope scope = observation.openScope()) {\\n doSomeWorkHere();\\n}\\ncatch (Exception ex) {\\n observation.error(ex); // and don't forget to handle exceptions\\n throw ex;\\n}\\nfinally {\\n observation.stop();\\n}\\n-----\\n\\n=== Signaling Errors and Arbitrary Events\\n\\nWhen **instrumenting** code we might want to signal that an error happened or signal that an arbitrary event happened. The observation API lets us do it via it `error` and `event` methods.\\n\\nOne use-case for signaling arbitrary event can be attaching annotations to `Span` for Distributed Tracing but you can also process them however you want in your own handler, e.g.: emit log events based on them.\\n\\n[source,java,subs=+attributes]\\n-----\\nObservationRegistry registry = ObservationRegistry.create();\\nObservation observation = Observation.start(\\\"my.operation\\\", registry);\\ntry (Observation.Scope scope = observation.openScope()) {\\n observation.event(Observation.Event.of(\\\"my.event\\\", \\\"look what happened\\\"));\\n doSomeWorkHere();\\n}\\ncatch (Exception exception) {\\n observation.error(exception);\\n throw exception;\\n}\\nfinally {\\n observation.stop();\\n}\\n-----\\n\\n=== Observation.ObservationConvention Example\\n\\nWhen **instrumenting** code we want to provide sensible defaults for tags but also we want to allow users to easily change those defaults. An `ObservationConvention` interface is a description of what tags and name we should create for an `Observation.Context`. See the full usage example of an instrumentation together with overriding the default tags.\\n\\n[source,java,subs=+attributes]\\n-----\\n\\n/**\\n * A dedicated {@link Observation.Context} used for taxing.\\n */\\nclass TaxContext extends Observation.Context {\\n\\n private final String taxType;\\n\\n private final String userId;\\n\\n TaxContext(String taxType, String userId) {\\n this.taxType = taxType;\\n this.userId = userId;\\n }\\n\\n String getTaxType() {\\n return taxType;\\n }\\n\\n String getUserId() {\\n return userId;\\n }\\n\\n}\\n\\n/**\\n * An example of an {@link ObservationFilter} that will add the key-values to all\\n * observations.\\n */\\nclass CloudObservationFilter implements ObservationFilter {\\n\\n @Override\\n public Observation.Context map(Observation.Context context) {\\n return context.addLowCardinalityKeyValue(KeyValue.of(\\\"cloud.zone\\\", CloudUtils.getZone()))\\n .addHighCardinalityKeyValue(KeyValue.of(\\\"cloud.instance.id\\\", CloudUtils.getCloudInstanceId()));\\n }\\n\\n}\\n\\n/**\\n * An example of an {@link ObservationConvention} that renames the tax related\\n * observations and adds cloud related tags to all contexts. When registered via the\\n * `ObservationRegistry#observationConfig#observationConvention` will override the\\n * default {@link TaxObservationConvention}. If the user provides a custom\\n * implementation of the {@link TaxObservationConvention} and passes it to the\\n * instrumentation, the custom implementation wins.\\n *\\n * In other words\\n *\\n * 1) Custom {@link ObservationConvention} has precedence 2) If no custom convention\\n * was passed and there's a matching {@link GlobalObservationConvention} it will be\\n * picked 3) If there's no custom, nor matching global convention, the default\\n * {@link ObservationConvention} will be used\\n *\\n * If you need to add some key-values regardless of the used\\n * {@link ObservationConvention} you should use an {@link ObservationFilter}.\\n */\\nclass GlobalTaxObservationConvention implements GlobalObservationConvention<TaxContext> {\\n\\n // this will be applicable for all tax contexts - it will rename all the tax\\n // contexts\\n @Override\\n public boolean supportsContext(Observation.Context context) {\\n return context instanceof TaxContext;\\n }\\n\\n @Override\\n public String getName() {\\n return \\\"global.tax.calculate\\\";\\n }\\n\\n}\\n\\n// Interface for an ObservationConvention related to calculating Tax\\ninterface TaxObservationConvention extends ObservationConvention<TaxContext> {\\n\\n @Override\\n default boolean supportsContext(Observation.Context context) {\\n return context instanceof TaxContext;\\n }\\n\\n}\\n\\n/**\\n * Default convention of tags related to calculating tax. If no user one or global\\n * convention will be provided then this one will be picked.\\n */\\nclass DefaultTaxObservationConvention implements TaxObservationConvention {\\n\\n @Override\\n public KeyValues getLowCardinalityKeyValues(TaxContext context) {\\n return KeyValues.of(TAX_TYPE.withValue(context.getTaxType()));\\n }\\n\\n @Override\\n public KeyValues getHighCardinalityKeyValues(TaxContext context) {\\n return KeyValues.of(USER_ID.withValue(context.getUserId()));\\n }\\n\\n @Override\\n public String getName() {\\n return \\\"default.tax.name\\\";\\n }\\n\\n}\\n\\n/**\\n * If micrometer-docs-generator is used, we will automatically generate documentation\\n * for your observations. Check this URL\\n * https://github.com/micrometer-metrics/micrometer-docs-generator#documentation for\\n * setup example and read the {@link ObservationDocumentation} javadocs.\\n */\\nenum TaxObservationDocumentation implements ObservationDocumentation {\\n\\n CALCULATE {\\n @Override\\n public Class<? extends ObservationConvention<? extends Observation.Context>> getDefaultConvention() {\\n return DefaultTaxObservationConvention.class;\\n }\\n\\n @Override\\n public String getContextualName() {\\n return \\\"calculate tax\\\";\\n }\\n\\n @Override\\n public String getPrefix() {\\n return \\\"tax\\\";\\n }\\n\\n @Override\\n public KeyName[] getLowCardinalityKeyNames() {\\n return TaxLowCardinalityKeyNames.values();\\n }\\n\\n @Override\\n public KeyName[] getHighCardinalityKeyNames() {\\n return TaxHighCardinalityKeyNames.values();\\n }\\n };\\n\\n enum TaxLowCardinalityKeyNames implements KeyName {\\n\\n TAX_TYPE {\\n @Override\\n public String asString() {\\n return \\\"tax.type\\\";\\n }\\n }\\n\\n }\\n\\n enum TaxHighCardinalityKeyNames implements KeyName {\\n\\n USER_ID {\\n @Override\\n public String asString() {\\n return \\\"tax.user.id\\\";\\n }\\n }\\n\\n }\\n\\n}\\n\\n/**\\n * Our business logic that we want to observe.\\n */\\nclass TaxCalculator {\\n\\n private final ObservationRegistry observationRegistry;\\n\\n // If the user wants to override the default they can override this. Otherwise,\\n // it will be {@code null}.\\n @Nullable\\n private final TaxObservationConvention observationConvention;\\n\\n TaxCalculator(ObservationRegistry observationRegistry,\\n @Nullable TaxObservationConvention observationConvention) {\\n this.observationRegistry = observationRegistry;\\n this.observationConvention = observationConvention;\\n }\\n\\n void calculateTax(String taxType, String userId) {\\n // Create a new context\\n TaxContext taxContext = new TaxContext(taxType, userId);\\n // Create a new observation\\n TaxObservationDocumentation.CALCULATE\\n .observation(this.observationConvention, new DefaultTaxObservationConvention(), () -> taxContext,\\n this.observationRegistry)\\n // Run the actual logic you want to observe\\n .observe(this::calculateInterest);\\n }\\n\\n private void calculateInterest() {\\n // do some work\\n }\\n\\n}\\n\\n/**\\n * Example of user changing the default conventions.\\n */\\nclass CustomTaxObservationConvention extends DefaultTaxObservationConvention {\\n\\n @Override\\n public KeyValues getLowCardinalityKeyValues(TaxContext context) {\\n return super.getLowCardinalityKeyValues(context)\\n .and(KeyValue.of(\\\"additional.low.cardinality.tag\\\", \\\"value\\\"));\\n }\\n\\n @Override\\n public KeyValues getHighCardinalityKeyValues(TaxContext context) {\\n return KeyValues.of(\\\"this.would.override.the.default.high.cardinality.tags\\\", \\\"value\\\");\\n }\\n\\n @Override\\n public String getName() {\\n return \\\"tax.calculate\\\";\\n }\\n\\n}\\n\\n/**\\n * A utility class to set cloud related arguments.\\n */\\nstatic class CloudUtils {\\n\\n static String getZone() {\\n return \\\"...\\\";\\n }\\n\\n static String getCloudInstanceId() {\\n return \\\"...\\\";\\n }\\n\\n}\\n-----\\n\\nBelow you can find an example of setting the whole code together.\\n\\n[source,java,subs=+attributes]\\n-----\\n// Registry setup\\nObservationRegistry observationRegistry = ObservationRegistry.create();\\n// add metrics\\nSimpleMeterRegistry registry = new SimpleMeterRegistry();\\nobservationRegistry.observationConfig().observationHandler(new DefaultMeterObservationHandler(registry));\\nobservationRegistry.observationConfig().observationConvention(new GlobalTaxObservationConvention());\\n// This will be applied to all observations\\nobservationRegistry.observationConfig().observationFilter(new CloudObservationFilter());\\n\\n// In this case we're overriding the default convention by passing the custom one\\nTaxCalculator taxCalculator = new TaxCalculator(observationRegistry, new CustomTaxObservationConvention());\\n// run the logic you want to observe\\ntaxCalculator.calculateTax(\\\"INCOME_TAX\\\", \\\"1234567890\\\");\\n-----\\n\\n=== Observation Predicates and Filters\\n\\nTo globally disable observations under given conditions you can use an `ObservationPredicate`. To mutate the `Observation.Context` you can use an `ObservationFilter`.\\n\\nTo set these just call `ObservationRegistry#observationConfig()#observationPredicate()` and `ObservationRegistry#observationConfig()#observationFilter()` methods respectively.\\n\\nBelow you can find an example of predicates and filters.\\n\\n[source,java,subs=+attributes]\\n-----\\n// Example using a metrics handler - we need a MeterRegistry\\nMeterRegistry meterRegistry = new SimpleMeterRegistry();\\n\\n// Create an ObservationRegistry\\nObservationRegistry registry = ObservationRegistry.create();\\n// Add predicates and filter to the registry\\nregistry.observationConfig()\\n // ObservationPredicate can decide whether an observation should be\\n // ignored or not\\n .observationPredicate((observationName, context) -> {\\n // Creates a noop observation if observation name is of given name\\n if (\\\"to.ignore\\\".equals(observationName)) {\\n // Will be ignored\\n return false;\\n }\\n if (context instanceof MyContext) {\\n // For the custom context will ignore a user with a given name\\n return !\\\"user to ignore\\\".equals(((MyContext) context).getUsername());\\n }\\n // Will proceed for all other types of context\\n return true;\\n })\\n // ObservationFilter can modify a context\\n .observationFilter(context -> {\\n // We're adding a low cardinality key to all contexts\\n context.addLowCardinalityKeyValue(KeyValue.of(\\\"low.cardinality.key\\\", \\\"low cardinality value\\\"));\\n if (context instanceof MyContext) {\\n // We're mutating a specific type of a context\\n MyContext myContext = (MyContext) context;\\n myContext.setUsername(\\\"some username\\\");\\n // We want to remove a high cardinality key value\\n return myContext.removeHighCardinalityKeyValue(\\\"high.cardinality.key.to.ignore\\\");\\n }\\n return context;\\n })\\n // Example of using metrics\\n .observationHandler(new DefaultMeterObservationHandler(meterRegistry));\\n\\n// Observation will be ignored because of the name\\nthen(Observation.start(\\\"to.ignore\\\", () -> new MyContext(\\\"don't ignore\\\"), registry)).isSameAs(Observation.NOOP);\\n// Observation will be ignored because of the entries in MyContext\\nthen(Observation.start(\\\"not.to.ignore\\\", () -> new MyContext(\\\"user to ignore\\\"), registry))\\n .isSameAs(Observation.NOOP);\\n\\n// Observation will not be ignored...\\nMyContext myContext = new MyContext(\\\"user not to ignore\\\");\\nmyContext.addHighCardinalityKeyValue(KeyValue.of(\\\"high.cardinality.key.to.ignore\\\", \\\"some value\\\"));\\nObservation.createNotStarted(\\\"not.to.ignore\\\", () -> myContext, registry).observe(this::yourCodeToMeasure);\\n// ...and will have the context mutated\\nthen(myContext.getLowCardinalityKeyValue(\\\"low.cardinality.key\\\").getValue()).isEqualTo(\\\"low cardinality value\\\");\\nthen(myContext.getUsername()).isEqualTo(\\\"some username\\\");\\nthen(myContext.getHighCardinalityKeyValues())\\n .doesNotContain(KeyValue.of(\\\"high.cardinality.key.to.ignore\\\", \\\"some value\\\"));\\n-----\\n\\n=== Using Annotations With @Observed\\n\\nIf you have turned on Aspect Oriented Programming (e.g. via `org.aspectj:aspectjweaver`) you can use the `@Observed` annotation to create observations. You can put that annotation either on a method to observe it or a class to observe all methods in it. Let's look at the following example.\\n\\nHere you can see an `ObservedService` that has an annotation on a method.\\n\\n[source,java,subs=+attributes]\\n-----\\nstatic class ObservedService {\\n\\n @Observed(name = \\\"test.call\\\", contextualName = \\\"test#call\\\",\\n lowCardinalityKeyValues = { \\\"abc\\\", \\\"123\\\", \\\"test\\\", \\\"42\\\" })\\n void call() {\\n System.out.println(\\\"call\\\");\\n }\\n\\n}\\n-----\\n\\nThe following test asserts whether the proper observation gets created when a proxied `ObservedService` instance gets called.\\n\\n[source,java,subs=+attributes]\\n-----\\n// create a test registry\\nTestObservationRegistry registry = TestObservationRegistry.create();\\n// add a system out printing handler\\nregistry.observationConfig().observationHandler(new ObservationTextPublisher());\\n\\n// create a proxy around the observed service\\nAspectJProxyFactory pf = new AspectJProxyFactory(new ObservedService());\\npf.addAspect(new ObservedAspect(registry));\\n\\n// make a call\\nObservedService service = pf.getProxy();\\nservice.call();\\n\\n// assert that observation has been properly created\\nTestObservationRegistryAssert.assertThat(registry)\\n .hasSingleObservationThat()\\n .hasBeenStopped()\\n .hasNameEqualTo(\\\"test.call\\\")\\n .hasContextualNameEqualTo(\\\"test#call\\\")\\n .hasLowCardinalityKeyValue(\\\"abc\\\", \\\"123\\\")\\n .hasLowCardinalityKeyValue(\\\"test\\\", \\\"42\\\")\\n .hasLowCardinalityKeyValue(\\\"class\\\", ObservedService.class.getName())\\n .hasLowCardinalityKeyValue(\\\"method\\\", \\\"call\\\").doesNotHaveError();\\n-----\\n\\n:leveloffset!:\\n\\n== Instrumenting\\n\\n:leveloffset: +1\\n\\nIn this section we will see some common examples of reusing existing Micrometer and Micrometer Tracing handlers and context types to do instrumentation.\\n\\nIMPORTANT: Before you decide to instrument a project yourself, please double-check whether it hasn't already been instrumented!\\n\\nTo better understand how you can do instrumentation we need to distinguish two concepts.\\n\\n- Context propagation\\n- Creation of Observations\\n\\n*Context propagation* - we propagate existing context through threads or network. We're using the https://micrometer.io/docs/contextPropagation[Micrometer Context Propagation] library to define the context and to propagate it through threads. We're using dedicated `SenderContext` and `ReceiverContext` objects, together with Micrometer Tracing handlers, to create Observations that will propagate context over the wire.\\n\\n*Creation of Observations* - we want to wrap an operation in an Observation to get measurements. We need to know if there previously has been a parent Observation to maintain the parent-child relationship of Observations.\\n\\n[[instrumentation_of_thread_switching_components]]\\n== Instrumentation of Thread Switching Components\\n\\nWe might want to create an Observation around a `Runnable` or `Callable` that we're submitting through an `Executor`. For that to work we need to know if in the parent thread there was an Observation that the new thread should continue, or for which a child Observation should be created.\\n\\nLet's look at the following example.\\n\\n[source,java,subs=+attributes]\\n-----\\n// Example of an Executor Service\\nExecutorService executor = Executors.newCachedThreadPool();\\n\\n\\n// This snippet shows an example of how to wrap in an observation code that would\\n// be executed in a separate thread\\n\\n// Let's assume that we have a parent observation\\nObservation parent = Observation.createNotStarted(\\\"parent\\\", registry);\\n// Observation is put in scope via the <observe()> method\\nFuture<Boolean> child = parent.observe(() -> {\\n // [Thread 1] Current Observation is the same as <parent>\\n then(registry.getCurrentObservation()).isSameAs(parent);\\n // [Thread 1] We're wrapping the executor in a Context Propagating version.\\n // <ContextExecutorService> comes from Context Propagation library\\n return ContextExecutorService.wrap(executor).submit(() -> {\\n // [Thread 2] Current Observation is same as <parent> - context got\\n // propagated\\n then(registry.getCurrentObservation()).isSameAs(parent);\\n // Wraps the code that should be run in a separate thread in an\\n // observation\\n return Observation.createNotStarted(\\\"child\\\", registry).observe(this::yourCodeToMeasure);\\n });\\n});\\n-----\\n\\n[[instrumentation_of_reactive_libraries]]\\n== Instrumentation of Reactive Libraries\\n\\nIn this section we'll discuss how to wrap Reactive libraries in Observations and how to use Reactor Context to safely propagate Observations between threads.\\n\\n[[instrumentation_of_reactive_libraries_after_reactor_3_5_3]]\\n=== For Reactor 3.5.3 and After\\n\\nIn Reactor 3.5.3 release (through this https://github.com/reactor/reactor-core/pull/3335[PR]) an option to turn on automated context propagation was added. To use this, please ensure that you're using the following projects at minimum in the following versions:\\n\\n- Reactor https://github.com/reactor/reactor-core/releases/tag/v3.5.7[3.5.7]\\n- Micrometer Context-Propagation https://github.com/micrometer-metrics/context-propagation/releases/tag/v1.0.3[1.0.3]\\n- Micrometer https://github.com/micrometer-metrics/micrometer/releases/tag/v1.10.8[1.10.8]\\n- Micrometer Tracing https://github.com/micrometer-metrics/tracing/releases/tag/v1.0.7[1.0.7]\\n\\nTo use the feature call the new Reactor's Hook method (e.g. in your `public static void main` method) like this\\n\\n[source,java,subs=+attributes]\\n-----\\nHooks.enableAutomaticContextPropagation();\\n-----\\n\\nThis will automatically wrap Reactor internal mechanisms to propagate context between operators, threads etc. Usage of `tap` and `handle` or Context Propagation API is not required.\\n\\nLet's look at the following example.\\n\\n[source,java,subs=+attributes]\\n-----\\n// This snippet shows an example of how to use the new Hook API with Reactor\\nHooks.enableAutomaticContextPropagation();\\n// Starting from Micrometer 1.10.8 you need to set your registry on this singleton\\n// instance of OTLA\\nObservationThreadLocalAccessor.getInstance().setObservationRegistry(registry);\\n\\n// Let's assume that we have a parent observation\\nObservation parent = Observation.start(\\\"parent\\\", registry);\\n// Now we put it in thread local\\nparent.scoped(() -> {\\n\\n // Example of propagating whatever there was in thread local\\n Integer block = Mono.just(1).publishOn(Schedulers.boundedElastic()).doOnNext(integer -> {\\n log.info(\\\"Context Propagation happens - the <parent> observation gets propagated [\\\"\\n + registry.getCurrentObservation() + \\\"]\\\");\\n then(registry.getCurrentObservation()).isSameAs(parent);\\n })\\n .flatMap(integer -> Mono.just(integer).map(monoInteger -> monoInteger + 1))\\n .transformDeferredContextual((integerMono, contextView) -> integerMono.doOnNext(integer -> {\\n log.info(\\\"Context Propagation happens - the <parent> observation gets propagated [\\\"\\n + registry.getCurrentObservation() + \\\"]\\\");\\n then(registry.getCurrentObservation()).isSameAs(parent);\\n }))\\n // Let's assume that we're modifying the context\\n .contextWrite(context -> context.put(\\\"foo\\\", \\\"bar\\\"))\\n // Since we are NOT part of the Reactive Chain (e.g. this is not a\\n // WebFlux application)\\n // you MUST call <contextCapture> to capture all ThreadLocal values\\n // and store them in a Reactor Context.\\n // ----------------------\\n // If you were part of the\\n // Reactive Chain (e.g. returning Mono from endpoint)\\n // there is NO NEED to call <contextCapture>. If you need to propagate\\n // your e.g. Observation\\n // to the Publisher you just created (e.g. Mono or Flux) please\\n // consider adding it\\n // to the Reactor Context directly instead of opening an Observation\\n // scope and calling <contextCapture> (see example below).\\n .contextCapture()\\n .block();\\n\\n // We're still using <parent> as current observation\\n then(registry.getCurrentObservation()).isSameAs(parent);\\n\\n then(block).isEqualTo(2);\\n\\n // Now, we want to create a child observation for a Reactor stream and put it\\n // to Reactor Context\\n // Automatically its parent will be <parent> observation since <parent> is in\\n // Thread Local\\n Observation child = Observation.start(\\\"child\\\", registry);\\n block = Mono.just(1).publishOn(Schedulers.boundedElastic()).doOnNext(integer -> {\\n log.info(\\n \\\"Context Propagation happens - the <child> observation from Reactor Context takes precedence over thread local <parent> observation [\\\"\\n + registry.getCurrentObservation() + \\\"]\\\");\\n then(registry.getCurrentObservation()).isSameAs(child);\\n })\\n .flatMap(integer -> Mono.just(integer).map(monoInteger -> monoInteger + 1))\\n .transformDeferredContextual((integerMono, contextView) -> integerMono.doOnNext(integer -> {\\n log.info(\\n \\\"Context Propagation happens - the <child> observation from Reactor Context takes precedence over thread local <parent> observation [\\\"\\n + registry.getCurrentObservation() + \\\"]\\\");\\n then(registry.getCurrentObservation()).isSameAs(child);\\n }))\\n // Remember to stop the child Observation!\\n .doFinally(signalType -> child.stop())\\n // When using Reactor we ALWAYS search for\\n // ObservationThreadLocalAccessor.KEY entry in the Reactor Context to\\n // search for an Observation. You DON'T have to use <contextCapture>\\n // because\\n // you have manually provided the ThreadLocalAccessor key\\n .contextWrite(context -> context.put(ObservationThreadLocalAccessor.KEY, child))\\n .block();\\n\\n // We're back to having <parent> as current observation\\n then(registry.getCurrentObservation()).isSameAs(parent);\\n\\n then(block).isEqualTo(2);\\n});\\n\\n// There should be no remaining observation\\nthen(registry.getCurrentObservation()).isNull();\\n\\n// We need to stop the parent\\nparent.stop();\\n-----\\n\\nIf performance of this approach is not satisfactory, please verify whether disabling the hook and explicitly using `handle` or `tap` operators improves the performance.\\n\\n[[instrumentation_of_reactive_libraries_before_reactor_3_5_3]]\\n=== Before Reactor 3.5.3\\n\\nThe preferred way of propagating elements through the Flux using Reactor is not via ``ThreadLocal``s but through Reactor Context. Reactor however gives you two operators, `tap()` and `handle()` where, if https://micrometer.io/docs/contextPropagation[Micrometer Context Propagation] library is on the classpath, it will set thread local values for you.\\n\\nLet's look at the following example.\\n\\n[source,java,subs=+attributes]\\n-----\\n// This snippet shows an example of how to wrap code that is using Reactor\\n\\n// Let's assume that we have a parent observation\\nObservation parent = Observation.start(\\\"parent\\\", registry);\\n\\n// We want to create a child observation for a Reactor stream\\nObservation child = Observation.start(\\\"child\\\", registry)\\n // There's no thread local entry, so we will pass parent observation\\n // manually. If we put the Observation in scope we could then call\\n // <.contextCapture()> method from Reactor to capture all thread locals\\n // and store them in Reactor Context.\\n .parentObservation(parent);\\nInteger block = Mono.just(1)\\n // Example of not propagating context by default\\n .doOnNext(integer -> {\\n log.info(\\n \\\"No context propagation happens by default in Reactor - there will be no Observation in thread local here [\\\"\\n + registry.getCurrentObservation() + \\\"]\\\");\\n then(registry.getCurrentObservation()).isNull();\\n })\\n // Example of having entries in thread local for <tap()> operator\\n .tap(() -> new DefaultSignalListener<Integer>() {\\n @Override\\n public void doFirst() throws Throwable {\\n log.info(\\\"We're using tap() -> there will be Observation in thread local here [\\\"\\n + registry.getCurrentObservation() + \\\"]\\\");\\n then(registry.getCurrentObservation()).isNotNull();\\n }\\n })\\n .flatMap(integer -> Mono.just(integer).map(monoInteger -> monoInteger + 1))\\n // Example of retrieving ThreadLocal entries via ReactorContext\\n .transformDeferredContextual((integerMono, contextView) -> integerMono.doOnNext(integer -> {\\n try (ContextSnapshot.Scope scope = ContextSnapshot.setAllThreadLocalsFrom(contextView)) {\\n log.info(\\n \\\"We're retrieving thread locals from Reactor Context - there will be Observation in thread local here [\\\"\\n + registry.getCurrentObservation() + \\\"]\\\");\\n then(registry.getCurrentObservation()).isNotNull();\\n }\\n }))\\n // Example of having entries in thread local for <handle()> operator\\n .handle((BiConsumer<Integer, SynchronousSink<Integer>>) (integer, synchronousSink) -> {\\n log.info(\\\"We're using handle() -> There will be Observation in thread local here [\\\"\\n + registry.getCurrentObservation() + \\\"]\\\");\\n then(registry.getCurrentObservation()).isNotNull();\\n synchronousSink.next(integer);\\n })\\n // Remember to stop the child Observation!\\n .doFinally(signalType -> child.stop())\\n // When using Reactor we ALWAYS search for\\n // ObservationThreadLocalAccessor.KEY entry in the Reactor Context to\\n // search for an Observation\\n .contextWrite(context -> context.put(ObservationThreadLocalAccessor.KEY, child))\\n // If there were ThreadLocal entries that are using Micrometer Context\\n // Propagation they would be caught here. All implementations of\\n // <ThreadLocalAccessor> will store their thread local entries under their\\n // keys in Reactor Context\\n .contextCapture()\\n .block();\\n\\n// We didn't have any observations in thread local\\nthen(registry.getCurrentObservation()).isNull();\\n\\n// We need to stop the parent\\nparent.stop();\\n\\nthen(block).isEqualTo(2);\\n-----\\n\\n[[instrumentation_of_http_communication]]\\n== Instrumentation of HTTP Communication\\n\\nIn order to instrument an HTTP-based communication we need to use the `RequestReplySenderContext` and `RequestReplyReceiverContext` for the client and server side respectively.\\n\\nAs an example for the client side we will use a handler that instruments the HTTP request by adding a `foo:bar` header (if you have Micrometer Tracing on the classpath you could reuse the `PropagatingSenderTracingObservationHandler` and `PropagatingReceiverTracingObservationHandler` to propagate tracing context over the wire). Let's look at the example of such a handler.\\n\\n[source,java,subs=+attributes]\\n-----\\nstatic class HeaderPropagatingHandler implements ObservationHandler<SenderContext<Object>> {\\n\\n @Override\\n public void onStart(SenderContext<Object> context) {\\n context.getSetter().set(context.getCarrier(), \\\"foo\\\", \\\"bar\\\");\\n }\\n\\n @Override\\n public boolean supportsContext(Observation.Context context) {\\n return context instanceof SenderContext;\\n }\\n\\n}\\n-----\\n\\nLet's look at the following of HTTP client side instrumentation that reuses the handler.\\n\\n[source,java,subs=+attributes]\\n-----\\n// This example can be combined with the idea of ObservationConvention to allow\\n// users to easily customize the key values. Please read the rest of the\\n// documentation on how to do it.\\n\\n// In Micrometer Tracing we would have predefined\\n// PropagatingSenderTracingObservationHandler but for the sake of this demo we\\n// create our own handler that puts \\\"foo\\\":\\\"bar\\\" headers into the request\\nregistry.observationConfig().observationHandler(new HeaderPropagatingHandler());\\n\\n// We're using WireMock to stub the HTTP GET call to \\\"/foo\\\" with a response \\\"OK\\\"\\nstubFor(get(\\\"/foo\\\").willReturn(ok().withBody(\\\"OK\\\")));\\n\\n// RequestReplySenderContext is a special type of context used for request-reply\\n// communication. It requires to define what the Request type is and how we can\\n// instrument it. It also needs to know what the Response type is\\nRequestReplySenderContext<HttpUriRequestBase, ClassicHttpResponse> context = new RequestReplySenderContext<>(\\n (carrier, key, value) -> Objects.requireNonNull(carrier).addHeader(key, value));\\n\\n// We're instrumenting the Apache HTTPClient\\ntry (CloseableHttpClient httpclient = HttpClients.createDefault()) {\\n // The HttpGet is our carrier (we can mutate it to instrument the headers)\\n HttpGet httpget = new HttpGet(info.getHttpBaseUrl() + \\\"/foo\\\");\\n // We must set the carrier BEFORE we run <Observation#start>\\n context.setCarrier(httpget);\\n // You can set the remote service address to provide more debugging\\n // information\\n context.setRemoteServiceAddress(info.getHttpBaseUrl());\\n // Examples of setting key values from the request\\n Observation observation = Observation.createNotStarted(\\\"http.client.requests\\\", () -> context, registry)\\n .contextualName(\\\"HTTP \\\" + httpget.getMethod())\\n .lowCardinalityKeyValue(\\\"http.url\\\", info.getHttpBaseUrl() + \\\"/{name}\\\")\\n .highCardinalityKeyValue(\\\"http.full-url\\\", httpget.getRequestUri());\\n observation.observeChecked(() -> {\\n String response = httpclient.execute(httpget, classicHttpResponse -> {\\n // We should set the response before we stop the observation\\n context.setResponse(classicHttpResponse);\\n // Example of setting key values from the response\\n observation.highCardinalityKeyValue(\\\"http.content.length\\\",\\n String.valueOf(classicHttpResponse.getEntity().getContentLength()));\\n return EntityUtils.toString(classicHttpResponse.getEntity());\\n });\\n\\n then(response).isEqualTo(\\\"OK\\\");\\n });\\n}\\n\\n// We want to be sure that we have successfully enriched the HTTP headers\\nverify(getRequestedFor(urlEqualTo(\\\"/foo\\\")).withHeader(\\\"foo\\\", equalTo(\\\"bar\\\")));\\n-----\\n\\nAs an example for the server side we will use a handler that instruments the Observation by adding the `foo` low cardinality key with the value being the matched path from the HTTP request. Let's look at the example of such a handler.\\n\\n[source,java,subs=+attributes]\\n-----\\nstatic class HeaderReadingHandler implements ObservationHandler<ReceiverContext<Context>> {\\n\\n @Override\\n public void onStart(ReceiverContext<Context> context) {\\n String fooHeader = context.getGetter().get(context.getCarrier(), \\\"foo\\\");\\n // We're setting the value of the <foo> header as a low cardinality key value\\n context.addLowCardinalityKeyValue(KeyValue.of(\\\"foo\\\", fooHeader));\\n }\\n\\n @Override\\n public boolean supportsContext(Observation.Context context) {\\n return context instanceof ReceiverContext;\\n }\\n\\n}\\n-----\\n\\nLet's look at the following of HTTP server side instrumentation that reuses the handler.\\n\\n[source,java,subs=+attributes]\\n-----\\n// This example can be combined with the idea of ObservationConvention to allow\\n// users to easily customize the key values. Please read the rest of the\\n// documentation on how to do it.\\n\\n// In Micrometer Tracing we would have predefined\\n// PropagatingReceiverTracingObservationHandler but for the sake of this demo we\\n// create our own handler that will reuse the <foo> header from the request as a\\n// low cardinality key value\\nregistry.observationConfig().observationHandler(new HeaderReadingHandler());\\n\\ntry (Javalin javalin = Javalin.create().before(\\\"/hello/{name}\\\", ctx -> {\\n // We're creating the special RequestReplyReceiverContext that will reuse the\\n // information from the HTTP headers\\n RequestReplyReceiverContext<Context, Context> receiverContext = new RequestReplyReceiverContext<>(\\n Context::header);\\n // Remember to set the carrier!!!\\n receiverContext.setCarrier(ctx);\\n String remoteServiceAddress = ctx.scheme() + \\\"://\\\" + ctx.host();\\n receiverContext.setRemoteServiceAddress(remoteServiceAddress);\\n // We're starting an Observation with the context\\n Observation observation = Observation\\n .createNotStarted(\\\"http.server.requests\\\", () -> receiverContext, registry)\\n .contextualName(\\\"HTTP \\\" + ctx.method() + \\\" \\\" + ctx.matchedPath())\\n .lowCardinalityKeyValue(\\\"http.url\\\", remoteServiceAddress + ctx.matchedPath())\\n .highCardinalityKeyValue(\\\"http.full-url\\\", remoteServiceAddress + ctx.path())\\n .lowCardinalityKeyValue(\\\"http.method\\\", ctx.method())\\n .start();\\n // Let's be consistent and always set the Observation related objects under\\n // the same key\\n ctx.attribute(ObservationThreadLocalAccessor.KEY, observation);\\n}).get(\\\"/hello/{name}\\\", ctx -> {\\n // We need to be thread-safe - we're not using ThreadLocals, we're retrieving\\n // information from the attributes\\n Observation observation = ctx.attribute(ObservationThreadLocalAccessor.KEY);\\n observation.scoped(() -> {\\n // If we need thread locals (e.g. MDC entries) we can use <scoped()>\\n log.info(\\\"We're using scoped - Observation in thread local here [\\\" + registry.getCurrentObservation()\\n + \\\"]\\\");\\n then(registry.getCurrentObservation()).isNotNull();\\n });\\n // We're returning body\\n ctx.result(\\\"Hello World [\\\" + observation.getContext().getLowCardinalityKeyValue(\\\"foo\\\").getValue() + \\\"]\\\");\\n}).after(\\\"/hello/{name}\\\", ctx -> {\\n // After sending the response we want to stop the Observation\\n Observation observation = ctx.attribute(ObservationThreadLocalAccessor.KEY);\\n observation.stop();\\n}).start(0)) {\\n // We're sending an HTTP request with a <foo:bar> header. We're expecting that\\n // it will be reused in the response\\n String response = sendRequestToHelloEndpointWithHeader(javalin.port(), \\\"foo\\\", \\\"bar\\\");\\n\\n // The response must contain the value from the header\\n then(response).isEqualTo(\\\"Hello World [bar]\\\");\\n}\\n-----\\n\\n== Instrumentation of Messaging Communication\\n\\nTo instrument messaging components you should proceed in the same way as you would with <<instrumentation_of_http_communication,HTTP-based communication>>, however instead of `RequestReplySenderContext` and `RequestReplyReceiverContext` you would use `SenderContext` and `ReceiverContext`. You can also set the `remoteServiceName` on a context to suggest the name of the broker (e.g. `kafka` or `rabbitmq`).\\n\\n:leveloffset!:\\n\\n== Testing\\n\\n:leveloffset: +1\\n\\nMicrometer Observation comes with `micrometer-observation-test` module that allows you to unit-test your Observations.\\n\\n== Installing\\n\\nThe following example shows the required dependency in Gradle (assuming that Micrometer BOM has been added):\\n\\n[source,groovy,subs=+attributes]\\n-----\\ntestImplementation 'io.micrometer:micrometer-observation-test'\\n-----\\n\\nThe following example shows the required dependency in Maven (assuming that Micrometer BOM has been added):\\n\\n[source,xml,subs=+attributes]\\n-----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-observation-test</artifactId>\\n <scope>test</scope>\\n</dependency>\\n-----\\n\\n== Running Observation Unit Tests\\n\\nLet's say that you have the following production code. It will create an observation with 2 tags (low and high cardinality) and then call `observe` that will start the observation, put it in scope, close the scope and stop the observation.\\n\\n[source,java,subs=+attributes]\\n-----\\nstatic class Example {\\n\\n private final ObservationRegistry registry;\\n\\n Example(ObservationRegistry registry) {\\n this.registry = registry;\\n }\\n\\n void run() {\\n Observation.createNotStarted(\\\"foo\\\", registry)\\n .lowCardinalityKeyValue(\\\"lowTag\\\", \\\"lowTagValue\\\")\\n .highCardinalityKeyValue(\\\"highTag\\\", \\\"highTagValue\\\")\\n .observe(() -> System.out.println(\\\"Hello\\\"));\\n }\\n\\n}\\n-----\\n\\nTo unit-test this code you can use the `TestObservationRegistry` class.\\n\\n[source,java,subs=+attributes]\\n-----\\n@Test\\nvoid should_assert_your_observation() {\\n // create a test registry in your tests\\n TestObservationRegistry registry = TestObservationRegistry.create();\\n\\n // run your production code with the TestObservationRegistry\\n new Example(registry).run();\\n\\n // check your observation\\n TestObservationRegistryAssert.assertThat(registry)\\n .doesNotHaveAnyRemainingCurrentObservation()\\n .hasObservationWithNameEqualTo(\\\"foo\\\")\\n .that()\\n .hasHighCardinalityKeyValue(\\\"highTag\\\", \\\"highTagValue\\\")\\n .hasLowCardinalityKeyValue(\\\"lowTag\\\", \\\"lowTagValue\\\")\\n .hasBeenStarted()\\n .hasBeenStopped();\\n}\\n-----\\n\\n:leveloffset!:\\n\\n== Documentation Generation\\n\\n:leveloffset: +1\\n\\n== Automated Documentation Generation\\n\\nBy using the https://github.com/micrometer-metrics/micrometer-docs-generator[Micrometer Docs Generator] project and by implementing the `ObservationDocumentation`, `SpanDocumentation` or `MeterDocumentation` interfaces as an `enum` we can scan your sources and generate Asciidoctor documentation. This allows you to maintain the docuemntation for your observability instrumentation in code, and as long as you use the `enum` implementation in your instrumentation, it will ensure that your documentation stays in-sync with the instrumentation.\\n\\nBelow you can find an example of a Maven `pom.xml` with the Micrometer Docs Generator project.\\n\\n.pom.xml\\n[source,xml,subs=+attributes]\\n-----\\n<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<project xmlns:xsi=\\\"http://www.w3.org/2001/XMLSchema-instance\\\"\\n\\t\\t xmlns=\\\"http://maven.apache.org/POM/4.0.0\\\"\\n\\t\\t xsi:schemaLocation=\\\"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd\\\">\\n\\t<modelVersion>4.0.0</modelVersion>\\n\\t<groupId>com.example</groupId>\\n\\t<artifactId>micrometer-docs-generator-example</artifactId>\\n\\t<packaging>jar</packaging>\\n\\t<name>micrometer-docs-generator-example</name>\\n\\t<description>micrometer-docs-generator-example</description>\\n\\t<properties>\\n\\t\\t<micrometer-docs-generator.version>1.0.0</micrometer-docs-generator.version>\\n\\t\\t<micrometer-docs-generator.inputPath>${maven.multiModuleProjectDirectory}/folder-with-sources-to-scan/</micrometer-docs-generator.inputPath>\\n\\t\\t<micrometer-docs-generator.inclusionPattern>.*</micrometer-docs-generator.inclusionPattern>\\n\\t\\t<micrometer-docs-generator.outputPath>${maven.multiModuleProjectDirectory}/target/output-folder-with-adocs/'</micrometer-docs-generator.outputPath>\\n\\t</properties>\\n\\t<build>\\n\\t\\t<plugins>\\n\\t\\t\\t<plugin>\\n\\t\\t\\t\\t<groupId>org.codehaus.mojo</groupId>\\n\\t\\t\\t\\t<artifactId>exec-maven-plugin</artifactId>\\n\\t\\t\\t\\t<executions>\\n\\t\\t\\t\\t\\t<execution>\\n\\t\\t\\t\\t\\t\\t<id>generate-docs</id>\\n\\t\\t\\t\\t\\t\\t<phase>prepare-package</phase>\\n\\t\\t\\t\\t\\t\\t<goals>\\n\\t\\t\\t\\t\\t\\t\\t<goal>java</goal>\\n\\t\\t\\t\\t\\t\\t</goals>\\n\\t\\t\\t\\t\\t\\t<configuration>\\n\\t\\t\\t\\t\\t\\t\\t<mainClass>io.micrometer.docs.DocsGeneratorCommand</mainClass>\\n\\t\\t\\t\\t\\t\\t\\t<includePluginDependencies>true</includePluginDependencies>\\n\\t\\t\\t\\t\\t\\t\\t<arguments>\\n\\t\\t\\t\\t\\t\\t\\t\\t<argument>${micrometer-docs-generator.inputPath}</argument>\\n\\t\\t\\t\\t\\t\\t\\t\\t<argument>${micrometer-docs-generator.inclusionPattern}</argument>\\n\\t\\t\\t\\t\\t\\t\\t\\t<argument>${micrometer-docs-generator.outputPath}</argument>\\n\\t\\t\\t\\t\\t\\t\\t</arguments>\\n\\t\\t\\t\\t\\t\\t</configuration>\\n\\t\\t\\t\\t\\t</execution>\\n\\t\\t\\t\\t</executions>\\n\\t\\t\\t\\t<dependencies>\\n\\t\\t\\t\\t\\t<dependency>\\n\\t\\t\\t\\t\\t\\t<groupId>io.micrometer</groupId>\\n\\t\\t\\t\\t\\t\\t<artifactId>micrometer-docs-generator</artifactId>\\n\\t\\t\\t\\t\\t\\t<version>${micrometer-docs-generator.version}</version>\\n\\t\\t\\t\\t\\t\\t<type>jar</type>\\n\\t\\t\\t\\t\\t</dependency>\\n\\t\\t\\t\\t</dependencies>\\n\\t\\t\\t</plugin>\\n\\t\\t</plugins>\\n\\t</build>\\n\\n\\t<repositories>\\n\\t\\t<repository>\\n\\t\\t\\t<id>spring-snapshots</id>\\n\\t\\t\\t<name>Spring Snapshots</name>\\n\\t\\t\\t<url>https://repo.spring.io/snapshot</url> <!-- For Snapshots -->\\n\\t\\t\\t<snapshots>\\n\\t\\t\\t\\t<enabled>true</enabled>\\n\\t\\t\\t</snapshots>\\n\\t\\t\\t<releases>\\n\\t\\t\\t\\t<enabled>false</enabled>\\n\\t\\t\\t</releases>\\n\\t\\t</repository>\\n\\t\\t<repository>\\n\\t\\t\\t<id>spring-milestones</id>\\n\\t\\t\\t<name>Spring Milestones</name>\\n\\t\\t\\t<url>https://repo.spring.io/milestone</url> <!-- For Milestones -->\\n\\t\\t\\t<snapshots>\\n\\t\\t\\t\\t<enabled>false</enabled>\\n\\t\\t\\t</snapshots>\\n\\t\\t</repository>\\n\\t</repositories>\\n</project>\\n-----\\n\\nBelow you can find an example of a Gradle `build.gradle` with the Micrometer Docs Generator project.\\n\\n.build.gradle\\n[source,groovy,subs=+attributes]\\n-----\\nrepositories {\\n\\tmaven { url 'https://repo.spring.io/snapshot' } // for snapshots\\n\\tmaven { url 'https://repo.spring.io/milestone' } // for milestones\\n\\tmavenCentral() // for GA\\n}\\n\\next {\\n\\tmicrometerDocsVersion=\\\"1.0.2\\\"\\n}\\n\\nconfigurations {\\n\\tadoc\\n}\\n\\ndependencies {\\n\\tadoc \\\"io.micrometer:micrometer-docs-generator:$micrometerDocsVersion\\\"\\n}\\n\\ntask generateObservabilityDocs(type: JavaExec) {\\n\\tmainClass = \\\"io.micrometer.docs.DocsGeneratorCommand\\\"\\n\\tclasspath configurations.adoc\\n\\t// input folder, inclusion pattern, output folder\\n\\targs project.rootDir.getAbsolutePath(), \\\".*\\\", project.rootProject.buildDir.getAbsolutePath()\\n}\\n-----\\n\\nRunning these tasks would lead to generation of adoc files similar to these ones.\\n\\n._metrics.adoc\\n[source,adoc,subs=+attributes]\\n-----\\n[[observability-metrics]]\\n=== Observability - Metrics\\n\\nBelow you can find a list of all samples declared by this project.\\n\\n[[observability-metrics-task-runner-observation]]\\n==== Task Runner Observation\\n\\n> Observation created when a task runner is executed.\\n\\n**Metric name** `spring.cloud.task.runner` (defined by convention class `org.springframework.cloud.task.configuration.observation.DefaultTaskObservationConvention`). **Type** `timer` and **base unit** `seconds`.\\n\\nFully qualified name of the enclosing class `org.springframework.cloud.task.configuration.observation.TaskDocumentedObservation`.\\n\\nIMPORTANT: All tags must be prefixed with `spring.cloud.task` prefix!\\n\\n.Low cardinality Keys\\n|===\\n|Name | Description\\n|`spring.cloud.task.runner.bean-name`|Name of the bean that was executed by Spring Cloud Task.\\n|===\\n-----\\n\\n._spans.adoc\\n[source,adoc,subs=+attributes]\\n-----\\n[[observability-spans]]\\n=== Observability - Spans\\n\\nBelow you can find a list of all spans declared by this project.\\n\\n[[observability-spans-task-runner-observation]]\\n==== Task Runner Observation Span\\n\\n> Observation created when a task runner is executed.\\n\\n**Span name** `spring.cloud.task.runner` (defined by convention class `org.springframework.cloud.task.configuration.observation.DefaultTaskObservationConvention`).\\n\\nFully qualified name of the enclosing class `org.springframework.cloud.task.configuration.observation.TaskDocumentedObservation`.\\n\\nIMPORTANT: All tags and event names must be prefixed with `spring.cloud.task` prefix!\\n\\n.Tag Keys\\n|===\\n|Name | Description\\n|`spring.cloud.task.runner.bean-name`|Name of the bean that was executed by Spring Cloud Task.\\n|===\\n-----\\n\\n=== Options\\n\\nThe main entry class for the docs generation is `DocsGeneratorCommand` class.\\nThis class takes following options.\\n\\n.Optional parameters\\n[cols=\\\"1,1\\\"]\\n|===\\n| `--metrics`\\n| Generate metrics documentation.\\n\\n| `--spans`\\n| Generate spans documentation.\\n\\n| `--conventions`\\n| Generate observation conventions documentation.\\n\\n| `--metrics-template=<location>`\\n| Handlebars template file location. This can be a path in the classpath or file system. +\\ne.g. `templates/metrics.adoc.hbs`, `/home/foo/bar.hbs`\\n\\n| `--spans-template=<location>`\\n| Handlebars template file location. This can be a path in the classpath or file system. +\\ne.g. `templates/spans.adoc.hbs`, `/home/foo/bar.hbs`\\n\\n| `--conventions-template=<location>`\\n| Handlebars template file location. This can be a path in the classpath or file system. +\\ne.g. `templates/conventions.adoc.hbs`, `/home/foo/bar.hbs`\\n\\n| `--metrics-output=<location>`\\n| Generated metrics doc file location. This can be an absolute path or relative path to the output directory. +\\nDefault: `_metrics.adoc`\\n\\n| `--spans-output=<location>`\\n| Generated spans doc file location. This can be an absolute path or relative path to the output directory. +\\nDefault: `_spans.adoc`\\n| `--conventions-output=<location>`\\n| Generated observation convention doc file location. This can be an absolute path or relative path to the output directory. +\\nDefault: `_conventions.adoc`\\n|===\\n\\n:leveloffset!:\\n\\n== Existing Instrumentations\\n\\n:leveloffset: +1\\n\\nMicrometer Observation is used to instrument various projects. Below you can find a table of projects that are using Micrometer Observation to _\\\"instrument once and have multiple benefits out of it\\\"_.\\n\\n.External Project Instrumentations\\n|===\\n|Project Name |Link\\n\\n| Apache Camel | https://issues.apache.org/jira/browse/CAMEL-19023[Issue]\\n| Apache CXF | https://github.com/apache/cxf/pull/1346#event-10091735987[PR]\\n| Apache Dubbo | https://github.com/apache/dubbo/pull/11021[PR]\\n| Apache HttpComponents | https://github.com/micrometer-metrics/micrometer/tree/main/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/httpcomponents[Repo]\\n| Apache Skywalking | https://github.com/apache/skywalking-java/pull/401[PR], https://skywalking.apache.org/docs/skywalking-java/next/en/setup/service-agent/java-agent/application-toolkit-micrometer-1.10/[Docs]\\n| Armeria | https://github.com/line/armeria/pull/4980[PR]\\n| Appsmith | https://github.com/appsmithorg/appsmith/commit/5e46a2f4b7bf184aba03b4b93038edce8a615366[Commit]\\n| gRPC | https://github.com/micrometer-metrics/micrometer/pull/3427[PR]\\n| Halo | https://github.com/halo-dev/halo/commit/d192b8c956887e4701b94e3ed302fb88e4771583[Commit]\\n| JDBC | https://github.com/jdbc-observations/datasource-micrometer[Repo]\\n| JDK Http Client | https://github.com/micrometer-metrics/micrometer/blob/main/micrometer-core/src/main/java11/io/micrometer/core/instrument/binder/jdk/MicrometerHttpClient.java[Repo]\\n| Jetty | https://github.com/micrometer-metrics/micrometer/pull/3416[PR]\\n| Jersey | https://github.com/micrometer-metrics/micrometer/tree/main/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jersey/server[Repo]\\n| JMS | https://github.com/micrometer-metrics/micrometer/blob/main/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jms/JmsInstrumentation.java[Repo]\\n| Kotlin Coroutines | https://github.com/micrometer-metrics/micrometer/pull/3256[PR]\\n| Lettuce | https://github.com/lettuce-io/lettuce-core/commit/6604fbe9e9cff476806c50716e17803e11d1e0ca[Commit]\\n| Micronaut | https://github.com/micronaut-projects/micronaut-micrometer/issues/492[Issue]\\n| OkHttp | https://github.com/micrometer-metrics/micrometer/tree/main/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/okhttp3[Repo]\\n| OpenFeign | https://github.com/OpenFeign/feign/pull/1760[PR]\\n| RabbitMQ | https://github.com/rabbitmq/rabbitmq-java-client/issues/952[Issue]\\n| RabbitMQ Stream | https://github.com/rabbitmq/rabbitmq-stream-java-client/pull/384[PR]\\n| Resilience4j | https://github.com/resilience4j/resilience4j/pull/1698[PR]\\n| R2DBC | https://github.com/r2dbc/r2dbc-proxy/issues/122[Issue]\\n| Reactor | https://micrometer.io/docs/observation#instrumentation_of_reactive_libraries[Docs]\\n| Reactor Netty | https://projectreactor.io/docs/netty/release/reference/index.html#_tracing_3[Docs]\\n| Redisson | https://github.com/redisson/redisson/issues/4976[Issue],\\nhttps://github.com/redisson/redisson/wiki/16.-Observability#162-tracing[Docs]\\n| RSocket | https://github.com/rsocket/rsocket-java/tree/master/rsocket-micrometer/src/main/java/io/rsocket/micrometer/observation[Repo]\\n| Spring Amqp | https://docs.spring.io/spring-amqp/docs/current/reference/html/index.html#observation[Docs]\\n| Spring Batch | https://docs.spring.io/spring-batch/docs/current/reference/html/monitoring-and-metrics.html#tracing[Docs]\\n| Spring Cloud Config | https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#observability[Docs]\\n| Spring Cloud CircuitBreaker | https://github.com/spring-cloud/spring-cloud-circuitbreaker/commit/4aa6883274a26b4c01b2c38e256d0b985978052e[Commit]\\n| Spring Cloud Function | https://github.com/spring-cloud/spring-cloud-function/tree/main/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/observability[Repo]\\n| Spring Cloud Gateway | https://github.com/spring-cloud/spring-cloud-gateway/tree/main/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/headers/observation[Repo]\\n| Spring Cloud OpenFeign | https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/#micrometer-support[Docs]\\n| Spring Cloud Task | https://docs.spring.io/spring-cloud-task/docs/current/reference/html/#enabling-observations-for-applicationrunner-and-commandlinerunner[Docs]\\n| Spring Cloud Vault | https://github.com/spring-cloud/spring-cloud-vault/commit/1116f81971f16f9f9e42ad0994ee12a24404610e[Commit]\\n| Spring Data Cassandra | https://docs.spring.io/spring-data/cassandra/docs/current/reference/html/#cassandra.observability[Docs]\\n| Spring Data MongoDB | https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongodb.observability[Docs]\\n| Spring Data Redis | https://docs.spring.io/spring-data-redis/docs/current/reference/html/#redis.observability[Docs]\\n| Spring GraphQL | https://docs.spring.io/spring-graphql/docs/current/reference/html/#observability[Docs]\\n| Spring Integration | https://docs.spring.io/spring-integration/reference/metrics.html#micrometer-observation[Docs]\\n| Spring Kafka | https://docs.spring.io/spring-kafka/reference/html/#x30-obs[Docs]\\n| Spring Security | https://docs.spring.io/spring-security/reference/reactive/integrations/observability.html[Docs]\\n| Spring Modulith | https://docs.spring.io/spring-modulith/docs/current/reference/html/#observability[Docs]\\n| Spring MVC | https://docs.spring.io/spring-framework/reference/integration/observability.html[Docs]\\n| Spring Pulsar | https://docs.spring.io/spring-pulsar/docs/current/reference/html/#micrometer[Docs]\\n| Spring WebFlux | https://docs.spring.io/spring-framework/reference/integration/observability.html[Docs]\\n|===\\n\\nIf your project is instrumented using Micrometer Observation, and it's not listed in the table above, https://github.com/micrometer-metrics/micrometer-docs/edit/main/src/docs/observation/observation-projects.adoc[please file a PR] to our documentation! If you want to instrument your project and need our help just mention us in your issue - https://github.com/shakuzen/[@shakuzen], https://github.com/jonatan-ivanov/[@jonatan-ivanov], https://github.com/marcingrzejszczak/[@marcingrzejszczak].\\n\\n:leveloffset!:\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Tracing support\\n:toc:\\n:sectnums:\\n:dimensional: true\\n\\n== Purpose\\n\\nThe problem of tracing is not new.\\nApplication developers have been creating ways to track the state of their applications for a long time.\\nFor much of that time, developers had to create the necessary tracing framework themselves.\\n\\nIn 2016, the Spring Cloud team created a tracing library that could help a lot of developers.\\nIt was called https://github.com/spring-cloud/spring-cloud-sleuth[Spring Cloud Sleuth].\\nThe Spring team realized that tracing could be separated from Spring Cloud and created the Micrometer Tracing project, which is, essentially, a Spring-agnostic copy of Spring Cloud Sleuth.\\nMicrometer Tracing had its 1.0.0 GA release in November 2022 and has been getting steadily better ever since.\\n\\nhttps://github.com/micrometer-metrics/tracing[Micrometer Tracing] provides a simple facade for the most popular tracer libraries, letting you instrument your JVM-based application code without vendor lock-in.\\nIt is designed to add little to no overhead to your tracing collection activity while maximizing the portability of your tracing effort.\\n\\nIt also provides a tracing extension to Micrometer's `ObservationHandler` (from Micrometer 1.10.0).\\nWhenever an `Observation` is used, a corresponding span will be created, started, stopped and reported.\\n\\n== Installing\\n\\nMicrometer Tracing comes with a Bill of Materials (BOM) which is a project that contains all the project versions for you.\\n\\nThe following example shows the required dependency in Gradle:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation platform('io.micrometer:micrometer-tracing-bom:latest.release')\\nimplementation 'io.micrometer:micrometer-tracing'\\n----\\n\\nThe following example shows the required dependency in Maven:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependencyManagement>\\n <dependencies>\\n <dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-tracing-bom</artifactId>\\n <version>${micrometer-tracing.version}</version>\\n <type>pom</type>\\n <scope>import</scope>\\n </dependency>\\n </dependencies>\\n</dependencyManagement>\\n\\n<dependencies>\\n <dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-tracing</artifactId>\\n </dependency>\\n</dependencies>\\n----\\n\\nYou should add a tracing bridge you want to use, such as `micrometer-tracing-bridge-brave` or `micrometer-tracing-bridge-otel` and span exporters / reporters.\\nIn case of adding a bridge the `micrometer-tracing` library is added transitively.\\n\\n== Glossary\\n\\n:leveloffset: +1\\n\\nMicrometer Tracing contains a core module with an instrumentation https://en.wikipedia.org/wiki/Service_provider_interface[SPI], a set of modules containing bridges to various tracers, a set of modules containing dedicated span reporting mechanisms, and a test kit.\\nYou need to understand the following definitions for distributed tracing:\\n\\nMicrometer Tracing borrows https://research.google.com/pubs/pub36356.html[Dapper's] terminology.\\n\\n*Span*: The basic unit of work.\\nFor example, sending an RPC is a new span, as is sending a response to an RPC.\\nSpans also have other data, such as descriptions, timestamped events, key-value annotations (tags), the ID of the span that caused them, and process IDs (normally IP addresses).\\n\\nSpans can be started and stopped, and they keep track of their timing information.\\nOnce you create a span, you must stop it at some point in the future.\\n\\n*Trace*: A set of spans forming a tree-like structure.\\nFor example, if you run a distributed big-data store, a trace might be formed by a `PUT` request.\\n\\n*Annotation/Event*: Used to record the existence of an event in time.\\n\\n*Tracer*: A library that handles the lifecycle of a span.\\nIt can create, start, stop and report spans to an external system via reporters / exporters.\\n\\n*Tracing context*: For distributed tracing to work the tracing context (trace identifier, span identifier, etc.) must be propagated through the process (e.g. over threads) and over the network.\\n\\n*Log correlation*: Parts of the tracing context (e.g. trace identifier, span identifier) can be populated to the logs of a given application.\\nOne can then collect all logs in a single storage and group them via trace id.\\nThat way one can get all logs, for a single business operation (trace) from all services put in a chronological order.\\n\\n*Latency analysis tools*: A tool that collects exported spans and visualizes the whole trace.\\nAllows easy latency analysis.\\n\\nThe following image shows how *Span* and *Trace* look in a system.\\n\\nimage::\" + require(\"!file-loader!./img/trace-id.jpg\") + \"[Trace Info propagation]\\n\\nEach color of a note signifies a span (there are seven spans - from *A* to *G*).\\nConsider the following note:\\n\\n[source]\\n----\\nTrace Id = X\\nSpan Id = D\\nClient Sent\\n----\\n\\nThis note indicates that the current span has *Trace Id* set to *X* and *Span Id* set to *D*.\\nAlso, from the RPC perspective, the `Client Sent` event took place.\\n\\nLet's consider more notes:\\n\\n[source]\\n----\\nTrace Id = X\\nSpan Id = A\\n(no custom span)\\n\\nTrace Id = X\\nSpan Id = C\\n(custom span)\\n----\\n\\nYou can continue with a created span (example with `no custom span` indication) or you can create child spans manually (example with `custom span` indication).\\n\\nThe following image shows how parent-child relationships of spans look:\\n\\nimage::\" + require(\"!file-loader!./img/parents.jpg\") + \"[Parent child relationship]\\n\\n:leveloffset!:\\n\\n== Supported Tracers\\n\\n:leveloffset: +1\\n\\nMicrometer Tracing supports the following Tracers.\\n\\n* https://github.com/openzipkin/brave[*OpenZipkin Brave*]\\n* https://opentelemetry.io/[*OpenTelemetry*]\\n\\n== Installing\\n\\nThe following example shows the required dependency in Gradle (assuming that Micrometer Tracing BOM has been added):\\n\\n.Brave Tracer\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-tracing-bridge-brave'\\n----\\n\\n.OpenTelemetry Tracer\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-tracing-bridge-otel'\\n----\\n\\nThe following example shows the required dependency in Maven (assuming that Micrometer Tracing BOM has been added):\\n\\n.Brave Tracer\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-tracing-bridge-brave</artifactId>\\n</dependency>\\n----\\n\\n.OpenTelemetry Tracer\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-tracing-bridge-otel</artifactId>\\n</dependency>\\n----\\n\\nIMPORTANT: Remember to pick *only one* bridge.\\nYou *shouldn't have* two bridges on the classpath.\\n\\n:leveloffset!:\\n\\n== Supported Reporters\\n\\n:leveloffset: +1\\n\\nMicrometer Tracing supports directly the following Reporters.\\n\\n* https://tanzu.vmware.com/observability[*Tanzu Observability by Wavefront*]\\n* https://zipkin.io[*OpenZipkin Zipkin*]\\n\\n== Installing\\n\\nThe following example shows the required dependency in Gradle (assuming that Micrometer Tracing BOM has been added):\\n\\n.Tanzu Observability by Wavefront\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-tracing-reporter-wavefront'\\n----\\n\\n.OpenZipkin Zipkin with Brave\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.zipkin.reporter2:zipkin-reporter-brave'\\n----\\n\\n.OpenZipkin Zipkin with OpenTelemetry\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.opentelemetry:opentelemetry-exporter-zipkin'\\n----\\n\\n.An OpenZipkin URL sender dependency to send out spans to Zipkin via a `URLConnectionSender`\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.zipkin.reporter2:zipkin-sender-urlconnection'\\n----\\n\\nThe following example shows the required dependency in Maven (assuming that Micrometer Tracing BOM has been added):\\n\\n.Tanzu Observability by Wavefront\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-tracing-reporter-wavefront</artifactId>\\n</dependency>\\n----\\n\\n.OpenZipkin Zipkin with Brave\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.zipkin.reporter2</groupId>\\n <artifactId>zipkin-reporter-brave</artifactId>\\n</dependency>\\n----\\n\\n.OpenZipkin Zipkin with OpenTelemetry\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.opentelemetry</groupId>\\n <artifactId>opentelemetry-exporter-zipkin</artifactId>\\n</dependency>\\n----\\n\\n.An OpenZipkin URL sender dependency to send out spans to Zipkin via a `URLConnectionSender`\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.zipkin.reporter2</groupId>\\n <artifactId>zipkin-sender-urlconnection</artifactId>\\n</dependency>\\n----\\n\\nIMPORTANT: Remember that Brave by default adds Zipkin as a dependency. If you want to use just Wavefront and you're using classpath dependant solutions such as Spring Boot, you might be required to exclude the transitive dependency on Zipkin when using Brave (e.g. via exlcuding the `io.zipkin.reporter2` group).\\n\\n:leveloffset!:\\n\\n== Using Micrometer Tracing Directly\\n\\n:leveloffset: +1\\n\\nIn this section we will describe how to use the Micrometer Tracing API directly to create and report spans.\\n\\n== Micrometer Tracing Examples\\n\\nBelow you can see basic operations on a span. Please read the comments in the snippet for details.\\n\\n[source,java,subs=+attributes]\\n-----\\n// Create a span. If there was a span present in this thread it will become\\n// the `newSpan`'s parent.\\nSpan newSpan = this.tracer.nextSpan().name(\\\"calculateTax\\\");\\n// Start a span and put it in scope. Putting in scope means putting the span\\n// in thread local\\n// and, if configured, adjust the MDC to contain tracing information\\ntry (Tracer.SpanInScope ws = this.tracer.withSpan(newSpan.start())) {\\n // ...\\n // You can tag a span - put a key value pair on it for better debugging\\n newSpan.tag(\\\"taxValue\\\", taxValue);\\n // ...\\n // You can log an event on a span - an event is an annotated timestamp\\n newSpan.event(\\\"taxCalculated\\\");\\n}\\nfinally {\\n // Once done remember to end the span. This will allow collecting\\n // the span to send it to a distributed tracing system e.g. Zipkin\\n newSpan.end();\\n}\\n-----\\n\\nBelow you can see how to continue a span in a new thread, that was started in another thread.\\n\\n[source,java,subs=+attributes]\\n-----\\nSpan spanFromThreadX = this.tracer.nextSpan().name(\\\"calculateTax\\\");\\ntry (Tracer.SpanInScope ws = this.tracer.withSpan(spanFromThreadX.start())) {\\n executorService.submit(() -> {\\n // Pass the span from thread X\\n Span continuedSpan = spanFromThreadX;\\n // ...\\n // You can tag a span\\n continuedSpan.tag(\\\"taxValue\\\", taxValue);\\n // ...\\n // You can log an event on a span\\n continuedSpan.event(\\\"taxCalculated\\\");\\n }).get();\\n}\\nfinally {\\n spanFromThreadX.end();\\n}\\n-----\\n\\nBelow you can see how to create a child span when explicitly knowing who the parent span is.\\n\\n[source,java,subs=+attributes]\\n-----\\n// let's assume that we're in a thread Y and we've received\\n// the `initialSpan` from thread X. `initialSpan` will be the parent\\n// of the `newSpan`\\nSpan newSpan = this.tracer.nextSpan(initialSpan).name(\\\"calculateCommission\\\");\\n// ...\\n// You can tag a span\\nnewSpan.tag(\\\"commissionValue\\\", commissionValue);\\n// ...\\n// You can log an event on a span\\nnewSpan.event(\\\"commissionCalculated\\\");\\n// Once done remember to end the span. This will allow collecting\\n// the span to send it to e.g. Zipkin. The tags and events set on the\\n// newSpan will not be present on the parent\\nnewSpan.end();\\n-----\\n\\n== Micrometer Tracing Brave Setup\\n\\nIn this subsection we will set up Micrometer Tracing with Brave.\\n\\nBelow you can see how to create a Micrometer Tracing `Tracer` using Brave components that would send completed spans to Zipkin.\\n\\n[source,java,subs=+attributes]\\n-----\\n// [Brave component] Example of using a SpanHandler. SpanHandler is a component\\n// that gets called when a span is finished. Here we have an example of setting it\\n// up with sending spans\\n// in a Zipkin format to the provided location via the UrlConnectionSender\\n// (through the <io.zipkin.reporter2:zipkin-sender-urlconnection> dependency)\\n// Another option could be to use a TestSpanHandler for testing purposes.\\nSpanHandler spanHandler = ZipkinSpanHandler\\n .create(AsyncReporter.create(URLConnectionSender.create(\\\"http://localhost:9411/api/v2/spans\\\")));\\n\\n// [Brave component] CurrentTraceContext is a Brave component that allows you to\\n// retrieve the current TraceContext.\\nThreadLocalCurrentTraceContext braveCurrentTraceContext = ThreadLocalCurrentTraceContext.newBuilder()\\n .addScopeDecorator(MDCScopeDecorator.get()) // Example of Brave's\\n // automatic MDC setup\\n .build();\\n\\n// [Micrometer Tracing component] A Micrometer Tracing wrapper for Brave's\\n// CurrentTraceContext\\nCurrentTraceContext bridgeContext = new BraveCurrentTraceContext(this.braveCurrentTraceContext);\\n\\n// [Brave component] Tracing is the root component that allows to configure the\\n// tracer, handlers, context propagation etc.\\nTracing tracing = Tracing.newBuilder()\\n .currentTraceContext(this.braveCurrentTraceContext)\\n .supportsJoin(false)\\n .traceId128Bit(true)\\n // For Baggage to work you need to provide a list of fields to propagate\\n .propagationFactory(BaggagePropagation.newFactoryBuilder(B3Propagation.FACTORY)\\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create(\\\"from_span_in_scope 1\\\")))\\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create(\\\"from_span_in_scope 2\\\")))\\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create(\\\"from_span\\\")))\\n .build())\\n .sampler(Sampler.ALWAYS_SAMPLE)\\n .addSpanHandler(this.spanHandler)\\n .build();\\n\\n\\n// [Brave component] Tracer is a component that handles the life-cycle of a span\\nbrave.Tracer braveTracer = this.tracing.tracer();\\n\\n// [Micrometer Tracing component] A Micrometer Tracing wrapper for Brave's Tracer\\nTracer tracer = new BraveTracer(this.braveTracer, this.bridgeContext, new BraveBaggageManager());\\n\\n-----\\n\\n== Micrometer Tracing OpenTelemetry Setup\\n\\nIn this subsection we will set up Micrometer Tracing with OpenTelemetry (OTel).\\n\\nBelow you can see how to create a Micrometer Tracing `Tracer` using OTel components that would send completed spans to Zipkin.\\n\\n[source,java,subs=+attributes]\\n-----\\n// [OTel component] Example of using a SpanExporter. SpanExporter is a component\\n// that gets called when a span is finished. Here we have an example of setting it\\n// up with sending spans\\n// in a Zipkin format to the provided location via the UrlConnectionSender\\n// (through the <io.opentelemetry:opentelemetry-exporter-zipkin> and\\n// <io.zipkin.reporter2:zipkin-sender-urlconnection> dependencies)\\n// Another option could be to use an ArrayListSpanProcessor for testing purposes\\nSpanExporter spanExporter = new ZipkinSpanExporterBuilder()\\n .setSender(URLConnectionSender.create(\\\"http://localhost:9411/api/v2/spans\\\"))\\n .build();\\n\\n// [OTel component] SdkTracerProvider is an SDK implementation for TracerProvider\\nSdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()\\n .setSampler(alwaysOn())\\n .addSpanProcessor(BatchSpanProcessor.builder(spanExporter).build())\\n .build();\\n\\n// [OTel component] The SDK implementation of OpenTelemetry\\nOpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder()\\n .setTracerProvider(sdkTracerProvider)\\n .setPropagators(ContextPropagators.create(B3Propagator.injectingSingleHeader()))\\n .build();\\n\\n// [OTel component] Tracer is a component that handles the life-cycle of a span\\nio.opentelemetry.api.trace.Tracer otelTracer = openTelemetrySdk.getTracerProvider()\\n .get(\\\"io.micrometer.micrometer-tracing\\\");\\n\\n// [Micrometer Tracing component] A Micrometer Tracing wrapper for OTel\\nOtelCurrentTraceContext otelCurrentTraceContext = new OtelCurrentTraceContext();\\n\\n// [Micrometer Tracing component] A Micrometer Tracing listener for setting up MDC\\nSlf4JEventListener slf4JEventListener = new Slf4JEventListener();\\n\\n// [Micrometer Tracing component] A Micrometer Tracing listener for setting\\n// Baggage in MDC. Customizable\\n// with correlation fields (currently we're setting empty list)\\nSlf4JBaggageEventListener slf4JBaggageEventListener = new Slf4JBaggageEventListener(Collections.emptyList());\\n\\n// [Micrometer Tracing component] A Micrometer Tracing wrapper for OTel's Tracer.\\n// You can consider\\n// customizing the baggage manager with correlation and remote fields (currently\\n// we're setting empty lists)\\nOtelTracer tracer = new OtelTracer(otelTracer, otelCurrentTraceContext, event -> {\\n slf4JEventListener.onEvent(event);\\n slf4JBaggageEventListener.onEvent(event);\\n}, new OtelBaggageManager(otelCurrentTraceContext, Collections.emptyList(), Collections.emptyList()));\\n\\n-----\\n\\n== Micrometer Tracing Baggage API\\n\\nTraces connect from service to service using header propagation. Besides trace identifiers, other properties (called `Baggage`) can also be passed along with the request.\\n\\nBelow you can find an example on how to use the Tracer API (version `1.0.x`) to create and extract baggage.\\n\\n[source,java,subs=+attributes]\\n-----\\n// ---------------------------------------------------------------------------\\n// Example for Tracing 1.0.x\\n// ---------------------------------------------------------------------------\\nSpan span = tracer.nextSpan().name(\\\"parent\\\").start();\\n\\n// Assuming that there's a span in scope...\\ntry (Tracer.SpanInScope ws = tracer.withSpan(span)) {\\n\\n // Not passing a TraceContext explicitly will bind the baggage to the\\n // current TraceContext\\n // If you want to retrieve the baggage value you should make it current\\n // first\\n try (BaggageInScope baggage = tracer.createBaggage(\\\"from_span_in_scope 1\\\", \\\"value 1\\\").makeCurrent()) {\\n // This is how you retrieve the baggage\\n String baggageValue = baggage.get();\\n then(baggageValue).as(\\\"[In scope] Baggage 1\\\").isEqualTo(\\\"value 1\\\");\\n\\n String baggageValueViaTracer = tracer.getBaggage(\\\"from_span_in_scope 1\\\").get();\\n then(baggageValueViaTracer).as(\\\"[In scope] Baggage 1\\\").isEqualTo(\\\"value 1\\\");\\n }\\n\\n try (BaggageInScope baggage = tracer.createBaggage(\\\"from_span_in_scope 2\\\", \\\"value 2\\\").makeCurrent()) {\\n then(baggage.get()).as(\\\"[In scope] Baggage 2\\\").isEqualTo(\\\"value 2\\\");\\n then(tracer.getBaggage(\\\"from_span_in_scope 2\\\").get()).as(\\\"[In scope] Baggage 2\\\")\\n .isEqualTo(\\\"value 2\\\");\\n }\\n}\\n\\n// Assuming that you have a handle to the span\\ntry (BaggageInScope baggage = tracer.createBaggage(\\\"from_span\\\")\\n .set(span.context(), \\\"value 3\\\")\\n .makeCurrent()) {\\n String baggageValueFromATraceContext = baggage.get(span.context());\\n then(baggageValueFromATraceContext).as(\\\"[Span passed explicitly] Baggage 3\\\").isEqualTo(\\\"value 3\\\");\\n\\n String baggageValueFromATraceContextThroughTracer = tracer.getBaggage(\\\"from_span\\\").get(span.context());\\n then(baggageValueFromATraceContextThroughTracer).as(\\\"[Span passed explicitly] Baggage 3\\\")\\n .isEqualTo(\\\"value 3\\\");\\n}\\n\\n// Assuming that there's no span in scope\\n// When there's no span in scope, there will never be any baggage - even if\\n// you make it current\\ntry (BaggageInScope baggage = tracer.createBaggage(\\\"from_span_in_scope 1\\\", \\\"value 1\\\").makeCurrent()) {\\n then(baggage.get()).as(\\\"[Out of span scope] Baggage 1\\\").isNull();\\n then(tracer.getBaggage(\\\"from_span_in_scope 1\\\").get()).as(\\\"[Out of span scope] Baggage 1\\\").isNull();\\n}\\nthen(tracer.getBaggage(\\\"from_span_in_scope 1\\\").get()).as(\\\"[Out of scope] Baggage 1\\\").isNull();\\nthen(tracer.getBaggage(\\\"from_span_in_scope 2\\\").get()).as(\\\"[Out of scope] Baggage 2\\\").isNull();\\nthen(tracer.getBaggage(\\\"from_span\\\").get()).as(\\\"[Out of scope] Baggage 3\\\").isNull();\\nthen(tracer.getBaggage(\\\"from_span\\\").get(span.context())).as(\\\"[Out of scope - with context] Baggage 3\\\")\\n .isNull();\\n-----\\n\\nBelow you can find an example on how to use the Tracer API (version `1.1.x`) to create and extract baggage.\\n\\n[source,java,subs=+attributes]\\n-----\\n// ---------------------------------------------------------------------------\\n// Example for Tracing 1.1.x\\n// ---------------------------------------------------------------------------\\n\\nSpan span = tracer.nextSpan().name(\\\"parent\\\").start();\\n\\n// Assuming that there's a span in scope...\\ntry (Tracer.SpanInScope ws = tracer.withSpan(span)) {\\n\\n // Not passing a TraceContext explicitly will bind the baggage to the\\n // current TraceContext\\n try (BaggageInScope baggage = tracer.createBaggageInScope(\\\"from_span_in_scope 1\\\", \\\"value 1\\\")) {\\n // This is how you retrieve the baggage\\n String baggageValue = baggage.get();\\n then(baggageValue).as(\\\"[In scope] Baggage 1\\\").isEqualTo(\\\"value 1\\\");\\n\\n String baggageValueViaTracer = tracer.getBaggage(\\\"from_span_in_scope 1\\\").get();\\n then(baggageValueViaTracer).as(\\\"[In scope] Baggage 1\\\").isEqualTo(\\\"value 1\\\");\\n }\\n\\n try (BaggageInScope baggage = tracer.createBaggageInScope(\\\"from_span_in_scope 2\\\", \\\"value 2\\\")) {\\n then(baggage.get()).as(\\\"[In scope] Baggage 2\\\").isEqualTo(\\\"value 2\\\");\\n then(tracer.getBaggage(\\\"from_span_in_scope 2\\\").get()).as(\\\"[In scope] Baggage 2\\\")\\n .isEqualTo(\\\"value 2\\\");\\n }\\n}\\n\\n// Assuming that you have a handle to the span\\ntry (BaggageInScope baggage = tracer.createBaggageInScope(span.context(), \\\"from_span\\\", \\\"value 3\\\")) {\\n String baggageValueFromATraceContext = baggage.get(span.context());\\n then(baggageValueFromATraceContext).as(\\\"[Span passed explicitly] Baggage 3\\\").isEqualTo(\\\"value 3\\\");\\n\\n String baggageValueFromATraceContextThroughTracer = tracer.getBaggage(\\\"from_span\\\").get(span.context());\\n then(baggageValueFromATraceContextThroughTracer).as(\\\"[Span passed explicitly] Baggage 3\\\")\\n .isEqualTo(\\\"value 3\\\");\\n}\\n\\n// Assuming that there's no span in scope\\n// When there's no span in scope, there will never be any baggage - even if\\n// you make it current\\ntry (BaggageInScope baggage = tracer.createBaggageInScope(\\\"from_span_in_scope 1\\\", \\\"value 1\\\")) {\\n then(baggage.get()).as(\\\"[Out of span scope] Baggage 1\\\").isNull();\\n then(tracer.getBaggage(\\\"from_span_in_scope 1\\\").get()).as(\\\"[Out of span scope] Baggage 1\\\").isNull();\\n}\\nthen(tracer.getBaggage(\\\"from_span_in_scope 1\\\").get()).as(\\\"[Out of scope] Baggage 1\\\").isNull();\\nthen(tracer.getBaggage(\\\"from_span_in_scope 2\\\").get()).as(\\\"[Out of scope] Baggage 2\\\").isNull();\\nthen(tracer.getBaggage(\\\"from_span\\\").get()).as(\\\"[Out of scope] Baggage 3\\\").isNull();\\nthen(tracer.getBaggage(\\\"from_span\\\").get(span.context())).as(\\\"[Out of scope - with context] Baggage 3\\\")\\n .isNull();\\n-----\\n\\nIMPORTANT: For Brave, remember to set up the `PropagationFactory` so that it contains the baggage fields that you will be using in your code. Check the example below for details.\\n\\n[source,java,subs=+attributes]\\n-----\\nTracing tracing = Tracing.newBuilder()\\n .currentTraceContext(this.braveCurrentTraceContext)\\n .supportsJoin(false)\\n .traceId128Bit(true)\\n // For Baggage to work you need to provide a list of fields to propagate\\n .propagationFactory(BaggagePropagation.newFactoryBuilder(B3Propagation.FACTORY)\\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create(\\\"from_span_in_scope 1\\\")))\\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create(\\\"from_span_in_scope 2\\\")))\\n .add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create(\\\"from_span\\\")))\\n .build())\\n .sampler(Sampler.ALWAYS_SAMPLE)\\n .addSpanHandler(this.spanHandler)\\n .build();\\n\\n-----\\n\\n== Aspect Oriented Programming (starting from Micrometer Tracing 1.1.0)\\n\\nIMPORTANT: This section is applicable from Micrometer Tracing 1.1.0.\\n\\nMicrometer Tracing contains a `@NewSpan`, `@ContinueSpan` and `@SpanTag` annotations that frameworks can use to create or customize spans for either specific types of methods such as those serving web request endpoints or, more generally, to all methods.\\n\\nWARNING: Micrometer's Spring Boot configuration does _not_ recognize these aspects on arbitrary methods.\\n\\nAn AspectJ aspect is included. You can use it in your application either through compile/load time AspectJ weaving or through framework facilities that interpret AspectJ aspects and proxy targeted methods in some other way, such as Spring AOP. Here is a sample Spring AOP configuration:\\n\\n[source,java,subs=+attributes]\\n-----\\n@Configuration\\npublic class SpanAspectConfiguration {\\n\\n @Bean\\n NewSpanParser newSpanParser() {\\n return new DefaultNewSpanParser();\\n }\\n\\n // You can provide your own resolvers - here we go with a noop example.\\n @Bean\\n ValueResolver valueResolver() {\\n return new NoOpValueResolver();\\n }\\n\\n // Example of a SpEL resolver\\n @Bean\\n ValueExpressionResolver valueExpressionResolver() {\\n return new SpelTagValueExpressionResolver();\\n }\\n\\n @Bean\\n MethodInvocationProcessor methodInvocationProcessor(NewSpanParser newSpanParser, Tracer tracer,\\n BeanFactory beanFactory) {\\n return new ImperativeMethodInvocationProcessor(newSpanParser, tracer, beanFactory::getBean,\\n beanFactory::getBean);\\n }\\n\\n @Bean\\n SpanAspect spanAspect(MethodInvocationProcessor methodInvocationProcessor) {\\n return new SpanAspect(methodInvocationProcessor);\\n }\\n\\n}\\n\\n// Example of using SpEL to resolve expressions in @SpanTag\\nstatic class SpelTagValueExpressionResolver implements ValueExpressionResolver {\\n\\n private static final Log log = LogFactory.getLog(SpelTagValueExpressionResolver.class);\\n\\n @Override\\n public String resolve(String expression, Object parameter) {\\n try {\\n SimpleEvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();\\n ExpressionParser expressionParser = new SpelExpressionParser();\\n Expression expressionToEvaluate = expressionParser.parseExpression(expression);\\n return expressionToEvaluate.getValue(context, parameter, String.class);\\n }\\n catch (Exception ex) {\\n log.error(\\\"Exception occurred while tying to evaluate the SpEL expression [\\\" + expression + \\\"]\\\", ex);\\n }\\n return parameter.toString();\\n }\\n\\n}\\n-----\\n\\nApplying `SpanAspect` makes `@NewSpan` and `@ContinueSpan` usable on any arbitrary method in an AspectJ proxied instance, as the following example shows:\\n\\n[source,java,subs=+attributes]\\n-----\\n// In Sleuth @NewSpan and @ContinueSpan annotations would be taken into\\n// consideration. In Micrometer Tracing due to limitations of @Aspect\\n// we can't do that. The @SpanTag annotation will work well though.\\nprotected interface TestBeanInterface {\\n\\n void testMethod2();\\n\\n void testMethod3();\\n\\n void testMethod10(@SpanTag(\\\"testTag10\\\") String param);\\n\\n void testMethod10_v2(@SpanTag(\\\"testTag10\\\") String param);\\n\\n}\\n\\n// Example of an implementation class\\nprotected static class TestBean implements TestBeanInterface {\\n\\n @NewSpan\\n @Override\\n public void testMethod2() {\\n }\\n\\n @NewSpan(name = \\\"customNameOnTestMethod3\\\")\\n @Override\\n public void testMethod3() {\\n }\\n\\n @ContinueSpan(log = \\\"customTest\\\")\\n @Override\\n public void testMethod10(@SpanTag(\\\"customTestTag10\\\") String param) {\\n\\n }\\n\\n @ContinueSpan(log = \\\"customTest\\\")\\n @Override\\n public void testMethod10_v2(String param) {\\n\\n }\\n\\n}\\n\\n// --------------------------\\n// ----- USAGE EXAMPLE ------\\n// --------------------------\\n\\n\\n// Creates a new span with\\ntestBean().testMethod2();\\nthen(createdSpanViaAspect()).isEqualTo(\\\"test-method2\\\");\\n\\n// Uses the name from the annotation\\ntestBean().testMethod3();\\nthen(createdSpanViaAspect()).isEqualTo(\\\"custom-name-on-test-method3\\\");\\n\\n// Continues the previous span\\nSpan span = this.tracer.nextSpan().name(\\\"foo\\\");\\ntry (Tracer.SpanInScope ws = this.tracer.withSpan(span.start())) {\\n\\n // Adds tags and events to an existing span\\n testBean().testMethod10(\\\"tagValue\\\");\\n SimpleSpan continuedSpan = modifiedSpanViaAspect();\\n then(continuedSpan.getName()).isEqualTo(\\\"foo\\\");\\n then(continuedSpan.getTags()).containsEntry(\\\"customTestTag10\\\", \\\"tagValue\\\");\\n then(continuedSpan.getEvents()).extracting(\\\"value\\\").contains(\\\"customTest.before\\\", \\\"customTest.after\\\");\\n}\\nspan.end();\\n\\n// Continues the previous span\\nspan = this.tracer.nextSpan().name(\\\"foo\\\");\\ntry (Tracer.SpanInScope ws = this.tracer.withSpan(span.start())) {\\n\\n // Adds tags and events to an existing span (reusing setup from the parent\\n // interface)\\n testBean().testMethod10_v2(\\\"tagValue\\\");\\n SimpleSpan continuedSpan = modifiedSpanViaAspect();\\n then(continuedSpan.getName()).isEqualTo(\\\"foo\\\");\\n then(continuedSpan.getTags()).containsEntry(\\\"testTag10\\\", \\\"tagValue\\\");\\n then(continuedSpan.getEvents()).extracting(\\\"value\\\").contains(\\\"customTest.before\\\", \\\"customTest.after\\\");\\n}\\nspan.end();\\n\\n\\n-----\\n\\n\\n:leveloffset!:\\n\\n== Configuring with Micrometer Observation\\n\\n:leveloffset: +1\\n\\n== Handler Configuration\\n\\n// TODO: We need to separately document that Micrometer provides a TimerObservationHandler\\n\\nFor Micrometer Tracing to work with Micrometer Observation, you need to add a tracing related `ObservationHandler`.\\nCheck the example below for an example of adding and using a single `DefaultTracingObservationHandler`.\\n\\n[source,java,subs=+attributes]\\n-----\\nTracer tracer = Tracer.NOOP; // The real tracer will come from your tracer\\n // implementation (Brave /\\n// OTel)\\nPropagator propagator = Propagator.NOOP; // The real propagator will come from\\n // your tracer implementation (Brave /\\n // OTel)\\nMeterRegistry meterRegistry = new SimpleMeterRegistry();\\n\\nObservationRegistry registry = ObservationRegistry.create();\\nregistry.observationConfig()\\n // assuming that micrometer-core is on the classpath\\n .observationHandler(new DefaultMeterObservationHandler(meterRegistry))\\n // we set up a first matching handler that creates spans - it comes from\\n // Micrometer\\n // Tracing. We set up spans for sending and receiving data over the wire\\n // and a default one\\n .observationHandler(new ObservationHandler.FirstMatchingCompositeObservationHandler(\\n new PropagatingSenderTracingObservationHandler<>(tracer, propagator),\\n new PropagatingReceiverTracingObservationHandler<>(tracer, propagator),\\n new DefaultTracingObservationHandler(tracer)));\\n\\n// Creating and starting a new observation\\n// via the `DefaultTracingObservationHandler` that will create a new Span and\\n// start it\\nObservation observation = Observation.start(\\\"my.operation\\\", registry)\\n .contextualName(\\\"This name is more readable - we can reuse it for e.g. spans\\\")\\n .lowCardinalityKeyValue(\\\"this.tag\\\", \\\"will end up as a meter tag and a span tag\\\")\\n .highCardinalityKeyValue(\\\"but.this.tag\\\", \\\"will end up as a span tag only\\\");\\n\\n// Put the observation in scope\\n// This will result in making the previously created Span, the current Span - it's\\n// in ThreadLocal\\ntry (Observation.Scope scope = observation.openScope()) {\\n // Run your code that you want to measure - still the attached Span is the\\n // current one\\n // This means that e.g. logging frameworks could inject to e.g. MDC tracing\\n // information\\n yourCodeToMeasure();\\n}\\nfinally {\\n // The corresponding Span will no longer be in ThreadLocal due to\\n // try-with-resources block (Observation.Scope is an AutoCloseable)\\n // Stop the Observation\\n // The corresponding Span will be stopped and reported to an external system\\n observation.stop();\\n}\\n-----\\n\\nYou can also use a shorter version to perform measurements via the `observe` method.\\n\\n[source,java,subs=+attributes]\\n-----\\nObservationRegistry registry = ObservationRegistry.create();\\n\\nObservation.createNotStarted(\\\"my.operation\\\", registry)\\n .contextualName(\\\"This name is more readable - we can reuse it for e.g. spans\\\")\\n .lowCardinalityKeyValue(\\\"this.tag\\\", \\\"will end up as a meter tag and a span tag\\\")\\n .highCardinalityKeyValue(\\\"but.this.tag\\\", \\\"will end up as a span tag only\\\")\\n .observe(this::yourCodeToMeasure);\\n-----\\n\\nThis will result in the following Micrometer Metrics:\\n\\n```\\nGathered the following metrics\\n Meter with name <my.operation> and type <TIMER> has the following measurements\\n <[\\n Measurement{statistic='COUNT', value=1.0},\\n Measurement{statistic='TOTAL_TIME', value=1.011949454},\\n Measurement{statistic='MAX', value=1.011949454}\\n ]>\\n and has the following tags <[tag(this.tag=will end up as a meter tag and a span tag)]>\\n```\\n\\nAnd the following trace view in e.g. Zipkin\\n\\nimage::\" + require(\"!file-loader!./img/zipkin.jpg\") + \"[Trace Info propagation]\\n\\n=== Ordered Handler Configuration\\n\\nMicrometer Tracing comes with multiple `ObservationHandler` implementations.\\nTo introduce ordering, you can use the `ObservationHandler.AllMatchingCompositeObservationHandler` to run logic for all ``ObservationHandler``s that are matching the given predicate and `ObservationHandler.FirstMatchingCompositeObservationHandler` to run logic only for the first `ObservationHandler` that matches the predicate.\\nThe former can group handlers and the latter can be chosen to e.g. run only one matching `TracingObservationHandler`.\\n\\n== Context Propagation with Micrometer Tracing\\n\\nIn order to make https://micrometer.io/docs/contextPropagation[Context Propagation] work with Micrometer Tracing you need to manually register the proper `ThreadLocalAccessor` as presented below.\\n\\n[source,java,subs=+attributes]\\n-----\\nContextRegistry.getInstance().registerThreadLocalAccessor(new ObservationAwareSpanThreadLocalAccessor(tracer));\\n-----\\n\\n== Exemplars\\n\\nTo add support for https://grafana.com/docs/grafana/latest/fundamentals/exemplars/[exemplars] instead of using the `DefaultMeterObservationHandler` you should use the `TracingAwareMeterObservationHandler` like presented below.\\n\\n[source,java,subs=+attributes]\\n-----\\nObservationRegistry registry = ObservationRegistry.create();\\nregistry.observationConfig()\\n // Don't register the DefaultMeterObservationHandler...\\n // .observationHandler(new DefaultMeterObservationHandler(meterRegistry))\\n // ...instead register the tracing aware version\\n .observationHandler(new TracingAwareMeterObservationHandler<>(\\n new DefaultMeterObservationHandler(meterRegistry), tracer));\\n-----\\n\\n:leveloffset!:\\n\\n== Testing\\n\\n:leveloffset: +1\\n\\nMicrometer Tracing comes with `micrometer-tracing-test` and `micrometer-tracing-integration-test` modules.\\n\\nFor unit tests it provides a `SimpleTracer` that is a test implementation of a `Tracer`.\\n\\nFor the integration tests it provides a `SampleTestRunner` mechanism that you can hook into your samples.\\nIt will\\n\\n* Configure an OpenZipkin Brave Tracer\\n** Set it up with Tanzu Observability by Wavefront Reporter\\n** Set it up with OpenZipkin Zipkin Reporter\\n* Configure an OpenTelemetry Tracer\\n** Set it up with Tanzu Observability by Wavefront Exporter\\n** Set it up with OpenZipkin Zipkin Exporter\\n* Run all the combinations above against the user code and running infrastructure\\n\\n== Installing\\n\\nThe following example shows the required dependency in Gradle (assuming that Micrometer Tracing BOM has been added):\\n\\n[source,groovy,subs=+attributes]\\n-----\\ntestImplementation 'io.micrometer:micrometer-tracing-test' // for unit tests\\ntestImplementation 'io.micrometer:micrometer-tracing-integration-test' // for integration tests\\n-----\\n\\nThe following example shows the required dependency in Maven (assuming that Micrometer Tracing BOM has been added):\\n\\n[source,xml,subs=+attributes]\\n-----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-tracing-test</artifactId> <!-- For unit tests -->\\n <scope>test</scope>\\n</dependency>\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-tracing-integration-test</artifactId> <!-- For integration tests -->\\n <scope>test</scope>\\n</dependency>\\n-----\\n\\n== Running Tracing Unit Tests\\n\\nTo run unit tests of your custom handler you may want to use the `SimpleTracer` test `Tracer` implementation. Let's assume the following custom `TracingObservationHandler`.\\n\\n[source,java,subs=+attributes]\\n-----\\nstatic class MyTracingObservationHandler implements TracingObservationHandler<CustomContext> {\\n\\n private final Tracer tracer;\\n\\n MyTracingObservationHandler(Tracer tracer) {\\n this.tracer = tracer;\\n }\\n\\n @Override\\n public void onStart(CustomContext context) {\\n String databaseName = context.getDatabaseName();\\n Span.Builder builder = this.tracer.spanBuilder().kind(Span.Kind.CLIENT).remoteServiceName(databaseName);\\n getTracingContext(context).setSpan(builder.start());\\n }\\n\\n @Override\\n public void onError(CustomContext context) {\\n getTracingContext(context).getSpan().error(context.getError());\\n }\\n\\n @Override\\n public void onStop(CustomContext context) {\\n Span span = getRequiredSpan(context);\\n span.name(context.getContextualName() != null ? context.getContextualName() : context.getName());\\n tagSpan(context, span);\\n span.end();\\n }\\n\\n @Override\\n public boolean supportsContext(Observation.Context context) {\\n return context instanceof CustomContext;\\n }\\n\\n @Override\\n public Tracer getTracer() {\\n return this.tracer;\\n }\\n\\n}\\n-----\\n\\nTo verify whether the spans got properly created we can use the `SimpleTracer` as follows:\\n\\n[source,java,subs=+attributes]\\n-----\\nclass SomeComponentThatIsUsingMyTracingObservationHandlerTests {\\n\\n ObservationRegistry registry = ObservationRegistry.create();\\n\\n SomeComponent someComponent = new SomeComponent(registry);\\n\\n SimpleTracer simpleTracer = new SimpleTracer();\\n\\n MyTracingObservationHandler handler = new MyTracingObservationHandler(simpleTracer);\\n\\n @BeforeEach\\n void setup() {\\n registry.observationConfig().observationHandler(handler);\\n }\\n\\n @Test\\n void should_store_a_span() {\\n // this code will call actual Observation API\\n someComponent.doSthThatShouldCreateSpans();\\n\\n TracerAssert.assertThat(simpleTracer)\\n .onlySpan()\\n .hasNameEqualTo(\\\"insert user\\\")\\n .hasKindEqualTo(Span.Kind.CLIENT)\\n .hasRemoteServiceNameEqualTo(\\\"mongodb-database\\\")\\n .hasTag(\\\"mongodb.command\\\", \\\"insert\\\")\\n .hasTag(\\\"mongodb.collection\\\", \\\"user\\\")\\n .hasTagWithKey(\\\"mongodb.cluster_id\\\")\\n .assertThatThrowable()\\n .isInstanceOf(IllegalStateException.class)\\n .backToSpan()\\n .hasIpThatIsBlank()\\n .hasPortThatIsNotSet();\\n }\\n\\n}\\n-----\\n\\n== Running integration tests\\n\\nThe following example shows how you can run your code to test your integrations\\n\\n* by asserting spans that were stored without emitting them to a reporting system\\n* against running Tanzu Observability by Wavefront instance (this option turns on when you have passed the Wavefront related configuration in the constructor - otherwise the test will be disabled)\\n* against running Zipkin instance (this option turns on when Zipkin is running - otherwise the test will be disabled)\\n\\n[source,java,subs=+attributes]\\n-----\\nclass ObservabilitySmokeTest extends SampleTestRunner {\\n\\n ObservabilitySmokeTest() {\\n super(SampleRunnerConfig.builder().wavefrontApplicationName(\\\"my-app\\\").wavefrontServiceName(\\\"my-service\\\")\\n .wavefrontToken(\\\"...\\\")\\n .wavefrontUrl(\\\"...\\\")\\n .zipkinUrl(\\\"...\\\") // defaults to localhost:9411\\n .build());\\n }\\n\\n @Override\\n public BiConsumer<BuildingBlocks, Deque<ObservationHandler<? extends Observation.Context>>> customizeObservationHandlers() {\\n return (bb, handlers) -> {\\n ObservationHandler defaultHandler = handlers.removeLast();\\n handlers.addLast(new MyTracingObservationHandler(bb.getTracer()));\\n handlers.addLast(defaultHandler);\\n };\\n }\\n\\n @Override\\n public SampleTestRunnerConsumer yourCode() {\\n return (bb, meterRegistry) -> {\\n // here you would be running your code\\n yourCode();\\n\\n SpansAssert.assertThat(bb.getFinishedSpans())\\n .haveSameTraceId()\\n .hasNumberOfSpansEqualTo(8)\\n .hasNumberOfSpansWithNameEqualTo(\\\"handle\\\", 4)\\n .forAllSpansWithNameEqualTo(\\\"handle\\\", span -> span.hasTagWithKey(\\\"rsocket.request-type\\\"))\\n .hasASpanWithNameIgnoreCase(\\\"request_stream\\\")\\n .thenASpanWithNameEqualToIgnoreCase(\\\"request_stream\\\")\\n .hasTag(\\\"rsocket.request-type\\\", \\\"REQUEST_STREAM\\\")\\n .backToSpans()\\n .hasASpanWithNameIgnoreCase(\\\"request_channel\\\")\\n .thenASpanWithNameEqualToIgnoreCase(\\\"request_channel\\\")\\n .hasTag(\\\"rsocket.request-type\\\", \\\"REQUEST_CHANNEL\\\")\\n .backToSpans()\\n .hasASpanWithNameIgnoreCase(\\\"request_fnf\\\")\\n .thenASpanWithNameEqualToIgnoreCase(\\\"request_fnf\\\")\\n .hasTag(\\\"rsocket.request-type\\\", \\\"REQUEST_FNF\\\")\\n .backToSpans()\\n .hasASpanWithNameIgnoreCase(\\\"request_response\\\")\\n .thenASpanWithNameEqualToIgnoreCase(\\\"request_response\\\")\\n .hasTag(\\\"rsocket.request-type\\\", \\\"REQUEST_RESPONSE\\\");\\n\\n MeterRegistryAssert.assertThat(meterRegistry)\\n .hasTimerWithNameAndTags(\\\"rsocket.response\\\", Tags.of(Tag.of(\\\"error\\\", \\\"none\\\"), Tag.of(\\\"rsocket.request-type\\\", \\\"REQUEST_RESPONSE\\\")))\\n .hasTimerWithNameAndTags(\\\"rsocket.fnf\\\", Tags.of(Tag.of(\\\"error\\\", \\\"none\\\"), Tag.of(\\\"rsocket.request-type\\\", \\\"REQUEST_FNF\\\")))\\n .hasTimerWithNameAndTags(\\\"rsocket.request\\\", Tags.of(Tag.of(\\\"error\\\", \\\"none\\\"), Tag.of(\\\"rsocket.request-type\\\", \\\"REQUEST_RESPONSE\\\")))\\n .hasTimerWithNameAndTags(\\\"rsocket.channel\\\", Tags.of(Tag.of(\\\"error\\\", \\\"none\\\"), Tag.of(\\\"rsocket.request-type\\\", \\\"REQUEST_CHANNEL\\\")))\\n .hasTimerWithNameAndTags(\\\"rsocket.stream\\\", Tags.of(Tag.of(\\\"error\\\", \\\"none\\\"), Tag.of(\\\"rsocket.request-type\\\", \\\"REQUEST_STREAM\\\")));\\n };\\n }\\n\\n}\\n-----\\n\\n:leveloffset!:\\n\"","export default __webpack_public_path__ + \"7043f6f1d0731de0cc0943e896c32fca.jpg\";","export default __webpack_public_path__ + \"e4aa3da5f34dc789ae92d1f759a97b85.jpg\";","export default __webpack_public_path__ + \"b8a4008ab6f119930854d422d6bd39b9.jpg\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Context Propagation support\\n:toc:\\n:sectnums:\\n:dimensional: true\\n\\n== Purpose\\n\\nhttps://github.com/micrometer-metrics/context-propagation[A library] that assists with context propagation across different types of context\\nmechanisms such as `ThreadLocal`, Reactor https://projectreactor.io/docs/core/release/reference/#context[Context]\\nand others.\\n\\nAbstractions:\\n\\n* `ThreadLocalAccessor` - contract to assist with access to a `ThreadLocal` value.\\n* `ContextAccessor` - contract to assist with access to a `Map`-like context.\\n* `ContextRegistry` - registry for instances of `ThreadLocalAccessor` and `ContextAccessor`.\\n* `ContextSnapshot` - holder of contextual values, that provides methods to capture and to propagate.\\n\\nExample Scenarios:\\n\\n* In imperative code, e.g. Spring MVC controller, capture `ThreadLocal` values into a\\n`ContextSnapshot`. After that use the snapshot to populate a Reactor `Context` with the\\ncaptured values, or to wrap a task (e.g. `Runnable`, `Callable`, etc) or an `Executor`\\nwith a decorator that restores `ThreadLocal` values when the task executes.\\n* In reactive code, e.g. Spring WebFlux controller, create a `ContextSnapshot` from\\nReactor `Context` values. After that use the snapshot to restore `ThreadLocal` values\\nwithin a specific stage (operator) of the reactive chain.\\n\\nContext values can originate from any context mechanism and propagate to any other, any\\nnumber of times. For example, a value in a `Reactor` context may originate as a\\n`ThreadLocal`, and may yet become a `ThreadLocal` again, and so on.\\n\\nGenerally, imperative code should interact with `ThreadLocal` values as usual, and\\nlikewise Reactor code should interact with the Reactor `Context` as usual. The Context\\nPropagation library is not intended to replace those, but to assist with propagation when\\ncrossing from one type of context to another, e.g. when imperative code invokes a Reactor\\nchain, or when a Reactor chain invokes an imperative component that expects\\n`ThreadLocal` values.\\n\\nThe library is not limited to context propagation from imperative to reactive. It can\\nassist in asynchronous scenarios to propagate `ThreadLocal` values from one thread to\\nanother. It can also propagate to any other type of context for which there is a\\nregistered `ContextAccesor` instance.\\n\\n== Installing\\n\\nSnapshots are published to https://repo.spring.io/snapshot for every successful build on the `main` branch and maintenance branches.\\n\\nMilestone releases are published to https://repo.spring.io/milestone. Include that as a Maven repository in your build\\nconfiguration to use milestone releases. Note that milestone releases are for testing purposes and are not intended for\\nproduction use.\\n\\nThe following example shows the required dependency in Gradle:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:context-propagation:latest.integration'\\n----\\n\\nThe following example shows the required dependency in Maven:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependencies>\\n <dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>context-propagation</artifactId>\\n <version>${micrometer-context-propagation.version}</version>\\n </dependency>\\n</dependencies>\\n----\\n\\n== Usage Examples\\n\\n:leveloffset: +1\\n\\n== `ThreadLocal` Population\\n\\nBelow you can find a holder for `ThreadLocal` values.\\n\\n.ObservationThreadLocalHolder\\n[source,java,subs=+attributes]\\n-----\\n/**\\n * Example of a wrapper around ThreadLocal values.\\n */\\npublic class ObservationThreadLocalHolder {\\n\\n private static final ThreadLocal<String> holder = new ThreadLocal<>();\\n\\n public static void setValue(String value) {\\n holder.set(value);\\n }\\n\\n public static String getValue() {\\n return holder.get();\\n }\\n\\n public static void reset() {\\n holder.remove();\\n }\\n\\n}\\n-----\\n\\nBelow you can find a `ThreadLocalAccessor` that interacts with the holder.\\n\\n.ObservationThreadLocalAccessor\\n[source,java,subs=+attributes]\\n-----\\n/**\\n * Example {@link ThreadLocalAccessor} implementation.\\n */\\npublic class ObservationThreadLocalAccessor implements ThreadLocalAccessor<String> {\\n\\n public static final String KEY = \\\"micrometer.observation\\\";\\n\\n @Override\\n public Object key() {\\n return KEY;\\n }\\n\\n @Override\\n public String getValue() {\\n return ObservationThreadLocalHolder.getValue();\\n }\\n\\n @Override\\n public void setValue(String value) {\\n ObservationThreadLocalHolder.setValue(value);\\n }\\n\\n @Override\\n public void setValue() {\\n ObservationThreadLocalHolder.reset();\\n }\\n\\n}\\n-----\\n\\nBelow you can find an example of how to store and restore thread local values via `ThreadLocalAccessor`, `ContextSnapshot` and `ContextRegistry`.\\n\\n[source,java,subs=+attributes]\\n-----\\n// Create a new Context Registry (you can use a global too)\\nContextRegistry registry = new ContextRegistry();\\n// Register thread local accessors (you can use SPI too)\\nregistry.registerThreadLocalAccessor(new ObservationThreadLocalAccessor());\\n\\n// When you set a thread local value...\\nObservationThreadLocalHolder.setValue(\\\"hello\\\");\\n// ... we can capture it using ContextSnapshot\\nContextSnapshot snapshot = ContextSnapshotFactory.builder().contextRegistry(registry).build().captureAll();\\n\\n// After capturing if you change the thread local value again ContextSnapshot will\\n// not see it\\nObservationThreadLocalHolder.setValue(\\\"hola\\\");\\ntry {\\n // We're populating the thread local values with what we had in\\n // ContextSnapshot\\n try (Scope scope = snapshot.setThreadLocals()) {\\n // Within this scope you will see the stored thread local values\\n then(ObservationThreadLocalHolder.getValue()).isEqualTo(\\\"hello\\\");\\n }\\n // After the scope is closed we will come back to the previously present\\n // values in thread local\\n then(ObservationThreadLocalHolder.getValue()).isEqualTo(\\\"hola\\\");\\n}\\nfinally {\\n // We're clearing the thread local values so that we don't pollute the thread\\n ObservationThreadLocalHolder.reset();\\n}\\n-----\\n\\n:leveloffset!:\\n\"","var map = {\n\t\"./appOptics.adoc\": 87,\n\t\"./atlas.adoc\": 90,\n\t\"./azure-monitor.adoc\": 94,\n\t\"./cloudwatch.adoc\": 95,\n\t\"./datadog.adoc\": 96,\n\t\"./dynatrace.adoc\": 97,\n\t\"./elastic.adoc\": 98,\n\t\"./ganglia.adoc\": 99,\n\t\"./graphite.adoc\": 101,\n\t\"./hierarchical-name-mapping.adoc\": 103,\n\t\"./humio.adoc\": 104,\n\t\"./influx.adoc\": 106,\n\t\"./install.adoc\": 107,\n\t\"./instana.adoc\": 108,\n\t\"./jmx.adoc\": 109,\n\t\"./kairos.adoc\": 111,\n\t\"./new-relic.adoc\": 112,\n\t\"./otlp.adoc\": 117,\n\t\"./prometheus.adoc\": 118,\n\t\"./signalFx.adoc\": 124,\n\t\"./stackdriver.adoc\": 130,\n\t\"./statsD.adoc\": 131,\n\t\"./wavefront.adoc\": 132\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 86;","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer AppOptics\\n:toc:\\n:sectnums:\\n:system: appoptics\\n\\nAppOptics is a dimensional time-series SaaS with built-in dashboarding.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThe following example configures an AppOptics instance:\\n\\n[source,java]\\n----\\nAppOpticsConfig appopticsConfig = new AppOpticsConfig() {\\n @Override\\n public String apiToken() {\\n return MY_TOKEN;\\n }\\n\\n @Override\\n @Nullable\\n public String get(String k) {\\n return null;\\n }\\n};\\nMeterRegistry registry = new AppOpticsMeterRegistry(appopticsConfig, Clock.SYSTEM);\\n----\\n\\n`AppOpticsConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.appoptics` directly to the `AppOpticsConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.appoptics:\\n api-token: YOURKEY\\n\\n # You will probably want disable AppOptics publishing in a local development profile.\\n enabled: true\\n\\n # The interval at which metrics are sent to AppOptics. The default is 1 minute.\\n step: 1m\\n----\\n\\n== Graphing\\n\\nThis section serves as a quick start to rendering useful representations in AppOptics for metrics that originate in Micrometer.\\n\\n=== Timers\\n\\nThe AppOptics implementation of `Timer` produces three fields in AppOptics:\\n\\n* `sum`: Rate of calls per second.\\n* `count`: Rate of total time per second.\\n* `max`: A sliding window maximum amount recorded.\\n\\n.Dimensionally aggregable average in AppOptics.\\nimage::\" + require(\"!file-loader!./img/appoptics-timer-average.png\") + \"[AppOptics timer average]\\n\\nAppOptics performs the `sum/count` division dimensionally to generate aggregable averages on your behalf.\\n\\n.Timer over a simulated service.\\nimage::\" + require(\"!file-loader!./img/appoptics-timer.png\") + \"[AppOptics-rendered timer]\\n\"","export default __webpack_public_path__ + \"0592f647d85fc092e402fdfb77234e24.png\";","export default __webpack_public_path__ + \"6bf5cf6071710d129ffaadb50d2b0874.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Atlas\\n:toc:\\n:sectnums:\\n:system: atlas\\n\\nAtlas is an in-memory dimensional time series database with built-in graphing, a custom stack-based query language, and advanced math operations. Atlas originated at Netflix, where it remains the operational metrics solution.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\n[source,java]\\n----\\nAtlasConfig atlasConfig = new AtlasConfig() {\\n @Override\\n public Duration step() {\\n return Duration.ofSeconds(10);\\n }\\n\\n @Override\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\nMeterRegistry registry = new AtlasMeterRegistry(atlasConfig, Clock.SYSTEM);\\n----\\n\\nMicrometer uses Netflix's https://github.com/netflix/spectator[Spectator] as the underlying instrumentation library when recording metrics destined for Atlas. `AtlasConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties prefixed with `management.metrics.export.atlas` directly to the `AtlasConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.atlas:\\n # The location of your Atlas server\\n uri: http://localhost:7101/api/v1/publish\\n\\n # You will probably want to conditionally disable Atlas publishing in local development.\\n enabled: true\\n\\n # The interval at which metrics are sent to Atlas. The default is 1 minute.\\n step: 1m\\n----\\n\\n== Graphing\\n\\nThis section serves as a quick start to rendering useful representations in Atlas for metrics originating in Micrometer. See the https://github.com/netflix/atlas/wiki[Atlas wiki] for a far more complete reference of what is possible in Atlas.\\n\\n=== Counters\\n\\nAtlas serves up graphs in the form of PNG images (and other https://github.com/Netflix/atlas/wiki/Output-Formats[output formats] as well).\\n\\nWe use the following query to visualize the counter from Atlas. Note that the value is rate-normalized over the step interval rather than monotonically increasing. Atlas always expects link:/docs/concepts#_client_side[rate-aggregated] data for counters from Micrometer.\\n\\n.Counter over a positive-biased random walk.\\nimage::\" + require(\"!file-loader!./img/atlas-counter.png\") + \"[Atlas-rendered counter]\\n\\n[source,http]\\n----\\nGET /api/v1/graph?\\n q=\\n name,counter,:eq,\\n 2,:lw\\n &tz=US/Central\\n &s=e-15m <1>\\n &w=400 <2>\\n &l=0 <3>\\nHost: localhost:7101\\n----\\n<1> The range of time we want to visualize along the x-axis. `e` represents the end time or \\\"`now`\\\". This graph's axis is from 15 minutes ago until now. Atlas automatically chooses the finest grained step interval available from the data that would render at least 1px wide on the resultant image.\\n<2> The overall width of the PNG image returned should be 400px.\\n<3> Set the y-axis lower limit to 0 so that random perturbation in the walk does not look so dramatic.\\n\\n=== Timers\\n\\nWhile reading directly from a `Timer` returns a `double`, the underlying value is\\nstored in https://github.com/netflix/spectator[Spectator] as a nanosecond-precise `long`. What precision is lost by\\nconverting to a `double` in the `Timer` interface does not affect a system like\\nAtlas, because it has been configured to read measurements from the underlying\\nSpectator `Timer` that Micrometer is hiding from you.\\n\\nThe Spectator Atlas `Timer` produces four time series, each with a different `statistic` tag:\\n\\n* `count`: Rate of calls per second.\\n* `totalTime`: Rate of total time per second.\\n* `totalOfSquares`: Rate of total time squared per second (useful for standard deviation).\\n* `max`: The maximum amount recorded.\\n\\nTherefore, you can achieve a throughput (requests/second) line with the following query:\\n\\n```http\\nname,timer,:eq,statistic,count,:eq,:and\\n```\\n\\nNotice that `statistic` is just a dimension that can be drilled down and selected like any other.\\n\\nFurthermore, `totalTime/count` represents average latency and can be selected with a short-hand `:dist-avg` query, which selects the `totalTime` and `count` time series and performs the division for us:\\n\\n```http\\nname,timer,:eq,:dist-avg\\n```\\n\\nIn the preceding example, you can see these two lines plotted on a single dual-axis graph.\\n\\n.Timer over a simulated service.\\nimage::\" + require(\"!file-loader!./img/atlas-timer.png\") + \"[Atlas-rendered timer]\\n\\n\\n=== Long task timers\\n\\nSuppose we had a task that took two minutes to complete when it was expected to complete in less than 70 seconds. A key benefit of long task timers is the ability to receive an alert at the first reporting interval after we have exceeded the threshold. With a regular timer, we would not receive an alert until the first reporting interval after the process completed. If we had a ten-second publishing interval, the regular timer alert would arrive almost a minute after the long task timer alert.\\n\\n.Simulated back-to-back long tasks.\\nimage::\" + require(\"!file-loader!./img/atlas-long-task-timer.png\") + \"[Atlas-rendered long task timer]\\n\\n[source, http]\\n----\\nGET /api/v1/graph?\\n q=\\n name,longTaskTimer,:eq,statistic,duration,:eq,:and, <1>\\n :dup,\\n 70,:gt,:vspan,f00,:color,40,:alpha,alerted,:legend, <2>\\n 70,f00,:color,alert+threshold,:legend <3>\\n &tz=US/Central\\n &s=e-15m\\n &w=400\\n &l=0\\n &title=Peaks+of+Long+Tasks\\n &ylabel=time\\nHost: localhost:7101\\n----\\n<1> A representation of long tasks that are happening back-to-back.\\n<2> A vertical span that appears whenever the long task exceeds our threshold of 70 seconds. So that it does not overwhelm the graph, we also decrease the opacity of the vspan.\\n<3> Plot the threshold of 70 seconds as a separate line.\\n\"","export default __webpack_public_path__ + \"b22351bea254b10bef1c26d3cc3ef397.png\";","export default __webpack_public_path__ + \"4ce8699a76d05ed4311151acc1772b1f.png\";","export default __webpack_public_path__ + \"1127e78d5d7524b0c0540de3d2a732b2.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Azure Monitor\\n:toc:\\n:sectnums:\\n:system: azure-monitor\\n\\nAzure Monitor is a dimensional time-series SaaS with built-in dashboarding.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThe following example configures a Micrometer Azure Monitor:\\n\\n[source,java]\\n----\\nAzureMonitorConfig azureMonitorConfig = new AzureMonitorConfig() {\\n @Override\\n public String instrumentationKey() {\\n return MY_KEY;\\n }\\n\\n @Override\\n public String get(String key) {\\n return null;\\n }\\n};\\nMeterRegistry registry = new AzureMonitorMeterRegistry(azureMonitorConfig, Clock.SYSTEM);\\n----\\n\\n`AzureMonitorConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.azure-monitor` directly to the `AzureMonitorConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.azure-monitor:\\n instrumentation-key: YOURKEY\\n\\n # You will probably want disable Azure Monitor publishing in a local development profile.\\n enabled: true\\n\\n # The interval at which metrics are sent to Azure Monitor. The default is 1 minute.\\n step: 1m\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer CloudWatch\\nTommy Ludwig <tludwig@vmware.com>\\n:toc:\\n:sectnums:\\n:system: cloudwatch2\\n\\nhttps://aws.amazon.com/cloudwatch/[Amazon CloudWatch] is a dimensional time-series SaaS on Amazon's cloud.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\nNOTE: The `micrometer-registry-cloudwatch2` module uses AWS SDK v2. `micrometer-registry-cloudwatch` is for AWS SDK v1.\\n\\n== Configuring\\n\\nThe following example configures Micrometer CloudWatch:\\n\\n[source,java]\\n----\\nCloudWatchConfig cloudWatchConfig = new CloudWatchConfig() {\\n @Override\\n public String get(String s) {\\n return null;\\n }\\n\\n @Override\\n public String namespace() {\\n return \\\"mynamespace\\\";\\n }\\n};\\nMeterRegistry meterRegistry = new CloudWatchMeterRegistry(cloudWatchConfig, Clock.SYSTEM, CloudWatchAsyncClient.create());\\n----\\n\\nYou can provide your own `CloudWatchAsyncClient` to the constructor of the registry.\\n\\n`CloudWatchConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, https://docs.awspring.io/spring-cloud-aws/docs/current/reference/html/index.html#cloudwatch-metrics[Micrometer support in Spring Cloud AWS] binds properties prefixed with `management.metrics.export.cloudwatch` directly to the `CloudWatchConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.cloudwatch:\\n namespace: YOURNAMESPACE\\n\\n # You will probably want to disable publishing in a local development profile.\\n enabled: true\\n\\n # The interval at which metrics are sent to CloudWatch. The default is 1 minute.\\n step: 1m\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Datadog\\n:toc:\\n:sectnums:\\n:system: datadog\\n\\nDatadog is a dimensional time-series SaaS with built-in dashboarding and alerting.\\n\\n== Installation and Configuration\\n\\nMicrometer supports shipping metrics to Datadog directly by using its HTTP API or by using DogStatsD through the link:/docs/registry/statsD[StatsD registry].\\nThe API approach is far more efficient if you need to choose between the two.\\n\\n=== Direct to Datadog API Approach\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy]\\n----\\nimplementation 'io.micrometer:micrometer-registry-datadog:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-datadog</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\nMetrics are rate-aggregated and pushed to `datadoghq` on a periodic interval. Rate aggregation performed by the registry yields datasets that are similar to those produced by `dogstatsd`.\\n\\n[source, java]\\n----\\nDatadogConfig config = new DatadogConfig() {\\n @Override\\n public Duration step() {\\n return Duration.ofSeconds(10);\\n }\\n\\n @Override\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\nMeterRegistry registry = new DatadogMeterRegistry(config, Clock.SYSTEM);\\n----\\n\\n`DatadogConfig` is an interface with a set of default methods.\\nIf, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration through properties.\\nFor example, Spring Boot's Micrometer support binds properties directly to the `DatadogConfig`.\\nSee the https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.metrics.export.datadog[Datadog] section in the Spring Boot reference documentation.\\n\\n`DatadogConfig.hostTag()` specifies a tag key that is mapped to https://docs.datadoghq.com/api/v1/metrics/#submit-metrics[the `host` field] when shipping metrics to Datadog.\\nFor example, if `DatadogConfig.hostTag()` returns `host`, the tag having `host` as its key is used.\\nYou can set the tag by using common tags, as follows:\\n\\n[source,java]\\n----\\nregistry.config().commonTags(\\\"host\\\", \\\"my-host\\\");\\n----\\n\\n`uri` is an important property to configure.\\nThe default value is `https://api.datadoghq.com`.\\nDepending on the Datadog site (region), the api endpoint will be different.\\nTo find your the correct `uri` for your account, do the following:\\n\\n1. Read about https://docs.datadoghq.com/getting_started/site/[Datadog site].\\n2. Go to https://docs.datadoghq.com/api/latest/metrics/[Metrics API reference] and select your own option from the \\\"DATADOG SITE\\\" dropdown.\\n3. Check any API request's endpoint.\\n\\nE.g. For `US5` site, the correct API endpoint is `https://api.us5.datadoghq.com` while for `US3` site, it is `https://api.us3.datadoghq.com/`.\\n\\n=== Through DogStatsD Approach\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-statsd:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-statsd</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\nMetrics are immediately shipped to DogStatsD using Datadog's flavor of the StatsD line protocol. `java-dogstatsd-client` is _not_ needed on the classpath for this to work, as Micrometer uses its own implementation.\\n\\n[source,java]\\n----\\nStatsdConfig config = new StatsdConfig() {\\n @Override\\n public String get(String k) {\\n return null;\\n }\\n\\n @Override\\n public StatsdFlavor flavor() {\\n return StatsdFlavor.DATADOG;\\n }\\n};\\n\\nMeterRegistry registry = new StatsdMeterRegistry(config, Clock.SYSTEM);\\n----\\n\\nMicrometer supports DogStatsD's https://docs.datadoghq.com/developers/dogstatsd/?tab=kubernetes#origin-detection-over-udp[origin detection over UDP] feature on Kubernetes if the `DD_ENTITY_ID` environment variable is properly set.\\n\\nMicrometer, by default, publishes `Timer` meters to DogStatsD as the StatsD \\\"timing\\\" metric type `ms`,\\nwhich are sent to Datadog as https://docs.datadoghq.com/metrics/types/?tab=histogram#metric-types[histogram] type metrics.\\nMicrometer publishes `DistributionSummary` meters as histogram type metrics by default, also.\\n\\nWhen `percentileHistogram` is enabled for the meter, Micrometer sends `Timer` and `DistributionSummary` meters as Datadog https://docs.datadoghq.com/metrics/distributions[Distributions] to DogStatsD.\\nYou can make a `DistributionSummary` with `percentileHistogram` enabled as follows:\\n\\n[source,java]\\n----\\nDistributionSummary responseSizeSummary = DistributionSummary.builder(\\\"http.server.response.size\\\")\\n .baseUnit(\\\"bytes\\\")\\n .publishPercentileHistogram()\\n .register(registry);\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Dynatrace\\n:toc:\\n:sectnums:\\n:system: dynatrace\\n\\nhttps://www.dynatrace.com/[*Dynatrace*] is a Software Intelligence Platform featuring application performance monitoring (APM), artificial intelligence for operations (AIOps), IT infrastructure monitoring, digital experience management (DEM), and digital business analytics capabilities.\\nIt can ingest multi-purpose dimensional time-series data and has built-in dashboarding.\\nBoth SaaS and self-hosted (Managed) deployments are offered.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nFor setting up new integrations with Dynatrace, it is recommended to use the latest version of the https://docs.dynatrace.com/docs/shortlink/api-metrics-v2[Dynatrace Metrics API] (v2).\\nIf you are using Micrometer with Spring Boot, please also refer to the https://docs.dynatrace.com/docs/shortlink/micrometer-metrics-ingest[Dynatrace documentation] and/or the https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.metrics.export.dynatrace[Spring Boot documentation].\\nDynatrace provides different ways of setting up integrations:\\n\\n=== Using Dynatrace auto-configuration (preferred) [[bookmark-auto-configuration]]\\n\\nDynatrace auto-configuration is available for hosts that are monitored by a OneAgent or by the Dynatrace Operator for Kubernetes.\\n\\nIf a Dynatrace OneAgent is installed on the host running Micrometer, metrics can be exported directly using the OneAgent without having to specify an endpoint URI or API token.\\nIf running in Kubernetes with the Dynatrace operator installed, the registry will pick up your endpoint URI and API token from the operator instead.\\nIn this case there is no need to configure anything, so you can use the following code in your project to export Micrometer metrics to Dynatrace:\\n\\n[source,java]\\n----\\nDynatraceConfig dynatraceConfig = new DynatraceConfig() {\\n @Override\\n @Nullable\\n public String get(String k) {\\n // This method of the interface is used by the other configuration methods and needs to be\\n // implemented here. Returning null accepts the defaults for the other configuration items.\\n return null;\\n }\\n};\\nMeterRegistry registry = new DynatraceMeterRegistry(dynatraceConfig, Clock.SYSTEM);\\n----\\n\\nIf you are using Micrometer 1.10.0 or above, you can also use the DEFAULT config to achieve the same with less code:\\n\\n[source,java]\\n----\\nMeterRegistry registry = new DynatraceMeterRegistry(DynatraceConfig.DEFAULT, Clock.SYSTEM);\\n----\\n\\nIt is also possible to change other properties by creating an instance of the `DynatraceConfig` and overwriting the respective methods.\\nFor example, you can specify the exporter version, which defaults to `v2` unless a deviceId is set:\\n\\n[source,java]\\n----\\nDynatraceConfig dynatraceConfig = new DynatraceConfig() {\\n @Override\\n public DynatraceApiVersion apiVersion() {\\n return DynatraceApiVersion.V2;\\n }\\n\\n @Override\\n @Nullable\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\nMeterRegistry registry = new DynatraceMeterRegistry(dynatraceConfig, Clock.SYSTEM);\\n----\\n\\n`DynatraceConfig` is an interface with a set of default methods.\\nSpring Boot's Micrometer support binds properties prefixed with `management.dynatrace.metrics.export` directly to the `DynatraceConfig`.\\n\\nNOTE: Property names for binding attributes from Spring Boot have changed in Spring Boot version 3.0.0. If you use a Spring Boot version before 3.0.0, use `management.metrics.export.dynatrace` instead of `management.dynatrace.metrics.export`.\\n\\nUsing Spring Boot Micrometer support allows configuring the Dynatrace exporter by using <<bookmark-available-properties, the available properties>>.\\nWhen using Micrometer with Spring Boot, you don't have to instantiate the `DynatraceMeterRegistry` manually as Spring Boot will do it automatically for you.\\nAll configuration options that can be set by overwriting methods can also be set via Spring Boot properties, and adding a separate MeterRegistry can lead to metrics not being exported as auto-configuration might break.\\n\\nTo use the Dynatrace metrics exporter for Micrometer in your Spring Boot project, it is enough to include the `runtimeOnly 'io.micrometer:micrometer-registry-dynatrace'` dependency.\\nIn this default configuration, metrics will be exported to the local OneAgent or Kubernetes operator-provided endpoint.\\n\\n=== Using a custom endpoint\\n\\nIf auto-configuration is not available on the host, both the Dynatrace Metrics API v2 endpoint and an API token have to be specified.\\nThe https://docs.dynatrace.com/docs/shortlink/api-authentication[Dynatrace API token documentation] contains more information on how to create an API token.\\nThe 'Ingest metrics' (`metrics.ingest`) permission is required on the token in order to ingest metrics.\\nIt is recommended to limit scope to only this permission.\\n\\n[source,java]\\n----\\nDynatraceConfig dynatraceConfig = new DynatraceConfig() {\\n @Override\\n public DynatraceApiVersion apiVersion() {\\n // not strictly required, but makes the code more clear/explicit\\n return DynatraceApiVersion.V2;\\n }\\n\\n @Override\\n public String uri() {\\n // The endpoint of the Dynatrace Metrics API v2 including path, e.g.:\\n // \\\"https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest\\\"\\n String endpoint = System.getenv(\\\"ENVVAR_METRICS_INGEST_URL\\\");\\n return endpoint != null ? endpoint : DynatraceConfig.super.uri();\\n }\\n\\n @Override\\n public String apiToken() {\\n // should be read from a secure source\\n String token = System.getenv(\\\"ENVVAR_METRICS_INGEST_TOKEN\\\");\\n return token != null ? token : \\\"\\\";\\n }\\n\\n @Override\\n @Nullable\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\nMeterRegistry registry = new DynatraceMeterRegistry(dynatraceConfig, Clock.SYSTEM);\\n----\\n\\nThese properties can also be set via Spring Boot, using property or yaml files.\\nIt is also possible to reference environment variables using the Spring property placeholders (e.g.: `management.dynatrace.metrics.export.uri: ${DT_METRICS_INGEST_URL}`).\\n\\nNOTE: `v2` is used as the default API version unless a `deviceId` is set (<<bookmark-apiv1, see below>>).\\n\\n[source,yml]\\n----\\n# For Spring Boot 3.0.0 and above:\\nmanagement.dynatrace.metrics.export:\\n# For Spring Boot versions below 3.0.0, use the line below instead of the line above:\\n# management.metrics.export.dynatrace:\\n # for SaaS: https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest\\n # for managed deployments: https://{your-domain}/e/{your-environment-id}/api/v2/metrics/ingest\\n uri: YOUR_METRICS_INGEST_URL\\n\\n # should be read from a secure source\\n api-token: YOUR_METRICS_INGEST_TOKEN\\n----\\n\\n=== Meter metadata\\n\\nStarting with Micrometer 1.12.0, the Dynatrace registry v2 exports meter metadata to Dynatrace.\\nCurrently supported types of metadata are *unit* (called \\\"base unit\\\" in Micrometer) and *description*.\\nNo changes are required to start exporting Metadata to Dynatrace - upgrading to version 1.12.0 or above is enough.\\nFind more information about metrics metadata in the https://docs.dynatrace.com/docs/shortlink/metric-ingestion-protocol#metadata[Dynatrace documentation].\\n\\nThe export of metrics metadata can be disabled by setting the `exportMeterMetadata` property on the `DynatraceConfig` (see <<bookmark-available-properties, the section on available properties>> below) to `false`.\\n\\n== API Versions\\n\\n=== API v2 [[bookmark-apiv2]]\\n\\nWhen the API version is configured to `v2`, the registry will send data using the https://docs.dynatrace.com/docs/shortlink/api-metrics-v2[Metrics API v2].\\nIn order to maintain backwards compatibility, when a `deviceId` is set (which is required for `v1` and not used in `v2`), `v1` is used as the default.\\nOtherwise, the version defaults to `v2`, and does not have to be set explicitly.\\nWith no endpoint URI and token set, metrics will be exported to the local OneAgent endpoint or, if running in Kubernetes with the Dynatrace operator installed, to the endpoint provided by the operator.\\nIf no auto-configuration is desired, it is possible to specify endpoint and token explicitly, in order to export metrics to that specific endpoint.\\nExplicitly specifying these will overwrite auto-configuration.\\n\\n*Minimal configuration with Dynatrace auto-configuration*\\n\\nIn the minimal configuration <<bookmark-auto-configuration, shown above>> (no URI or API token), the v2 registry will attempt to retrieve the endpoint provided by the Dynatrace Kubernetes operator.\\nIf the operator is not set up or does not provide this information, the exporter will attempt to send metrics to the https://docs.dynatrace.com/docs/shortlink/local-api[local OneAgent metrics ingest endpoint].\\nNote that this only works if a OneAgent is running on the host and the https://docs.dynatrace.com/docs/shortlink/local-api#enable-the-oneagent-metric-api[local OneAgent Metric API] is available.\\nIf the ingestion port for the local OneAgent was changed to a custom one, the full endpoint URI has to be provided for the URI property (with API token left empty).\\n\\n*Configuration with URI and API token*\\n\\nIf no auto-configuration is available or the metrics should be sent to a different endpoint (e.g. a different tenant), the Dynatrace v2 exporter can be configured with an explicit endpoint URI and an https://docs.dynatrace.com/docs/shortlink/api-authentication[API token].\\nThe https://docs.dynatrace.com/docs/shortlink/api-authentication[API token] must have the https://docs.dynatrace.com/docs/dynatrace-api/basics/dynatrace-api-authentication#token-scopes[\\\"Ingest metrics\\\"] (`metrics.ingest`) permission set.\\nIt is recommended to limit scope to only this permission.\\n\\nThe entire Metrics v2 API endpoint URI has to be specified including its path, i.e.: with the path `/api/v2/metrics/ingest` on SaaS and managed deployments, or `/metrics/ingest` for OneAgent endpoints as mentioned in the https://docs.dynatrace.com/docs/shortlink/api-metrics-v2-post-datapoints[documentation].\\n\\n*Properties available in the v2 exporter* [[bookmark-available-properties]]\\n\\nWhen using the https://docs.dynatrace.com/docs/shortlink/api-metrics-v2[Dynatrace metrics API v2], the following properties can be set:\\n\\n[source,java]\\n----\\nDynatraceConfig dynatraceConfig = new DynatraceConfig() {\\n @Override\\n public DynatraceApiVersion apiVersion() {\\n return DynatraceApiVersion.V2;\\n }\\n\\n @Override\\n public String uri() {\\n // The endpoint of the Dynatrace Metrics API v2 including path, e.g.:\\n // \\\"https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest\\\".\\n String endpoint = System.getenv(\\\"ENVVAR_METRICS_INGEST_URL\\\");\\n return endpoint != null ? endpoint : DynatraceConfig.super.uri();\\n }\\n\\n @Override\\n public String apiToken() {\\n // should be read from a secure source\\n String token = System.getenv(\\\"ENVVAR_METRICS_INGEST_TOKEN\\\");\\n return token != null ? token : \\\"\\\";\\n }\\n\\n @Override\\n public String metricKeyPrefix() {\\n // will be prepended to all metric keys\\n return \\\"your.desired.prefix\\\";\\n }\\n\\n @Override\\n public boolean enrichWithDynatraceMetadata() {\\n return true;\\n }\\n\\n @Override\\n public Map<String, String> defaultDimensions() {\\n // create and return a map containing the desired key-value pairs.\\n Map<String, String> dims = new HashMap<>();\\n dims.put(\\\"dimensionKey\\\", \\\"dimensionValue\\\");\\n return dims;\\n }\\n\\n // Only available in Micrometer 1.9.0 and above\\n @Override\\n public boolean useDynatraceSummaryInstruments() {\\n return false;\\n }\\n\\n // Only available in Micrometer 1.12.0 and above\\n @Override\\n public boolean exportMeterMetadata() {\\n return true;\\n }\\n\\n @Override\\n @Nullable\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\n----\\n\\nThese properties can also be set in Spring Boot configuration files:\\n\\n[source,yml]\\n----\\nmanagement.dynatrace.metrics.export:\\n # Required only if not using the OneAgent endpoint\\n # For SaaS: https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest\\n # For managed deployments: https://{your-domain}/e/{your-environment-id}/api/v2/metrics/ingest\\n uri: YOUR_METRICS_INGEST_URL\\n\\n # should be read from a secure source\\n api-token: YOUR_METRICS_INGEST_TOKEN\\n\\n # These properties can only be used with the v2 exporter.\\n v2:\\n # Sets a prefix that is prepended to each exported metric key.\\n metric-key-prefix: my.metric.key.prefix\\n\\n # If set to true and a local OneAgent or operator is running, retrieves metadata\\n # and adds it as additional dimensions to all data points (default: true)\\n enrich-with-dynatrace-metadata: true\\n\\n # Sets an arbitrary number of key-value pairs as default dimensions.\\n # Micrometer tags will overwrite these dimensions, if they have the same key.\\n # Each exported metric will contain these dimensions.\\n default-dimensions:\\n key1: \\\"value1\\\"\\n key2: \\\"value2\\\"\\n\\n # (since 1.9.0) Whether or not to use the Dynatrace-specific summary instruments. (default: true)\\n # This should only be disabled if problems with existing instrumentation are discovered after upgrading to 1.9.0.\\n # Set to false, this will restore the previous (1.8.x) behavior for Timers and DistributionSummaries.\\n use-dynatrace-summary-instruments: true\\n\\n # (since 1.12.0) Determines whether meter metadata (unit, description) should be exported.\\n export-meter-metadata: true\\n\\n # The export interval in which metrics are sent to Dynatrace (default: 60s).\\n step: 60s\\n----\\n\\nFor more information about the metadata picked up by the Dynatrace metadata enrichment feature, see https://docs.dynatrace.com/docs/shortlink/enrichment-files[the Dynatrace documentation].\\n\\nIn Micrometer 1.9.0, Dynatrace-specific summary instruments (`DynatraceTimer` and `DynatraceDistributionSummary`) were introduced.\\nThese specialized instruments are tailored to the Dynatrace metrics ingest, and prevent the creation of invalid metrics.\\nThey are available from version 1.9.0 and are used as a drop-in replacement by default.\\nNo action is needed from users upgrading to 1.9.0. If there is a discrepancy in the observed metrics, it is possible to return to the previous behavior by setting the `useDynatraceSummaryInstruments` toggle to `false`.\\n\\n=== API v1 (Legacy) [[bookmark-apiv1]]\\n\\nWhen the apiVersion is configured to `v1`, the registry will send data using the https://docs.dynatrace.com/docs/shortlink/api-custom-metrics[Dynatrace Timeseries API v1 for custom metrics].\\nIf a `deviceId` is specified, it will default to `v1` for backwards compatibility with earlier setups.\\nThe `device-id` property is required for `v1` and not used in `v2`.\\nExisting setups will continue to work when updating to newer versions of Micrometer.\\nThe reported metrics will be assigned to https://docs.dynatrace.com/docs/shortlink/api-custom-device-report-metric[custom devices] in Dynatrace.\\n\\nFor the v1 API, do not specify the ingest path, but only the base URL of your environment, e.g.: `uri: https://{your-environment-id}.live.dynatrace.com`\\n\\n[source,java]\\n----\\nDynatraceConfig dynatraceConfig = new DynatraceConfig() {\\n @Override\\n public String uri() {\\n // The Dynatrace environment URI without any path, e.g.:\\n // https://{your-environment-id}.live.dynatrace.com\\n return MY_DYNATRACE_URI;\\n }\\n\\n @Override\\n public String apiToken() {\\n // should be read from a secure source\\n return MY_TOKEN;\\n }\\n\\n @Override\\n public String deviceId() {\\n return MY_DEVICE_ID;\\n }\\n\\n @Override\\n @Nullable\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\nMeterRegistry registry = new DynatraceMeterRegistry(dynatraceConfig, Clock.SYSTEM);\\n----\\n\\n[source,yml]\\n----\\nmanagement.dynatrace.metrics.export:\\n # For v1 export, do not append a path to the endpoint URL, e.g.:\\n # For SaaS: https://{your-environment-id}.live.dynatrace.com\\n # For managed deployments: https://{your-domain}/e/{your-environment-id}\\n uri: https://{your-environment-id}.live.dynatrace.com\\n\\n # should be read from a secure source\\n api-token: MY_TOKEN\\n\\n # When setting the device id, metrics will be exported to the v1 timeseries endpoint\\n # Using just device-id (without the v1 prefix) is deprecated, but will work to maintain backwards compatibility.\\n v1:\\n device-id: sample\\n\\n # To disable Dynatrace publishing, e.g. in a local development profile, use:\\n # enabled: false\\n\\n # The interval at which metrics are sent to Dynatrace. The default is 1 minute.\\n step: 1m\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Elastic\\n:toc:\\n:sectnums:\\n:system: elastic\\n\\nElasticsearch is an open source search and analytics platform. Metrics stored in Elasticsearch can be visualized in Kibana.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThe following example configures an ElasticSearch instance:\\n\\n[source,java]\\n----\\nElasticConfig elasticConfig = new ElasticConfig() {\\n @Override\\n @Nullable\\n public String get(String k) {\\n return null;\\n }\\n};\\nMeterRegistry registry = new ElasticMeterRegistry(elasticConfig, Clock.SYSTEM);\\n----\\n\\n`ElasticConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.elastic` directly to the `ElasticConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.elastic:\\n # You will probably want disable Elastic publishing in a local development profile.\\n enabled: true\\n\\n # The interval at which metrics are sent to Elastic. The default is 1 minute.\\n step: 1m\\n\\n # The index to store metrics in, defaults to \\\"micrometer-metrics\\\"\\n index: micrometer-metrics\\n----\\n\\n== Elastic APM agent integration\\n\\nIf you are using the Elastic APM agent, it can collect metrics from Micrometer `MeterRegistry` instances automatically. You can use the `SimpleMeterRegistry` if you only want metrics collected by the Elastic APM agent and not shipped anywhere else. See the https://www.elastic.co/guide/en/apm/agent/java/current/metrics.html#metrics-micrometer[Elastic docs] for more details.\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Ganglia\\n:toc:\\n:sectnums:\\n:system: ganglia\\n\\nGanglia is an aging hierarchical metrics system which enjoyed wide popularity in Linux system monitoring and is still in place in many organizations. It originated in the early 2000s at the University of California, Berkeley.\\n\\nNOTE: The `micrometer-registry-ganglia` module uses the https://github.com/ganglia/gmetric4j[gmetric4j] library, which contains classes generated by the LGPL licensed https://sourceforge.net/projects/remotetea/[remotetea project].\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThe following example configures a Ganglia instance:\\n\\n[source,java]\\n----\\nGangliaConfig gangliaConfig = new GangliaConfig() {\\n @Override\\n public String host() {\\n return \\\"mygraphitehost\\\";\\n }\\n\\n @Override\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\n\\nMeterRegistry registry = new GangliaMeterRegistry(gangliaConfig, Clock.SYSTEM);\\n----\\n\\nMicrometer uses Dropwizard Metrics as the underlying instrumentation library when recording metrics destined for Ganglia. `GangliaConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.ganglia` directly to the `GangliaConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.ganglia:\\n # The location of your Ganglia server\\n host: mygraphitehost\\n\\n # You will probably want to conditionally disable Ganglia publishing in local development.\\n enabled: true\\n\\n # The interval at which metrics are sent to Ganglia. The default is 1 minute.\\n step: 1m\\n----\\n\\n== Hierarchical name mapping\\n\\nMicrometer provides a `HierarchicalNameMapper` interface that governs how a dimensional meter ID is mapped to flat hierarchical names.\\n\\nThe default (`HierarchicalNameMapper.DEFAULT`) sorts tags alphabetically by key and appends tag key/value pairs to the base meter name with '.' -- for example, `http_server_requests.method.GET.response.200`. The name and tag keys have the registry's naming convention applied to them first.\\n\\nIf there is something special about your naming scheme that you need to honor, you can provide your own `HierarchicalNameMapper` implementation. The most common cause of a custom mapper comes from a need to prefix something to the front of every metric (generally something like `app.<name>.http_server_requests.method.GET.response.200`).\\n\\n== Graphing\\n\\nThis section serves as a quick start to rendering useful representations in Ganglia for metrics originating in Micrometer.\\n\\n=== Counters\\n\\nGanglia counters measure mean throughput and one-, five-, and fifteen-minute exponentially-weighted moving average throughputs.\\n\\n.A Ganglia rendered graph of the random walk counter.\\nimage::\" + require(\"!file-loader!./img/ganglia-counter.png\") + \"[Ganglia-rendered counter]\\n\"","export default __webpack_public_path__ + \"80865a7f65d47863b3b264a9ed09629a.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Graphite\\n:toc:\\n:sectnums:\\n:system: graphite\\n\\nGraphite is one of the most popular current hierarchical metrics systems backed by a fixed-size database, similar in design and purpose to RRDtool. It originated at Orbitz in 2006 and was open sourced in 2008.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThe following example configures a Graphite instance:\\n\\n[source,java]\\n----\\nGraphiteConfig graphiteConfig = new GraphiteConfig() {\\n @Override\\n public String host() {\\n return \\\"mygraphitehost\\\";\\n }\\n\\n @Override\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\n\\nMeterRegistry registry = new GraphiteMeterRegistry(graphiteConfig, Clock.SYSTEM, HierarchicalNameMapper.DEFAULT);\\n----\\n\\nMicrometer uses Dropwizard Metrics as the underlying instrumentation library when recording metrics destined for Graphite. `GraphiteConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.graphite` directly to the `GraphiteConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.graphite:\\n # The location of your Graphite server\\n host: mygraphitehost\\n\\n # You will probably want to conditionally disable Graphite publishing in local development.\\n enabled: true\\n\\n # The interval at which metrics are sent to Graphite. The default is 1 minute.\\n step: 1m\\n----\\n\\n== Graphite Tag Support\\n\\nAs of Micrometer version 1.4.0, Micrometer supports exporting Graphite metrics by using tags instead of the traditional hierarchical format. By default, metrics are exported by using the tag format, unless any `tagsAsPrefix` values are configured.\\nhttps://graphite.readthedocs.io/en/latest/tags.html[Tag support] was added to Graphite in the 1.1.0 Graphite release.\\nIf you wish to revert to the traditional hierarchical format, ensure that the `graphiteTagsEnabled` config value is set to `false`.\\nThe following documentation sections on hierarchical name mapping and metrics prefixing are only applicable if tag support is disabled.\\n\\n== Hierarchical name mapping\\n\\nMicrometer provides a `HierarchicalNameMapper` interface that governs how a dimensional meter ID is mapped to flat hierarchical names.\\n\\nThe default (`HierarchicalNameMapper.DEFAULT`) sorts tags alphabetically by key and appends tag key/value pairs to the base meter name with '.' -- for example, `http_server_requests.method.GET.response.200`. The name and tag keys have the registry's naming convention applied to them first.\\n\\nIf there is something special about your naming scheme that you need to honor, you can provide your own `HierarchicalNameMapper` implementation. The most common cause of a custom mapper comes from a need to prefix something to the front of every metric (generally something like `app.<name>.http_server_requests.method.GET.response.200`).\\n\\n== Prefixing your metrics\\n\\nTo add a prefix to all metrics that go to graphite, use the `GraphiteConfig#tagsAsPrefix` configuration option. This option applies the tag value of a set of common tags as a prefix. For example, if `tagsAsPrefix` contains `application`, and a meter named `myTimer` is created with a tag of `application=APPNAME`, it appears in Graphite as `APPNAME.myTimer`.\\n\\nGenerally, when you use `tagsAsPrefix`, you should add common tags to the registry so that the tags are present on all meters that belong to that registry:\\n\\n[source,java]\\n----\\n@Bean\\npublic MeterRegistryCustomizer<MeterRegistry> commonTags() {\\n return r -> r.config().commonTags(\\\"application\\\", \\\"APPNAME\\\");\\n}\\n----\\n\\nWe do it this way because, generally, a tag prefix in Graphite is correlated to a common tag elsewhere. Prefixes tend to be something like app name or host. By applying those values as common tags, you make your metrics more portable (that is, if you ever switch to a dimensional monitoring system, you are set).\\n\\nYou can use this when the order of the prefix matters. Micrometer always sorts tags, but the order of tag keys in `tagsAsPrefix` is preserved, so adding `host` and `application` to `tagsAsPrefix` results in a prefixed metric, such as `HOST.APP.myCounter`.\\n\\nTo meet your specific naming needs, you can also provide a custom hierarchical name mapper when creating `GraphiteMeterRegistry`, as follows:\\n\\n[source,java]\\n----\\nGraphiteMeterRegistry r = new GraphiteMeterRegistry(\\n GraphiteConfig.DEFAULT,\\n Clock.SYSTEM,\\n (id, convention) -> \\\"prefix.\\\" + HierarchicalNameMapper.DEFAULT.toHierarchicalName(id, convention));\\n----\\n\\nNOTE: If you use a custom `HierarchicalNameMapper`, `tagsAsPrefix` is ignored.\\n\\n== Further Customizing the `GraphiteReporter`\\n\\nWe give you the option to configure `GraphiteReporter` yourself if you need further customization. To do so, use this constructor and provide your own `GraphiteReporter`:\\n\\n[source,java]\\n----\\nGraphiteMeterRegistry(GraphiteConfig config, Clock clock, HierarchicalNameMapper nameMapper,\\n MetricRegistry metricRegistry, GraphiteReporter reporter)\\n----\\n\\n== Graphing\\n\\nThis section serves as a quick start to rendering useful representations in Graphite for metrics originating in Micrometer.\\n\\n=== Counters\\n\\nGraphite counters measure mean throughput and one-, five-, and fifteen-minute exponentially-weighted moving average throughputs.\\n\\n.A Graphite rendered graph of the random walk counter.\\nimage::\" + require(\"!file-loader!./img/graphite-counter.png\") + \"[Graphite-rendered counter]\\n\"","export default __webpack_public_path__ + \"cd6b0314737fa94a81e42689517fd7fb.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n== Hierarchical name mapping\\n\\nMicrometer provides a `HierarchicalNameMapper` interface that governs how a dimensional meter ID is mapped to flat hierarchical names.\\n\\nThe default (`HierarchicalNameMapper.DEFAULT`) sorts tags alphabetically by key and appends tag key/value pairs to the base meter name with '.' -- for example, `http_server_requests.method.GET.response.200`. The name and tag keys have the registry's naming convention applied to them first.\\n\\nIf there is something special about your naming scheme that you need to honor, you can provide your own `HierarchicalNameMapper` implementation. The most common cause of a custom mapper comes from a need to prefix something to the front of every metric (generally something like `app.<name>.http_server_requests.method.GET.response.200`).\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Humio\\n:toc:\\n:sectnums:\\n:system: humio\\n\\nHumio is a dimensional time-series SaaS with built-in dashboarding.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThe following example configures a Humio instance:\\n\\n[source,java]\\n----\\nHumioConfig humioConfig = new HumioConfig() {\\n @Override\\n public String apiToken() {\\n return MY_TOKEN;\\n }\\n\\n @Override\\n @Nullable\\n public String get(String k) {\\n return null;\\n }\\n};\\nMeterRegistry registry = new HumioMeterRegistry(humioConfig, Clock.SYSTEM);\\n----\\n\\n`HumioConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.humio` directly to the `HumioConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.humio:\\n api-token: YOURKEY\\n\\n # You will probably want disable Humio publishing in a local development profile.\\n enabled: true\\n\\n # The interval at which metrics are sent to Humio. The default is 1 minute.\\n step: 1m\\n\\n # The cluster Micrometer will send metrics to. The default is \\\"https://cloud.humio.com\\\"\\n uri: https://myhumiohost\\n----\\n\\n== Graphing\\n\\nThis section serves as a quick start to rendering useful representations in Humio for metrics originating in Micrometer.\\n\\n=== Timers\\n\\nThe Humio implementation of `Timer` produces four fields in Humio:\\n\\n* `sum`: Rate of calls per second.\\n* `count`: Rate of total time per second.\\n* `max`: A sliding window maximum amount recorded.\\n* `avg`: A non-aggregable average for only this set of tag values.\\n\\nThe following query constructs a dimensionally aggregable average latency per URI:\\n\\n[source, text]\\n----\\nname = http_server_requests\\n| timechart(uri, function=max(avg))\\n----\\n\\n.Timer over a simulated service.\\nimage::\" + require(\"!file-loader!./img/humio-timer.png\") + \"[Humio-rendered timer]\\n\"","export default __webpack_public_path__ + \"6584fae5a94c66dd29f69056b031d7e3.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Influx\\n:toc:\\n:sectnums:\\n:system: influx\\n\\nThe InfluxData suite of tools supports real-time stream processing and storage of time-series data. It supports downsampling, automatically expiring and deleting unwanted data, as well as backup and restore.\\n\\nThe InfluxMeterRegistry supports the 1.x InfluxDB API as well as the v2 API.\\n\\n== Configuring\\n\\nMicrometer supports shipping metrics to InfluxDB directly or through Telegraf through the StatsD registry.\\n\\n=== Direct to InfluxDB\\n\\nThe following example adds the required library in Gradle:\\n\\n[source,groovy]\\n----\\nimplementation 'io.micrometer:micrometer-registry-influx:latest.release'\\n----\\n\\nThe following example adds the required library in Maven:\\n\\n[source,xml]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-influx</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\nMetrics are rate-aggregated and pushed to InfluxDB on a periodic interval. Rate aggregation performed by the registry yields datasets that are quite similar to those produced by Telegraf. The following example configures a meter registry for InfluxDB:\\n\\n.InfluxDB 1.x configuration example\\n[source, java]\\n----\\nInfluxConfig config = new InfluxConfig() {\\n @Override\\n public Duration step() {\\n return Duration.ofSeconds(10);\\n }\\n\\n @Override\\n public String db() {\\n return \\\"mydb\\\";\\n }\\n\\n @Override\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\nMeterRegistry registry = new InfluxMeterRegistry(config, Clock.SYSTEM);\\n----\\n\\nTo ship metrics to InfluxDB 2.x, make sure to configure the `org` and `bucket` to which to write the metrics, as well as the authentication `token`.\\n\\n.InfluxDB v2 configuration example\\n[source, java]\\n----\\nInfluxConfig config = new InfluxConfig() {\\n\\n @Override\\n public String org() {\\n return \\\"myorg\\\";\\n }\\n\\n @Override\\n public String bucket() {\\n return \\\"app-metrics\\\";\\n }\\n\\n @Override\\n public String token() {\\n return \\\"auth_token_here\\\"; // FIXME: This should be securely bound rather than hard-coded, of course.\\n }\\n\\n @Override\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\nMeterRegistry registry = new InfluxMeterRegistry(config, Clock.SYSTEM);\\n----\\n\\n`InfluxConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.influx` directly to the `InfluxConfig`:\\n\\n[source, yaml]\\n----\\nmanagement.metrics.export.influx:\\n api-version: v2 # API version of InfluxDB to use. Defaults to 'v1' unless an org is configured. If an org is configured, defaults to 'v2'.\\n auto-create-db: true # Whether to create the InfluxDB database if it does not exist before attempting to publish metrics to it. InfluxDB v1 only. (Default: true)\\n batch-size: 10000 # Number of measurements per request to use for this backend. If more measurements are found, then multiple requests will be made. (Default: 10000)\\n bucket: mybucket # Bucket for metrics. Use either the bucket name or ID. Defaults to the value of the db property if not set. InfluxDB v2 only.\\n compressed: true # Whether to enable GZIP compression of metrics batches published to InfluxDB. (Default: true)\\n connect-timeout: 1s # Connection timeout for requests to this backend. (Default: 1s)\\n consistency: one # Write consistency for each point. (Default: one)\\n db: mydb # Database to send metrics to. InfluxDB v1 only. (Default: mydb)\\n enabled: true # Whether exporting of metrics to this backend is enabled. (Default: true)\\n num-threads: 2 # Number of threads to use with the metrics publishing scheduler. (Default: 2)\\n org: myorg # Org to write metrics to. InfluxDB v2 only.\\n password: mysecret # Login password of the InfluxDB server. InfluxDB v1 only.\\n read-timeout: 10s # Read timeout for requests to this backend. (Default: 10s)\\n retention-policy: my_rp # Retention policy to use (InfluxDB writes to the DEFAULT retention policy if one is not specified). InfluxDB v1 only.\\n step: 1m # Step size (i.e. reporting frequency) to use. (Default: 1m)\\n token: AUTH_TOKEN_HERE # Authentication token to use with calls to the InfluxDB backend. For InfluxDB v1, the Bearer scheme is used. For v2, the Token scheme is used.\\n uri: http://localhost:8086 # URI of the InfluxDB server. (Default: http://localhost:8086)\\n user-name: myusername # Login user of the InfluxDB server. InfluxDB v1 only.\\n----\\n\\n=== Through Telegraf\\n\\nTelegraf is a StatsD agent that expects a modified flavor of the StatsD line protocol.\\n\\nThe following listing adds the relevant library in Gradle:\\n\\n[source,groovy]\\n----\\nimplementation 'io.micrometer:micrometer-registry-statsd:latest.release'\\n----\\n\\nThe following listing adds the relevant library in Maven:\\n\\n[source,xml]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-statsd</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\nMetrics are shipped immediately over UDP to Telegraf by using Telegraf's flavor of the StatsD line protocol.\\n\\n[source,java]\\n----\\nStatsdConfig config = new StatsdConfig() {\\n @Override\\n public String get(String k) {\\n return null;\\n }\\n\\n @Override\\n public StatsdFlavor flavor() {\\n return StatsdFlavor.Telegraf;\\n }\\n};\\n\\nMeterRegistry registry = new StatsdMeterRegistry(config, Clock.SYSTEM);\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Instana\\nFabian Lange <fabian.lange@instana.com>\\n:toc:\\n:sectnums:\\n:system: instana\\n\\nInstana is an automatic application performance management and infrastructure monitoring system.\\n\\n== Installation and Configuration\\n\\nInstana automatically detects and reports all metrics without the need of any additional dependency or configuration.\\nIt does so by detecting all instances of `io.micrometer.core.instrument.MeterRegistry` and collecting all registered `io.micrometer.core.instrument.Meter` instances from them.\\n\\nYou can run the Instana agent alongside your application by using Micrometer, and the Instana agent automatically monitors it.\\n\\n== Supported Metrics\\n\\n* **Timer**: The total time of recorded events, scaled to milliseconds.\\n* **Counter**: The cumulative count since this counter was created.\\n* **Gauge**: The current value.\\n* **DistributionSummary**: The total number of all recorded events.\\n* **LongTaskTimer**: The current number of tasks being executed.\\n* **FunctionCounter**: The cumulative count since this counter was created.\\n* **FunctionTimer**: The total time of all occurrences of the timed event.\\n* **TimeGauge**: The current value, scaled to the appropriate base unit.\\n\\nThe metrics show up on the Java Virtual Machine dashboard in Instana. You can configure alerting based on these metrics.\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer JMX\\n:toc:\\n:sectnums:\\n:system: jmx\\n\\nMicrometer provides a hierarchical mapping to JMX, primarily as a cheap and portable way to view metrics locally. Where JMX exporting is found in production, the same metrics are generally exported to another, more purpose-fit monitoring system.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\nMicrometer also sometimes scrapes data from JMX beans for use in reporting metrics. This registry implementation is not needed for these uses. Rather, this module is strictly used to _export_ data to JMX.\\n\\n== Hierarchical name mapping\\n\\nMicrometer provides a `HierarchicalNameMapper` interface that governs how a dimensional meter ID is mapped to flat hierarchical names.\\n\\nThe default (`HierarchicalNameMapper.DEFAULT`) sorts tags alphabetically by key and appends tag key/value pairs to the base meter name with '.' -- for example, `http_server_requests.method.GET.response.200`. The name and tag keys have the registry's naming convention applied to them first.\\n\\nIf there is something special about your naming scheme that you need to honor, you can provide your own `HierarchicalNameMapper` implementation. The most common cause of a custom mapper comes from a need to prefix something to the front of every metric (generally something like `app.<name>.http_server_requests.method.GET.response.200`).\\n\\n== Counters\\n\\nJMX counters measure mean throughput and one-, five-, and fifteen-minute exponentially-weighted moving average throughputs.\\n\\n.The JMX rendered values of the random walk counter.\\nimage::\" + require(\"!file-loader!./img/jmx-counter.png\") + \"[JMX-rendered counter]\\n\"","export default __webpack_public_path__ + \"8077bd6e31e279e04a38e631b2d61a1e.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer KairosDB\\n:toc:\\n:sectnums:\\n:system: kairos\\n\\nKairosDB is a dimensional time-series database built on top of Cassandra. Charting can be accomplished in Grafana by using a link:https://docs.grafana.org/v4.0/datasources/kairosdb/[Kairos datasource].\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThe following example configures KairosDB:\\n\\n[source,java]\\n----\\nKairosConfig kairosConfig = new KairosConfig() {\\n @Override\\n @Nullable\\n public String get(String k) {\\n return null;\\n }\\n};\\nMeterRegistry registry = new KairosMeterRegistry(kairosConfig, Clock.SYSTEM);\\n----\\n\\n`KairosConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.kairos` directly to the `KairosConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.kairos:\\n # You will probably want disable Kairos publishing in a local development profile.\\n enabled: true\\n\\n # The interval at which metrics are sent to Kairos. The default is 1 minute.\\n step: 1m\\n\\n # Authentication may be required, depending on how you have Kairos configured\\n user-name: MYUSER\\n password: MYPASSWORD\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer New Relic\\n:toc:\\n:sectnums:\\n:system: new-relic\\n\\nNew Relic offers a dimensional monitoring system product called Insights. It includes a full UI and a query language called NRQL. New Relic Insights operates on a push model. Some features of NRQL assume that Insights receives a distinct event payload for every timing, count, and so on. Micrometer instead ships aggregates at a prescribed interval, letting your app's throughput scale without concern for event propagation to Insights becoming a bottleneck.\\n\\nNOTE: New Relic provides its own Micrometer `MeterRegistry` implementation based on dimensional metrics.\\nIt intends to supersede Micrometer's `NewRelicMeterRegistry` (which uses custom events in New Relic), because New Relic's dimensional metrics are a better fit for metrics than custom events.\\nYou can find more details in https://github.com/newrelic/micrometer-registry-newrelic[its GitHub repository].\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThe following example configures New Relic:\\n\\n[source,java]\\n----\\nNewRelicConfig newRelicConfig = new NewRelicConfig() {\\n @Override\\n public String accountId() {\\n return \\\"MYACCOUNT\\\";\\n }\\n\\n @Override\\n public String apiKey() {\\n return \\\"MY_INSIGHTS_API_KEY\\\";\\n }\\n\\n @Override\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\n\\nMeterRegistry registry = new NewRelicMeterRegistry(newRelicConfig, Clock.SYSTEM);\\n----\\n\\nThere are two distinct sources of API keys in New Relic.\\n\\n`NewRelicConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.newrelic` directly to the `NewRelicConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.newrelic:\\n account-id: MYACCOUNT\\n api-key: MY_INSIGHTS_API_KEY\\n\\n # The interval at which metrics are sent to New Relic. See Duration.parse for the expected format.\\n # The default is 1 minute.\\n step: 1m\\n----\\n\\n== Graphing\\n\\nThis section serves as a quick start to rendering useful representations in New Relic for metrics originating in Micrometer. See the https://docs.newrelic.com/docs/insights/nrql-new-relic-query-language/using-nrql/introduction-nrql[New Relic NRQL docs] for a far more complete reference of what is possible in New Relic.\\n\\n=== Timers\\n\\nAt each publishing interval, the New Relic `Timer` produces a single event with the timer's name and several attributes:\\n\\n* `avg`: A mean latency for the publishing interval.\\n* `count`: Throughput per second over the publishing interval.\\n* `totalTime`: Total time per second over the publishing interval (used with `count`) to create aggregable means.\\n\\nAdditionally, if any percentiles or SLO buckets are defined on the timer, additional events are produced:\\n\\n* `${name}.percentiles`: Micrometer calculated percentiles for the publishing interval. One event is produced for each percentile, with a tag of `phi` in the range of [0,1].\\n* `${name}.histogram`: One event is produced for each SLO boundary with a tag of 'le', indicating that it represents a cumulative count of events less than or equal to SLO boundaries over the publishing interval.\\n\\nTo generate an aggregable view of latency in New Relic, divide `totalTime` by `count`:\\n\\n[source,sql]\\n----\\nSELECT sum(totalTime)/sum(count) as 'Average Latency', max(max) as 'Max' FROM timer since 30 minutes ago TIMESERIES auto\\n----\\n\\n.Timer latency.\\nimage::\" + require(\"!file-loader!./img/new-relic-timer-latency.png\") + \"[New Relic-rendered timer]\\n\\nTo generate a throughput chart:\\n\\n[source,sql]\\n----\\nSELECT average(count) as 'Average Throughput' FROM timer since 30 minutes ago TIMESERIES auto\\n----\\n\\n.Timer throughput.\\nimage::\" + require(\"!file-loader!./img/new-relic-timer-throughput.png\") + \"[New Relic-rendered timer throughput]\\n\\nTo generate a plot of client-side percentiles:\\n\\n[source,sql]\\n----\\nSELECT latest(value) from timerPercentile FACET phi since 30 minutes ago TIMESERIES auto\\n----\\n\\n.Timer Percentiles.\\nimage::\" + require(\"!file-loader!./img/new-relic-timer-percentiles.png\") + \"[New Relic-rendered percentiles]\\n\\nNote how these percentiles are _not aggregable_. We have selected the `latest(value)` function to display this chart (it isn't correct to `average(value)` on a percentile value). The more dimensions you add to a timer, the less useful these values become.\\n\\nFinally, if you define SLO boundaries with the fluent builder for `Timer`, you can view throughput below certain SLO boundaries. In this example, we set SLO boundaries at 275 (yellow), 300 (red), and 500 (blue) milliseconds for a simulated `Timer` that is recording samples normally distributed around 250 ms. These counts represent the rate/second of samples less than or equal to each SLO boundary.\\n\\n[source,sql]\\n----\\nSELECT sum(value) from timerHistogram FACET le since 30 minutes ago TIMESERIES auto\\n----\\n\\n.Timer SLO boundaries.\\nimage::\" + require(\"!file-loader!./img/new-relic-timer-sla.png\") + \"[New Relic-rendered SLO boundaries]\\n\\nWhere the lines converge at various points, it is evident that no sample exceeded the 275 ms SLO boundary.\\n\"","export default __webpack_public_path__ + \"4d25b7833c033d6e2380ec4ecc988d66.png\";","export default __webpack_public_path__ + \"02f1215f99df0a7a03ac1d5986ace874.png\";","export default __webpack_public_path__ + \"03797aa9d08a216ed90efab2b59e0114.png\";","export default __webpack_public_path__ + \"e1fdf4994baf8640b183e76694d53390.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer OTLP\\n:toc:\\n:sectnums:\\n:system: otlp\\n\\nOpenTelemetry is a CNCF incubating project for providing standards for telemetry data. OpenTelemetry protocol (OTLP) is a vendor neutral protocol that can be used to send data to various backends which support it. You can read the corresponding docs on how the metrics are ingested and can be visualized in the respective vendor docs.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\nThe following example configures an OTLP registry:\\n\\n[source,java]\\n----\\nOtlpConfig otlpConfig = new OtlpConfig() {\\n @Override\\n public String get(final String key) {\\n return null;\\n }\\n};\\n\\nMeterRegistry registry = new OtlpMeterRegistry(otlpConfig, Clock.SYSTEM);\\n----\\n\\n`OtlpConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source (e.g.: a simple `Map` can work), you can override the default configuration through properties. For example, Micrometer's Spring Boot support binds properties prefixed with `management.otlp.metrics.export` directly to the `OtlpConfig`:\\n\\n[source, yaml]\\n----\\nmanagement:\\n otlp:\\n metrics:\\n export:\\n # Supported configs\\n url: \\\"https://otlp.example.com:4318/v1/metrics\\\"\\n aggregationTemporality: \\\"cumulative\\\"\\n headers:\\n header1: value1\\n resourceAttributes:\\n key1: value1\\n----\\n\\n1. `url` - The URL to which data will be reported. Defaults to `http://localhost:4318/v1/metrics`\\n2. `aggregationTemporality` - https://opentelemetry.io/docs/specs/otel/metrics/data-model/#temporality[Aggregation temporality, window=_blank] determines how the additive quantities are expressed, in relation to time. The supported values are `cumulative` or `delta`. Defaults to `cumulative`. +\\n*Note*: This config was introduced in version 1.11.0.\\n3. `headers` - Additional headers to send with exported metrics. This can be used for authorization headers. By default, headers will be loaded from the config. If that is not set, they can be taken from the environment variables `OTEL_EXPORTER_OTLP_HEADERS` and `OTEL_EXPORTER_OTLP_METRICS_HEADERS`. If a header is set in both the environmental variables, the header in the latter will override the former.\\n4. `resourceAttributes` - https://opentelemetry.io/docs/specs/otel/resource/semantic_conventions/#service[Resource attributes, window=_blank] that will be used for all metrics published. By default, Micrometer adds the following resource attributes:\\n\\n[%autowidth]\\n|===\\n|Key | Default value\\n\\n|telemetry.sdk.name\\n|io.micrometer\\n\\n|telemetry.sdk.language\\n|java\\n\\n|telemetry.sdk.version\\n|<micrometer-core-version> (e.g.: 1.11.0)\\n\\n|service.name\\n|unknown_service\\n|===\\n\\nIf this config is empty, then resource attributes will be loaded from the environmental variable `OTEL_RESOURCE_ATTRIBUTES`. `service.name` can be overridden by the environmental variable `OTEL_SERVICE_NAME` and this takes precedence over other configs.\\n\\n== Supported metrics\\nhttps://opentelemetry.io/docs/specs/otel/metrics/data-model/#metric-points[Metric points, window=_blank] define the different data points that are supported in OTLP. Micrometer supports exporting the below data points in OTLP format,\\n\\n1. https://opentelemetry.io/docs/specs/otel/metrics/data-model/#sums[Sums, window=_blank]\\n2. https://opentelemetry.io/docs/specs/otel/metrics/data-model/#gauge[Gauge, window=_blank]\\n3. https://opentelemetry.io/docs/specs/otel/metrics/data-model/#histogram[Histogram, window=_blank]\\n4. https://opentelemetry.io/docs/specs/otel/metrics/data-model/#summary-legacy[Summary, window=_blank]\\n\\nThe below table maps OTLP data points and the Micrometer meters:\\n\\n[%autowidth]\\n|===\\n|OTLP data point | Micrometer meter type\\n\\n|Sums\\n|Counter, FunctionCounter\\n\\n|Gauge\\n|Gauge, TimeGauge, MultiGauge\\n\\n|Histogram\\n|Timer, DistributionSummary, LongTaskTimer, FunctionTimer (only sum and count are set)\\n\\n|Summary\\n|Timer, DistributionSummary, LongTaskTimer\\n|===\\n\\n*Note*:\\n\\n1. `max` on Histogram data point is only supported in delta aggregation temporality. This is because the values represented by cumulative min and max will stabilize as more events are recorded and are less useful when recorded over application's lifecycle.\\n2. Currently, Micrometer only exports metadata for type `Meter` to OTLP.\\n\\n== Histograms and Percentiles\\nMicrometer `Timer` and `DistributionSummary` support configuring link:/docs/concepts#_histograms_and_percentiles[client-side percentiles and percentile histograms]. OTLP specification terms Summary data point (client-side percentiles) as legacy and not recommended for new applications. Summary data point also cannot have min/max associated with it. Due to these reasons Micrometer prefers exporting Timers and DistributionSummary as Histogram data point. By default, a Timer/DistributionSummary without any additional percentile/histogram config will be exported as Histogram data point. However, by configuring the timer to generate only client-side percentiles using `publishPercentiles` this can be changed to a Summary data point exporting pre-calculated percentiles. When both `publishPercentiles` and (`publishPercentileHistogram` or `serviceLevelObjectives`) are configured, Histogram data point is preferred and pre-calculated percentiles *will not* be generated. See the below table on which data point will be used with different configurations:\\n\\n[%autowidth]\\n|===\\n|Configuration | OTLP data point\\n\\n| publishPercentiles\\n| Summary\\n\\n| publishPercentileHistogram\\n| Histogram\\n\\n| serviceLevelObjectives\\n| Histogram\\n\\n| publishPercentiles and (publishPercentileHistogram/serviceLevelObjectives)\\n| Histogram\\n|===\\n\\nAlternatively, if you are using Spring Boot, you can use the https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.metrics.customizing.per-meter-properties[per-meter properties, window=_blank] to configure this behaviour.\\n\\nIf you want to generate Histogram data point for a Timer with name `test.timer` and default buckets generated by Micrometer, use:\\n\\n[source,properties]\\n----\\nmanagement.metrics.distribution.percentiles-histogram.test.timer=true\\n----\\n\\nand for buckets with customized SLO, use:\\n\\n[source,properties]\\n----\\nmanagement.metrics.distribution.slo.test.timer=10.0,100.0,500.0,1000.0\\n----\\n\\nAlternatively, if you want to generate Summary data point for a timer with name `test.timer` and 90th and 99th percentiles, you can use the below config:\\n\\n[source,properties]\\n----\\nmanagement.metrics.distribution.percentiles.test.timer=0.9,0.99\\n----\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Prometheus\\n:toc:\\n:sectnums:\\n:system: prometheus\\n\\nPrometheus is a dimensional time series database with a built-in UI, a custom query language, and math operations.\\nPrometheus is designed to operate on a pull model, periodically scraping metrics from application instances, based on service discovery.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nPrometheus expects to scrape or poll individual application instances for metrics.\\nIn addition to creating a Prometheus registry, you also need to expose an HTTP endpoint to Prometheus' scraper.\\nIn a Spring Boot application, a https://docs.spring.io/spring-boot/docs/current/actuator-api/htmlsingle/#prometheus[Prometheus actuator endpoint] is auto-configured in the presence of Spring Boot Actuator.\\nOtherwise, you can use any JVM-based HTTP server implementation to expose scrape data to Prometheus.\\n\\nThe following example uses the JDK's `com.sun.net.httpserver.HttpServer` to expose a scrape endpoint:\\n\\n[source,java]\\n----\\nPrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);\\n\\ntry {\\n HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);\\n server.createContext(\\\"/prometheus\\\", httpExchange -> {\\n String response = prometheusRegistry.scrape(); <1>\\n httpExchange.sendResponseHeaders(200, response.getBytes().length);\\n try (OutputStream os = httpExchange.getResponseBody()) {\\n os.write(response.getBytes());\\n }\\n });\\n\\n new Thread(server::start).start();\\n} catch (IOException e) {\\n throw new RuntimeException(e);\\n}\\n----\\n<1> The `PrometheusMeterRegistry` has a `scrape()` function that knows how to supply the String data necessary for the scrape. All you have to do is wire it to an endpoint.\\n\\nYou can alternatively use `io.prometheus.client.exporter.HTTPServer` that you can find in `io.prometheus:simpleclient_httpserver`:\\n[source,java]\\n----\\nPrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);\\n// you can set the daemon flag to false if you want the server to block\\nnew HTTPServer(new InetSocketAddress(8080), prometheusRegistry.getPrometheusRegistry(), true);\\n----\\n\\nAnother alternative can be `io.prometheus.client.exporter.MetricsServlet` that you can find in `io.prometheus:simpleclient_servlet` in case your app is running in a servlet container (e.g.: Tomcat):\\n[source,java]\\n----\\nPrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);\\nHttpServlet metricsServlet = new MetricsServlet(prometheusRegistry.getPrometheusRegistry());\\n----\\n\\n=== Scrape format\\n\\nBy default, the https://prometheus.io/docs/instrumenting/exposition_formats/#text-based-format[Prometheus text format] is returned from the `PrometheusMeterRegistry` `scrape()` method.\\n\\nThe https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md[OpenMetrics] format can also be produced.\\nTo specify the format to be returned, you can pass a content type to the `scrape` method.\\nFor example, to get the OpenMetrics 1.0.0 format scrape, you could use the Prometheus Java client constant for it, as follows:\\n\\n[source,java]\\n----\\nString openMetricsScrape = registry.scrape(TextFormat.CONTENT_TYPE_OPENMETRICS_100);\\n----\\n\\nIn Spring Boot applications, the https://docs.spring.io/spring-boot/docs/current/actuator-api/htmlsingle/#prometheus[Prometheus Actuator endpoint] supports scraping in either format, defaulting to the Prometheus text format in absence of a specific `Accept` header.\\n\\n=== The Prometheus Rename Filter\\n\\nIn some cases, Micrometer provides instrumentation that overlaps with commonly used Prometheus simple client modules but has chosen a different naming scheme for consistency and portability.\\nIf you wish to use the Prometheus \\\"standard\\\" names, add the following filter:\\n\\n[source,java]\\n----\\nprometheusRegistry.config().meterFilter(new PrometheusRenameFilter());\\n----\\n\\n== Graphing\\n\\nThis section serves as a quick start to rendering useful representations in Prometheus for metrics originating in Micrometer.\\nSee the https://prometheus.io/docs/querying/basics[Prometheus docs] for a far more complete reference of what is possible in Prometheus.\\n\\n=== Grafana Dashboard\\n\\nA publicly available Grafana dashboard for Micrometer-sourced JVM and Tomcat metrics is available https://grafana.com/grafana/dashboards/4701-jvm-micrometer/[here].\\n\\nimage::\" + require(\"!file-loader!./img/prometheus-dashboard.png\") + \"[Grafana dashboard for JVM and Tomcat binders]\\n\\nThe dashboard features:\\n\\n* JVM memory\\n* Process memory (provided by https://github.com/mweirauch/micrometer-jvm-extras[micrometer-jvm-extras])\\n* CPU-Usage, Load, Threads, File Descriptors, and Log Events\\n* JVM Memory Pools (Heap, Non-Heap)\\n* Garbage Collection\\n* Classloading\\n* Direct/Mapped buffer sizes\\n\\nInstead of using the `job` tag to distinguish different applications, this dashboard makes use of a common tag called `application`, which is applied to every metric.\\nYou can apply the common tag as follows:\\n\\n[source,java]\\n----\\nregistry.config().commonTags(\\\"application\\\", \\\"MYAPPNAME\\\");\\n----\\n\\nIn Spring Boot applications, you can use the https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.metrics.customizing.common-tags[property support for common tags]:\\n\\n[source,properties]\\n----\\nmanagement.metrics.tags.application=MYAPPNAME\\n----\\n\\n=== Counters\\n\\nThe query that generates a graph for the random-walk counter is\\n`rate(counter[10s])`.\\n\\n.A Grafana rendered graph of the random walk counter.\\nimage::\" + require(\"!file-loader!./img/prometheus-counter.png\") + \"[Grafana-rendered Prometheus counter]\\n\\nRepresenting a counter without rate normalization over some time window is rarely useful, as the representation is a function of both the rapidity with which the counter is incremented and the longevity of the service. It is generally most useful to rate-normalize these time series to reason about them. Since Prometheus keeps track of discrete events across all time, it has the advantage of allowing for the selection of an arbitrary time window across which to normalize at query time (for example, `rate(counter[10s])` provides a notion of requests per second over 10 second windows). The rate-normalized graph in the preceding image would return back to a value around 55 as soon as the new instance (say on a production deployment) was in service.\\n\\n.Counter over the same random walk, no rate normalization.\\nimage::\" + require(\"!file-loader!./img/prometheus-counter-norate.png\") + \"[Grafana-rendered Prometheus counter (no rate)]\\n\\nIn contrast, without rate normalization, the counter drops back to zero on service restart, and the count increases without bound for the duration of the service's uptime.\\n\\n=== Timers\\n\\nThe Prometheus `Timer` produces two counter time series with different names:\\n\\n* `${name}_count`: Total number of all calls.\\n* `${name}_sum`: Total time of all calls.\\n\\nRepresenting a counter without rate normalization over some time window is rarely useful, as the representation is a function of both the rapidity with which the counter is incremented and the longevity of the service.\\n\\nUsing the following Prometheus queries, we can graph the most commonly used statistics about timers:\\n\\n* Average latency: `rate(timer_sum[10s])/rate(timer_count[10s])`\\n* Throughput (requests per second): `rate(timer_count[10s])`\\n\\n.Timer over a simulated service.\\nimage::\" + require(\"!file-loader!./img/prometheus-timer.png\") + \"[Grafana-rendered Prometheus timer]\\n\\n=== Long task timers\\n\\nThe Prometheus query to plot the duration of a long task timer for a serial task is `long_task_timer_sum`. In Grafana, we can set an alert threshold at some fixed point.\\n\\n.Simulated back-to-back long tasks with a fixed alert threshold.\\nimage::\" + require(\"!file-loader!./img/prometheus-long-task-timer.png\") + \"[Grafana-rendered Prometheus long task timer]\\n\"","export default __webpack_public_path__ + \"39fa40459993be394ab40488bf8c6a8f.png\";","export default __webpack_public_path__ + \"594dce115710525d7771ebe3ab82db19.png\";","export default __webpack_public_path__ + \"439c0eea1918ef143002cf62a9393e2a.png\";","export default __webpack_public_path__ + \"fc8d290e3f5356fad7d93f76c6abe188.png\";","export default __webpack_public_path__ + \"fb6c59cc88b85301c5bbb890afc71593.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer SignalFx\\n:toc:\\n:sectnums:\\n:system: signalfx\\n\\nSignalFx is a dimensional monitoring system SaaS with a full UI that operates on a push model. It has a rich set of alert \\\"`detectors`\\\".\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThe following example configures SignalFx:\\n\\n[source,java]\\n----\\nSignalFxConfig signalFxConfig = new SignalFxConfig() {\\n @Override\\n public String accessToken() {\\n return \\\"MYTOKEN\\\";\\n }\\n\\n @Override\\n public String get(String k) {\\n return null; // accept the rest of the defaults\\n }\\n};\\n\\nMeterRegistry registry = new SignalFxMeterRegistry(signalFxConfig, Clock.SYSTEM);\\n----\\n\\nThere are two distinct sources of API keys in SignalFx.\\n\\n`SignalFxConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.signalfx` directly to the `SignalFxConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.signalfx:\\n access-token: MYTOKEN\\n\\n # The interval at which metrics are sent to Ganglia. See Duration.parse for the expected format.\\n # The default is 1 minute.\\n step: 1m\\n----\\n\\n== Graphing\\n\\nThis section serves as a quick start to rendering useful representations in SignalFx for metrics originating in Micrometer. See the https://docs.signalfx.com/en/latest/charts/index.html[SignalFx docs] for a far more complete reference of what is possible in SignalFx.\\n\\n=== Timers\\n\\nAt each publishing interval, the SignalFx `Timer` produces several time series in SignalFx:\\n\\n* `${name}.avg`: A mean latency for the publishing interval.\\n* `${name}.count`: Throughput per second over the publishing interval.\\n* `${name}.totalTime`: Total time per second over the publishing interval (used with `count`) to create aggregable means.\\n* `${name}.percentiles`: Micrometer calculated percentiles for the publishing interval. One time series is produced for each percentile, with a tag of `phi` in the range of [0,1].\\n* `${name}.histogram`: One event is produced for each SLO boundary with a tag of 'le', indicating that it represents a cumulative count of events less than or equal to SLO boundaries over the publishing interval.\\n\\nTo generate an aggregable view of latency in SignalFx, divide `totalTime` by `count`:\\n\\nimage::\" + require(\"!file-loader!./img/signalfx-timer-latency-query.png\") + \"[SignalFx-aggregable latency query]\\n\\nThis is accomplished by adding signals for `${name}.totalTime` and `${name}.count`, adding a formula that divides them, and hiding the inputs to the formula.\\n\\n.Timer latency.\\nimage::\" + require(\"!file-loader!./img/signalfx-timer-latency.png\") + \"[SignalFx-rendered timer]\\n\\nTo generate a throughput chart, use the `${name}.count` signal:\\n\\n.Timer throughput.\\nimage::\" + require(\"!file-loader!./img/signalfx-timer-throughput.png\") + \"[SignalFx-rendered timer throughput]\\n\\nTo generate a plot of client-side percentiles, use the `${name}.percentiles` signal:\\n\\n.Timer Percentiles.\\nimage::\" + require(\"!file-loader!./img/signalfx-timer-percentiles.png\") + \"[SignalFx-rendered percentiles]\\n\\nNote that these percentiles are _not aggregable_. The more dimensions you add to a timer, the less useful these values become.\\n\\nFinally, if you define SLO boundaries with the fluent builder for `Timer`, you can view throughput below certain SLO boundaries by using the `${name}.histogram` signal. In this example, we set SLO boundaries at 275 (green), 300 (blue), and 500 (purple) milliseconds for a simulated `Timer` that is recording samples normally distributed around 250 ms. These counts represent the rate/second of samples less than or equal to each SLO boundary.\\n\\n.Timer SLO boundaries.\\nimage::\" + require(\"!file-loader!./img/signalfx-timer-sla.png\") + \"[SignalFx-rendered SLO boundaries]\\n\\nWhere the lines converge at various points it is evident that no sample exceeded the 275 ms SLO boundary.\\n\"","export default __webpack_public_path__ + \"d77cd7a4fea8c37d7dc37e7bbe069b5e.png\";","export default __webpack_public_path__ + \"beec842accba1a667e0e288745191070.png\";","export default __webpack_public_path__ + \"02141ef2139e0de5d180b5b76dff1982.png\";","export default __webpack_public_path__ + \"a165f31f4506fa9b07f0f2319dd58aa0.png\";","export default __webpack_public_path__ + \"b19ccbd241a3bfd9377d4066961b1620.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Stackdriver Monitoring\\nRay Tsang <saturnism@gmail.com>\\n:toc:\\n:sectnums:\\n:system: stackdriver\\n\\nStackdriver Monitoring is a dimensional time-series SaaS with built-in dashboarding.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThe following example configures Stackdriver:\\n\\n[source,java]\\n----\\nStackdriverConfig stackdriverConfig = new StackdriverConfig() {\\n @Override\\n public String projectId() {\\n return MY_PROJECT_ID;\\n }\\n\\n @Override\\n public String get(String key) {\\n return null;\\n }\\n}\\n\\nMeterRegistry registry = StackdriverMeterRegistry.builder(stackdriverConfig).build();\\n----\\n\\n`StackdriverConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.stackdriver` directly to the `StackdriverConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.stackdriver:\\n project-id: MY_PROJECT_ID\\n resource-type: global\\n\\n # You will probably want to disable Stackdriver Monitoring publishing in a local development profile.\\n enabled: true\\n\\n # The interval at which metrics are sent to Stackdriver Monitoring. The default is 1 minute.\\n step: 1m\\n----\\n\\nFor most environments, you need to create and configure credentials to push metrics to Stackdriver Monitoring.\\nIn most cases, you should create a service account with Stackdriver Monitoring permissions and configure a\\n`GOOGLE_APPLICATION_CREDENTIALS` environmental variable to the path of the service account key file.\\nThe following example shows how to do so:\\n\\n[source]\\n----\\nexport PROJECT_ID=MY_PROJECT_ID\\nexport APP_NAME=MY_APP\\n\\n# Create a service account\\ngcloud iam service-accounts create $APP_NAME\\n\\n# Grant the service account Stackdriver Monitoring writer permission\\ngcloud projects add-iam-policy-binding $PROJECT_ID \\\\\\n --member serviceAccount:$APP_NAME@$PROJECT_ID.iam.gserviceaccount.com \\\\\\n --role roles/monitoring.metricWriter\\n\\n# Create a key JSON file\\ngcloud iam service-accounts keys create $HOME/$APP_NAME-key.json \\\\\\n --iam-account $APP_NAME@$PROJECT_ID.iam.gserviceaccount.com\\n\\n# Configure GOOGLE_APPLICATION_CREDENTIALS env var\\nexport GOOGLE_APPLICATION_CREDENTIALS=$HOME/$APP_NAME-key.json\\n----\\n\\nWhen running in managed environments (such as Google App Engine, Google Cloud Run, Google Cloud Function)\\nyou need not configure this environmental variable. In those environments, a service account is\\nautomatically associated with the application instance. The underlying Stackdriver Monitoring client\\nlibrary can automatically detect and use those credentials.\\n\\n== Stackdriver Labels\\n\\nMicrometer metrics tags are mapped to https://cloud.google.com/monitoring/api/v3/metrics-details#intro-time-series[Stackdriver metrics labels]. With tags and labels, you can further filter or group\\nby the tag or label. See link:/docs/concepts#_tag_naming[Micrometer Concepts] for more information on tags.\\nThe following example filters by tags:\\n\\n[source,java]\\n----\\nMeterRegistry registry = StackdriverMeterRegistry.builder(stackdriverConfig).build();\\nregistry.config().commonTags(\\\"application\\\", \\\"my-application\\\");\\n----\\n\\nYou can also configure resource labels with the `StackdriverConfig` method `resourceLabels`. Depending on the configured `resourceType`, there will be required resource labels. See the documentation on https://cloud.google.com/monitoring/custom-metrics/creating-metrics#which-resource[choosing a monitored resource type].\\n\\nIMPORTANT: When using Micrometer across multiple applications/instances, it is necessary that Stackdriver labels are unique per application/instance. Otherwise, you will see errors like `One or more TimeSeries could not be written: One or more points were written more frequently than the maximum sampling period configured`. If using a resource type other than `global`, the resource labels may already make metrics unique per application instance. If not, a common tag with the hostname or platform-provided instance ID may be a good candidate for achieving this.\\n\\n== Spring Boot\\n\\nSpring Boot provides auto-configuration for Micrometer's StackdriverMeterRegistry. For more information, see the https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready-metrics-export-stackdriver[Spring Boot documentation].\\n\\nYou can manually configure or register the `StackdriverMeterRegistry`.\\nIn addition to using Spring Boot Actuator, make sure you create the `StackdriverMeterRegistry` bean:\\n\\n[source,java]\\n----\\n@Bean\\nStackdriverConfig stackdriverConfig() {\\n return new StackdriverConfig() {\\n @Override\\n public String projectId() {\\n return MY_PROJECT_ID;\\n }\\n\\n @Override\\n public String get(String key) {\\n return null;\\n }\\n }\\n}\\n\\n@Bean\\nStackdriverMeterRegistry meterRegistry(StackdriverConfig stackdriverConfig) {\\n return StackdriverMeterRegistry.builder(stackdriverConfig).build();\\n}\\n----\\n\\nYou can also use https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-metrics-common-tags[Spring Boot Actuator Common Tags configuration] to configure common tags:\\n\\n[source]\\n----\\nspring.application.name=my-application\\nmanagement.metrics.tags.application=${spring.application.name}\\n----\\n\\n== GraalVM native image compilation\\n\\nTo compile an application using `micrometer-registry-stackdriver` to a https://www.graalvm.org/reference-manual/native-image/[native image using GraalVM], add the https://github.com/GoogleCloudPlatform/native-image-support-java[native-image-support-java] library as a dependency. This will ensure the correct native image configuration is available and avoid errors like `Classes that should be initialized at run time got initialized during image building`.\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer StatsD\\n:toc:\\n:sectnums:\\n:system: statsd\\n\\nStatsD is a UDP-based sidecar-driven metrics collection system. The maintainer of the original StatsD line protocol specification is Etsy. Datadog's DogStatsD and Influx's Telegraf each accept a modified version of the line protocol, having each enriched the original specification with dimensionality in different ways.\\n\\nIf you intend to use the Datadog or Telegraf flavors, see the documentation for Micrometer's link:/docs/registry/datadog[Datadog] or link:/docs/registry/influx[Influx] support.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThis configuration is used to ship metrics to a StatsD agent that is compatible with the original Etsy protocol. Metrics are shipped immediately over UDP to the agent.\\n\\n[source,java]\\n----\\nStatsdConfig config = new StatsdConfig() {\\n @Override\\n public String get(String k) {\\n return null;\\n }\\n\\n\\n @Override\\n public StatsdFlavor flavor() {\\n return StatsdFlavor.Etsy;\\n }\\n};\\n\\nMeterRegistry registry = new StatsdMeterRegistry(config, Clock.SYSTEM);\\n----\\n\\nNOTE: You can also configure Telegraf to accept the dogstatsd format. If you use Telegraf, configuring Micrometer to ship Telegraf-formatted StatsD lines eases the requirements of your Telegraf configuration.\\n\\n`StatsdConfig` is an interface with a set of default methods. If, in the implementation of `get(String k)`, rather than returning `null`, you instead bind it to a property source, you can override the default configuration. For example, Micrometer's Spring Boot support binds properties that are prefixed with `management.metrics.export.statsd` directly to the `StatsdConfig`:\\n\\n[source,yml]\\n----\\nmanagement.metrics.export.statsd:\\n flavor: etsy\\n\\n # You will probably want to conditionally disable StatsD publishing in local development.\\n enabled: true\\n\\n # The interval at which metrics are sent to StatsD. The default is 1 minute.\\n step: 1m\\n----\\n\\n== Customizing the Metrics Sink\\n\\nBy default, Micrometer publishes StatsD line protocol over UDP, as the vast majority of existing StatsD agents are UDP servers. It is possible to fully customize how the line protocol is shipped by modifying the builder for `StatsdMeterRegistry`:\\n\\n[source,java]\\n----\\nConsumer<String> lineLogger = line -> logger.info(line); <1>\\n\\nMeterRegistry registry = StatsdMeterRegistry.builder(StatsdConfig.DEFAULT) <2>\\n .clock(clock)\\n .lineSink(lineLogger)\\n .build();\\n----\\n<1> Define what to do with lines.\\n<2> The flavor configuration option determines the structure of the line for the default line builder. It has no effect if you override the line builder with a customization.\\n\\n=== Using Apache Kafka for Line Sink\\n\\nYou can also use Apache Kafka for line sink, as follows:\\n\\n[source,java]\\n----\\nProperties properties = new Properties();\\nproperties.setProperty(BOOTSTRAP_SERVERS_CONFIG, \\\"localhost:9092\\\");\\nproperties.setProperty(KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());\\nproperties.setProperty(VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());\\n\\nProducer<String, String> producer = new KafkaProducer<>(properties);\\n\\nStatsdMeterRegistry.builder(statsdConfig)\\n .lineSink((line) -> producer.send(new ProducerRecord<>(\\\"my-metrics\\\", line)))\\n .build();\\n----\\n\\nNow Micrometer produces lines for metrics to the `my-metrics` topic and you can consume the lines on the topic.\\n\\n== Customizing the Line Format\\n\\nThe built-in Etsy, dogstatsd, and Telegraf flavors cover most known public StatsD agents, but you can completely customize the line format to satisfy closed, proprietary agents. Again, we use the `StatsdMeterRegistry` builder to establish a line builder for each ID. Providing an instance of the builder _per ID_ offers you the opportunity to eagerly cache the serialization of the ID's name and tags to optimize the serialization of a StatsD line based on that ID as samples are recorded. The following listing defines a fictional format:\\n\\n[source,java]\\n----\\nFunction<Meter.Id, StatsdLineBuilder> nameAndUnits = id -> new StatsdLineBuilder() {\\n String name = id.getName() + \\\"/\\\" + (id.getBaseUnit() == null ? \\\"unknown\\\" : id.getBaseUnit());\\n\\n @Override\\n public String count(long amount, Statistic stat) {\\n return name + \\\":\\\" + amount + \\\"|c\\\";\\n }\\n\\n ... // implement gauge, histogram, and timing similarly\\n}\\n\\nMeterRegistry registry = StatsdMeterRegistry.builder(StatsdConfig.DEFAULT) <1>\\n .clock(clock)\\n .lineBuilder(nameAndUnits)\\n .build();\\n----\\n<1> Because you have taken control of line building, the flavor is ignored.\\n\"","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\n= Micrometer Wavefront\\n:toc:\\n:sectnums:\\n:system: wavefront\\n\\nWavefront is a dimensional monitoring system offered as a SaaS with a full UI, custom query language, and advanced math operations. Wavefront operates on a push model. Metrics may either be pushed through a sidecar process running on the same host (called the Wavefront proxy) or directly to the Wavefront API.\\n\\n== Installing\\n\\nFor Gradle, add the following implementation:\\n\\n[source,groovy,subs=+attributes]\\n----\\nimplementation 'io.micrometer:micrometer-registry-{system}:latest.release'\\n----\\n\\nFor Maven, add the following dependency:\\n\\n[source,xml,subs=+attributes]\\n----\\n<dependency>\\n <groupId>io.micrometer</groupId>\\n <artifactId>micrometer-registry-{system}</artifactId>\\n <version>${micrometer.version}</version>\\n</dependency>\\n----\\n\\n== Configuring\\n\\nThis section describes how to configure Wavefront when you send data:\\n\\n* <<configuring-directly-to-wavefront>>\\n* <<configuring-through-a-wavefront-proxy-sidecar>>\\n\\n[[configuring-directly-to-wavefront]]\\n=== Directly to Wavefront\\n\\nThe following example configures sending directly to Wavefront:\\n\\n[source,java]\\n----\\nWavefrontConfig config = new WavefrontConfig() {\\n @Override\\n public String uri() {\\n return \\\"https://longboard.wavefront.com\\\"; <1>\\n }\\n\\n @Override\\n public String apiToken() {\\n return \\\"MYAPIKEY\\\"; <2>\\n }\\n\\n @Override\\n public String get(String key) {\\n return null; <3>\\n }\\n};\\nMeterRegistry registry = new WavefrontMeterRegistry(config, Clock.SYSTEM);\\n----\\n<1> `longboard` is the name of the co-tenant instance on which most organizations start. Once you reach a sufficient scale, Wavefront may move you\\nto a dedicated host.\\n<2> This is required when pushing directly to Wavefront's API.\\n<3> Accept the rest of the defaults.\\n\\n[[configuring-through-a-wavefront-proxy-sidecar]]\\n=== Through a Wavefront Proxy Sidecar\\n\\nThe following example configures sending through a Wavefront proxy sidecar:\\n\\n[source,java]\\n----\\nMeterRegistry registry = new WavefrontMeterRegistry(WavefrontConfig.DEFAULT_PROXY, Clock.SYSTEM);\\n----\\n\\nThe default proxy configuration pushs metrics and histogram distributions to a Wavefront proxy sitting on `localhost:2878`.\\n\\nNOTE: If publishing metrics to a Wavefront proxy, the URI must be expressed in the form of `proxy://HOST:PORT`.\\n\\n== Graphing\\n\\nThis section serves as a quick start to rendering useful representations in Wavefront for metrics originating in Micrometer. See the https://docs.wavefront.com/query_language_getting_started.html[Wavefront docs] for a far more complete reference of what is possible in Wavefront.\\n\\n=== Counters\\n\\nThe query that generates a graph for a random-walk counter is `rate(ts(counter))`.\\n\\n.A Wavefront rendered graph of the random walk counter.\\nimage::\" + require(\"!file-loader!./img/wavefront-counter-rate.png\") + \"[Wavefront-rendered counter]\\n\\nRepresenting a counter without rate normalization over some time window is rarely useful, as the\\nrepresentation is a function of both the rapidity with which the counter is incremented and the\\nlongevity of the service. It is generally most useful to rate-normalize these time series to\\nreason about them.\\n\\nBecause Wavefront keeps track of cumulative counts across all time, it has the\\nadvantage of allowing for the selection of a particular time function at query time (for example,\\n`rate(ts(counter))` to compute the per-second rate of change).\\n\\n=== Timers\\n\\nThe Wavefront `Timer` produces different time series depending on whether or not\\n`publishPercentileHistogram` is enabled.\\n\\nIf `publishPercentileHistogram` is enabled, the Wavefront `Timer` produces histogram distributions\\nthat let you query for the latency at any percentile using `hs()` queries. For example, you can\\nvisualize latency at the 95th percentile (`percentile(95, hs(timer.m))`) or the 99.9th percentile\\n(`percentile(99.9, hs(timer.m))`). For more information on histogram distributions, see\\n<<wavefront-histograms>>, later in this section.\\n\\nIf `publishPercentileHistogram` is disabled, the Wavefront `Timer` produces several\\ntime series:\\n\\n* `${name}.avg`: Mean latency across all calls.\\n* `${name}.count`: Total number of all calls.\\n* `${name}.sum`: Total time of all calls.\\n* `${name}.max`: Max latency over the publishing interval.\\n* `${name}.percentiles`: Micrometer-calculated percentiles for the publishing interval. These\\ncannot be aggregated across dimensions.\\n\\nYou can use these time series to generate a quick view of latency in Wavefront:\\n\\n.Timer latency.\\nimage::\" + require(\"!file-loader!./img/wavefront-timer-latency.png\") + \"[Wavefront-rendered timer]\\n\\nThe preceding chart shows the average latency (`rate(ts(timer.sum))/rate(ts(timer.count))` in\\ngreen), 95th percentile (`ts(timer.percentile, phi=\\\"0.95\\\")` in orange), and max (`ts(timer.max)`\\nin blue).\\n\\nAdditionally, `rate(ts(timer.count))` represents a rate/second throughput of events being timed:\\n\\n.Timer throughput.\\nimage::\" + require(\"!file-loader!./img/wavefront-timer-throughput.png\") + \"[Wavefront-rendered timer throughput]\\n\\n[[wavefront-histograms]]\\n=== Wavefront Histograms\\n\\nWavefront's histogram implementation stores an actual distribution of metrics, as opposed to single metrics. This lets you apply any percentile and aggregation function on the distribution at query time without having to specify specific percentiles and metrics to keep during metric collection.\\n\\nWavefront histogram distributions are collected and reported for any `Timer` or `DistributionSummary` that has `publishPercentileHistogram` enabled.\\n\\nBy default, distributions that are reported to Wavefront get aggregated by the minute, providing you with a histogram distribution for each minute. You also have the option of aggregating by hour or day. You can customize this with the following configuration options:\\n\\n* `reportMinuteDistribution`: Boolean specifying whether to aggregate by minute. Enabled by default. Metric name in Wavefront has `.m` suffix.\\n* `reportHourDistribution`: Boolean specifying whether to aggregate by hour. Disabled by default. Metric name in Wavefront has `.h` suffix.\\n* `reportDayDistribution`: Boolean specifying whether to aggregate by day. Disabled by default. Metric name in Wavefront has `.d` suffix.\\n\\nIf you are sending to a Wavefront proxy, by default, both metrics and histogram distributions are published to the same port: 2878 in the default proxy configuration. If your proxy is configured to listen for histogram distributions on a different port, you can specify the port to which to publish by using the `distributionPort` configuration option.\\n\\nYou can query histogram distributions in Wavefront by using `hs()` queries. For example, `percentile(98, hs(${name}.m))` returns the 98th percentile for a particular histogram aggregated over each minute. Each histogram metric name has a suffix (`.m`, `.h`, or `.d`), depending on the histogram's aggregation interval.\\n\\nSee the https://docs.wavefront.com/proxies_histograms.html[Wavefront Histograms documentation] for more information.\\n\"","export default __webpack_public_path__ + \"105c9d351e5cabcc4504a9b863032ca3.png\";","export default __webpack_public_path__ + \"10ee7658d93746e240978c7ca9b3467b.png\";","export default __webpack_public_path__ + \"9cc263d6b012a89bad0374b418540a31.png\";","module.exports = \"////\\nDO NOT EDIT THIS FILE. IT WAS GENERATED.\\nManual changes to this file will be lost when it is generated again.\\nEdit the files in the src/docs/ directory instead.\\n////\\n\\n\\nMicrometer's open source support policy is defined as follows for different types of releases. Release versions follow a MAJOR.MINOR.PATCH convention, as defined in https://semver.org/[semantic versioning].\\n\\n* *Major release lines* (such as 1.x or 2.x) are supported with patch releases for a minimum of 3 years from the date the major release (such as `1.0.0` or `2.0.0`) was made available for download.\\n* *Minor release lines* (such as 1.1.x or 1.2.x) are supported with patch releases for a minimum of 12 months from the date the minor release (such as `1.1.0` or `1.2.0`) was made available for download.\\n* Any confirmed security vulnerabilities on supported release lines should result in a patch release to Maven Central.\\n\\nCommercial support that extends beyond the OSS support period described on this page is https://tanzu.vmware.com/spring-runtime[available from VMware].\\n\\nWe generally plan to release a new major or minor version every 6 months (in May and November).\\n\\n## Released versions\\n\\nThe following releases are actively maintained:\\n\\n.Supported minor releases\\n[width=\\\"35%\\\",options=\\\"header\\\"]\\n|===========\\n| Minor release | OSS Support Until\\n| 1.12.x | November 2024\\n| 1.11.x | May 2024\\n|===========\\n\\nThe following releases are out of OSS support:\\n\\n.Out of OSS support minor releases\\n[width=\\\"35%\\\",options=\\\"header\\\"]\\n|===========\\n| Minor release | Final patch\\n| 1.10.x | `1.10.13`\\n| 1.9.x | `1.9.17`\\n| 1.8.x | `1.8.13`\\n| 1.7.x | `1.7.12`\\n| 1.6.x | `1.6.13`\\n| 1.5.x | `1.5.17`\\n| 1.4.x | `1.4.2`\\n| 1.3.x | `1.3.20`\\n| 1.2.x | `1.2.2`\\n| 1.1.x | `1.1.19`\\n| 1.0.x | `1.0.11`\\n|===========\\n\\n## Examples\\n\\nThe following examples demonstrate how the support policy applies:\\n\\n** Micrometer 1.0.0 was released in February 2018. At a minimum, support for the 1.x line extends through February 2021 (Major Releases statement). Practically, the Micrometer 1.x line is supported for at least as long as Spring Boot 2.x and major versions of other dependent web frameworks are supported.\\n** Micrometer 1.1.0 was released in October 2018, minimally extending support through October 2019 (Minor Releases statement). Practically, the Micrometer 1.1.x line is supported for at least as long as the Spring Boot 2.1.x line is supported.\\n** If Micrometer 1.2.x were to be released, support for the 1.x line would be extended another 12 months from the 1.2.x release date.\\n** Patch releases, such as Micrometer 1.0.7, do not increase the support obligations for the 1.0.x release line.\\n\"","export default __webpack_public_path__ + \"static/media/logo.e2f91fdb.svg\";","import React from 'react';\nimport {Link} from 'react-router-dom';\nimport logo from '../../img/logo.svg';\nimport 'font-awesome/css/font-awesome.min.css';\nimport './style.css';\nimport { Nav, Navbar } from \"react-bootstrap\";\n\nexport default function MyNavbar() {\n return (\n <Navbar collapseOnSelect expand=\"lg\" bg=\"dark\" variant=\"dark\" style={{ borderTop: '8px solid #1ba89c' }} >\n <Navbar.Brand as={Link} to=\"/\" >\n <img src={logo} className=\"img-fluid\" style={{ maxHeight: 80 }} alt=\"Micrometer\" />\n </Navbar.Brand>\n <Navbar.Toggle aria-controls=\"responsive-navbar-nav\" />\n <Navbar.Collapse id=\"responsive-navbar-nav\">\n <Nav className=\"ml-auto mt-2 mt-lg-0\">\n <Nav.Item href=\"/docs\">\n <Nav.Link as={Link} to=\"/docs\"><i className=\"fa fa-lg fa-book\"/> Documentation</Nav.Link>\n </Nav.Item>\n <Nav.Item>\n <Nav.Link href=\"https://github.com/micrometer-metrics/micrometer\"><i className=\"fa fa-lg fa-github-alt\" /> GitHub</Nav.Link>\n </Nav.Item>\n <Nav.Item>\n <Nav.Link href=\"https://twitter.com/micrometerio\"><i className=\"fa fa-lg fa-twitter\" /> Twitter</Nav.Link>\n </Nav.Item>\n <Nav.Item>\n <Nav.Link href=\"https://slack.micrometer.io\"><i className=\"fa fa-lg fa-slack\" /> Slack</Nav.Link>\n </Nav.Item>\n </Nav>\n </Navbar.Collapse>\n </Navbar>\n );\n}\n","import React from 'react';\n\nexport default function Footer() {\n return (\n <div className=\"bg-dark text-center\">\n <div className=\"col-12\" style={{padding: 10, color: 'white'}}>\n <p>Copyright © 2005 - 2023 Broadcom. All Rights Reserved. The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries. See <a href=\"https://www.vmware.com/help/legal.html\">Terms of Use</a> and <a href=\"https://www.vmware.com/help/privacy.html\">Privacy Policy</a>.</p>\n </div>\n </div>\n )\n}\n","export default __webpack_public_path__ + \"static/media/logo-no-title.c52ef844.svg\";","export default __webpack_public_path__ + \"static/media/playback-latency.b7cc768a.png\";","import React from 'react';\nimport logoNoTitle from '../../img/logo-no-title.svg';\nimport background from '../../img/playback-latency.png';\n\nexport default function Home() {\n return (\n <div>\n <div className=\"jumbotron text-center\" style={{ background: `url(${background}) no-repeat center center` }}>\n <div className=\"container\">\n <img src={logoNoTitle} className=\"img-fluid\" alt=\"\" />\n <h1 className=\"jumbotron-heading mt-3\" style={{ color: 'white', background: 'rgba(52, 48, 45, 0.8)' }}>\n Vendor-neutral application observability facade\n </h1>\n <p className=\"lead\" style={{ padding: 8, color: 'white', background: 'rgba(52, 48, 45, 0.8)' }}>Micrometer\n provides a simple facade over the instrumentation clients for the most popular observability systems,\n allowing you to instrument your JVM-based application code without vendor lock-in. Think SLF4J, but for\n observability.\n </p>\n </div>\n </div>\n <div className=\"container-fluid\">\n <div className=\"row\" style={{ background: 'rgba(17, 122, 113, 0.8)', color: 'white', padding: 30 }}>\n <div className=\"col-lg-4 text-center\">\n <i className=\"fa fa-4x fa-database\" aria-hidden=\"true\" />\n <h2>Dimensional Metrics</h2>\n <p>Micrometer provides vendor-neutral interfaces for <strong>timers</strong>, <strong>gauges</strong>, <strong>counters</strong>, <strong>distribution summaries</strong>, and <strong>long task timers</strong> with a dimensional data model that, when paired with a dimensional monitoring system, allows for efficient access to a particular named metric with the ability to drill down across its dimensions.</p>\n </div>\n <div className=\"col-lg-4 text-center\">\n <i className=\"fa fa-4x fa-area-chart\" aria-hidden=\"true\" />\n <h2>Pre-configured Bindings</h2>\n <p>Out-of-the-box instrumentation of caches, the class loader, garbage collection, processor utilization,\n thread pools, and more tailored to actionable insight.\n </p>\n </div>\n <div className=\"col-lg-4 text-center\">\n <i className=\"fa fa-4x fa-leaf\" aria-hidden=\"true\" />\n <h2>Integrated into Spring</h2>\n <p>Micrometer is the instrumentation library powering\n the delivery of application observability from Spring Boot applications.</p>\n </div>\n </div>\n <div className=\"row justify-content-center\" style={{ padding: 30 }}>\n <div className=\"col-lg-6 col-md-12\">\n <h2>Support for popular observability systems</h2>\n <p>As an instrumentation facade, Micrometer allows you to instrument your code with dimensional metrics, spans with\n a vendor-neutral interface and decide on the observability system as a last step. Instrumenting your core library\n code with Micrometer allows the libraries to be included in applications that ship data to different backends.\n </p>\n <p>\n Contains built-in support for <strong>AppOptics</strong>, <strong>Azure Monitor</strong>, Netflix <strong>Atlas</strong>, <strong>CloudWatch</strong>, <strong>Datadog</strong>, <strong>Dynatrace</strong>, <strong>Elastic</strong>, <strong>Ganglia</strong>, <strong>Graphite</strong>, <strong>Humio</strong>, <strong>Influx/Telegraf</strong>, <strong>JMX</strong>, <strong>KairosDB</strong>, <strong>New Relic</strong>, <strong>OpenTelemetry</strong> Protocol (OTLP), <strong>Prometheus</strong>, <strong>SignalFx</strong>, Google <strong>Stackdriver</strong>, <strong>StatsD</strong>, and <strong>Wavefront</strong>.\n </p>\n <p>\n Through <strong>Micrometer Observation</strong> and <strong>Micrometer Tracing</strong> you can ship your spans via <strong>OpenZipkin Brave</strong> or <strong>OpenTelemetry</strong> tracers to different backends (e.g. <strong>OpenZipkin</strong> or <strong>Wavefront</strong>).\n </p>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { NavLink } from 'react-router-dom';\n\nimport './style.css';\n\nexport default function DocRoot() {\n return (\n <div className=\"container-fluid mt-4\" style={{ paddingRight: 30, paddingLeft: 30 }}>\n <h1>Micrometer Documentation</h1>\n\n <p>\n Micrometer provides a simple facade over the instrumentation clients for the most popular observability systems,\n allowing you to instrument your JVM-based application code without vendor lock-in. Think SLF4J, but for\n application observability! Data recorded by Micrometer are intended to be used to observe, alert, and\n react to the current/recent operational state of your environment.\n </p>\n\n <p>\n Join the discussion with any comments and feature requests on Micrometer's\n public <a href=\"https://slack.micrometer.io\"><i className=\"fa fa-lg fa-slack\" /> Slack Workspace</a>.\n </p>\n\n <ol>\n <li><NavLink className=\"doc-section\" to=\"/docs/installing\">Installing</NavLink>. Where to get the latest release\n and snapshot builds.\n </li>\n <li><NavLink className=\"doc-section\" to=\"/docs/concepts\">Concepts</NavLink>. An introduction to\n the abstraction provided by Micrometer.\n </li>\n <li><span className=\"doc-section\">Setup</span>. Instructions for how to configure Micrometer for use with\n different monitoring systems. As a facade over multiple monitoring systems, the point of Micrometer is to\n allow you to instrument your code in the same way and be able to visualize the results in your monitoring\n system of choice.\n <ul>\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/appOptics\">AppOptics</NavLink>. AppOptics\n is a dimensional time-series SAAS with built-in dashboarding. Micrometer supports shipping\n metrics to AppOptics directly via its API.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/atlas\">Atlas</NavLink>. An\n in-memory dimensional time series database with built-in graphing, a custom stack-based query language,\n and advanced math operations. Atlas originated at Netflix, where it remains the operational metrics\n solution.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/cloudwatch\">CloudWatch</NavLink>. CloudWatch \n is a dimensional time-series SaaS on Amazon's cloud.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/datadog\">Datadog</NavLink>. Datadog\n is a dimensional time-series SAAS with built-in dashboarding and alerting. Micrometer supports shipping\n metrics to Datadog directly via its API or through Dogstatsd via the StatsD registry.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/dynatrace\">Dynatrace</NavLink>. Dynatrace\n is a Software Intelligence Platform featuring application performance monitoring (APM), artificial\n intelligence for operations (AIOps), IT infrastructure monitoring, digital experience management (DEM),\n and digital business analytics capabilities. Micrometer supports shipping metrics to Dynatrace directly\n via its API.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/elastic\">Elastic</NavLink>. Elasticsearch is an\n open source search and analytics platform. Metrics stored in Elasticsearch can be visualized in Kibana.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/ganglia\">Ganglia</NavLink>. An\n aging hierarchical metrics system which enjoyed wide popularity in Linux system monitoring and is still in\n place in many organizations. It originated in the early 2000s at the University of California, Berkeley.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/graphite\">Graphite</NavLink>. One\n of the most popular current hierarchical metrics systems backed by a fixed-size database, similar in\n design and purpose to RRD. It originated at Orbitz in 2006 and was open sourced in 2008.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/humio\">Humio</NavLink>. Humio\n is a dimensional time-series SAAS with built-in dashboarding. Micrometer supports shipping\n metrics to Humio directly via its API.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/influx\">Influx</NavLink>.\n The InfluxData suite of tools supports real-time stream processing and storage of time-series data. It\n supports downsampling, automatically expiring and deleting unwanted data, as well as backup and restore.\n Analysis of data is done via a SQL-like query language.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/instana\">Instana</NavLink>.\n Instana is an automatic application performance management and infrastructure monitoring system.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/jmx\">JMX</NavLink>. Micrometer\n provides a hierarchical mapping to JMX, primarily as a cheap and portable way to view metrics locally.\n Where JMX exporting is found in production, the same metrics are generally exported to another, more\n purpose-fit monitoring system.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/kairos\">KairosDB</NavLink>. KairosDB is a\n dimensional time-series database built on top of Cassandra. Charting can be accomplished in Grafana.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/new-relic\">New Relic</NavLink>.\n Micrometer publishes to New Relic Insights, a SaaS offering with a full UI and a query language called NRQL.\n New Relic Insights operates on a push model.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/otlp\">OpenTelemetry Protocol (OTLP)</NavLink>.\n OpenTelemetry is a CNCF incubating project for providing standards for telemetry data. Micrometer can publish metrics using the OpenTelemetry protocol (OTLP) to the backends that support it.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/prometheus\">Prometheus</NavLink>.\n An in-memory dimensional time series database with a simple built-in UI, a custom query language, and math\n operations. Prometheus is designed to operate on a pull model, scraping metrics from application instances\n periodically based on service discovery.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/signalFx\">SignalFx</NavLink>.\n SignalFx is a dimensional monitoring system SaaS with a full UI operating on a push model. It has a rich\n set of alert \"detectors\".\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/stackdriver\">Stackdriver</NavLink>.\n Stackdriver Monitoring is a dimensional time-series SAAS with built-in dashboarding and alerting. Micrometer\n supports shipping metrics to Stackdriver directly via its API using a push model. Alternatively, you can\n export Micrometer metrics via Prometheus and use a Prometheus to Stackdriver sidecar.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/statsD\">StatsD</NavLink>.\n Micrometer supports three flavors of StatsD: the original Etsy format plus the Datadog and Telegraf\n (Influx) extensions of StatsD that add dimensional support. Use this registry if you prefer to publish\n metrics to a StatsD agent. Also use this registry with Datadog flavor to publish metrics to Splunk.\n </li>\n\n <li><NavLink className=\"doc-section\" to=\"/docs/registry/wavefront\">Wavefront</NavLink>.\n Wavefront is a SaaS-based metrics monitoring and analytics platform that lets you visualize, query, and\n alert over data from across your entire stack (infrastructure, network, custom app metrics, business KPIs,\n etc.)\n </li>\n </ul>\n </li>\n <li><span className=\"doc-section\">Reference</span>. Detailed list of out-of-the-box\n instrumentation provided by Micrometer.\n <ul>\n <li><a className=\"doc-section\"\n href=\"https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready-metrics\">Spring\n Boot</a>. Micrometer is the instrumentation library powering the delivery of application metrics from Spring.\n </li>\n <li><NavLink className=\"doc-section\" to=\"/docs/ref/jvm\">JVM</NavLink>. Metrics on classloaders, memory,\n garbage collection, threads, etc.\n </li>\n <li><NavLink className=\"doc-section\" to=\"/docs/ref/cache\">Cache</NavLink>. Instrumentation for the most\n popular caching frameworks.\n </li>\n <li><NavLink className=\"doc-section\" to=\"/docs/ref/okhttpclient\">OkHttpClient</NavLink>. Instrumentation for OkHttpClient.\n </li>\n <li><NavLink className=\"doc-section\" to=\"/docs/ref/jetty\">Jetty and Jersey</NavLink>. Instrumentation for Jetty and Jersey.\n </li>\n <li><NavLink className=\"doc-section\" to=\"/docs/ref/netty\">Netty</NavLink>. Instrumentation for Netty.\n </li>\n </ul>\n </li>\n <li><span className=\"doc-section\">Guides</span>.\n <ul>\n <li><NavLink className=\"doc-section\" to=\"/docs/guide/consoleReporter\">Passing through to Dropwizard's console reporter</NavLink></li>\n </ul>\n <ul>\n <li><NavLink className=\"doc-section\" to=\"/docs/guide/httpSenderResilience4jRetry\">HttpSender with Resilience4j retry</NavLink></li>\n </ul>\n <ul>\n <li><NavLink className=\"doc-section\" to=\"/docs/guide/customMeterRegistry\">Custom meter registry</NavLink></li>\n </ul>\n </li>\n <li><NavLink className=\"doc-section\" to=\"/docs/observation\">Micrometer Observation</NavLink>. An introduction to\n the Micrometer Observation API.\n </li>\n <li><NavLink className=\"doc-section\" to=\"/docs/tracing\">Micrometer Tracing</NavLink>. An introduction to\n the abstraction provided by Micrometer Tracing.\n </li>\n <li><NavLink className=\"doc-section\" to=\"/docs/contextPropagation\">Micrometer Context Propagation</NavLink>. An introduction to\n the abstraction provided by Micrometer Context Propagation.\n </li>\n <li>\n <NavLink className=\"doc-section\" to=\"/docs/support\">Support policy</NavLink>. Micrometer's support policy for releases.\n </li>\n </ol>\n </div>\n );\n}\n","import React, {Component} from 'react';\nimport PropTypes from 'prop-types';\nimport '@asciidoctor/core/dist/css/asciidoctor.css';\n\n// To rebuild this with a small set of languages, clone highlight.js, run:\n// `node tools/build.js java groovy http xml gradle yaml json -t node`\n// Copy much of the build directory to ./highlight.\n// You will have to force off a couple eslint rules in highlight.js as well.\nimport hljs from './highlight';\nimport './highlight.github.css';\n\nlet asciidoctor = require('asciidoctor')();\n\nasciidoctor.Extensions.register(function () {\n this.treeProcessor(function() {\n let self = this;\n self.process(function (doc) {\n doc.findBy({'context': 'image'}).forEach(function(img) {\n // hack to add an additional attribute. otherwise, setAttribute only allows you to replace existing attributes\n let alt = img.getAttribute('alt');\n img.setAttribute('alt', alt + '\" class=\"img-fluid', true);\n });\n return doc;\n });\n });\n});\n\nexport default class Asciidoc extends Component {\n constructor(props) {\n super(props);\n this.highlightCode = this.highlightCode.bind(this);\n }\n\n componentDidMount() {\n this.highlightCode();\n }\n\n componentDidUpdate() {\n this.highlightCode();\n }\n\n highlightCode() {\n this.root.querySelectorAll('pre code').forEach(node => hljs.highlightBlock(node));\n }\n\n render() {\n let converted = asciidoctor.convert(this.props.source, { attributes: this.props.attrs, safe: 'safe'});\n\n return (\n <div\n ref={(root) => { this.root = root; }}\n dangerouslySetInnerHTML={{ __html: converted }} />\n )\n }\n}\n\nAsciidoc.propTypes = {\n source: PropTypes.string,\n attrs: PropTypes.any,\n};","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Asciidoc from '../Asciidoc';\n\nimport './style.css';\n\nexport default function DocSection({ title, content, attrs }) {\n return (\n <div className=\"container-fluid mt-4 ml-3 mr-3\">\n <h1>{title}</h1>\n <hr/>\n <Asciidoc\n source={content}\n attrs={attrs} />\n </div>\n );\n}\n\nDocSection.defaultProps = {\n attrs: {},\n};\n\nDocSection.propTypes = {\n title: PropTypes.string.isRequired,\n content: PropTypes.string.isRequired,\n attrs: PropTypes.object,\n};","import React from 'react';\nimport { Route, Redirect } from 'react-router-dom';\n\nimport DocRoot from '../DocRoot';\nimport DocSection from '../DocSection';\n\n/* eslint import/no-webpack-loader-syntax: off */\nlet docsInstalling = require('!asciidoc-loader!../../generated-docs/installing/index.adoc');\nlet docsConcepts = require('!asciidoc-loader!../../generated-docs/concepts/index.adoc');\nlet docsJvm = require('!asciidoc-loader!../../generated-docs/jvm/index.adoc');\nlet docsCache = require('!asciidoc-loader!../../generated-docs/cache/index.adoc');\nlet docsOkHttpClient = require('!asciidoc-loader!../../generated-docs/okhttpclient/index.adoc');\nlet docsJetty = require('!asciidoc-loader!../../generated-docs/jetty/index.adoc');\nlet docsNetty = require('!asciidoc-loader!../../generated-docs/netty/index.adoc');\nlet docsConsoleReporter = require('!asciidoc-loader!../../generated-docs/guide/console-reporter.adoc');\nlet docsHttpSenderResilience4jRetry = require('!asciidoc-loader!../../generated-docs/guide/http-sender-resilience4j-retry.adoc');\nlet docsCustomMeterRegistry = require('!asciidoc-loader!../../generated-docs/guide/custom-meter-registry.adoc');\nlet docsObservation = require('!asciidoc-loader!../../generated-docs/observation/index.adoc');\nlet docsTracing = require('!asciidoc-loader!../../generated-docs/tracing/index.adoc');\nlet docsContextPropagation = require('!asciidoc-loader!../../generated-docs/contextpropagation/index.adoc');\n\nconst systems = ['appOptics', 'atlas', 'azure-monitor', 'cloudwatch', 'datadog', 'dynatrace', 'elastic', 'ganglia', 'graphite', 'humio', 'influx', 'instana', 'jmx', 'kairos', 'new-relic', 'otlp', 'prometheus', 'signalFx', 'stackdriver', 'statsD', 'wavefront'];\n\nlet docsBySystem = {};\nsystems.forEach(sys => docsBySystem[sys] = require(`!asciidoc-loader!../../generated-docs/implementations/${sys}.adoc`));\n\nexport default function DocRoutes() {\n return (\n <div>\n <Route exact path=\"/docs\" component={DocRoot} />\n\n <Route path=\"/docs/installing\" render={() =>\n <DocSection title=\"Installing\" content={docsInstalling}/>\n }/>\n\n <Route exact path=\"/docs/concepts\" render={() =>\n <DocSection title=\"Concepts\" content={docsConcepts} />} />\n\n <Route path=\"/docs/registry/:system\" render={({ match }) => {\n let system = match.params.system;\n return systems.includes(system) ?\n <DocSection title={`Micrometer ${system.split('-').map(part => part[0].toUpperCase() + part.slice(1)).join(\" \")}`}\n content={docsBySystem[system]} /> :\n <Redirect to=\"/docs\" />;\n }} />\n\n <Route path=\"/docs/ref/jvm\" render={() =>\n <DocSection title=\"JVM and System Metrics\" content={docsJvm}/>\n }/>\n\n <Route path=\"/docs/ref/cache\" render={() =>\n <DocSection title=\"Cache Metrics\" content={docsCache}/>\n }/>\n\n <Route path=\"/docs/ref/okhttpclient\" render={() =>\n <DocSection title=\"OkHttpClient Metrics\" content={docsOkHttpClient}/>\n }/>\n\n <Route path=\"/docs/ref/jetty\" render={() =>\n <DocSection title=\"Jetty and Jersey Metrics\" content={docsJetty}/>\n }/>\n\n <Route path=\"/docs/ref/netty\" render={() =>\n <DocSection title=\"Netty Metrics\" content={docsNetty}/>\n }/>\n\n <Route path=\"/docs/guide/consoleReporter\" render={() =>\n <DocSection title=\"Passing through to Dropwizard's console reporter\" content={docsConsoleReporter}/>\n }/>\n\n <Route path=\"/docs/guide/httpSenderResilience4jRetry\" render={() =>\n <DocSection title=\"HttpSender with Resilience4j retry\" content={docsHttpSenderResilience4jRetry}/>\n }/>\n\n <Route path=\"/docs/guide/customMeterRegistry\" render={() =>\n <DocSection title=\"Custom meter registry\" content={docsCustomMeterRegistry}/>\n }/>\n\n <Route path=\"/docs/observation\" render={() =>\n <DocSection title=\"Observation\" content={docsObservation}/>\n }/>\n\n <Route path=\"/docs/tracing\" render={() =>\n <DocSection title=\"Tracing\" content={docsTracing}/>\n }/>\n\n <Route path=\"/docs/contextPropagation\" render={() =>\n <DocSection title=\"Context Propagation\" content={docsContextPropagation}/>\n }/>\n </div>\n )\n}\n","import React from 'react';\nimport { Route, Redirect, Switch } from 'react-router-dom';\nimport MyNavbar from '../MyNavbar';\nimport Footer from '../Footer';\nimport Home from '../Home';\nimport DocRoutes from '../DocRoutes';\nimport DocSection from \"../DocSection\";\n\n/* eslint import/no-webpack-loader-syntax: off */\nlet docsSupport = require('!asciidoc-loader!../../generated-docs/support/index.adoc');\n\nexport default function App() {\n return (\n <div>\n <MyNavbar />\n\n <Switch>\n <Route exact path=\"/\" component={Home} />\n\n <Route exact path=\"/support\" render={() =>\n <DocSection title=\"Micrometer Support Policy\" content={docsSupport}/>\n }/>\n\n <Route exact path=\"/docs/support\" render={() => <Redirect to=\"/support\" />} />\n\n <Route path=\"/security-policy\" component={() => { \n window.location.href='https://tanzu.vmware.com/security';\n return null; \n }\n } />\n\n <DocRoutes/>\n\n <Route path=\"**\" render={() => <Redirect to=\"/\" />} />\n </Switch>\n\n <div className=\"container-fluid\" style={{ paddingRight: 0, paddingLeft: 0 }}>\n <Footer className=\"row\" />\n </div>\n </div>\n );\n}\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://cra.link/PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://cra.link/PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://cra.link/PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log('No internet connection found. App is running in offline mode.');\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n registration.unregister();\n })\n .catch((error) => {\n console.error(error.message);\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { Router } from 'react-router-dom'\nimport App from './components/App/App';\nimport * as serviceWorkerRegistration from './registerServiceWorker';\nimport { createBrowserHistory } from 'history';\n\n// We have to import the CSS here. By placing it in index.html like the Bootstrap getting started guide suggests,\n// Any CSS imported further down the component hierarchy will appear after Bootstrap CSS in the <style> ordering in <head>,\n// effectively overriding Bootstrap styles.\nimport 'bootstrap/dist/css/bootstrap.min.css';\n\nimport './index.css'; // where we wish to override bootstrap defaults\n\nconst history = createBrowserHistory();\n\nReactDOM.render(<Router history={history}><App/></Router>, document.getElementById('root'));\nserviceWorkerRegistration.unregister();\n"],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/runtime-main.6ab23704.js b/static/js/runtime-main.6ab23704.js new file mode 100644 index 00000000..53513473 --- /dev/null +++ b/static/js/runtime-main.6ab23704.js @@ -0,0 +1,2 @@ +!function(e){function r(r){for(var n,c,i=r[0],l=r[1],f=r[2],p=0,s=[];p<i.length;p++)c=i[p],Object.prototype.hasOwnProperty.call(o,c)&&o[c]&&s.push(o[c][0]),o[c]=0;for(n in l)Object.prototype.hasOwnProperty.call(l,n)&&(e[n]=l[n]);for(a&&a(r);s.length;)s.shift()();return u.push.apply(u,f||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,i=1;i<t.length;i++){var l=t[i];0!==o[l]&&(n=!1)}n&&(u.splice(r--,1),e=c(c.s=t[0]))}return e}var n={},o={1:0},u=[];function c(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,c),t.l=!0,t.exports}c.m=e,c.c=n,c.d=function(e,r,t){c.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},c.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},c.t=function(e,r){if(1&r&&(e=c(e)),8&r)return e;if(4&r&&"object"===typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(c.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)c.d(t,n,function(r){return e[r]}.bind(null,n));return t},c.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return c.d(r,"a",r),r},c.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},c.p="/docs/";var i=this["webpackJsonpmicrometer-docs"]=this["webpackJsonpmicrometer-docs"]||[],l=i.push.bind(i);i.push=r,i=i.slice();for(var f=0;f<i.length;f++)r(i[f]);var a=l;t()}([]); +//# sourceMappingURL=runtime-main.6ab23704.js.map \ No newline at end of file diff --git a/static/js/runtime-main.6ab23704.js.map b/static/js/runtime-main.6ab23704.js.map new file mode 100644 index 00000000..1a0d58a0 --- /dev/null +++ b/static/js/runtime-main.6ab23704.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../webpack/bootstrap"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","this","oldJsonpFunction","slice"],"mappings":"aACE,SAASA,EAAqBC,GAQ7B,IAPA,IAMIC,EAAUC,EANVC,EAAWH,EAAK,GAChBI,EAAcJ,EAAK,GACnBK,EAAiBL,EAAK,GAIHM,EAAI,EAAGC,EAAW,GACpCD,EAAIH,EAASK,OAAQF,IACzBJ,EAAUC,EAASG,GAChBG,OAAOC,UAAUC,eAAeC,KAAKC,EAAiBX,IAAYW,EAAgBX,IACpFK,EAASO,KAAKD,EAAgBX,GAAS,IAExCW,EAAgBX,GAAW,EAE5B,IAAID,KAAYG,EACZK,OAAOC,UAAUC,eAAeC,KAAKR,EAAaH,KACpDc,EAAQd,GAAYG,EAAYH,IAKlC,IAFGe,GAAqBA,EAAoBhB,GAEtCO,EAASC,QACdD,EAASU,OAATV,GAOD,OAHAW,EAAgBJ,KAAKK,MAAMD,EAAiBb,GAAkB,IAGvDe,GACR,CACA,SAASA,IAER,IADA,IAAIC,EACIf,EAAI,EAAGA,EAAIY,EAAgBV,OAAQF,IAAK,CAG/C,IAFA,IAAIgB,EAAiBJ,EAAgBZ,GACjCiB,GAAY,EACRC,EAAI,EAAGA,EAAIF,EAAed,OAAQgB,IAAK,CAC9C,IAAIC,EAAQH,EAAeE,GACG,IAA3BX,EAAgBY,KAAcF,GAAY,EAC9C,CACGA,IACFL,EAAgBQ,OAAOpB,IAAK,GAC5Be,EAASM,EAAoBA,EAAoBC,EAAIN,EAAe,IAEtE,CAEA,OAAOD,CACR,CAGA,IAAIQ,EAAmB,CAAC,EAKpBhB,EAAkB,CACrB,EAAG,GAGAK,EAAkB,GAGtB,SAASS,EAAoB1B,GAG5B,GAAG4B,EAAiB5B,GACnB,OAAO4B,EAAiB5B,GAAU6B,QAGnC,IAAIC,EAASF,EAAiB5B,GAAY,CACzCK,EAAGL,EACH+B,GAAG,EACHF,QAAS,CAAC,GAUX,OANAf,EAAQd,GAAUW,KAAKmB,EAAOD,QAASC,EAAQA,EAAOD,QAASH,GAG/DI,EAAOC,GAAI,EAGJD,EAAOD,OACf,CAIAH,EAAoBM,EAAIlB,EAGxBY,EAAoBO,EAAIL,EAGxBF,EAAoBQ,EAAI,SAASL,EAASM,EAAMC,GAC3CV,EAAoBW,EAAER,EAASM,IAClC3B,OAAO8B,eAAeT,EAASM,EAAM,CAAEI,YAAY,EAAMC,IAAKJ,GAEhE,EAGAV,EAAoBe,EAAI,SAASZ,GACX,qBAAXa,QAA0BA,OAAOC,aAC1CnC,OAAO8B,eAAeT,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DpC,OAAO8B,eAAeT,EAAS,aAAc,CAAEe,OAAO,GACvD,EAOAlB,EAAoBmB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQlB,EAAoBkB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,kBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKxC,OAAOyC,OAAO,MAGvB,GAFAvB,EAAoBe,EAAEO,GACtBxC,OAAO8B,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOlB,EAAoBQ,EAAEc,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,EAAM,EAAEC,KAAK,KAAMD,IAC9I,OAAOF,CACR,EAGAtB,EAAoB0B,EAAI,SAAStB,GAChC,IAAIM,EAASN,GAAUA,EAAOiB,WAC7B,WAAwB,OAAOjB,EAAgB,OAAG,EAClD,WAA8B,OAAOA,CAAQ,EAE9C,OADAJ,EAAoBQ,EAAEE,EAAQ,IAAKA,GAC5BA,CACR,EAGAV,EAAoBW,EAAI,SAASgB,EAAQC,GAAY,OAAO9C,OAAOC,UAAUC,eAAeC,KAAK0C,EAAQC,EAAW,EAGpH5B,EAAoB6B,EAAI,SAExB,IAAIC,EAAaC,KAAK,+BAAiCA,KAAK,gCAAkC,GAC1FC,EAAmBF,EAAW3C,KAAKsC,KAAKK,GAC5CA,EAAW3C,KAAOf,EAClB0D,EAAaA,EAAWG,QACxB,IAAI,IAAItD,EAAI,EAAGA,EAAImD,EAAWjD,OAAQF,IAAKP,EAAqB0D,EAAWnD,IAC3E,IAAIU,EAAsB2C,EAI1BvC,G","file":"static/js/runtime-main.6ab23704.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t1: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/docs/\";\n\n \tvar jsonpArray = this[\"webpackJsonpmicrometer-docs\"] = this[\"webpackJsonpmicrometer-docs\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// run deferred modules from other chunks\n \tcheckDeferredModules();\n"],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/runtime-main.a024820b.js b/static/js/runtime-main.a024820b.js deleted file mode 100644 index 1cb59ac9..00000000 --- a/static/js/runtime-main.a024820b.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(e){function r(r){for(var n,i,l=r[0],c=r[1],f=r[2],p=0,s=[];p<l.length;p++)i=l[p],Object.prototype.hasOwnProperty.call(o,i)&&o[i]&&s.push(o[i][0]),o[i]=0;for(n in c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(a&&a(r);s.length;)s.shift()();return u.push.apply(u,f||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,l=1;l<t.length;l++){var c=t[l];0!==o[c]&&(n=!1)}n&&(u.splice(r--,1),e=i(i.s=t[0]))}return e}var n={},o={1:0},u=[];function i(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,i),t.l=!0,t.exports}i.m=e,i.c=n,i.d=function(e,r,t){i.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},i.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,r){if(1&r&&(e=i(e)),8&r)return e;if(4&r&&"object"===typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(i.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)i.d(t,n,function(r){return e[r]}.bind(null,n));return t},i.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(r,"a",r),r},i.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},i.p="/";var l=this["webpackJsonpmicrometer-docs"]=this["webpackJsonpmicrometer-docs"]||[],c=l.push.bind(l);l.push=r,l=l.slice();for(var f=0;f<l.length;f++)r(l[f]);var a=c;t()}([]); -//# sourceMappingURL=runtime-main.a024820b.js.map \ No newline at end of file diff --git a/static/js/runtime-main.a024820b.js.map b/static/js/runtime-main.a024820b.js.map deleted file mode 100644 index acf4d48f..00000000 --- a/static/js/runtime-main.a024820b.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../webpack/bootstrap"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","this","oldJsonpFunction","slice"],"mappings":"aACE,SAASA,EAAqBC,GAQ7B,IAPA,IAMIC,EAAUC,EANVC,EAAWH,EAAK,GAChBI,EAAcJ,EAAK,GACnBK,EAAiBL,EAAK,GAIHM,EAAI,EAAGC,EAAW,GACpCD,EAAIH,EAASK,OAAQF,IACzBJ,EAAUC,EAASG,GAChBG,OAAOC,UAAUC,eAAeC,KAAKC,EAAiBX,IAAYW,EAAgBX,IACpFK,EAASO,KAAKD,EAAgBX,GAAS,IAExCW,EAAgBX,GAAW,EAE5B,IAAID,KAAYG,EACZK,OAAOC,UAAUC,eAAeC,KAAKR,EAAaH,KACpDc,EAAQd,GAAYG,EAAYH,IAKlC,IAFGe,GAAqBA,EAAoBhB,GAEtCO,EAASC,QACdD,EAASU,OAATV,GAOD,OAHAW,EAAgBJ,KAAKK,MAAMD,EAAiBb,GAAkB,IAGvDe,IAER,SAASA,IAER,IADA,IAAIC,EACIf,EAAI,EAAGA,EAAIY,EAAgBV,OAAQF,IAAK,CAG/C,IAFA,IAAIgB,EAAiBJ,EAAgBZ,GACjCiB,GAAY,EACRC,EAAI,EAAGA,EAAIF,EAAed,OAAQgB,IAAK,CAC9C,IAAIC,EAAQH,EAAeE,GACG,IAA3BX,EAAgBY,KAAcF,GAAY,GAE3CA,IACFL,EAAgBQ,OAAOpB,IAAK,GAC5Be,EAASM,EAAoBA,EAAoBC,EAAIN,EAAe,KAItE,OAAOD,EAIR,IAAIQ,EAAmB,GAKnBhB,EAAkB,CACrB,EAAG,GAGAK,EAAkB,GAGtB,SAASS,EAAoB1B,GAG5B,GAAG4B,EAAiB5B,GACnB,OAAO4B,EAAiB5B,GAAU6B,QAGnC,IAAIC,EAASF,EAAiB5B,GAAY,CACzCK,EAAGL,EACH+B,GAAG,EACHF,QAAS,IAUV,OANAf,EAAQd,GAAUW,KAAKmB,EAAOD,QAASC,EAAQA,EAAOD,QAASH,GAG/DI,EAAOC,GAAI,EAGJD,EAAOD,QAKfH,EAAoBM,EAAIlB,EAGxBY,EAAoBO,EAAIL,EAGxBF,EAAoBQ,EAAI,SAASL,EAASM,EAAMC,GAC3CV,EAAoBW,EAAER,EAASM,IAClC3B,OAAO8B,eAAeT,EAASM,EAAM,CAAEI,YAAY,EAAMC,IAAKJ,KAKhEV,EAAoBe,EAAI,SAASZ,GACX,qBAAXa,QAA0BA,OAAOC,aAC1CnC,OAAO8B,eAAeT,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DpC,OAAO8B,eAAeT,EAAS,aAAc,CAAEe,OAAO,KAQvDlB,EAAoBmB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQlB,EAAoBkB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,kBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKxC,OAAOyC,OAAO,MAGvB,GAFAvB,EAAoBe,EAAEO,GACtBxC,OAAO8B,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOlB,EAAoBQ,EAAEc,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRtB,EAAoB0B,EAAI,SAAStB,GAChC,IAAIM,EAASN,GAAUA,EAAOiB,WAC7B,WAAwB,OAAOjB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAJ,EAAoBQ,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRV,EAAoBW,EAAI,SAASgB,EAAQC,GAAY,OAAO9C,OAAOC,UAAUC,eAAeC,KAAK0C,EAAQC,IAGzG5B,EAAoB6B,EAAI,IAExB,IAAIC,EAAaC,KAAK,+BAAiCA,KAAK,gCAAkC,GAC1FC,EAAmBF,EAAW3C,KAAKsC,KAAKK,GAC5CA,EAAW3C,KAAOf,EAClB0D,EAAaA,EAAWG,QACxB,IAAI,IAAItD,EAAI,EAAGA,EAAImD,EAAWjD,OAAQF,IAAKP,EAAqB0D,EAAWnD,IAC3E,IAAIU,EAAsB2C,EAI1BvC,I","file":"static/js/runtime-main.a024820b.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t1: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \tvar jsonpArray = this[\"webpackJsonpmicrometer-docs\"] = this[\"webpackJsonpmicrometer-docs\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// run deferred modules from other chunks\n \tcheckDeferredModules();\n"],"sourceRoot":""} \ No newline at end of file diff --git a/static/media/logo-no-title.c52ef844.svg b/static/media/logo-no-title.c52ef844.svg deleted file mode 100644 index b9072988..00000000 --- a/static/media/logo-no-title.c52ef844.svg +++ /dev/null @@ -1,152 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - id="svg3355" - version="1.1" - inkscape:version="1.2.2 (b0a8486, 2022-12-01)" - xml:space="preserve" - width="189.10574" - height="189.10738" - viewBox="0 0 189.10574 189.10738" - sodipodi:docname="logo-no-title.svg" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns="http://www.w3.org/2000/svg" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:dc="http://purl.org/dc/elements/1.1/"><metadata - id="metadata3361"><rdf:RDF><cc:Work - rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs - id="defs3359"><clipPath - clipPathUnits="userSpaceOnUse" - id="clipPath3369"><path - d="M 0,768 1366,768 1366,0 0,0 0,768 Z" - id="path3371" - inkscape:connector-curvature="0" /></clipPath></defs><sodipodi:namedview - pagecolor="#000000" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1920" - inkscape:window-height="1027" - id="namedview3357" - showgrid="false" - inkscape:zoom="0.70710678" - inkscape:cx="264.45794" - inkscape:cy="143.54268" - inkscape:window-x="0" - inkscape:window-y="25" - inkscape:window-maximized="1" - inkscape:current-layer="g3365" - fit-margin-top="0" - fit-margin-left="0" - fit-margin-right="0" - fit-margin-bottom="0" - inkscape:showpageshadow="2" - inkscape:pagecheckerboard="0" - inkscape:deskcolor="#000000" /><g - id="g3363" - inkscape:groupmode="layer" - inkscape:label="Micrometer logo" - transform="matrix(1.25,0,0,-1.25,-468.03375,573.92875)"><g - id="g3365"><g - id="g3367" - clip-path="url(#clipPath3369)" - inkscape:export-xdpi="69.889999" - inkscape:export-ydpi="69.889999"><g - id="g3373" - transform="translate(395.813,350.585)" - inkscape:export-xdpi="69.889999" - inkscape:export-ydpi="69.889999"><path - d="m 0,0 6.153,13.984 13.601,4.163 10.115,47.589 24.485,-27.706 23.921,27.249 11.183,-40.1 7.351,1.719 14.983,30.109 10.831,8.308 c -12.137,25.565 -38.186,43.243 -68.367,43.243 -41.776,0 -75.642,-33.867 -75.642,-75.643 0,-12.414 2.99,-24.13 8.291,-34.466 L 0,0 Z" - style="fill:#1ba89c;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path3375" - inkscape:connector-curvature="0" /></g><g - id="g3377" - transform="translate(514.7026,401.7451)" - inkscape:export-xdpi="69.889999" - inkscape:export-ydpi="69.889999"><path - d="m 0,0 -15.938,-32.024 -19.815,-4.638 -9.046,32.435 -19.715,-22.457 -19.442,22 -7.513,-35.35 -14.72,-4.507 -6.562,-14.914 -14.192,-1.681 c 13.644,-19.783 36.461,-32.752 62.31,-32.752 41.776,0 75.642,33.867 75.642,75.643 0,8.303 -1.342,16.291 -3.814,23.765 L 0,0 Z" - style="fill:#117a71;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path3379" - inkscape:connector-curvature="0" /></g><g - id="g3381" - transform="translate(607.1494,363.6182)" - inkscape:export-xdpi="69.889999" - inkscape:export-ydpi="69.889999" /><g - id="g3387" - transform="translate(674.8364,366.5996)" - inkscape:export-xdpi="69.889999" - inkscape:export-ydpi="69.889999" /><g - id="g3391" - transform="translate(705.082,390.7964)" - inkscape:export-xdpi="69.889999" - inkscape:export-ydpi="69.889999" /><g - id="g3395" - transform="translate(757.1162,383.5142)" - inkscape:export-xdpi="69.889999" - inkscape:export-ydpi="69.889999" /><g - id="g3399" - transform="translate(822.9971,363.6182)" - inkscape:export-xdpi="69.889999" - inkscape:export-ydpi="69.889999" /><g - id="g3403" - transform="translate(862.9902,363.6182)" - inkscape:export-xdpi="69.889999" - inkscape:export-ydpi="69.889999" /><g - id="g3407" - transform="translate(909.1182,393.6919)" - inkscape:export-xdpi="69.889999" - inkscape:export-ydpi="69.889999" /><g - id="g3411" - transform="translate(946.0723,363.6182)" - inkscape:export-xdpi="69.889999" - inkscape:export-ydpi="69.889999" /><g - id="g3415" - transform="translate(976.29,390.7964)" - inkscape:export-xdpi="69.889999" - inkscape:export-ydpi="69.889999" /></g><text - xml:space="preserve" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:'Gill Sans';-inkscape-font-specification:'Gill Sans';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="1031.8103" - y="-384.66608" - id="text4219" - transform="scale(1,-1)"><tspan - sodipodi:role="line" - id="tspan4221" - x="1031.8103" - y="-384.66608" - style="font-size:32px;line-height:1.25"> </tspan></text> -<flowRoot - xml:space="preserve" - id="flowRoot4223" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0.01%;font-family:'Gill Sans';-inkscape-font-specification:'Gill Sans';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - transform="matrix(0.8,0,0,-0.8,0,768)"><flowRegion - id="flowRegion4225"><rect - id="rect4227" - width="523.25903" - height="149.90663" - x="704.27838" - y="419.77042" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Gill Sans';-inkscape-font-specification:'Gill Sans'" /></flowRegion><flowPara - id="flowPara4229" - style="font-size:40px;line-height:1.25"> </flowPara></flowRoot><text - xml:space="preserve" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:'Gill Sans';-inkscape-font-specification:'Gill Sans';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="617.72845" - y="-345.06812" - id="text4231" - transform="scale(1,-1)"><tspan - sodipodi:role="line" - id="tspan4233" - x="617.72845" - y="-345.06812" - style="font-size:32px;line-height:1.25"> </tspan></text> -</g></g></svg> diff --git a/static/media/playback-latency.b7cc768a.png b/static/media/playback-latency.b7cc768a.png deleted file mode 100644 index 3feb16e7..00000000 Binary files a/static/media/playback-latency.b7cc768a.png and /dev/null differ