PageSourceSearch

https://about.ebsco.com/themes/custom/cog_ebsco/js/dist/elementWrapper.js?v=2

js ebsco.com collected 2026-09-24 07:28:39 UTC 31,525 bytes, 225 lines download raw bytes

vendor: 2,797 bytes, lines 1-26
1"use strict";
2
3function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
4function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
5function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
6function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
7function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
8function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
9function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
10/* eslint-disable no-restricted-globals */
11/* eslint-disable brace-style */
12/**
13 * @file
14 * Chart to showhide functionality.
15 *
16 * Adds or removes markup as needed to set up the showhide functionality
17 * of charts at mobile. This is a basic example without full showhide hooks.
18 *
19 * Should not matter how many columns or rows the chart has, or if there are
20 * multiple charts within the same "container".
21 */
22
23(function ($, Drupal) {
24  Drupal.behaviors.elementWrapper = {
25    attach: function attach(context, settings) {
26      // This is the overall container targetted charts are within.
27      var chContainerClass = "chart-container.edl-showhide--container";
28      // This is the class that is written at mobile to wrap target elems.
29      var chWrapperClass = "edl-showhide--target";
30
31      // media query at mobile-to-desktop breakpoint
32      var mq = window.matchMedia("(max-width: 720px)");
33      var mq2 = window.matchMedia("(min-width: 841px) and (max-width: 1280px)");
34      if (typeof context.location !== "undefined") {
35        // All chart containers.
36        var chContainers = document.querySelectorAll(".".concat(chContainerClass));
37        // Bind once per container.
38        $(once('chartGroup', ".".concat(chContainerClass), context)).each(function (idx) {
39          // This chart container.
40          var containerArray = [].slice.call(chContainers);
41          var chContainer = containerArray[idx];
42
43          /**
44           * Returns the number of column groups.
45           *
46           * This is a little bit of a cheat - this function only looks at the
47           * very last matching item and assumes the "col-n" value will be
48           * enough to indicate how many col groups there are. So if the markup
49           * ever changes to "skip" numbers (col-0, col-1, col-5) then this
50           * function will fail.
51           *
52           * @return{*} No return.
53           */
54          function getNumberOfColGroups() {
55            var numberOfColGroups = 0;
56            // Get the very last item
57            var lastItem = _toConsumableArray(chContainer.querySelectorAll("[class*=col-]")).pop();
58            var lastItemClasses = lastItem.classList;
59            // Loop through all classes looking for"col-n", then get the "n"
60            for (var i = 0; i < lastItemClasses.length; i++) {
61              if (lastItemClasses[i].indexOf("col-") !== -1) {
62                // ok, now on the col-n class name
63                var colNumber = lastItemClasses[i].split("-")[1];
64                numberOfColGroups = parseInt(colNumber, 10) + 1;
65              }
66            }
67            return numberOfColGroups;
68          }
69
70          /**
71           * Given an array of children, and given an element where we want to
72           * append the children as sibling (as siblings), insert each child.
73           *
74           * @param {*} children Array of children.
75           * @param {*} triggerElem Elem that is previous sibling
76           * @returns{*} No return.
77           */
78
79          function appendClonedChildren(children, triggerElem) {
80            var prevItem;
81            children.forEach(function (item) {
82              if (typeof prevItem !== "undefined") {
83                prevItem = chContainer.insertBefore(item, prevItem.nextSibling);
84              } else {
85                prevItem = chContainer.insertBefore(item, triggerElem.nextSibling);
86              }
87            });
88          }
89          function makeMobile() {
90            // mobile
91            var colGroups = getNumberOfColGroups();
92            // Loop through the amount of col groups we should have
93            for (var i = 1; i < colGroups; i++) {
94              // get all elems that should be wrapped
95              var itemsToWrap = chContainer.querySelectorAll(".col-".concat(i, ":not(.row-0)"));
96              // get the first item (aka trigger)
97              var itemTrigger = chContainer.querySelectorAll(".col-".concat(i, ".row-0"))[0];
98              // basic setup of the wrapper to be added
99              var wrapperElem = document.createElement("div");
100              var realCount = i - 1;
101              var wrapID = "".concat(chContainer.id, "__sect").concat(realCount);
102              var ariaLabel = "".concat(chContainer.id, "__tabID_").concat(realCount);
103              wrapperElem.classList.add(chWrapperClass);
104              wrapperElem.setAttribute("id", wrapID);
105              wrapperElem.setAttribute("role", "region");
106              wrapperElem.setAttribute("aria-labelledby", ariaLabel);
107              wrapperElem.hidden = true;
108
109              // now loop through each item being wrapped and append it
110              // to the wrapper
111              // eslint-disable-next-line no-restricted-syntax
112              var _iterator = _createForOfIteratorHelper(itemsToWrap),
113                _step;
114              try {
115                for (_iterator.s(); !(_step = _iterator.n()).done;) {
116                  var item = _step.value;
117                  wrapperElem.append(item);
118                }
119                // finally place the wrapper (and children) right after the
120                // trigger for this group
121              } catch (err) {
122                _iterator.e(err);
123              } finally {
124                _iterator.f();
125              }
126              chContainer.insertBefore(wrapperElem, itemTrigger.nextSibling);
127            }
128          }
129          function makeDesktop() {
130            // desktop
131            // First check if removal is even needed
132            if (chContainer.querySelectorAll(".".concat(chWrapperClass)).length) {
133              // get a list of wrappers
134              var wrappers = chContainer.querySelectorAll(".".concat(chWrapperClass));
135              // loop through to find and clone the children; then delete the
136              // wrapper. After that we can append the cloned children.
137              for (var i = 0; i < wrappers.length; i++) {
138                // this wrapper
139                var wrapper = wrappers[i];
140                // this wrapper's children
141                var wrapperChildren = wrapper.childNodes;
142                // array setup for the cloned children
143                var clonedChildren = [];
144                // our current trigger elem (previous sibling)
145                var triggerElem = chContainer.querySelectorAll(".col-".concat(i, ".row-0"))[0];
146                // loop through children and clone each one to save it for appending
147                // eslint-disable-next-line no-restricted-syntax
148                var _iterator2 = _createForOfIteratorHelper(wrapperChildren),
149                  _step2;
150                try {
151                  for (_iterator2.s();
151 !(_step2 = _iterator2.n()).done;) {
152                    var child = _step2.value;
153                    var childClone = child.cloneNode(true);
154                    clonedChildren.push(childClone);
155                  }
156                  // remove the wrapper
157                } catch (err) {
158                  _iterator2.e(err);
159                } finally {
160                  _iterator2.f();
161                }
162                wrapper.remove();
163                // and append the children as siblings to the trigger
164                appendClonedChildren(clonedChildren, triggerElem);
165              }
166            }
167          }
168          function mqUpdateMobile(e) {
169            if (e.matches) {
170              location.reload();
171              makeMobile();
172            } else {
173              location.reload();
174              makeDesktop();
175            }
176          }
177
178          // eslint-disable-next-line no-shadow
179          function mqUpdateTablet(mq2) {
180            if (mq2.matches && chContainer.id === "ft-by-region") {
181              makeMobile();
182            } else {
183              makeDesktop();
184            }
185          }
186          function init() {
187            if (chContainer.id === "ft-by-region") {
188              if (mq.matches || mq2.matches) {
189                makeMobile();
190              } else {
191                makeDesktop();
192              }
193            } else if (mq.matches) {
194              makeMobile();
195            } else {
196              makeDesktop();
197            }
198          }
199
200          /**
201           * Checks if the mediaquery event matches the matchmedia value (i.e.
202           * whether mobile else desktop).
203           *
204           * If mobile, wraps elems in a container for attaching showhide.
205           *
206           * If desktop, removes wrapping elems (and places children back as
207           * siblings).
208           *
209           * @param {*} e The mq event.
210           * @returns{*} No return.
211           */
212
213          // We're using mediamatch to bind changes when the media-query triggers.
214          // When the page first loads we run mqUpdate, and then we set a
215          // media query listener that will fire mqUpdate whenever that breakpoint
216          // is triggered (i.e. when the browser window passes 960px).
217          init();
218          mq.addListener(mqUpdateMobile);
219          mq2.addListener(mqUpdateTablet);
220        });
221      }
222    }
223  };
224})(jQuery, Drupal);
225//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudFdyYXBwZXIuanMiLCJuYW1lcyI6WyIkIiwiRHJ1cGFsIiwiYmVoYXZpb3JzIiwiZWxlbWVudFdyYXBwZXIiLCJhdHRhY2giLCJjb250ZXh0Iiwic2V0dGluZ3MiLCJjaENvbnRhaW5lckNsYXNzIiwiY2hXcmFwcGVyQ2xhc3MiLCJtcSIsIndpbmRvdyIsIm1hdGNoTWVkaWEiLCJtcTIiLCJsb2NhdGlvbiIsImNoQ29udGFpbmVycyIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvckFsbCIsImNvbmNhdCIsIm9uY2UiLCJlYWNoIiwiaWR4IiwiY29udGFpbmVyQXJyYXkiLCJzbGljZSIsImNhbGwiLCJjaENvbnRhaW5lciIsImdldE51bWJlck9mQ29sR3JvdXBzIiwibnVtYmVyT2ZDb2xHcm91cHMiLCJsYXN0SXRlbSIsIl90b0NvbnN1bWFibGVBcnJheSIsInBvcCIsImxhc3RJdGVtQ2xhc3NlcyIsImNsYXNzTGlzdCIsImkiLCJsZW5ndGgiLCJpbmRleE9mIiwiY29sTnVtYmVyIiwic3BsaXQiLCJwYXJzZUludCIsImFwcGVuZENsb25lZENoaWxkcmVuIiwiY2hpbGRyZW4iLCJ0cmlnZ2VyRWxlbSIsInByZXZJdGVtIiwiZm9yRWFjaCIsIml0ZW0iLCJpbnNlcnRCZWZvcmUiLCJuZXh0U2libGluZyIsIm1ha2VNb2JpbGUiLCJjb2xHcm91cHMiLCJpdGVtc1RvV3JhcCIsIml0ZW1UcmlnZ2VyIiwid3JhcHBlckVsZW0iLCJjcmVhdGVFbGVtZW50IiwicmVhbENvdW50Iiwid3JhcElEIiwiaWQiLCJhcmlhTGFiZWwiLCJhZGQiLCJzZXRBdHRyaWJ1dGUiLCJoaWRkZW4iLCJfaXRlcmF0b3IiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9zdGVwIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJhcHBlbmQiLCJlcnIiLCJlIiwiZiIsIm1ha2VEZXNrdG9wIiwid3JhcHBlcnMiLCJ3cmFwcGVyIiwid3JhcHBlckNoaWxkcmVuIiwiY2hpbGROb2RlcyIsImNsb25lZENoaWxkcmVuIiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsImNoaWxkIiwiY2hpbGRDbG9uZSIsImNsb25lTm9kZSIsInB1c2giLCJyZW1vdmUiLCJtcVVwZGF0ZU1vYmlsZSIsIm1hdGNoZXMiLCJyZWxvYWQiLCJtcVVwZGF0ZVRhYmxldCIsImluaXQiLCJhZGRMaXN0ZW5lciIsImpRdWVyeSJdLCJzb3VyY2VzIjpbImVsZW1lbnRXcmFwcGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyAqL1xuLyogZXNsaW50LWRpc2FibGUgYnJhY2Utc3R5bGUgKi9cbi8qKlxuICogQGZpbGVcbiAqIENoYXJ0IHRvIHNob3doaWRlIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogQWRkcyBvciByZW1vdmVzIG1hcmt1cCBhcyBuZWVkZWQgdG8gc2V0IHVwIHRoZSBzaG93aGlkZSBmdW5jdGlvbmFsaXR5XG4gKiBvZiBjaGFydHMgYXQgbW9iaWxlLiBUaGlzIGlzIGEgYmFzaWMgZXhhbXBsZSB3aXRob3V0IGZ1bGwgc2hvd2hpZGUgaG9va3MuXG4gKlxuICogU2hvdWxkIG5vdCBtYXR0ZXIgaG93IG1hbnkgY29sdW1ucyBvciByb3dzIHRoZSBjaGFydCBoYXMsIG9yIGlmIHRoZXJlIGFyZVxuICogbXVsdGlwbGUgY2hhcnRzIHdpdGhpbiB0aGUgc2FtZSBcImNvbnRhaW5lclwiLlxuICovXG5cbihmdW5jdGlvbiAoJCwgRHJ1cGFsKSB7XG4gIERydXBhbC5iZWhhdmlvcnMuZWxlbWVudFdyYXBwZXIgPSB7XG4gICAgYXR0YWNoKGNvbnRleHQsIHNldHRpbmdzKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBvdmVyYWxsIGNvbnRhaW5lciB0YXJnZXR0ZWQgY2hhcnRzIGFyZSB3aXRoaW4uXG4gICAgICBjb25zdCBjaENvbnRhaW5lckNsYXNzID0gXCJjaGFydC1jb250YWluZXIuZWRsLXNob3doaWRlLS1jb250YWluZXJcIjtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIGNsYXNzIHRoYXQgaXMgd3JpdHRlbiBhdCBtb2JpbGUgdG8gd3JhcCB0YXJnZXQgZWxlbXMuXG4gICAgICBjb25zdCBjaFdyYXBwZXJDbGFzcyA9IFwiZWRsLXNob3doaWRlLS10YXJnZXRcIjtcblxuICAgICAgLy8gbWVkaWEgcXVlcnkgYXQgbW9iaWxlLXRvLWRlc2t0b3AgYnJlYWtwb2ludFxuICAgICAgY29uc3QgbXEgPSB3aW5kb3cubWF0Y2hNZWRpYShcIihtYXgtd2lkdGg6IDcyMHB4KVwiKTtcbiAgICAgIGNvbnN0IG1xMiA9IHdpbmRvdy5tYXRjaE1lZGlhKFxuICAgICAgICBcIihtaW4td2lkdGg6IDg0MXB4KSBhbmQgKG1heC13aWR0aDogMTI4MHB4KVwiXG4gICAgICApO1xuXG4gICAgICBpZiAodHlwZW9mIGNvbnRleHQubG9jYXRpb24gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgLy8gQWxsIGNoYXJ0IGNvbnRhaW5lcnMuXG4gICAgICAgIGNvbnN0IGNoQ29udGFpbmVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke2NoQ29udGFpbmVyQ2xhc3N9YCk7XG4gICAgICAgIC8vIEJpbmQgb25jZSBwZXIgY29udGFpbmVyLlxuICAgICAgICAkKG9uY2UoJ2NoYXJ0R3JvdXAnLCBgLiR7Y2hDb250YWluZXJDbGFzc31gLCBjb250ZXh0KSlcbiAgICAgICAgICAuZWFjaCgoaWR4KSA9PiB7XG4gICAgICAgICAgICAvLyBUaGlzIGNoYXJ0IGNvbnRhaW5lci5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckFycmF5ID0gW10uc2xpY2UuY2FsbChjaENvbnRhaW5lcnMpO1xuICAgICAgICAgICAgY29uc3QgY2hDb250YWluZXIgPSBjb250YWluZXJBcnJheVtpZHhdO1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjb2x1bW4gZ3JvdXBzLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIFRoaXMgaXMgYSBsaXR0bG
225UgYml0IG9mIGEgY2hlYXQgLSB0aGlzIGZ1bmN0aW9uIG9ubHkgbG9va3MgYXQgdGhlXG4gICAgICAgICAgICAgKiB2ZXJ5IGxhc3QgbWF0Y2hpbmcgaXRlbSBhbmQgYXNzdW1lcyB0aGUgXCJjb2wtblwiIHZhbHVlIHdpbGwgYmVcbiAgICAgICAgICAgICAqIGVub3VnaCB0byBpbmRpY2F0ZSBob3cgbWFueSBjb2wgZ3JvdXBzIHRoZXJlIGFyZS4gU28gaWYgdGhlIG1hcmt1cFxuICAgICAgICAgICAgICogZXZlciBjaGFuZ2VzIHRvIFwic2tpcFwiIG51bWJlcnMgKGNvbC0wLCBjb2wtMSwgY29sLTUpIHRoZW4gdGhpc1xuICAgICAgICAgICAgICogZnVuY3Rpb24gd2lsbCBmYWlsLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEByZXR1cm57Kn0gTm8gcmV0dXJuLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBmdW5jdGlvbiBnZXROdW1iZXJPZkNvbEdyb3VwcygpIHtcbiAgICAgICAgICAgICAgbGV0IG51bWJlck9mQ29sR3JvdXBzID0gMDtcbiAgICAgICAgICAgICAgLy8gR2V0IHRoZSB2ZXJ5IGxhc3QgaXRlbVxuICAgICAgICAgICAgICBjb25zdCBsYXN0SXRlbSA9IFtcbiAgICAgICAgICAgICAgICAuLi5jaENvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKFwiW2NsYXNzKj1jb2wtXVwiKSxcbiAgICAgICAgICAgICAgXS5wb3AoKTtcbiAgICAgICAgICAgICAgY29uc3QgbGFzdEl0ZW1DbGFzc2VzID0gbGFzdEl0ZW0uY2xhc3NMaXN0O1xuICAgICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIGNsYXNzZXMgbG9va2luZyBmb3JcImNvbC1uXCIsIHRoZW4gZ2V0IHRoZSBcIm5cIlxuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxhc3RJdGVtQ2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChsYXN0SXRlbUNsYXNzZXNbaV0uaW5kZXhPZihcImNvbC1cIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAvLyBvaywgbm93IG9uIHRoZSBjb2wtbiBjbGFzcyBuYW1lXG4gICAgICAgICAgICAgICAgICBjb25zdCBjb2xOdW1iZXIgPSBsYXN0SXRlbUNsYXNzZXNbaV0uc3BsaXQoXCItXCIpWzFdO1xuICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZDb2xHcm91cHMgPSBwYXJzZUludChjb2xOdW1iZXIsIDEwKSArIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBudW1iZXJPZkNvbEdyb3VwcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBHaXZlbiBhbiBhcnJheSBvZiBjaGlsZHJlbiwgYW5kIGdpdmVuIGFuIGVsZW1lbnQgd2hlcmUgd2Ugd2FudCB0b1xuICAgICAgICAgICAgICogYXBwZW5kIHRoZSBjaGlsZHJlbiBhcyBzaWJsaW5nIChhcyBzaWJsaW5ncyksIGluc2VydCBlYWNoIGNoaWxkLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBwYXJhbSB7Kn0gY2hpbGRyZW4gQXJyYXkgb2YgY2hpbGRyZW4uXG4gICAgICAgICAgICAgKiBAcGFyYW0geyp9IHRyaWdnZXJFbGVtIEVsZW0gdGh
225hdCBpcyBwcmV2aW91cyBzaWJsaW5nXG4gICAgICAgICAgICAgKiBAcmV0dXJuc3sqfSBObyByZXR1cm4uXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgZnVuY3Rpb24gYXBwZW5kQ2xvbmVkQ2hpbGRyZW4oY2hpbGRyZW4sIHRyaWdnZXJFbGVtKSB7XG4gICAgICAgICAgICAgIGxldCBwcmV2SXRlbTtcbiAgICAgICAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJldkl0ZW0gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgIHByZXZJdGVtID0gY2hDb250YWluZXIuaW5zZXJ0QmVmb3JlKFxuICAgICAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgICAgICBwcmV2SXRlbS5uZXh0U2libGluZ1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcHJldkl0ZW0gPSBjaENvbnRhaW5lci5pbnNlcnRCZWZvcmUoXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJFbGVtLm5leHRTaWJsaW5nXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIG1ha2VNb2JpbGUoKSB7XG4gICAgICAgICAgICAgIC8vIG1vYmlsZVxuICAgICAgICAgICAgICBjb25zdCBjb2xHcm91cHMgPSBnZXROdW1iZXJPZkNvbEdyb3VwcygpO1xuICAgICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIGFtb3VudCBvZiBjb2wgZ3JvdXBzIHdlIHNob3VsZCBoYXZlXG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY29sR3JvdXBzOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBnZXQgYWxsIGVsZW1zIHRoYXQgc2hvdWxkIGJlIHdyYXBwZWRcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtc1RvV3JhcCA9IGNoQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgICAgICAgICAgICBgLmNvbC0ke2l9Om5vdCgucm93LTApYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCBpdGVtIChha2EgdHJpZ2dlcilcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtVHJpZ2dlciA9IGNoQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgICAgICAgICAgICBgLmNvbC0ke2l9LnJvdy0wYFxuICAgICAgICAgICAgICAgIClbMF07XG4gICAgICAgICAgICAgICAgLy8gYmFzaWMgc2V0dXAgb2YgdGhlIHdyYXBwZXIgdG8gYmUgYWRkZWRcbiAgICAgICAgICAgICAgICBjb25zdCB3cmFwcGVyRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhbENvdW50ID0gaSAtIDE7XG4gICAgICAgICAgICAgICAgY29uc3Qgd3JhcElEID0gYCR7Y2hDb250YWluZXIuaWR9X19zZWN0JHtyZWFsQ291bnR9YDtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmlhTGFiZWwgPSBgJHtjaENvbnRhaW5lci5pZH1fX3RhYklEXyR7cmVhbENvdW50fWA7XG4gICAgICAgICAgICAgICAgd3JhcHBlckVsZW0uY2xhc3NMaXN0LmFkZChjaFdyYXBwZXJDbGFzcyk7XG4gICAgICAgICAgICAgICAgd3JhcHBlckVsZW0uc2V0QXR0cmlidXRlKFwiaWRcIiwgd3JhcElEKTtcbiAgICAgICAgICAgICAgICB3cmFwcGVyRWxlbS5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwicmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHdyYXBwZXJFbGVtLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiLCBhcmlhTGFiZWwpO1xuICAgICAgICAgICAgICAgIHdyYXBwZXJFbGVtLmhpZGRlbiA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAvLyBub3cgbG9vcCB0aHJvdWdoIGVhY2ggaXRlbSBiZWluZyB3cmFwcGVkIGFuZCBhcHBlbmQgaXRcbiAgICAgICAgICAgICAgICAvLyB0byB0aGUgd3JhcHBlclxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtc1RvV3JhcCkge1xuICAgICAgICAgICAgICAgICAgd3JhcHBlckVsZW0uYXBwZW5kKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBmaW5hbGx5IHBsYWNlIHRoZSB3cmFwcGVyIChhbmQgY2hpbGRyZW4pIHJpZ2h0IGFmdGVyIHRoZVxuICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgZm9yIHRoaXMgZ3JvdXBcbiAgICAgICAgICAgICAgICBjaENvbnRhaW5lci5pbnNlcnRCZWZvcmUod3JhcHBlckVsZW0sIGl0ZW1UcmlnZ2VyLm5leHRTaWJsaW5nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBtYWtlRGVza3RvcCgpIHtcbiAgICAgICAgICAgICAgLy8gZGVza3RvcFxuICAgICAgICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiByZW1vdmFsIGlzIGV2ZW4gbmVlZGVkXG4gICAgICAgICAgICAgIGlmIChjaENvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKGAuJHtjaFdyYXBwZXJDbGFzc31gKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBnZXQgYSBsaXN0IG9mIHdyYXBwZXJzXG4gICAgICAgICAgICAgICAgY29uc3Qgd3JhcHBlcnMgPSBjaENvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgICAgICAgICAgYC4ke2NoV3JhcHBlckNsYXNzfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIC8vIGxvb3AgdGhyb3VnaCB0byBmaW5kIGFuZCBjbG9uZSB0aGUgY2hpbGRyZW47IHRoZW4gZGVsZXRlIHRoZVxuICAgICAgICAgICAgICAgIC8vIHdyYXBwZXIuIEFmdGVyIHRoYXQgd2UgY2FuIGFwcGVuZCB0aGUgY2xvbmVkIGNoaWxkcmVuLlxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd3JhcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgIC8vIHRoaXMgd3JhcHBlclxuICAgICAgICAgICAgICAgICAgY29uc3Qgd3JhcHBlciA9IHdyYXBwZXJzW2ldO1xuICAgICAgICAgICAgICAgICAgLy8gdGhpcyB3cmFwcGVyJ3MgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHdyYXBwZXJDaGlsZHJlbiA9IHdyYXBwZXIuY2hpbGROb2RlcztcbiAgICAgICAgICAgICAgICAgIC8vIGFycmF5IHNldHVwIGZvciB0aGUgY2xvbmVkIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgICBjb25zdCBjbG9uZWRDaGlsZHJlbiA9IFtdO1xuICAgICAgICAgICAgICAgICAgLy8gb3VyIGN1cnJlbnQgdHJpZ2dlciBlbGVtIChwcmV2aW91cyBzaWJsaW5nKVxuICAgICAgICAgICAgICAgICAgY29uc3QgdHJpZ2dlckVsZW0gP
225SBjaENvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgICAgICAgICAgICBgLmNvbC0ke2l9LnJvdy0wYFxuICAgICAgICAgICAgICAgICAgKVswXTtcbiAgICAgICAgICAgICAgICAgIC8vIGxvb3AgdGhyb3VnaCBjaGlsZHJlbiBhbmQgY2xvbmUgZWFjaCBvbmUgdG8gc2F2ZSBpdCBmb3IgYXBwZW5kaW5nXG4gICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygd3JhcHBlckNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkQ2xvbmUgPSBjaGlsZC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNsb25lZENoaWxkcmVuLnB1c2goY2hpbGRDbG9uZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIHdyYXBwZXJcbiAgICAgICAgICAgICAgICAgIHdyYXBwZXIucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAvLyBhbmQgYXBwZW5kIHRoZSBjaGlsZHJlbiBhcyBzaWJsaW5ncyB0byB0aGUgdHJpZ2dlclxuICAgICAgICAgICAgICAgICAgYXBwZW5kQ2xvbmVkQ2hpbGRyZW4oY2xvbmVkQ2hpbGRyZW4sIHRyaWdnZXJFbGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gbXFVcGRhdGVNb2JpbGUoZSkge1xuICAgICAgICAgICAgICBpZiAoZS5tYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICAgICAgICAgICAgbWFrZU1vYmlsZSgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIG1ha2VEZXNrdG9wKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICAgICAgICAgICAgZnVuY3Rpb24gbXFVcGRhdGVUYWJsZXQobXEyKSB7XG4gICAgICAgICAgICAgIGlmIChtcTIubWF0Y2hlcyAmJiBjaENvbnRhaW5lci5pZCA9PT0gXCJmdC1ieS1yZWdpb25cIikge1xuICAgICAgICAgICAgICAgIG1ha2VNb2JpbGUoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYWtlRGVza3RvcCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgICAgICAgIGlmIChjaENvbnRhaW5lci5pZCA9PT0gXCJmdC1ieS1yZWdpb25cIikge1xuICAgICAgICAgICAgICAgIGlmIChtcS5tYXRjaGVzIHx8IG1xMi5tYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgICBtYWtlTW9iaWxlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIG1ha2VEZXNrdG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1xLm1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICBtYWtlTW9iaWxlKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWFrZURlc2t0b3AoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIENoZWNrcyBpZiB0aGUgbWVkaWFxdWVyeSBldmVudCBtYXRjaGVzIHRoZSBtYXRjaG1lZGlhIHZhbHVlIChpLmUuXG4gICAgICAgICAgICAgKiB3aGV0aGVyIG1vYmlsZSBlbHNlIGRlc2t0b3ApLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIElmIG1vYmlsZSwgd3JhcHMgZWxlbXMgaW4gYSBjb250YWluZXIgZm9yIGF0dGFjaGluZyBzaG93aGlkZS5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBJZiBkZXNrdG9wLCByZW1vdmVzIHdyYXBwaW5nIGVsZW1zIChhbmQgcGxhY2VzIGNoaWxkcmVuIGJhY2sgYXNcbiAgICAgICAgICAgICAqIHNpYmxpbmdzKS5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAcGFyYW0geyp9IGUgVGhlIG1xIGV2ZW50LlxuICAgICAgICAgICAgICogQHJldHVybnN7Kn0gTm8gcmV0dXJuLlxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIC8vIFdlJ3JlIHVzaW5nIG1lZGlhbWF0Y2ggdG8gYmluZCBjaGFuZ2VzIHdoZW4gdGhlIG1lZGlhLXF1ZXJ5IHRyaWdnZXJzLlxuICAgICAgICAgICAgLy8gV2hlbiB0aGUgcGFnZSBmaXJzdCBsb2FkcyB3ZSBydW4gbXFVcGRhdGUsIGFuZCB0aGVuIHdlIHNldCBhXG4gICAgICAgICAgICAvLyBtZWRpYSBxdWVyeSBsaXN0ZW5lciB0aGF0IHdpbGwgZmlyZSBtcVVwZGF0ZSB3aGVuZXZlciB0aGF0IGJyZWFrcG9pbnRcbiAgICAgICAgICAgIC8vIGlzIHRyaWdnZXJlZCAoaS5lLiB3aGVuIHRoZSBicm93c2VyIHdpbmRvdyBwYXNzZXMgOTYwcHgpLlxuICAgICAgICAgICAgaW5pdCgpO1xuICAgICAgICAgICAgbXEuYWRkTGlzdGVuZXIobXFVcGRhdGVNb2JpbGUpO1xuICAgICAgICAgICAgbXEyLmFkZExpc3RlbmVyKG1xVXBkYXRlVGFibGV0KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufSkoalF1ZXJ5LCBEcnVwYWwpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0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

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.