@agilemotion/oui-react-js 2.0.11 → 2.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _Utils = _interopRequireDefault(require("../Utils"));
9
+ var _Observable = _interopRequireDefault(require("../event/Observable"));
10
+ var _Event = _interopRequireDefault(require("../event/Event"));
11
+ var _EventType = _interopRequireDefault(require("../event/EventType"));
12
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
+ /**
14
+ * CDUI-wrapped Cloudflare Turnstile widget. Drops the widget into a
15
+ * layout the same way any other CDUI component does and exposes the
16
+ * resolved challenge token through {@code handle.api.value}, so view
17
+ * authors can reference it from other components / service calls via
18
+ * {@code @#{turnstile}.value} when wiring up an httpParameterType.
19
+ *
20
+ * <p>Loads Cloudflare's vendor script lazily on first mount. The script
21
+ * defines {@code window.turnstile} which exposes {@code render()} —
22
+ * we render explicitly (not auto-render via class="cf-turnstile") so
23
+ * the React lifecycle can issue a {@code reset} when the parent view
24
+ * re-mounts.
25
+ *
26
+ * <p>Site key is sourced from {@code REACT_APP_TURNSTILE_SITE_KEY} at
27
+ * build time (matches the project's existing REACT_APP_* convention),
28
+ * NOT from CDUI JSON — view authors shouldn't have to know the key.
29
+ * For dev, hostname {@code localhost} is explicitly supported by
30
+ * Cloudflare so the same env var can be used unchanged.
31
+ */
32
+ const TURNSTILE_SCRIPT_URL = 'https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit';
33
+
34
+ // Cloudflare Turnstile's "site key" is intentionally public (it's the
35
+ // publishable identifier, analogous to Stripe's publishable key) and
36
+ // is hostname-bound on the Cloudflare side, so leaking it can't be
37
+ // used against other domains. Even so, sourcing it from an env var
38
+ // keeps dev/staging/prod swappable without a code change — same shape
39
+ // the codebase already uses for REACT_APP_DOCS_API_HOST etc. Set
40
+ // REACT_APP_TURNSTILE_SITE_KEY per environment.
41
+ const SITE_KEY = process.env.REACT_APP_TURNSTILE_SITE_KEY;
42
+ let scriptLoadPromise = null;
43
+ const loadTurnstileScript = () => {
44
+ if (scriptLoadPromise) {
45
+ return scriptLoadPromise;
46
+ }
47
+ if (typeof window !== 'undefined' && window.turnstile) {
48
+ scriptLoadPromise = Promise.resolve();
49
+ return scriptLoadPromise;
50
+ }
51
+ scriptLoadPromise = new Promise((resolve, reject) => {
52
+ const script = document.createElement('script');
53
+ script.src = TURNSTILE_SCRIPT_URL;
54
+ script.async = true;
55
+ script.defer = true;
56
+ script.onload = () => resolve();
57
+ script.onerror = e => {
58
+ scriptLoadPromise = null; // allow retry next mount
59
+ reject(e);
60
+ };
61
+ document.head.appendChild(script);
62
+ });
63
+ return scriptLoadPromise;
64
+ };
65
+ const Turnstile = /*#__PURE__*/_react.default.memo(props => {
66
+ const containerRef = _react.default.useRef(null);
67
+ const widgetIdRef = _react.default.useRef(null);
68
+ const [token, setToken] = _react.default.useState(null);
69
+ _react.default.useEffect(() => {
70
+ props.handle.api = api();
71
+ });
72
+ _react.default.useEffect(() => {
73
+ const parsedConfig = _Utils.default.parseConfig(props.config, props.viewId);
74
+ _Observable.default.addSubscriptions(parsedConfig.eventHandlingConfig, props.handle, props.viewId);
75
+ _Observable.default.addSystemSubscriptions(props.viewId, parsedConfig);
76
+ if (!SITE_KEY) {
77
+ console.error('Turnstile: REACT_APP_TURNSTILE_SITE_KEY env var is not set — the widget will not render');
78
+ return;
79
+ }
80
+ let cancelled = false;
81
+ loadTurnstileScript().then(() => {
82
+ if (cancelled || !containerRef.current || !window.turnstile) {
83
+ return;
84
+ }
85
+ widgetIdRef.current = window.turnstile.render(containerRef.current, {
86
+ sitekey: SITE_KEY,
87
+ callback: newToken => {
88
+ setToken(newToken);
89
+ const event = new _Event.default(props.handle, props.viewId, newToken);
90
+ _Observable.default.fireEvent(_EventType.default.VALUE_CHANGE, event);
91
+ },
92
+ 'error-callback': () => {
93
+ setToken(null);
94
+ },
95
+ 'expired-callback': () => {
96
+ setToken(null);
97
+ }
98
+ });
99
+ }).catch(e => console.error('Turnstile: failed to load vendor script', e));
100
+
101
+ // Fire COMPONENT_LOAD so any view-level eventHandlingConfig keyed
102
+ // on the turnstile component's load can hook in (mirrors the
103
+ // pattern used by HtmlPanel / other CDUI components).
104
+ const loadEvent = new _Event.default(props.handle, props.viewId, null);
105
+ _Observable.default.fireEvent(_EventType.default.COMPONENT_LOAD, loadEvent);
106
+ return () => {
107
+ cancelled = true;
108
+ if (widgetIdRef.current && window.turnstile) {
109
+ try {
110
+ window.turnstile.remove(widgetIdRef.current);
111
+ } catch (e) {
112
+ // turnstile.remove throws if the widget id is unknown
113
+ // (e.g. script unloaded mid-cleanup) — safe to ignore.
114
+ }
115
+ widgetIdRef.current = null;
116
+ }
117
+ _Observable.default.clearComponentEventListeners(props.handle);
118
+ };
119
+ }, []);
120
+ const api = () => ({
121
+ get id() {
122
+ return props.config.id;
123
+ },
124
+ // The challenge token the backend siteverifies against. Null
125
+ // before the widget resolves; CDUI service-call wiring should
126
+ // guard with `nullable: false` so submit can't fire pre-solve.
127
+ get value() {
128
+ return token;
129
+ },
130
+ getChildren: () => [],
131
+ // Allows callers to manually reset the widget after a backend
132
+ // rejection — e.g. a 403 from siteverify. Token is consumed per
133
+ // call; resetting re-issues a fresh one.
134
+ reset: () => {
135
+ if (widgetIdRef.current && window.turnstile) {
136
+ window.turnstile.reset(widgetIdRef.current);
137
+ setToken(null);
138
+ }
139
+ },
140
+ refresh: () => {}
141
+ });
142
+ return /*#__PURE__*/_react.default.createElement("div", {
143
+ style: _Utils.default.mergeStyles({
144
+ margin: '8px 0'
145
+ }, props.config)
146
+ }, /*#__PURE__*/_react.default.createElement("div", {
147
+ ref: containerRef
148
+ }));
149
+ });
150
+ var _default = exports.default = Turnstile;
151
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9VdGlscyIsIl9PYnNlcnZhYmxlIiwiX0V2ZW50IiwiX0V2ZW50VHlwZSIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIlRVUk5TVElMRV9TQ1JJUFRfVVJMIiwiU0lURV9LRVkiLCJwcm9jZXNzIiwiZW52IiwiUkVBQ1RfQVBQX1RVUk5TVElMRV9TSVRFX0tFWSIsInNjcmlwdExvYWRQcm9taXNlIiwibG9hZFR1cm5zdGlsZVNjcmlwdCIsIndpbmRvdyIsInR1cm5zdGlsZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwic2NyaXB0IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50Iiwic3JjIiwiYXN5bmMiLCJkZWZlciIsIm9ubG9hZCIsIm9uZXJyb3IiLCJoZWFkIiwiYXBwZW5kQ2hpbGQiLCJUdXJuc3RpbGUiLCJSZWFjdCIsIm1lbW8iLCJwcm9wcyIsImNvbnRhaW5lclJlZiIsInVzZVJlZiIsIndpZGdldElkUmVmIiwidG9rZW4iLCJzZXRUb2tlbiIsInVzZVN0YXRlIiwidXNlRWZmZWN0IiwiaGFuZGxlIiwiYXBpIiwicGFyc2VkQ29uZmlnIiwiVXRpbHMiLCJwYXJzZUNvbmZpZyIsImNvbmZpZyIsInZpZXdJZCIsImV2ZW50TWFuYWdlciIsImFkZFN1YnNjcmlwdGlvbnMiLCJldmVudEhhbmRsaW5nQ29uZmlnIiwiYWRkU3lzdGVtU3Vic2NyaXB0aW9ucyIsImNvbnNvbGUiLCJlcnJvciIsImNhbmNlbGxlZCIsInRoZW4iLCJjdXJyZW50IiwicmVuZGVyIiwic2l0ZWtleSIsImNhbGxiYWNrIiwibmV3VG9rZW4iLCJldmVudCIsIkV2ZW50IiwiZmlyZUV2ZW50IiwiRXZlbnRUeXBlIiwiVkFMVUVfQ0hBTkdFIiwiZXJyb3ItY2FsbGJhY2siLCJleHBpcmVkLWNhbGxiYWNrIiwiY2F0Y2giLCJsb2FkRXZlbnQiLCJDT01QT05FTlRfTE9BRCIsInJlbW92ZSIsImNsZWFyQ29tcG9uZW50RXZlbnRMaXN0ZW5lcnMiLCJpZCIsInZhbHVlIiwiZ2V0Q2hpbGRyZW4iLCJyZXNldCIsInJlZnJlc2giLCJzdHlsZSIsIm1lcmdlU3R5bGVzIiwibWFyZ2luIiwicmVmIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL1R1cm5zdGlsZS5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBVdGlscyBmcm9tICcuLi9VdGlscyc7XG5pbXBvcnQgZXZlbnRNYW5hZ2VyIGZyb20gJy4uL2V2ZW50L09ic2VydmFibGUnO1xuaW1wb3J0IEV2ZW50IGZyb20gJy4uL2V2ZW50L0V2ZW50JztcbmltcG9ydCBFdmVudFR5cGUgZnJvbSAnLi4vZXZlbnQvRXZlbnRUeXBlJztcblxuLyoqXG4gKiBDRFVJLXdyYXBwZWQgQ2xvdWRmbGFyZSBUdXJuc3RpbGUgd2lkZ2V0LiBEcm9wcyB0aGUgd2lkZ2V0IGludG8gYVxuICogbGF5b3V0IHRoZSBzYW1lIHdheSBhbnkgb3RoZXIgQ0RVSSBjb21wb25lbnQgZG9lcyBhbmQgZXhwb3NlcyB0aGVcbiAqIHJlc29sdmVkIGNoYWxsZW5nZSB0b2tlbiB0aHJvdWdoIHtAY29kZSBoYW5kbGUuYXBpLnZhbHVlfSwgc28gdmlld1xuICogYXV0aG9ycyBjYW4gcmVmZXJlbmNlIGl0IGZyb20gb3RoZXIgY29tcG9uZW50cyAvIHNlcnZpY2UgY2FsbHMgdmlhXG4gKiB7QGNvZGUgQCN7dHVybnN0aWxlfS52YWx1ZX0gd2hlbiB3aXJpbmcgdXAgYW4gaHR0cFBhcmFtZXRlclR5cGUuXG4gKlxuICogPHA+TG9hZHMgQ2xvdWRmbGFyZSdzIHZlbmRvciBzY3JpcHQgbGF6aWx5IG9uIGZpcnN0IG1vdW50LiBUaGUgc2NyaXB0XG4gKiBkZWZpbmVzIHtAY29kZSB3aW5kb3cudHVybnN0aWxlfSB3aGljaCBleHBvc2VzIHtAY29kZSByZW5kZXIoKX0g4oCUXG4gKiB3ZSByZW5kZXIgZXhwbGljaXRseSAobm90IGF1dG8tcmVuZGVyIHZpYSBjbGFzcz1cImNmLXR1cm5zdGlsZVwiKSBzb1xuICogdGhlIFJlYWN0IGxpZmVjeWNsZSBjYW4gaXNzdWUgYSB7QGNvZGUgcmVzZXR9IHdoZW4gdGhlIHBhcmVudCB2aWV3XG4gKiByZS1tb3VudHMuXG4gKlxuICogPHA+U2l0ZSBrZXkgaXMgc291cmNlZCBmcm9tIHtAY29kZSBSRUFDVF9BUFBfVFVSTlNUSUxFX1NJVEVfS0VZfSBhdFxuICogYnVpbGQgdGltZSAobWF0Y2hlcyB0aGUgcHJvamVjdCdzIGV4aXN0aW5nIFJFQUNUX0FQUF8qIGNvbnZlbnRpb24pLFxuICogTk9UIGZyb20gQ0RVSSBKU09OIOKAlCB2aWV3IGF1dGhvcnMgc2hvdWxkbid0IGhhdmUgdG8ga25vdyB0aGUga2V5LlxuICogRm9yIGRldiwgaG9zdG5hbWUge0Bjb2RlIGxvY2FsaG9zdH0gaXMgZXhwbGljaXRseSBzdXBwb3J0ZWQgYnlcbiAqIENsb3VkZmxhcmUgc28gdGhlIHNhbWUgZW52IHZhciBjYW4gYmUgdXNlZCB1bmNoYW5nZWQuXG4gKi9cbmNvbnN0IFRVUk5TVElMRV9TQ1JJUFRfVVJMID0gJ2h0dHBzOi8vY2hhbGxlbmdlcy5jbG91ZGZsYXJlLmNvbS90dXJuc3RpbGUvdjAvYXBpLmpzP3JlbmRlcj1leHBsaWNpdCc7XG5cbi8vIENsb3VkZmxhcmUgVHVybnN0aWxlJ3MgXCJzaXRlIGtleVwiIGlzIGludGVudGlvbmFsbHkgcHVibGljIChpdCdzIHRoZVxuLy8gcHVibGlzaGFibGUgaWRlbnRpZmllciwgYW5hbG9nb3VzIHRvIFN0cmlwZSdzIHB1Ymxpc2hhYmxlIGtleSkgYW5kXG4vLyBpcyBob3N0bmFtZS1ib3VuZCBvbiB0aGUgQ2xvdWRmbGFyZSBzaWRlLCBzbyBsZWFraW5nIGl0IGNhbid0IGJlXG4vLyB1c2VkIGFnYWluc3Qgb3RoZXIgZG9tYWlucy4gRXZlbiBzbywgc291cmNpbmcgaXQgZnJvbSBhbiBlbnYgdmFyXG4vLyBrZWVwcyBkZXYvc3RhZ2luZy9wcm9kIHN3YXBwYWJsZSB3aXRob3V0IGEgY29kZSBjaGFuZ2Ug4oCUIHNhbWUgc2hhcGVcbi8vIHRoZSBjb2RlYmFzZSBhbHJlYWR5IHVzZXMgZm9yIFJFQUNUX0FQUF9ET0NTX0FQSV9IT1NUIGV0Yy4gU2V0XG4vLyBSRUFDVF9BUFBfVFVSTlNUSUxFX1NJVEVfS0VZIHBlciBlbnZpcm9ubWVudC5cbmNvbnN0IFNJVEVfS0VZID0gcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX1RVUk5TVElMRV9TSVRFX0tFWTtcblxubGV0IHNjcmlwdExvYWRQcm9taXNlID0gbnVsbDtcbmNvbnN0IGxvYWRUdXJuc3RpbGVTY3JpcHQgPSAoKSA9PiB7XG4gICAgaWYgKHNjcmlwdExvYWRQcm9taXNlKSB7XG4gICAgICAgIHJldHVybiBzY3JpcHRMb2FkUHJvbWlzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy50dXJuc3RpbGUpIHtcbiAgICAgICAgc2NyaXB0TG9hZFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuIHNjcmlwdExvYWRQcm9taXNlO1xuICAgIH1cbiAgICBzY3JpcHRMb2FkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgIHNjcmlwdC5zcmMgPSBUVVJOU1RJTEVfU0NSSVBUX1VSTDtcbiAgICAgICAgc2NyaXB0LmFzeW5jID0gdHJ1ZTtcbiAgICAgICAgc2NyaXB0LmRlZmVyID0gdHJ1ZTtcbiAgICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgICAgc2NyaXB0Lm9uZXJyb3IgPSAoZSkgPT4ge1xuICAgICAgICAgICAgc2NyaXB0TG9hZFByb21pc2UgPSBudWxsOyAvLyBhbGxvdyByZXRyeSBuZXh0IG1vdW50XG4gICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH07XG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICB9KTtcbiAgICByZXR1cm4gc2NyaXB0TG9hZFByb21pc2U7XG59O1xuXG5jb25zdCBUdXJuc3RpbGUgPSBSZWFjdC5tZW1vKChwcm9wcykgPT4ge1xuICAgIGNvbnN0IGNvbnRhaW5lclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICBjb25zdCB3aWRnZXRJZFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICBjb25zdCBbdG9rZW4sIHNldFRva2VuXSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuXG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgcHJvcHMuaGFuZGxlLmFwaSA9IGFwaSgpO1xuICAgIH0pO1xuXG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgcGFyc2VkQ29uZmlnID0gVXRpbHMucGFyc2VDb25maWcocHJvcHMuY29uZmlnLCBwcm9wcy52aWV3SWQpO1xuICAgICAgICBldmVudE1hbmFnZXIuYWRkU3Vic2NyaXB0aW9ucyhwYXJzZWRDb25maWcuZXZlbnRIYW5kbGluZ0NvbmZpZywgcHJvcHMuaGFuZGxlLCBwcm9wcy52aWV3SWQpO1xuICAgICAgICBldmVudE1hbmFnZXIuYWRkU3lzdGVtU3Vic2NyaXB0aW9ucyhwcm9wcy52aWV3SWQsIHBhcnNlZENvbmZpZyk7XG5cbiAgICAgICAgaWYgKCFTSVRFX0tFWSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignVHVybnN0aWxlOiBSRUFDVF9BUFBfVFVSTlNUSUxFX1NJVEVfS0VZIGVudiB2YXIgaXMgbm90IHNldCDigJQgdGhlIHdpZGdldCB3aWxsIG5vdCByZW5kZXInKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjYW5jZWxsZWQgPSBmYWxzZTtcbiAgICAgICAgbG9hZFR1cm5zdGlsZVNjcmlwdCgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxlZCB8fCAhY29udGFpbmVyUmVmLmN1cnJlbnQgfHwgIXdpbmRvdy50dXJuc3RpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aWRnZXRJZFJlZi5jdXJyZW50ID0gd2luZG93LnR1cm5zdGlsZS5yZW5kZXIoY29udGFpbmVyUmVmLmN1cnJlbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgc2l0ZWtleTogU0lURV9LRVksXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiAobmV3VG9rZW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRva2VuKG5ld1Rva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KHByb3BzLmhhbmRsZSwgcHJvcHMudmlld0lkLCBuZXdUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudE1hbmFnZXIuZmlyZUV2ZW50KEV2ZW50VHlwZS5WQUxVRV9DSEFOR0UsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgJ2Vycm9yLWNhbGxiYWNrJzogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9rZW4obnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICdleHBpcmVkLWNhbGxiYWNrJzogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9rZW4obnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlKSA9PiBjb25zb2xlLmVycm9yKCdUdXJuc3RpbGU6IGZhaWxlZCB0byBsb2FkIHZlbmRvciBzY3JpcHQnLCBlKSk7XG5cbiAgICAgICAgLy8gRmlyZSBDT01QT05FTlRfTE9BRCBzbyBhbnkgdmlldy1sZXZlbCBldmVudEhhbmRsaW5nQ29uZmlnIGtleWVkXG4gICAgICAgIC8vIG9uIHRoZSB0dXJuc3RpbGUgY29tcG9uZW50J3MgbG9hZCBjYW4gaG9vayBpbiAobWlycm9ycyB0aGVcbiAgICAgICAgLy8gcGF0dGVybiB1c2VkIGJ5IEh0bWxQYW5lbCAvIG90aGVyIENEVUkgY29tcG9uZW50cykuXG4gICAgICAgIGNvbnN0IGxvYWRFdmVudCA9IG5ldyBFdmVudChwcm9wcy5oYW5kbGUsIHByb3BzLnZpZXdJZCwgbnVsbCk7XG4gICAgICAgIGV2ZW50TWFuYWdlci5maXJlRXZlbnQoRXZlbnRUeXBlLkNPTVBPTkVOVF9MT0FELCBsb2FkRXZlbnQpO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHdpZGdldElkUmVmLmN1cnJlbnQgJiYgd2luZG93LnR1cm5zdGlsZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy50dXJuc3RpbGUucmVtb3ZlKHdpZGdldElkUmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdHVybnN0aWxlLnJlbW92ZSB0aHJvd3MgaWYgdGhlIHdpZGdldCBpZCBpcyB1bmtub3duXG4gICAgICAgICAgICAgICAgICAgIC8vIChlLmcuIHNjcmlwdCB1bmxvYWRlZCBtaWQtY2xlYW51cCkg4oCUIHNhZmUgdG8gaWdub3JlLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aWRnZXRJZFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2ZW50TWFuYWdlci5jbGVhckNvbXBvbmVudEV2ZW50TGlzdGVuZXJzKHByb3BzLmhhbmRsZSk7XG4gICAgICAgIH07XG4gICAgfSwgW10pO1xuXG4gICAgY29uc3QgYXBpID0gKCkgPT4gKHtcbiAgICAgICAgZ2V0IGlkKCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BzLmNvbmZpZy5pZDtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gVGhlIGNoYWxsZW5nZSB0b2tlbiB0aGUgYmFja2VuZCBzaXRldmVyaWZpZXMgYWdhaW5zdC4gTnVsbFxuICAgICAgICAvLyBiZWZvcmUgdGhlIHdpZGdldCByZXNvbHZlczsgQ0RVSSBzZXJ2aWNlLWNhbGwgd2lyaW5nIHNob3VsZFxuICAgICAgICAvLyBndWFyZCB3aXRoIGBudWxsYWJsZTogZmFsc2VgIHNvIHN1Ym1pdCBjYW4ndCBmaXJlIHByZS1zb2x2ZS5cbiAgICAgICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICB9LFxuICAgICAgICBnZXRDaGlsZHJlbjogKCkgPT4gW10sXG4gICAgICAgIC8vIEFsbG93cyBjYWxsZXJzIHRvIG1hbnVhbGx5IHJlc2V0IHRoZSB3aWRnZXQgYWZ0ZXIgYSBiYWNrZW5kXG4gICAgICAgIC8vIHJlamVjdGlvbiDigJQgZS5nLiBhIDQwMyBmcm9tIHNpdGV2ZXJpZnkuIFRva2VuIGlzIGNvbnN1bWVkIHBlclxuICAgICAgICAvLyBjYWxsOyByZXNldHRpbmcgcmUtaXNzdWVzIGEgZnJlc2ggb25lLlxuICAgICAgICByZXNldDogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHdpZGdldElkUmVmLmN1cnJlbnQgJiYgd2luZG93LnR1cm5zdGlsZSkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy50dXJuc3RpbGUucmVzZXQod2lkZ2V0SWRSZWYuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgc2V0VG9rZW4obnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlZnJlc2g6ICgpID0+IHt9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBzdHlsZT17VXRpbHMubWVyZ2VTdHlsZXMoe21hcmdpbjogJzhweCAwJ30sIHByb3BzLmNvbmZpZyl9PlxuICAgICAgICAgICAgPGRpdiByZWY9e2NvbnRhaW5lclJlZn0vPlxuICAgICAgICA8L2Rpdj5cbiAgICApO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFR1cm5zdGlsZTsiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLFdBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLFVBQUEsR0FBQUwsc0JBQUEsQ0FBQUMsT0FBQTtBQUEyQyxTQUFBRCx1QkFBQU0sQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQUUzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU1HLG9CQUFvQixHQUFHLHVFQUF1RTs7QUFFcEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNQyxRQUFRLEdBQUdDLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDQyw0QkFBNEI7QUFFekQsSUFBSUMsaUJBQWlCLEdBQUcsSUFBSTtBQUM1QixNQUFNQyxtQkFBbUIsR0FBR0EsQ0FBQSxLQUFNO0VBQzlCLElBQUlELGlCQUFpQixFQUFFO0lBQ25CLE9BQU9BLGlCQUFpQjtFQUM1QjtFQUNBLElBQUksT0FBT0UsTUFBTSxLQUFLLFdBQVcsSUFBSUEsTUFBTSxDQUFDQyxTQUFTLEVBQUU7SUFDbkRI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