From 436c4172e1007bedf92470a52921f21098205c3c Mon Sep 17 00:00:00 2001 From: vivek Date: Wed, 5 Nov 2014 10:13:56 -0800 Subject: [PATCH 01/25] Bug 847435 - Redesign tab history menu. r=bnicholson --- mobile/android/base/BrowserApp.java | 37 +++- mobile/android/base/Tab.java | 58 +------ mobile/android/base/moz.build | 4 + .../resources/drawable/tab_history_bg.xml | 27 +++ .../drawable/tab_history_icon_state.xml | 24 +++ .../base/resources/layout/gecko_app.xml | 6 + .../resources/layout/tab_history_item_row.xml | 56 ++++++ .../resources/layout/tab_history_layout.xml | 17 ++ .../android/base/resources/values/attrs.xml | 5 + .../android/base/resources/values/colors.xml | 8 + .../android/base/resources/values/dimens.xml | 15 ++ .../base/tabs/TabHistoryController.java | 119 +++++++++++++ .../android/base/tabs/TabHistoryFragment.java | 161 ++++++++++++++++++ .../android/base/tabs/TabHistoryItemRow.java | 95 +++++++++++ mobile/android/base/tabs/TabHistoryPage.java | 60 +++++++ .../android/base/toolbar/BrowserToolbar.java | 6 + .../toolbar/BrowserToolbarTabletBase.java | 7 +- mobile/android/base/widget/FaviconView.java | 32 +++- mobile/android/chrome/content/browser.js | 34 ++-- 19 files changed, 693 insertions(+), 78 deletions(-) create mode 100644 mobile/android/base/resources/drawable/tab_history_bg.xml create mode 100644 mobile/android/base/resources/drawable/tab_history_icon_state.xml create mode 100644 mobile/android/base/resources/layout/tab_history_item_row.xml create mode 100644 mobile/android/base/resources/layout/tab_history_layout.xml create mode 100644 mobile/android/base/tabs/TabHistoryController.java create mode 100644 mobile/android/base/tabs/TabHistoryFragment.java create mode 100644 mobile/android/base/tabs/TabHistoryItemRow.java create mode 100644 mobile/android/base/tabs/TabHistoryPage.java diff --git a/mobile/android/base/BrowserApp.java b/mobile/android/base/BrowserApp.java index ff7095fcc16..3e06a4250f3 100644 --- a/mobile/android/base/BrowserApp.java +++ b/mobile/android/base/BrowserApp.java @@ -58,7 +58,11 @@ import org.mozilla.gecko.preferences.GeckoPreferences; import org.mozilla.gecko.prompts.Prompt; import org.mozilla.gecko.prompts.PromptListItem; import org.mozilla.gecko.sync.setup.SyncAccounts; +import org.mozilla.gecko.tabs.TabHistoryController; +import org.mozilla.gecko.tabs.TabHistoryFragment; +import org.mozilla.gecko.tabs.TabHistoryPage; import org.mozilla.gecko.tabs.TabsPanel; +import org.mozilla.gecko.tabs.TabHistoryController.OnShowTabHistory; import org.mozilla.gecko.toolbar.AutocompleteHandler; import org.mozilla.gecko.toolbar.BrowserToolbar; import org.mozilla.gecko.toolbar.ToolbarProgressView; @@ -175,9 +179,11 @@ public class BrowserApp extends GeckoApp protected Telemetry.Timer mAboutHomeStartupTimer; private ActionModeCompat mActionMode; private boolean mShowActionModeEndAnimation; + private TabHistoryController tabHistoryController; private static final int GECKO_TOOLS_MENU = -1; private static final int ADDON_MENU_OFFSET = 1000; + public static final String TAB_HISTORY_FRAGMENT_TAG = "tabHistoryFragment"; private static class MenuItemInfo { public int id; public String label; @@ -461,6 +467,22 @@ public class BrowserApp extends GeckoApp mProgressView = (ToolbarProgressView) findViewById(R.id.progress); mBrowserToolbar.setProgressBar(mProgressView); + // Initialize Tab History Controller. + tabHistoryController = new TabHistoryController(new OnShowTabHistory() { + @Override + public void onShowHistory(final List historyPageList, final int toIndex) { + runOnUiThread(new Runnable() { + @Override + public void run() { + final TabHistoryFragment fragment = TabHistoryFragment.newInstance(historyPageList, toIndex); + final FragmentManager fragmentManager = getSupportFragmentManager(); + fragment.show(R.id.tab_history_panel, fragmentManager.beginTransaction(), TAB_HISTORY_FRAGMENT_TAG); + } + }); + } + }); + mBrowserToolbar.setTabHistoryController(tabHistoryController); + final String action = intent.getAction(); if (Intent.ACTION_VIEW.equals(action)) { // Show the target URL immediately in the toolbar. @@ -650,7 +672,6 @@ public class BrowserApp extends GeckoApp return null; } - @Override public void onBackPressed() { if (getSupportFragmentManager().getBackStackEntryCount() > 0) { @@ -2574,6 +2595,12 @@ public class BrowserApp extends GeckoApp if (aMenu == null) return false; + // Hide the tab history panel when hardware menu button is pressed. + TabHistoryFragment frag = (TabHistoryFragment) getSupportFragmentManager().findFragmentByTag(TAB_HISTORY_FRAGMENT_TAG); + if (frag != null) { + frag.dismiss(); + } + if (!GeckoThread.checkLaunchState(GeckoThread.LaunchState.GeckoRunning)) { aMenu.findItem(R.id.settings).setEnabled(false); aMenu.findItem(R.id.help).setEnabled(false); @@ -2935,9 +2962,15 @@ public class BrowserApp extends GeckoApp @Override public boolean onKeyLongPress(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { + // If the tab search history is already shown, do nothing. + TabHistoryFragment frag = (TabHistoryFragment) getSupportFragmentManager().findFragmentByTag(TAB_HISTORY_FRAGMENT_TAG); + if (frag != null) { + return false; + } + Tab tab = Tabs.getInstance().getSelectedTab(); if (tab != null) { - return tab.showAllHistory(); + return tabHistoryController.showTabHistory(tab, TabHistoryController.HistoryAction.ALL); } } return super.onKeyLongPress(keyCode, event); diff --git a/mobile/android/base/Tab.java b/mobile/android/base/Tab.java index fd862122e07..6ccba862952 100644 --- a/mobile/android/base/Tab.java +++ b/mobile/android/base/Tab.java @@ -15,7 +15,6 @@ import java.util.regex.Pattern; import org.json.JSONException; import org.json.JSONObject; -import org.mozilla.gecko.db.BrowserContract.Bookmarks; import org.mozilla.gecko.db.BrowserDB; import org.mozilla.gecko.db.URLMetadata; import org.mozilla.gecko.favicons.Favicons; @@ -74,7 +73,6 @@ public class Tab { private boolean mEnteringReaderMode; private final Context mAppContext; private ErrorType mErrorType = ErrorType.NONE; - private static final int MAX_HISTORY_LIST_SIZE = 50; private volatile int mLoadProgress; private volatile int mRecordingCount; private String mMostRecentHomePanel; @@ -91,6 +89,7 @@ public class Tab { public static final int LOAD_PROGRESS_STOP = 100; private static final int DEFAULT_BACKGROUND_COLOR = Color.WHITE; + public static final int MAX_HISTORY_LIST_SIZE = 50; public enum ErrorType { CERT_ERROR, // Pages with certificate problems @@ -321,6 +320,14 @@ public class Tab { return mContentType; } + public int getHistoryIndex() { + return mHistoryIndex; + } + + public int getHistorySize() { + return mHistorySize; + } + public synchronized void updateTitle(String title) { // Keep the title unchanged while entering reader mode. if (mEnteringReaderMode) { @@ -545,53 +552,6 @@ public class Tab { return true; } - public boolean showBackHistory() { - if (!canDoBack()) - return false; - return this.showHistory(Math.max(mHistoryIndex - MAX_HISTORY_LIST_SIZE, 0), mHistoryIndex, mHistoryIndex); - } - - public boolean showForwardHistory() { - if (!canDoForward()) - return false; - return this.showHistory(mHistoryIndex, Math.min(mHistorySize - 1, mHistoryIndex + MAX_HISTORY_LIST_SIZE), mHistoryIndex); - } - - public boolean showAllHistory() { - if (!canDoForward() && !canDoBack()) - return false; - - int min = mHistoryIndex - MAX_HISTORY_LIST_SIZE / 2; - int max = mHistoryIndex + MAX_HISTORY_LIST_SIZE / 2; - if (min < 0) { - max -= min; - } - if (max > mHistorySize - 1) { - min -= max - (mHistorySize - 1); - max = mHistorySize - 1; - } - min = Math.max(min, 0); - - return this.showHistory(min, max, mHistoryIndex); - } - - /** - * This method will show the history starting on fromIndex until toIndex of the history. - */ - public boolean showHistory(int fromIndex, int toIndex, int selIndex) { - JSONObject json = new JSONObject(); - try { - json.put("fromIndex", fromIndex); - json.put("toIndex", toIndex); - json.put("selIndex", selIndex); - } catch (JSONException e) { - Log.e(LOGTAG, "JSON error", e); - } - GeckoEvent e = GeckoEvent.createBroadcastEvent("Session:ShowHistory", json.toString()); - GeckoAppShell.sendEventToGecko(e); - return true; - } - public void doStop() { GeckoEvent e = GeckoEvent.createBroadcastEvent("Session:Stop", ""); GeckoAppShell.sendEventToGecko(e); diff --git a/mobile/android/base/moz.build b/mobile/android/base/moz.build index 387ac111d14..35c2249033b 100644 --- a/mobile/android/base/moz.build +++ b/mobile/android/base/moz.build @@ -395,6 +395,10 @@ gbjar.sources += [ 'tabs/PrivateTabsPanel.java', 'tabs/RemoteTabsPanel.java', 'tabs/TabCurve.java', + 'tabs/TabHistoryController.java', + 'tabs/TabHistoryFragment.java', + 'tabs/TabHistoryItemRow.java', + 'tabs/TabHistoryPage.java', 'tabs/TabsGridLayout.java', 'tabs/TabsLayoutAdapter.java', 'tabs/TabsLayoutItemView.java', diff --git a/mobile/android/base/resources/drawable/tab_history_bg.xml b/mobile/android/base/resources/drawable/tab_history_bg.xml new file mode 100644 index 00000000000..fd5a7a923c0 --- /dev/null +++ b/mobile/android/base/resources/drawable/tab_history_bg.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + diff --git a/mobile/android/base/resources/drawable/tab_history_icon_state.xml b/mobile/android/base/resources/drawable/tab_history_icon_state.xml new file mode 100644 index 00000000000..504dd580411 --- /dev/null +++ b/mobile/android/base/resources/drawable/tab_history_icon_state.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/mobile/android/base/resources/layout/gecko_app.xml b/mobile/android/base/resources/layout/gecko_app.xml index c600b2a609d..8f5e552ad22 100644 --- a/mobile/android/base/resources/layout/gecko_app.xml +++ b/mobile/android/base/resources/layout/gecko_app.xml @@ -124,6 +124,12 @@ + + diff --git a/mobile/android/base/resources/layout/tab_history_item_row.xml b/mobile/android/base/resources/layout/tab_history_item_row.xml new file mode 100644 index 00000000000..501a8f066ef --- /dev/null +++ b/mobile/android/base/resources/layout/tab_history_item_row.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + diff --git a/mobile/android/base/resources/layout/tab_history_layout.xml b/mobile/android/base/resources/layout/tab_history_layout.xml new file mode 100644 index 00000000000..010ab6c5007 --- /dev/null +++ b/mobile/android/base/resources/layout/tab_history_layout.xml @@ -0,0 +1,17 @@ + + + + + + + diff --git a/mobile/android/base/resources/values/attrs.xml b/mobile/android/base/resources/values/attrs.xml index fd5d23cf00b..174cf29da1f 100644 --- a/mobile/android/base/resources/values/attrs.xml +++ b/mobile/android/base/resources/values/attrs.xml @@ -182,5 +182,10 @@ + + + + + diff --git a/mobile/android/base/resources/values/colors.xml b/mobile/android/base/resources/values/colors.xml index 06843b7315b..cf2609ee20b 100644 --- a/mobile/android/base/resources/values/colors.xml +++ b/mobile/android/base/resources/values/colors.xml @@ -142,6 +142,14 @@ #DD2C3136 #FFFFFFFF + + #EBEBF0 + #D7D9DB + #D7D9DB + #FFFFFF + #363B40 + #DADADF + #AFB1B3 diff --git a/mobile/android/base/resources/values/dimens.xml b/mobile/android/base/resources/values/dimens.xml index 85b4d40b7ca..46d3d6e726c 100644 --- a/mobile/android/base/resources/values/dimens.xml +++ b/mobile/android/base/resources/values/dimens.xml @@ -163,6 +163,21 @@ 12dip 8dp + + 3dp + 14dp + 32dp + 5dp + 3dp + 1dp + 15dp + 15dp + 50dp + 15dp + 14sp + 2dp + 2dp + 5dip 12dip diff --git a/mobile/android/base/tabs/TabHistoryController.java b/mobile/android/base/tabs/TabHistoryController.java new file mode 100644 index 00000000000..838d3e73832 --- /dev/null +++ b/mobile/android/base/tabs/TabHistoryController.java @@ -0,0 +1,119 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.gecko.tabs; + +import java.util.ArrayList; +import java.util.List; + +import org.json.JSONException; +import org.json.JSONObject; +import org.mozilla.gecko.GeckoAppShell; +import org.mozilla.gecko.Tab; +import org.mozilla.gecko.util.GeckoRequest; +import org.mozilla.gecko.util.NativeJSObject; + +import android.util.Log; + +public class TabHistoryController { + private static final String LOGTAG = "TabHistoryController"; + private final OnShowTabHistory showTabHistoryListener; + + public static enum HistoryAction { + ALL, + BACK, + FORWARD + }; + + public interface OnShowTabHistory { + void onShowHistory(ListhistoryPageList, int toIndex); + } + + public TabHistoryController(OnShowTabHistory showTabHistoryListener) { + this.showTabHistoryListener = showTabHistoryListener; + } + + public boolean showTabHistory(final Tab tab, final HistoryAction action) { + int historyIndex = tab.getHistoryIndex(); + int historySize = tab.getHistorySize(); + + switch(action) { + case BACK: + if (!tab.canDoBack()) { + return false; + } + return showHistory(Math.max(historyIndex - Tab.MAX_HISTORY_LIST_SIZE, 0), historyIndex, historyIndex); + + case FORWARD: + if (!tab.canDoForward()) { + return false; + } + return showHistory(historyIndex, Math.min(historySize - 1, historyIndex + Tab.MAX_HISTORY_LIST_SIZE), historyIndex); + + case ALL: + if (!tab.canDoForward() && !tab.canDoBack()) { + return false; + } + + int min = historyIndex - Tab.MAX_HISTORY_LIST_SIZE / 2; + int max = historyIndex + Tab.MAX_HISTORY_LIST_SIZE / 2; + if (min < 0) { + max -= min; + } + if (max > historySize - 1) { + min -= max - (historySize - 1); + max = historySize - 1; + } + min = Math.max(min, 0); + + return showHistory(min, max, historyIndex); + + default: + return false; + } + } + + /** + * This method will show the history starting on fromIndex until toIndex of the history. + */ + private boolean showHistory(final int fromIndex, final int toIndex, final int selIndex) { + JSONObject json = new JSONObject(); + try { + json.put("fromIndex", fromIndex); + json.put("toIndex", toIndex); + json.put("selIndex", selIndex); + } catch (JSONException e) { + Log.e(LOGTAG, "JSON error", e); + } + + GeckoAppShell.sendRequestToGecko(new GeckoRequest("Session:GetHistory", json) { + @Override + public void onResponse(NativeJSObject nativeJSObject) { + /* + * The response from gecko request is of the form + * "urls" : [ + * { + * "title": "google", + * "url": "google.com", + * "selected": false + * } + * ] + */ + + final NativeJSObject[] historyItems = nativeJSObject.getObjectArray("historyItems"); + final List historyPageList = new ArrayList<>(historyItems.length); + + for (NativeJSObject obj : historyItems) { + final String title = obj.getString("title"); + final String url = obj.getString("url"); + final boolean selected = obj.getBoolean("selected"); + historyPageList.add(new TabHistoryPage(title, url, selected)); + } + + showTabHistoryListener.onShowHistory(historyPageList, toIndex); + } + }); + return true; + } +} diff --git a/mobile/android/base/tabs/TabHistoryFragment.java b/mobile/android/base/tabs/TabHistoryFragment.java new file mode 100644 index 00000000000..32a7d922d4d --- /dev/null +++ b/mobile/android/base/tabs/TabHistoryFragment.java @@ -0,0 +1,161 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.gecko.tabs; + +import java.util.ArrayList; +import java.util.List; + +import org.mozilla.gecko.GeckoAppShell; +import org.mozilla.gecko.GeckoEvent; +import org.mozilla.gecko.R; + +import android.content.Context; +import android.content.DialogInterface; +import android.os.Bundle; +import android.os.Parcelable; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.ArrayAdapter; +import android.widget.ListView; + +public class TabHistoryFragment extends Fragment implements OnItemClickListener, OnClickListener { + private static final String ARG_LIST = "historyPageList"; + private static final String ARG_INDEX = "index"; + private static final String BACK_STACK_ID = "backStateId"; + + private List historyPageList; + private int toIndex; + private ListView dialogList; + private int backStackId = -1; + private ViewGroup parent; + private boolean dismissed; + + public TabHistoryFragment() { + + } + + public static TabHistoryFragment newInstance(List historyPageList, int toIndex) { + final TabHistoryFragment fragment = new TabHistoryFragment(); + final Bundle args = new Bundle(); + args.putParcelableArrayList(ARG_LIST, (ArrayList) historyPageList); + args.putInt(ARG_INDEX, toIndex); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (savedInstanceState != null) { + backStackId = savedInstanceState.getInt(BACK_STACK_ID, -1); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + this.parent = container; + parent.setVisibility(View.VISIBLE); + View view = inflater.inflate(R.layout.tab_history_layout, container, false); + view.setOnClickListener(this); + dialogList = (ListView) view.findViewById(R.id.tab_history_list); + dialogList.setDivider(null); + return view; + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + Bundle bundle = getArguments(); + historyPageList = bundle.getParcelableArrayList(ARG_LIST); + toIndex = bundle.getInt(ARG_INDEX); + final ArrayAdapter urlAdapter = new TabHistoryAdapter(getActivity(), historyPageList); + dialogList.setAdapter(urlAdapter); + dialogList.setOnItemClickListener(this); + } + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + String index = String.valueOf(toIndex - position); + GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("Session:Navigate", index)); + dismiss(); + } + + @Override + public void onClick(View v) { + // Since the fragment view fills the entire screen, any clicks outside of the history + // ListView will end up here. + dismiss(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + dismiss(); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + if (backStackId >= 0) { + outState.putInt(BACK_STACK_ID, backStackId); + } + } + + // Function to add this fragment to activity state with containerViewId as parent. + // This similar in functionality to DialogFragment.show() except that containerId is provided here. + public void show(final int containerViewId, final FragmentTransaction transaction, final String tag) { + dismissed = false; + transaction.add(containerViewId, this, tag); + transaction.addToBackStack(tag); + backStackId = transaction.commit(); + } + + // Pop the fragment from backstack if it exists. + public void dismiss() { + if (dismissed) { + return; + } + + dismissed = true; + + if (backStackId >= 0) { + getFragmentManager().popBackStackImmediate(backStackId, FragmentManager.POP_BACK_STACK_INCLUSIVE); + backStackId = -1; + } + + if (parent != null) { + parent.setVisibility(View.GONE); + } + } + + private static class TabHistoryAdapter extends ArrayAdapter { + private final List pages; + private final Context context; + + public TabHistoryAdapter(Context context, List pages) { + super(context, R.layout.tab_history_item_row, pages); + this.context = context; + this.pages = pages; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + TabHistoryItemRow row = (TabHistoryItemRow) convertView; + if (row == null) { + row = new TabHistoryItemRow(context, null); + } + + row.update(pages.get(position), position == 0, position == pages.size() - 1); + return row; + } + } +} diff --git a/mobile/android/base/tabs/TabHistoryItemRow.java b/mobile/android/base/tabs/TabHistoryItemRow.java new file mode 100644 index 00000000000..5c5eadf6cc8 --- /dev/null +++ b/mobile/android/base/tabs/TabHistoryItemRow.java @@ -0,0 +1,95 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.gecko.tabs; + +import java.lang.ref.WeakReference; + +import org.mozilla.gecko.R; +import org.mozilla.gecko.favicons.Favicons; +import org.mozilla.gecko.favicons.OnFaviconLoadedListener; +import org.mozilla.gecko.util.ThreadUtils; +import org.mozilla.gecko.widget.FaviconView; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Typeface; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +public class TabHistoryItemRow extends RelativeLayout { + private final FaviconView favicon; + private final TextView title; + private final ImageView timeLineTop; + private final ImageView timeLineBottom; + // Listener for handling Favicon loads. + private final OnFaviconLoadedListener faviconListener; + + private int loadFaviconJobId = Favicons.NOT_LOADING; + + public TabHistoryItemRow(Context context, AttributeSet attrs) { + super(context, attrs); + LayoutInflater.from(context).inflate(R.layout.tab_history_item_row, this); + favicon = (FaviconView) findViewById(R.id.tab_history_icon); + title = (TextView) findViewById(R.id.tab_history_title); + timeLineTop = (ImageView) findViewById(R.id.tab_history_timeline_top); + timeLineBottom = (ImageView) findViewById(R.id.tab_history_timeline_bottom); + faviconListener = new UpdateViewFaviconLoadedListener(favicon); + } + + // Update the views with historic page detail. + public void update(final TabHistoryPage historyPage, boolean isFirstElement, boolean isLastElement) { + ThreadUtils.assertOnUiThread(); + + timeLineTop.setVisibility(isFirstElement ? View.INVISIBLE : View.VISIBLE); + timeLineBottom.setVisibility(isLastElement ? View.INVISIBLE : View.VISIBLE); + title.setText(historyPage.getTitle()); + + if (historyPage.isSelected()) { + // Highlight title with bold font. + title.setTypeface(null, Typeface.BOLD); + } else { + // Clear previously set bold font. + title.setTypeface(null, Typeface.NORMAL); + } + + favicon.setEnabled(historyPage.isSelected()); + favicon.clearImage(); + Favicons.cancelFaviconLoad(loadFaviconJobId); + loadFaviconJobId = Favicons.getSizedFaviconForPageFromLocal(getContext(), historyPage.getUrl(), faviconListener); + } + + // Only holds a reference to the FaviconView itself, so if the row gets + // discarded while a task is outstanding, we'll leak less memory. + private static class UpdateViewFaviconLoadedListener implements OnFaviconLoadedListener { + private final WeakReference view; + public UpdateViewFaviconLoadedListener(FaviconView view) { + this.view = new WeakReference(view); + } + + /** + * Update this row's favicon. + *

+ * This method is always invoked on the UI thread. + */ + @Override + public void onFaviconLoaded(String url, String faviconURL, Bitmap favicon) { + FaviconView v = view.get(); + if (v == null) { + return; + } + + if (favicon == null) { + v.showDefaultFavicon(); + return; + } + + v.updateImage(favicon, faviconURL); + } + } +} diff --git a/mobile/android/base/tabs/TabHistoryPage.java b/mobile/android/base/tabs/TabHistoryPage.java new file mode 100644 index 00000000000..6c608b2ac70 --- /dev/null +++ b/mobile/android/base/tabs/TabHistoryPage.java @@ -0,0 +1,60 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.gecko.tabs; + +import android.os.Parcel; +import android.os.Parcelable; + +public class TabHistoryPage implements Parcelable { + private final String title; + private final String url; + private final boolean selected; + + public TabHistoryPage(String title, String url, boolean selected) { + this.title = title; + this.url = url; + this.selected = selected; + } + + public String getTitle() { + return title; + } + + public String getUrl() { + return url; + } + + public boolean isSelected() { + return selected; + } + + @Override + public int describeContents() { + return 0; + } + + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(title); + dest.writeString(url); + dest.writeInt(selected ? 1 : 0); + } + + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public TabHistoryPage createFromParcel(final Parcel source) { + final String title = source.readString(); + final String url = source.readString(); + final boolean selected = source.readByte() != 0; + + final TabHistoryPage page = new TabHistoryPage(title, url, selected); + return page; + } + + @Override + public TabHistoryPage[] newArray(int size) { + return new TabHistoryPage[size]; + } + }; +} diff --git a/mobile/android/base/toolbar/BrowserToolbar.java b/mobile/android/base/toolbar/BrowserToolbar.java index 06ca1ea1197..fb58b5ed538 100644 --- a/mobile/android/base/toolbar/BrowserToolbar.java +++ b/mobile/android/base/toolbar/BrowserToolbar.java @@ -26,6 +26,7 @@ import org.mozilla.gecko.animation.PropertyAnimator.PropertyAnimationListener; import org.mozilla.gecko.animation.ViewHelper; import org.mozilla.gecko.menu.GeckoMenu; import org.mozilla.gecko.menu.MenuPopup; +import org.mozilla.gecko.tabs.TabHistoryController; import org.mozilla.gecko.toolbar.ToolbarDisplayLayout.OnStopListener; import org.mozilla.gecko.toolbar.ToolbarDisplayLayout.OnTitleChangeListener; import org.mozilla.gecko.toolbar.ToolbarDisplayLayout.UpdateFlags; @@ -132,6 +133,7 @@ public abstract class BrowserToolbar extends ThemedRelativeLayout protected boolean hasSoftMenuButton; protected UIMode uiMode; + protected TabHistoryController tabHistoryController; private final Paint shadowPaint; private final int shadowSize; @@ -372,6 +374,10 @@ public abstract class BrowserToolbar extends ThemedRelativeLayout this.progressBar = progressBar; } + public void setTabHistoryController(TabHistoryController tabHistoryController) { + this.tabHistoryController = tabHistoryController; + } + public void refresh() { urlDisplayLayout.dismissSiteIdentityPopup(); } diff --git a/mobile/android/base/toolbar/BrowserToolbarTabletBase.java b/mobile/android/base/toolbar/BrowserToolbarTabletBase.java index 8f80719624a..9c3e705568f 100644 --- a/mobile/android/base/toolbar/BrowserToolbarTabletBase.java +++ b/mobile/android/base/toolbar/BrowserToolbarTabletBase.java @@ -11,6 +11,7 @@ import org.mozilla.gecko.NewTabletUI; import org.mozilla.gecko.R; import org.mozilla.gecko.Tab; import org.mozilla.gecko.Tabs; +import org.mozilla.gecko.tabs.TabHistoryController; import org.mozilla.gecko.menu.MenuItemActionBar; import android.content.Context; @@ -65,7 +66,8 @@ abstract class BrowserToolbarTabletBase extends BrowserToolbar { backButton.setOnLongClickListener(new Button.OnLongClickListener() { @Override public boolean onLongClick(View view) { - return Tabs.getInstance().getSelectedTab().showBackHistory(); + return tabHistoryController.showTabHistory(Tabs.getInstance().getSelectedTab(), + TabHistoryController.HistoryAction.BACK); } }); @@ -78,7 +80,8 @@ abstract class BrowserToolbarTabletBase extends BrowserToolbar { forwardButton.setOnLongClickListener(new Button.OnLongClickListener() { @Override public boolean onLongClick(View view) { - return Tabs.getInstance().getSelectedTab().showForwardHistory(); + return tabHistoryController.showTabHistory(Tabs.getInstance().getSelectedTab(), + TabHistoryController.HistoryAction.FORWARD); } }); } diff --git a/mobile/android/base/widget/FaviconView.java b/mobile/android/base/widget/FaviconView.java index fed25868346..ef3924c84b7 100644 --- a/mobile/android/base/widget/FaviconView.java +++ b/mobile/android/base/widget/FaviconView.java @@ -9,6 +9,7 @@ import org.mozilla.gecko.R; import org.mozilla.gecko.favicons.Favicons; import android.content.Context; +import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; @@ -56,6 +57,12 @@ public class FaviconView extends ImageView { // Size of the background rectangle. private final RectF mBackgroundRect; + // Type of the border whose value is defined in attrs.xml . + private final boolean isDominantBorderEnabled; + + // boolean switch for overriding scaletype, whose value is defined in attrs.xml . + private final boolean isOverrideScaleTypeEnabled; + // Initializing the static paints. static { sStrokePaint = new Paint(Paint.ANTI_ALIAS_FLAG); @@ -67,7 +74,18 @@ public class FaviconView extends ImageView { public FaviconView(Context context, AttributeSet attrs) { super(context, attrs); - setScaleType(ImageView.ScaleType.CENTER); + TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.FaviconView, 0, 0); + + try { + isDominantBorderEnabled = a.getBoolean(R.styleable.FaviconView_dominantBorderEnabled, true); + isOverrideScaleTypeEnabled = a.getBoolean(R.styleable.FaviconView_overrideScaleType, true); + } finally { + a.recycle(); + } + + if (isOverrideScaleTypeEnabled) { + setScaleType(ImageView.ScaleType.CENTER); + } mStrokeRect = new RectF(); mBackgroundRect = new RectF(); @@ -105,12 +123,14 @@ public class FaviconView extends ImageView { public void onDraw(Canvas canvas) { super.onDraw(canvas); - // 27.5% transparent dominant color. - sBackgroundPaint.setColor(mDominantColor & 0x46FFFFFF); - canvas.drawRect(mStrokeRect, sBackgroundPaint); + if (isDominantBorderEnabled) { + // 27.5% transparent dominant color. + sBackgroundPaint.setColor(mDominantColor & 0x46FFFFFF); + canvas.drawRect(mStrokeRect, sBackgroundPaint); - sStrokePaint.setColor(mDominantColor); - canvas.drawRoundRect(mStrokeRect, sStrokeWidth, sStrokeWidth, sStrokePaint); + sStrokePaint.setColor(mDominantColor); + canvas.drawRoundRect(mStrokeRect, sStrokeWidth, sStrokeWidth, sStrokePaint); + } } /** diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js index 6485d29182e..f86c3499fdc 100644 --- a/mobile/android/chrome/content/browser.js +++ b/mobile/android/chrome/content/browser.js @@ -350,8 +350,8 @@ var BrowserApp = { Services.obs.addObserver(this, "Tab:Selected", false); Services.obs.addObserver(this, "Tab:Closed", false); Services.obs.addObserver(this, "Session:Back", false); - Services.obs.addObserver(this, "Session:ShowHistory", false); Services.obs.addObserver(this, "Session:Forward", false); + Services.obs.addObserver(this, "Session:Navigate", false); Services.obs.addObserver(this, "Session:Reload", false); Services.obs.addObserver(this, "Session:Stop", false); Services.obs.addObserver(this, "SaveAs:PDF", false); @@ -377,6 +377,7 @@ var BrowserApp = { Services.obs.addObserver(this, "Webapps:Load", false); Services.obs.addObserver(this, "Webapps:AutoUninstall", false); Services.obs.addObserver(this, "sessionstore-state-purge-complete", false); + Messaging.addListener(this.getHistory.bind(this), "Session:GetHistory"); function showFullScreenWarning() { NativeWindow.toast.show(Strings.browser.GetStringFromName("alertFullScreenToast"), "short"); @@ -1573,6 +1574,11 @@ var BrowserApp = { browser.goForward(); break; + case "Session:Navigate": + let index = JSON.parse(aData); + browser.gotoIndex(index); + break; + case "Session:Reload": { let flags = Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_PROXY | Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_CACHE; @@ -1606,12 +1612,6 @@ var BrowserApp = { browser.stop(); break; - case "Session:ShowHistory": { - let data = JSON.parse(aData); - this.showHistory(data.fromIndex, data.toIndex, data.selIndex); - break; - } - case "Tab:Load": { let data = JSON.parse(aData); let url = data.url; @@ -1978,30 +1978,26 @@ var BrowserApp = { this._prefObservers = newPrefObservers; }, - // This method will print a list from fromIndex to toIndex, optionally + // This method will return a list of history items from fromIndex to toIndex, optionally // selecting selIndex(if fromIndex<=selIndex<=toIndex) - showHistory: function(fromIndex, toIndex, selIndex) { + getHistory: function(data) { + let fromIndex = data.fromIndex; + let toIndex = data.toIndex; + let selIndex = data.selIndex; let browser = this.selectedBrowser; let hist = browser.sessionHistory; let listitems = []; for (let i = toIndex; i >= fromIndex; i--) { let entry = hist.getEntryAtIndex(i, false); let item = { - label: entry.title || entry.URI.spec, + title: entry.title || entry.URI.spec, + url: entry.URI.spec, selected: (i == selIndex) }; listitems.push(item); } - let p = new Prompt({ - window: browser.contentWindow - }).setSingleChoiceItems(listitems).show(function(data) { - let selected = data.button; - if (selected == -1) - return; - - browser.gotoIndex(toIndex-selected); - }); + return { "historyItems" : listitems }; }, }; From cba4f7b673337139ea0d6fdaa3bb473da47908ae Mon Sep 17 00:00:00 2001 From: Jared Wein Date: Wed, 5 Nov 2014 13:47:52 -0500 Subject: [PATCH 02/25] Bug 1093793 - desktop call recipient declining incoming call leaves link-clicker's camera on. r=dmose --- .../loop/standalone/content/js/webapp.js | 6 ++++-- .../loop/standalone/content/js/webapp.jsx | 6 ++++-- .../components/loop/test/standalone/webapp_test.js | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/browser/components/loop/standalone/content/js/webapp.js b/browser/components/loop/standalone/content/js/webapp.js index 123752de728..6aa14183009 100644 --- a/browser/components/loop/standalone/content/js/webapp.js +++ b/browser/components/loop/standalone/content/js/webapp.js @@ -27,7 +27,7 @@ loop.webapp = (function($, _, OT, mozL10n) { */ var HomeView = React.createClass({displayName: 'HomeView', render: function() { - loop.standaloneMedia.multiplexGum.reset(); + multiplexGum.reset(); return ( React.DOM.p(null, mozL10n.get("welcome", {clientShortname: mozL10n.get("clientShortname2")})) ); @@ -291,7 +291,7 @@ loop.webapp = (function($, _, OT, mozL10n) { }, _cancelOutgoingCall: function() { - loop.standaloneMedia.multiplexGum.reset(); + multiplexGum.reset(); this.props.websocket.cancel(); }, @@ -852,6 +852,8 @@ loop.webapp = (function($, _, OT, mozL10n) { * timeout, cancel, media-fail, user-unknown, closed) */ _handleCallTerminated: function(reason) { + multiplexGum.reset(); + if (reason === "cancel") { this.setState({callStatus: "start"}); return; diff --git a/browser/components/loop/standalone/content/js/webapp.jsx b/browser/components/loop/standalone/content/js/webapp.jsx index 505ced04002..2a868a5c113 100644 --- a/browser/components/loop/standalone/content/js/webapp.jsx +++ b/browser/components/loop/standalone/content/js/webapp.jsx @@ -27,7 +27,7 @@ loop.webapp = (function($, _, OT, mozL10n) { */ var HomeView = React.createClass({ render: function() { - loop.standaloneMedia.multiplexGum.reset(); + multiplexGum.reset(); return (

{mozL10n.get("welcome", {clientShortname: mozL10n.get("clientShortname2")})}

); @@ -291,7 +291,7 @@ loop.webapp = (function($, _, OT, mozL10n) { }, _cancelOutgoingCall: function() { - loop.standaloneMedia.multiplexGum.reset(); + multiplexGum.reset(); this.props.websocket.cancel(); }, @@ -852,6 +852,8 @@ loop.webapp = (function($, _, OT, mozL10n) { * timeout, cancel, media-fail, user-unknown, closed) */ _handleCallTerminated: function(reason) { + multiplexGum.reset(); + if (reason === "cancel") { this.setState({callStatus: "start"}); return; diff --git a/browser/components/loop/test/standalone/webapp_test.js b/browser/components/loop/test/standalone/webapp_test.js index d45476d3900..930f560b01a 100644 --- a/browser/components/loop/test/standalone/webapp_test.js +++ b/browser/components/loop/test/standalone/webapp_test.js @@ -231,6 +231,20 @@ describe("loop.webapp", function() { loop.webapp.FailedConversationView); }); + it("should reset multiplexGum when a call is rejected", + function() { + var multiplexGum = new standaloneMedia._MultiplexGum(); + standaloneMedia.setSingleton(multiplexGum); + sandbox.stub(standaloneMedia._MultiplexGum.prototype, "reset"); + + ocView._websocket.trigger("progress", { + state: "terminated", + reason: "reject" + }); + + sinon.assert.calledOnce(multiplexGum.reset); + }); + it("should display an error message if the reason is not 'cancel'", function() { ocView._websocket.trigger("progress", { From 7febb73e8e5421c8ade6db7159781a84a9862845 Mon Sep 17 00:00:00 2001 From: Gijs Kruitbosch Date: Wed, 5 Nov 2014 19:08:45 +0000 Subject: [PATCH 03/25] Bug 690307 - add more tests for the localhost + spaces case, r=mak --- browser/base/content/test/general/browser_urlbarTrimURLs.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/browser/base/content/test/general/browser_urlbarTrimURLs.js b/browser/base/content/test/general/browser_urlbarTrimURLs.js index 92485161eee..4dc9fd0159e 100644 --- a/browser/base/content/test/general/browser_urlbarTrimURLs.js +++ b/browser/base/content/test/general/browser_urlbarTrimURLs.js @@ -57,6 +57,8 @@ function test() { testVal("http://localhost"); testVal("http://someotherhostwithnodots"); + testVal("http://localhost/ foo bar baz"); + testVal("http://localhost.localdomain/ foo bar baz", "localhost.localdomain/ foo bar baz"); Services.prefs.setBoolPref(prefname, false); From cb11266e0d9a23e186fd6bb80632e328f404e925 Mon Sep 17 00:00:00 2001 From: Brian Nicholson Date: Wed, 5 Nov 2014 12:14:34 -0800 Subject: [PATCH 04/25] Bug 1068425 - Implement tile reporting components. r=rnewman --- mobile/android/app/mobile.js | 5 + mobile/android/base/moz.build | 2 + mobile/android/base/tiles/Tile.java | 18 ++++ mobile/android/base/tiles/TilesRecorder.java | 103 +++++++++++++++++++ mobile/android/chrome/content/browser.js | 40 +++++++ 5 files changed, 168 insertions(+) create mode 100644 mobile/android/base/tiles/Tile.java create mode 100644 mobile/android/base/tiles/TilesRecorder.java diff --git a/mobile/android/app/mobile.js b/mobile/android/app/mobile.js index f03e89d1454..f448bcec98c 100644 --- a/mobile/android/app/mobile.js +++ b/mobile/android/app/mobile.js @@ -613,6 +613,11 @@ pref("urlclassifier.gethash.timeout_ms", 5000); pref("urlclassifier.max-complete-age", 2700); #endif +// URL for posting tiles metrics. +#ifdef RELEASE_BUILD +pref("browser.tiles.reportURL", "https://tiles.services.mozilla.com/v2/links/click"); +#endif + // True if this is the first time we are showing about:firstrun pref("browser.firstrun.show.uidiscovery", true); pref("browser.firstrun.show.localepicker", false); diff --git a/mobile/android/base/moz.build b/mobile/android/base/moz.build index 35c2249033b..6ac04bf8fdc 100644 --- a/mobile/android/base/moz.build +++ b/mobile/android/base/moz.build @@ -410,6 +410,8 @@ gbjar.sources += [ 'TextSelection.java', 'TextSelectionHandle.java', 'ThumbnailHelper.java', + 'tiles/Tile.java', + 'tiles/TilesRecorder.java', 'toolbar/ActionBarViewFlipper.java', 'toolbar/AutocompleteHandler.java', 'toolbar/BackButton.java', diff --git a/mobile/android/base/tiles/Tile.java b/mobile/android/base/tiles/Tile.java new file mode 100644 index 00000000000..0c051372628 --- /dev/null +++ b/mobile/android/base/tiles/Tile.java @@ -0,0 +1,18 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.gecko.tiles; + +/** + * Metadata for a tile shown on the top sites grid. + */ +public class Tile { + public final int id; + public final boolean pinned; + + public Tile(int id, boolean pinned) { + this.id = id; + this.pinned = pinned; + } +} diff --git a/mobile/android/base/tiles/TilesRecorder.java b/mobile/android/base/tiles/TilesRecorder.java new file mode 100644 index 00000000000..40a2759b940 --- /dev/null +++ b/mobile/android/base/tiles/TilesRecorder.java @@ -0,0 +1,103 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.gecko.tiles; + +import java.util.List; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.json.JSONException; + +import org.mozilla.gecko.GeckoAppShell; +import org.mozilla.gecko.GeckoEvent; +import org.mozilla.gecko.Tab; + +import android.util.Log; + +public class TilesRecorder { + public static final String ACTION_CLICK = "click"; + + private static final String LOG_TAG = "GeckoTilesRecorder"; + private static final String EVENT_TILES_CLICK = "Tiles:Click"; + + public void recordAction(Tab tab, String action, int index, List tiles) { + final Tile clickedTile = tiles.get(index); + + if (tab == null || clickedTile == null) { + throw new IllegalArgumentException("Tab and tile cannot be null"); + } + + if (clickedTile.id == -1) { + // User clicked a non-distribution tile, so we don't need to report it. + return; + } + + try { + final JSONArray tilesJSON = new JSONArray(); + int clickedTileIndex = -1; + int currentTileIndex = 0; + + for (int i = 0; i < tiles.size(); i++) { + final Tile tile = tiles.get(i); + if (tile == null) { + // Tiles may be null if there are pinned tiles with blank tiles in between. + continue; + } + + // jsonForTile will return {} if the tile isn't tracked or pinned. That's fine + // as we still want to record that a tile exists (i.e., is not empty). + tilesJSON.put(jsonForTile(tile, currentTileIndex, i)); + + // The click index is relative to the tiles array we're building. That index is + // incremented whenever we hit a non-null tile. When we find the tile that was + // clicked, the index will match its position in the new array. + if (clickedTile == tile) { + clickedTileIndex = currentTileIndex; + } + + currentTileIndex++; + } + + if (clickedTileIndex == -1) { + throw new IllegalStateException("Clicked tile index not set"); + } + + final JSONObject payload = new JSONObject(); + payload.put(action, clickedTileIndex); + payload.put("tiles", tilesJSON); + + final JSONObject data = new JSONObject(); + data.put("tabId", tab.getId()); + data.put("payload", payload.toString()); + + GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent(EVENT_TILES_CLICK, data.toString())); + } catch (JSONException e) { + Log.e(LOG_TAG, "JSON error", e); + } + } + + private JSONObject jsonForTile(Tile tile, int tileIndex, int viewIndex) throws JSONException { + final JSONObject tileJSON = new JSONObject(); + + // Set the ID only if it is a distribution tile with a tracking ID. + if (tile.id != -1) { + tileJSON.put("id", tile.id); + } + + // Set pinned to true only if the tile is pinned. + if (tile.pinned) { + tileJSON.put("pin", true); + } + + // If the tile's index in the new array does not match its index in the view grid, record + // its position in the view grid. This can happen if there are pinned tiles with blank tiles + // in between. + if (tileIndex != viewIndex) { + tileJSON.put("pos", viewIndex); + } + + return tileJSON; + } +} diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js index f86c3499fdc..c30a5eadc37 100644 --- a/mobile/android/chrome/content/browser.js +++ b/mobile/android/chrome/content/browser.js @@ -505,6 +505,15 @@ var BrowserApp = { } } + try { + // Set the tiles click observer only if tiles reporting is enabled (that + // is, a report URL is set in prefs). + gTilesReportURL = Services.prefs.getCharPref("browser.tiles.reportURL"); + Services.obs.addObserver(this, "Tiles:Click", false); + } catch (e) { + // Tiles reporting is disabled. + } + // Notify Java that Gecko has loaded. Messaging.sendRequest({ type: "Gecko:Ready" }); }, @@ -1854,6 +1863,13 @@ var BrowserApp = { this.computeAcceptLanguages(osLocale, aData); break; + case "Tiles:Click": + // Set the click data for the given tab to be handled on the next page load. + let data = JSON.parse(aData); + let tab = this.getTabForId(data.tabId); + tab.tilesData = data.payload; + break; + default: dump('BrowserApp.observe: unexpected topic "' + aTopic + '"\n'); break; @@ -3167,6 +3183,9 @@ let gReflowPending = null; // into account said browser chrome. let gViewportMargins = { top: 0, right: 0, bottom: 0, left: 0}; +// The URL where suggested tile clicks are posted. +let gTilesReportURL = null; + function Tab(aURL, aParams) { this.browser = null; this.id = 0; @@ -3195,6 +3214,7 @@ function Tab(aURL, aParams) { this.hasTouchListener = false; this.browserWidth = 0; this.browserHeight = 0; + this.tilesData = null; this.create(aURL, aParams); } @@ -4218,6 +4238,18 @@ Tab.prototype = { } } + // Upload any pending tile click events. + // Tiles data will be non-null for this tab only if: + // 1) the user just clicked a suggested site with a tracking ID, and + // 2) tiles reporting is enabled (gTilesReportURL != null). + if (this.tilesData) { + let xhr = new XMLHttpRequest(); + xhr.open("POST", gTilesReportURL, true); + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.send(this.tilesData); + this.tilesData = null; + } + if (!Reader.isEnabledForParseOnLoad) return; @@ -4296,6 +4328,14 @@ Tab.prototype = { success = aRequest.status == 0; } + // At this point, either: + // 1) the page loaded, the pageshow event fired, and the tilesData XHR has been posted, or + // 2) the page did not load, and we're loading a new page. + // Either way, we're done with the tiles data, so clear it out. + if (this.tilesData && (aStateFlags & Ci.nsIWebProgressListener.STATE_STOP)) { + this.tilesData = null; + } + // Check to see if we restoring the content from a previous presentation (session) // since there should be no real network activity let restoring = (aStateFlags & Ci.nsIWebProgressListener.STATE_RESTORING) > 0; From a4468a5fa97f61b6ab7ff113816776ce7956b871 Mon Sep 17 00:00:00 2001 From: Brian Nicholson Date: Wed, 5 Nov 2014 12:14:34 -0800 Subject: [PATCH 05/25] Bug 1068425 - Move TopSitesGridView click listeners to TopSitesPanel. r=lucasr --- .../android/base/home/TopSitesGridView.java | 117 +----------------- mobile/android/base/home/TopSitesPanel.java | 66 +++++++++- 2 files changed, 66 insertions(+), 117 deletions(-) diff --git a/mobile/android/base/home/TopSitesGridView.java b/mobile/android/base/home/TopSitesGridView.java index 204a6050654..209924b1670 100644 --- a/mobile/android/base/home/TopSitesGridView.java +++ b/mobile/android/base/home/TopSitesGridView.java @@ -5,25 +5,15 @@ package org.mozilla.gecko.home; -import java.util.EnumSet; - import org.mozilla.gecko.R; -import org.mozilla.gecko.Telemetry; -import org.mozilla.gecko.TelemetryContract; import org.mozilla.gecko.ThumbnailHelper; -import org.mozilla.gecko.db.BrowserContract.TopSites; -import org.mozilla.gecko.home.HomePager.OnUrlOpenListener; -import org.mozilla.gecko.util.StringUtils; - import android.content.Context; import android.content.res.TypedArray; -import android.database.Cursor; import android.graphics.Rect; import android.util.AttributeSet; import android.view.ContextMenu.ContextMenuInfo; import android.view.View; import android.widget.AbsListView; -import android.widget.AdapterView; import android.widget.GridView; /** @@ -56,12 +46,6 @@ public class TopSitesGridView extends GridView { // Measured height of this view. private int mMeasuredHeight; - // On URL open listener. - private OnUrlOpenListener mUrlOpenListener; - - // Edit pinned site listener. - private OnEditPinnedSiteListener mEditPinnedSiteListener; - // Context menu info. private TopSitesGridContextMenuInfo mContextMenuInfo; @@ -90,70 +74,6 @@ public class TopSitesGridView extends GridView { a.recycle(); } - /** - * {@inheritDoc} - */ - @Override - public void onAttachedToWindow() { - super.onAttachedToWindow(); - - setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - TopSitesGridItemView item = (TopSitesGridItemView) view; - - // Decode "user-entered" URLs before loading them. - String url = StringUtils.decodeUserEnteredUrl(item.getUrl()); - int type = item.getType(); - - // If the url is empty, the user can pin a site. - // If not, navigate to the page given by the url. - if (type != TopSites.TYPE_BLANK) { - if (mUrlOpenListener != null) { - final TelemetryContract.Method method; - if (type == TopSites.TYPE_SUGGESTED) { - method = TelemetryContract.Method.SUGGESTION; - } else { - method = TelemetryContract.Method.GRID_ITEM; - } - Telemetry.sendUIEvent(TelemetryContract.Event.LOAD_URL, method, Integer.toString(position)); - - mUrlOpenListener.onUrlOpen(url, EnumSet.noneOf(OnUrlOpenListener.Flags.class)); - } - } else { - if (mEditPinnedSiteListener != null) { - mEditPinnedSiteListener.onEditPinnedSite(position, ""); - } - } - } - }); - - setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { - @Override - public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { - Cursor cursor = (Cursor) parent.getItemAtPosition(position); - - TopSitesGridItemView item = (TopSitesGridItemView) view; - if (cursor == null || item.getType() == TopSites.TYPE_BLANK) { - mContextMenuInfo = null; - return false; - } - - mContextMenuInfo = new TopSitesGridContextMenuInfo(view, position, id); - updateContextMenuFromCursor(mContextMenuInfo, cursor); - return showContextMenuForChild(TopSitesGridView.this); - } - }); - } - - @Override - public void onDetachedFromWindow() { - super.onDetachedFromWindow(); - - mUrlOpenListener = null; - mEditPinnedSiteListener = null; - } - @Override protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) { mIsHandlingFocusChange = true; @@ -168,9 +88,6 @@ public class TopSitesGridView extends GridView { } } - /** - * {@inheritDoc} - */ @Override public int getColumnWidth() { // This method will be called from onMeasure() too. @@ -179,9 +96,6 @@ public class TopSitesGridView extends GridView { return (getMeasuredWidth() - getPaddingLeft() - getPaddingRight() - totalHorizontalSpacing) / mNumColumns; } - /** - * {@inheritDoc} - */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // Sets the padding for this view. @@ -236,35 +150,8 @@ public class TopSitesGridView extends GridView { return mContextMenuInfo; } - /* - * Update the fields of a TopSitesGridContextMenuInfo object - * from a cursor. - * - * @param info context menu info object to be updated - * @param cursor used to update the context menu info object - */ - private void updateContextMenuFromCursor(TopSitesGridContextMenuInfo info, Cursor cursor) { - info.url = cursor.getString(cursor.getColumnIndexOrThrow(TopSites.URL)); - info.title = cursor.getString(cursor.getColumnIndexOrThrow(TopSites.TITLE)); - info.type = cursor.getInt(cursor.getColumnIndexOrThrow(TopSites.TYPE)); - info.historyId = cursor.getInt(cursor.getColumnIndexOrThrow(TopSites.HISTORY_ID)); - } - /** - * Set an url open listener to be used by this view. - * - * @param listener An url open listener for this view. - */ - public void setOnUrlOpenListener(OnUrlOpenListener listener) { - mUrlOpenListener = listener; - } - - /** - * Set an edit pinned site listener to be used by this view. - * - * @param listener An edit pinned site listener for this view. - */ - public void setOnEditPinnedSiteListener(final OnEditPinnedSiteListener listener) { - mEditPinnedSiteListener = listener; + public void setContextMenuInfo(TopSitesGridContextMenuInfo contextMenuInfo) { + mContextMenuInfo = contextMenuInfo; } /** diff --git a/mobile/android/base/home/TopSitesPanel.java b/mobile/android/base/home/TopSitesPanel.java index ee5426f3965..d5aebd7bccd 100644 --- a/mobile/android/base/home/TopSitesPanel.java +++ b/mobile/android/base/home/TopSitesPanel.java @@ -15,6 +15,7 @@ import java.util.List; import java.util.Map; import org.mozilla.gecko.GeckoProfile; +import org.mozilla.gecko.GeckoSharedPrefs; import org.mozilla.gecko.R; import org.mozilla.gecko.Telemetry; import org.mozilla.gecko.TelemetryContract; @@ -193,8 +194,69 @@ public class TopSitesPanel extends HomeFragment { } }); - mGrid.setOnUrlOpenListener(mUrlOpenListener); - mGrid.setOnEditPinnedSiteListener(mEditPinnedSiteListener); + mGrid.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + TopSitesGridItemView item = (TopSitesGridItemView) view; + + // Decode "user-entered" URLs before loading them. + String url = StringUtils.decodeUserEnteredUrl(item.getUrl()); + int type = item.getType(); + + // If the url is empty, the user can pin a site. + // If not, navigate to the page given by the url. + if (type != TopSites.TYPE_BLANK) { + if (mUrlOpenListener != null) { + final TelemetryContract.Method method; + if (type == TopSites.TYPE_SUGGESTED) { + method = TelemetryContract.Method.SUGGESTION; + } else { + method = TelemetryContract.Method.GRID_ITEM; + } + Telemetry.sendUIEvent(TelemetryContract.Event.LOAD_URL, method, Integer.toString(position)); + + mUrlOpenListener.onUrlOpen(url, EnumSet.noneOf(OnUrlOpenListener.Flags.class)); + } + } else { + if (mEditPinnedSiteListener != null) { + mEditPinnedSiteListener.onEditPinnedSite(position, ""); + } + } + } + }); + + mGrid.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + + Cursor cursor = (Cursor) parent.getItemAtPosition(position); + + TopSitesGridItemView item = (TopSitesGridItemView) view; + if (cursor == null || item.getType() == TopSites.TYPE_BLANK) { + mGrid.setContextMenuInfo(null); + return false; + } + + TopSitesGridContextMenuInfo contextMenuInfo = new TopSitesGridContextMenuInfo(view, position, id); + updateContextMenuFromCursor(contextMenuInfo, cursor); + mGrid.setContextMenuInfo(contextMenuInfo); + return mGrid.showContextMenuForChild(mGrid); + } + + /* + * Update the fields of a TopSitesGridContextMenuInfo object + * from a cursor. + * + * @param info context menu info object to be updated + * @param cursor used to update the context menu info object + */ + private void updateContextMenuFromCursor(TopSitesGridContextMenuInfo info, Cursor cursor) { + info.url = cursor.getString(cursor.getColumnIndexOrThrow(TopSites.URL)); + info.title = cursor.getString(cursor.getColumnIndexOrThrow(TopSites.TITLE)); + info.type = cursor.getInt(cursor.getColumnIndexOrThrow(TopSites.TYPE)); + info.historyId = cursor.getInt(cursor.getColumnIndexOrThrow(TopSites.HISTORY_ID)); + } + }); registerForContextMenu(mList); registerForContextMenu(mGrid); From 65d42d7d0ce7d48f485ac3f0cb26191af2749ecd Mon Sep 17 00:00:00 2001 From: Brian Nicholson Date: Wed, 5 Nov 2014 12:14:35 -0800 Subject: [PATCH 06/25] Bug 1068425 - Add TilesRecorder hooks to TopSitesPanel. r=lucasr --- mobile/android/base/BrowserApp.java | 15 ++++++- mobile/android/base/home/TopSitesPanel.java | 45 ++++++++++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/mobile/android/base/BrowserApp.java b/mobile/android/base/BrowserApp.java index 3e06a4250f3..05b6e5c1483 100644 --- a/mobile/android/base/BrowserApp.java +++ b/mobile/android/base/BrowserApp.java @@ -17,6 +17,7 @@ import java.util.Vector; import org.json.JSONException; import org.json.JSONObject; + import org.mozilla.gecko.AppConstants.Versions; import org.mozilla.gecko.DynamicToolbar.PinReason; import org.mozilla.gecko.DynamicToolbar.VisibilityTransition; @@ -49,6 +50,7 @@ import org.mozilla.gecko.home.HomePager; import org.mozilla.gecko.home.HomePager.OnUrlOpenInBackgroundListener; import org.mozilla.gecko.home.HomePager.OnUrlOpenListener; import org.mozilla.gecko.home.HomePanelsManager; +import org.mozilla.gecko.home.TopSitesPanel; import org.mozilla.gecko.home.SearchEngine; import org.mozilla.gecko.menu.GeckoMenu; import org.mozilla.gecko.menu.GeckoMenuItem; @@ -63,6 +65,7 @@ import org.mozilla.gecko.tabs.TabHistoryFragment; import org.mozilla.gecko.tabs.TabHistoryPage; import org.mozilla.gecko.tabs.TabsPanel; import org.mozilla.gecko.tabs.TabHistoryController.OnShowTabHistory; +import org.mozilla.gecko.tiles.TilesRecorder; import org.mozilla.gecko.toolbar.AutocompleteHandler; import org.mozilla.gecko.toolbar.BrowserToolbar; import org.mozilla.gecko.toolbar.ToolbarProgressView; @@ -147,7 +150,8 @@ public class BrowserApp extends GeckoApp OnUrlOpenListener, OnUrlOpenInBackgroundListener, ActionModeCompat.Presenter, - LayoutInflater.Factory { + LayoutInflater.Factory, + TopSitesPanel.BrowserTilesRecorderProvider { private static final String LOGTAG = "GeckoBrowserApp"; private static final int TABS_ANIMATION_DURATION = 450; @@ -249,6 +253,8 @@ public class BrowserApp extends GeckoApp private final DynamicToolbar mDynamicToolbar = new DynamicToolbar(); + private TilesRecorder mTilesRecorder; + @Override public View onCreateView(final String name, final Context context, final AttributeSet attrs) { final View view; @@ -606,6 +612,8 @@ public class BrowserApp extends GeckoApp Log.e(LOGTAG, "Error initializing media manager", ex); } } + + mTilesRecorder = new TilesRecorder(); } private void setupSystemUITinting() { @@ -3268,4 +3276,9 @@ public class BrowserApp extends GeckoApp appLocale, previousSession); } + + @Override + public TilesRecorder getTilesRecorder() { + return mTilesRecorder; + } } diff --git a/mobile/android/base/home/TopSitesPanel.java b/mobile/android/base/home/TopSitesPanel.java index d5aebd7bccd..c0f0cf1c7d8 100644 --- a/mobile/android/base/home/TopSitesPanel.java +++ b/mobile/android/base/home/TopSitesPanel.java @@ -15,8 +15,9 @@ import java.util.List; import java.util.Map; import org.mozilla.gecko.GeckoProfile; -import org.mozilla.gecko.GeckoSharedPrefs; import org.mozilla.gecko.R; +import org.mozilla.gecko.Tab; +import org.mozilla.gecko.Tabs; import org.mozilla.gecko.Telemetry; import org.mozilla.gecko.TelemetryContract; import org.mozilla.gecko.db.BrowserContract.Thumbnails; @@ -31,6 +32,8 @@ import org.mozilla.gecko.home.HomePager.OnUrlOpenListener; import org.mozilla.gecko.home.PinSiteDialog.OnSiteSelectedListener; import org.mozilla.gecko.home.TopSitesGridView.OnEditPinnedSiteListener; import org.mozilla.gecko.home.TopSitesGridView.TopSitesGridContextMenuInfo; +import org.mozilla.gecko.tiles.TilesRecorder; +import org.mozilla.gecko.tiles.Tile; import org.mozilla.gecko.util.StringUtils; import org.mozilla.gecko.util.ThreadUtils; @@ -99,6 +102,9 @@ public class TopSitesPanel extends HomeFragment { // Max number of entries shown in the grid from the cursor. private int mMaxGridEntries; + // Fields used for tiles metrics recording. + private TilesRecorder mTilesRecorder; + // Time in ms until the Gecko thread is reset to normal priority. private static final long PRIORITY_RESET_TIMEOUT = 10000; @@ -121,11 +127,22 @@ public class TopSitesPanel extends HomeFragment { } } + public interface BrowserTilesRecorderProvider { + public TilesRecorder getTilesRecorder(); + } + @Override public void onAttach(Activity activity) { super.onAttach(activity); mMaxGridEntries = activity.getResources().getInteger(R.integer.number_of_top_sites); + + try { + mTilesRecorder = ((BrowserTilesRecorderProvider) activity).getTilesRecorder(); + } catch (ClassCastException e) { + throw new ClassCastException(activity.toString() + + " must implement TopSitesPanel.BrowserTilesRecorderProvider"); + } } @Override @@ -215,6 +232,12 @@ public class TopSitesPanel extends HomeFragment { } Telemetry.sendUIEvent(TelemetryContract.Event.LOAD_URL, method, Integer.toString(position)); + // Record tile click events on non-private tabs. + final Tab tab = Tabs.getInstance().getSelectedTab(); + if (!tab.isPrivate()) { + mTilesRecorder.recordAction(tab, TilesRecorder.ACTION_CLICK, position, getTilesSnapshot()); + } + mUrlOpenListener.onUrlOpen(url, EnumSet.noneOf(OnUrlOpenListener.Flags.class)); } } else { @@ -262,6 +285,26 @@ public class TopSitesPanel extends HomeFragment { registerForContextMenu(mGrid); } + private List getTilesSnapshot() { + final int count = mGrid.getCount(); + final ArrayList snapshot = new ArrayList<>(); + for (int i = 0; i < count; i++) { + final Cursor cursor = (Cursor) mGrid.getItemAtPosition(i); + final int type = cursor.getInt(cursor.getColumnIndexOrThrow(TopSites.TYPE)); + + if (type == TopSites.TYPE_BLANK) { + snapshot.add(null); + continue; + } + + final String url = cursor.getString(cursor.getColumnIndexOrThrow(TopSites.URL)); + final int id = BrowserDB.getTrackingIdForUrl(url); + final boolean pinned = (type == TopSites.TYPE_PINNED); + snapshot.add(new Tile(id, pinned)); + } + return snapshot; + } + @Override public void onDestroyView() { super.onDestroyView(); From e7a9bd4d6c8af9d5e1c03a634097aae6e2f426fb Mon Sep 17 00:00:00 2001 From: Brian Nicholson Date: Wed, 5 Nov 2014 12:14:35 -0800 Subject: [PATCH 07/25] Bug 1068425 - Add tile reporting tests. r=rnewman --- mobile/android/base/tests/StringHelper.java | 5 ++ .../base/tests/assets/mock-package.zip | Bin 2272 -> 3787 bytes mobile/android/base/tests/robocop_tiles.sjs | 26 +++++++++ .../android/base/tests/testDistribution.java | 54 +++++++++++++++++- mobile/android/chrome/content/browser.js | 9 +++ testing/profiles/prefs_general.js | 3 + 6 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 mobile/android/base/tests/robocop_tiles.sjs diff --git a/mobile/android/base/tests/StringHelper.java b/mobile/android/base/tests/StringHelper.java index b5c39366c02..05d250d8290 100644 --- a/mobile/android/base/tests/StringHelper.java +++ b/mobile/android/base/tests/StringHelper.java @@ -50,6 +50,7 @@ public class StringHelper { public static final String CONTEXT_MENU_COPY_ADDRESS = "Copy Address"; public static final String CONTEXT_MENU_EDIT_SITE_SETTINGS = "Edit Site Settings"; public static final String CONTEXT_MENU_ADD_TO_HOME_SCREEN = "Add to Home Screen"; + public static final String CONTEXT_MENU_PIN_SITE = "Pin Site"; // Context Menu menu items public static final String[] CONTEXT_MENU_ITEMS_IN_PRIVATE_TAB = new String[] { @@ -143,6 +144,10 @@ public class StringHelper { public static final String ROBOCOP_INPUT_TITLE = "Robocop Input"; public static final String ROBOCOP_SELECTION_HANDLER_TITLE = "Automated Text Selection tests for Mobile"; + // Distribution tile labels + public static final String DISTRIBUTION1_LABEL = "Distribution 1"; + public static final String DISTRIBUTION2_LABEL = "Distribution 2"; + // Settings menu strings // Section labels - ordered as found in the settings menu public static final String CUSTOMIZE_SECTION_LABEL = "Customize"; diff --git a/mobile/android/base/tests/assets/mock-package.zip b/mobile/android/base/tests/assets/mock-package.zip index c7742ea6dbd599e6c11d9cd8663ac0699e02cafc..7c299823caeed7a27055cc121d79b5b9cbeadea2 100644 GIT binary patch delta 1583 zcmaDLcv{vyz?+$civa}mHYB@(8Bl_kL53kEv$&)vGpV#BGe1v1G=!6Zc}I3cNJwd9 zNNEK(10%}|W(Ec@G5J5Mld(w&hIn)=7s7_pWvDhtGssLn$Sz|EHaIRCtHHQ+D}i+@ z%iz;JAy^Q@Q5#d1vexIdrJ#6L2Hms8rRnLZ#U-gJ#hE3k#Sp*u1O11^?+7Q_par1{ zE>r8F#^&TFC+5J6zl=R-5yqcKbF>yNF&6z(ro+V^iPSS*|2}unTPMz`f@n@Bu z7(Qz*xq^L$|n-g93#N+ z))B-+%QdW!T!WHhCbMwpFuOA_OqOAja|9|-V3G+$QNRFn5F?WuGsI5JoP%uV{K@;- z<(xx9faZX55eeofF(8}s1!#_{1TJ$XPhr<$3SgXkfZetpp6`(ziJ7O64fkh93mDX- z0!*Gj=Yw(>9_PdIS3NYq8B|c*zm$L#h};IW3Y6RMScRF_kUUfG$jpJ?H!!PUSr2F- zQu2qTen{xy%6AY8fmx7YNn<*SeV)M57%livEku=sWt`#^AV0AsMAL4kW8 g!r3O*@#)D!RWUFGc(bwrjbLB~LNlP7rm%x}0IX>w?*IS* diff --git a/mobile/android/base/tests/robocop_tiles.sjs b/mobile/android/base/tests/robocop_tiles.sjs new file mode 100644 index 00000000000..04e228a6ae1 --- /dev/null +++ b/mobile/android/base/tests/robocop_tiles.sjs @@ -0,0 +1,26 @@ +/** + * Used with testDistribution. + * Responds by simply echoing back the request data. + */ + +const cc = Components.Constructor; +const BinaryInputStream = cc("@mozilla.org/binaryinputstream;1", + "nsIBinaryInputStream", + "setInputStream"); + +function handleRequest(request, response) { + let bodyStream = new BinaryInputStream(request.bodyInputStream); + let avail; + let bytes = []; + while ((avail = bodyStream.available()) > 0) { + Array.prototype.push.apply(bytes, bodyStream.readByteArray(avail)); + } + let data = String.fromCharCode.apply(null, bytes); + + // Including this header will cause Gecko to broadcast the Robocop:TilesResponse event. + response.setHeader("X-Robocop", "true", false); + + response.setHeader("Content-Type", "application/json", false); + response.setHeader("Cache-Control", "no-cache", false); + response.write(data); +} diff --git a/mobile/android/base/tests/testDistribution.java b/mobile/android/base/tests/testDistribution.java index e6d7894beb3..19f9231546d 100644 --- a/mobile/android/base/tests/testDistribution.java +++ b/mobile/android/base/tests/testDistribution.java @@ -12,9 +12,12 @@ import java.util.jar.JarInputStream; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; + import org.mozilla.gecko.Actions; import org.mozilla.gecko.AppConstants; import org.mozilla.gecko.db.BrowserContract; +import org.mozilla.gecko.db.BrowserDB; +import org.mozilla.gecko.db.SuggestedSites; import org.mozilla.gecko.distribution.Distribution; import org.mozilla.gecko.distribution.ReferrerDescriptor; import org.mozilla.gecko.distribution.ReferrerReceiver; @@ -39,6 +42,10 @@ import android.util.Log; * searchplugins/ * common/ * engine.xml + * suggestedsites/ + * locales/ + * en-US/ + * suggestedsites.json */ public class testDistribution extends ContentProviderTest { private static final String CLASS_REFERRER_RECEIVER = "org.mozilla.gecko.distribution.ReferrerReceiver"; @@ -117,6 +124,13 @@ public class testDistribution extends ContentProviderTest { // finish. This reduces the chance of us racing with startup pref writes. waitForBackgroundHappiness(); + // Pre-clear distribution pref, override suggested sites and run tiles tests. + clearDistributionPref(); + Distribution dist = initDistribution(mockPackagePath); + SuggestedSites suggestedSites = new SuggestedSites(mActivity, dist); + BrowserDB.setSuggestedSites(suggestedSites); + checkTilesReporting(); + // Pre-clear distribution pref, run basic preferences and en-US localized preferences Tests clearDistributionPref(); setTestLocale("en-US"); @@ -229,12 +243,13 @@ public class testDistribution extends ContentProviderTest { } // Initialize the distribution from the mock package. - private void initDistribution(String aPackagePath) { + private Distribution initDistribution(String aPackagePath) { // Call Distribution.init with the mock package. Actions.EventExpecter distributionSetExpecter = mActions.expectGeckoEvent("Distribution:Set:OK"); - Distribution.init(mActivity, aPackagePath, "prefs-" + System.currentTimeMillis()); + Distribution dist = Distribution.init(mActivity, aPackagePath, "prefs-" + System.currentTimeMillis()); distributionSetExpecter.blockForEvent(); distributionSetExpecter.unregisterListener(); + return dist; } // Test distribution and preferences values stored in preferences.json @@ -439,6 +454,41 @@ public class testDistribution extends ContentProviderTest { TestableDistribution.clearReferrerDescriptorForTesting(); } + public void checkTilesReporting() throws Exception { + // Slight hack: Force top sites grid to reload. + inputAndLoadUrl(StringHelper.ABOUT_BLANK_URL); + inputAndLoadUrl(StringHelper.ABOUT_HOME_URL); + + // Click the first tracking tile and verify the posted data. + JSONObject response = clickTrackingTile(StringHelper.DISTRIBUTION1_LABEL); + assertEquals(response.getInt("click"), 0); + assertEquals(response.getString("tiles"), "[{\"id\":123},{\"id\":456},{},{},{},{}]"); + + inputAndLoadUrl(StringHelper.ABOUT_HOME_URL); + + // Pin the second tracking tile. + mSolo.clickLongOnText(StringHelper.DISTRIBUTION2_LABEL); + mSolo.waitForDialogToOpen(); + mSolo.clickOnText(StringHelper.CONTEXT_MENU_PIN_SITE); + + // Click the second tracking tile and verify the posted data. + response = clickTrackingTile(StringHelper.DISTRIBUTION2_LABEL); + assertEquals(response.getInt("click"), 1); + assertEquals(response.getString("tiles"), "[{\"id\":123},{\"id\":456,\"pin\":true},{},{},{},{}]"); + } + + private JSONObject clickTrackingTile(String text) throws JSONException { + boolean viewFound = waitForText(text); + assertTrue("Found text: " + text, viewFound); + + Actions.EventExpecter loadExpecter = mActions.expectGeckoEvent("Robocop:TilesResponse"); + mSolo.clickOnText(text); + String data = loadExpecter.blockForEventData(); + JSONObject dataJSON = new JSONObject(data); + String response = dataJSON.getString("response"); + return new JSONObject(response); + } + @Override public void setUp() throws Exception { // TODO: Set up the content provider after setting the distribution. diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js index c30a5eadc37..8fb6542c8d5 100644 --- a/mobile/android/chrome/content/browser.js +++ b/mobile/android/chrome/content/browser.js @@ -4246,6 +4246,15 @@ Tab.prototype = { let xhr = new XMLHttpRequest(); xhr.open("POST", gTilesReportURL, true); xhr.setRequestHeader("Content-Type", "application/json"); + xhr.onload = function (e) { + // Broadcast reply if X-Robocop header is set. Used for testing only. + if (this.status == 200 && this.getResponseHeader("X-Robocop")) { + Messaging.sendRequest({ + type: "Robocop:TilesResponse", + response: this.response + }); + } + }; xhr.send(this.tilesData); this.tilesData = null; } diff --git a/testing/profiles/prefs_general.js b/testing/profiles/prefs_general.js index 5d265e61a84..4a922d2fee2 100644 --- a/testing/profiles/prefs_general.js +++ b/testing/profiles/prefs_general.js @@ -216,6 +216,9 @@ user_pref('browser.contentHandlers.types.3.uri', 'http://test1.example.org/rss?u user_pref('browser.contentHandlers.types.4.uri', 'http://test1.example.org/rss?url=%%s') user_pref('browser.contentHandlers.types.5.uri', 'http://test1.example.org/rss?url=%%s') +// Set dummy server for Android tiles testing. +user_pref('browser.tiles.reportURL', 'http://%(server)s/tests/robocop/robocop_tiles.sjs') + // We want to collect telemetry, but we don't want to send in the results. user_pref('toolkit.telemetry.server', 'https://%(server)s/telemetry-dummy/'); From 21b87ba21f7a769c135d10fe657e708fe08db7eb Mon Sep 17 00:00:00 2001 From: Victor Porof Date: Wed, 5 Nov 2014 16:52:44 -0500 Subject: [PATCH 08/25] Bug 1058898 - Enable profiler tests for e10s, r=ejpbruel --- browser/devtools/profiler/test/browser.ini | 1 - browser/devtools/profiler/test/head.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/browser/devtools/profiler/test/browser.ini b/browser/devtools/profiler/test/browser.ini index b2354be2fcf..8d9692665de 100644 --- a/browser/devtools/profiler/test/browser.ini +++ b/browser/devtools/profiler/test/browser.ini @@ -1,5 +1,4 @@ [DEFAULT] -skip-if = e10s # Bug 1058898 subsuite = devtools support-files = doc_simple-test.html diff --git a/browser/devtools/profiler/test/head.js b/browser/devtools/profiler/test/head.js index 80ac8f3bfbc..354e3612622 100644 --- a/browser/devtools/profiler/test/head.js +++ b/browser/devtools/profiler/test/head.js @@ -74,7 +74,7 @@ function* initFrontend(url, id = "jsprofiler") { let tab = yield addTab(url); let target = TargetFactory.forTab(tab); - let debuggee = target.window.wrappedJSObject; + let debuggee = tab.linkedBrowser.contentWindow.wrappedJSObject; yield target.makeRemote(); From 075c2a91aa56c1059e4d4c97dc73ba16583d57fc Mon Sep 17 00:00:00 2001 From: Victor Porof Date: Wed, 5 Nov 2014 16:52:46 -0500 Subject: [PATCH 09/25] Bug 1091596 - [e10s] browser_net_copy_as_curl.js disabled because `waitForClipboard` doesn't seem to work properly on e10s, r=ejpbruel --- browser/devtools/netmonitor/test/browser.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/browser/devtools/netmonitor/test/browser.ini b/browser/devtools/netmonitor/test/browser.ini index 863d5364471..ca4dc017229 100644 --- a/browser/devtools/netmonitor/test/browser.ini +++ b/browser/devtools/netmonitor/test/browser.ini @@ -51,6 +51,7 @@ skip-if= buildapp == 'mulet' [browser_net_copy_image_as_data_uri.js] [browser_net_copy_url.js] [browser_net_copy_as_curl.js] +skip-if = e10s # Bug 1091596 [browser_net_cyrillic-01.js] [browser_net_cyrillic-02.js] [browser_net_details-no-duplicated-content.js] From 9d583c0c0fce1ef53a1e8f12866ef6dd6dc73a91 Mon Sep 17 00:00:00 2001 From: Victor Porof Date: Wed, 5 Nov 2014 16:52:50 -0500 Subject: [PATCH 10/25] Bug 1091603 - [e10s] browser_net_filter-01.js disabled because `nsIXMLHttpRequest` doesn't correctly determine whether or not a request is XHR in e10s, r=ejpbruel --- browser/devtools/netmonitor/test/browser.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/browser/devtools/netmonitor/test/browser.ini b/browser/devtools/netmonitor/test/browser.ini index ca4dc017229..5c25e59b9fb 100644 --- a/browser/devtools/netmonitor/test/browser.ini +++ b/browser/devtools/netmonitor/test/browser.ini @@ -56,6 +56,7 @@ skip-if = e10s # Bug 1091596 [browser_net_cyrillic-02.js] [browser_net_details-no-duplicated-content.js] [browser_net_filter-01.js] +skip-if = e10s # Bug 1091603 [browser_net_filter-02.js] [browser_net_filter-03.js] [browser_net_filter-04.js] From 5be0882642428b34b744ae554c91cb82b74b1210 Mon Sep 17 00:00:00 2001 From: Victor Porof Date: Wed, 5 Nov 2014 16:52:53 -0500 Subject: [PATCH 11/25] Bug 1091612 - [e10s] browser_net_resend.js disabled because actors for the new request channels don't correspond to the ones sent in network event updates, r=ejpbruel --- browser/devtools/netmonitor/test/browser.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/browser/devtools/netmonitor/test/browser.ini b/browser/devtools/netmonitor/test/browser.ini index 5c25e59b9fb..03ef9c70326 100644 --- a/browser/devtools/netmonitor/test/browser.ini +++ b/browser/devtools/netmonitor/test/browser.ini @@ -83,6 +83,7 @@ skip-if = e10s # Bug 1091603 [browser_net_reload-button.js] [browser_net_req-resp-bodies.js] [browser_net_resend.js] +skip-if = e10s # Bug 1091612 [browser_net_simple-init.js] [browser_net_simple-request-data.js] [browser_net_simple-request-details.js] From be0670c3404446cd7c68cfec7687ec38a4ede1c8 Mon Sep 17 00:00:00 2001 From: Victor Porof Date: Wed, 5 Nov 2014 16:52:56 -0500 Subject: [PATCH 12/25] Bug 1074205 - Enable devtools/netmonitor tests with e10s, r=ejpbruel --- browser/devtools/netmonitor/test/browser.ini | 1 - .../devtools/netmonitor/test/browser_net_copy_as_curl.js | 8 ++++---- .../netmonitor/test/browser_net_timing-division.js | 8 +------- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/browser/devtools/netmonitor/test/browser.ini b/browser/devtools/netmonitor/test/browser.ini index 03ef9c70326..eedcfdf1cc1 100644 --- a/browser/devtools/netmonitor/test/browser.ini +++ b/browser/devtools/netmonitor/test/browser.ini @@ -1,5 +1,4 @@ [DEFAULT] -skip-if = e10s # Bug ?????? - devtools tests disabled with e10s subsuite = devtools support-files = head.js diff --git a/browser/devtools/netmonitor/test/browser_net_copy_as_curl.js b/browser/devtools/netmonitor/test/browser_net_copy_as_curl.js index e67f67326c8..a5b1adb8e3c 100644 --- a/browser/devtools/netmonitor/test/browser_net_copy_as_curl.js +++ b/browser/devtools/netmonitor/test/browser_net_copy_as_curl.js @@ -13,9 +13,9 @@ function test() { "curl", "'" + SIMPLE_SJS + "'", "-H 'Host: example.com'", - "-H 'User-Agent: " + aDebuggee.navigator.userAgent + "'", + "-H 'User-Agent: " + navigator.userAgent + "'", "-H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'", - "-H 'Accept-Language: " + aDebuggee.navigator.language + "'", + "-H 'Accept-Language: " + navigator.language + "'", "--compressed", "-H 'X-Custom-Header-1: Custom value'", "-H 'X-Custom-Header-2: 8.8.8.8'", @@ -28,9 +28,9 @@ function test() { 'curl', '"' + SIMPLE_SJS + '"', '-H "Host: example.com"', - '-H "User-Agent: ' + aDebuggee.navigator.userAgent + '"', + '-H "User-Agent: ' + navigator.userAgent + '"', '-H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"', - '-H "Accept-Language: ' + aDebuggee.navigator.language + '"', + '-H "Accept-Language: ' + navigator.language + '"', "--compressed", '-H "X-Custom-Header-1: Custom value"', '-H "X-Custom-Header-2: 8.8.8.8"', diff --git a/browser/devtools/netmonitor/test/browser_net_timing-division.js b/browser/devtools/netmonitor/test/browser_net_timing-division.js index 3e2290a74d1..fa537dd0860 100644 --- a/browser/devtools/netmonitor/test/browser_net_timing-division.js +++ b/browser/devtools/netmonitor/test/browser_net_timing-division.js @@ -52,13 +52,7 @@ function test() { teardown(aMonitor).then(finish); }); - aDebuggee.get(Math.random(), () => { // Timeout needed for having enough divisions on the time scale. - setTimeout(() => { - aDebuggee.get(Math.random(), () => { - // Done. - }); - }, 3000); - }); + aDebuggee.performRequests(2, null, 3000); }); } From b3097dfa7c6d424a5caa9820cac6a7091c07374e Mon Sep 17 00:00:00 2001 From: Shane Caraveo Date: Wed, 5 Nov 2014 16:14:19 -0800 Subject: [PATCH 13/25] Bug 1075000 fix isWindowPrivate use on content window, r=markh --- toolkit/components/social/MozSocialAPI.jsm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toolkit/components/social/MozSocialAPI.jsm b/toolkit/components/social/MozSocialAPI.jsm index b5806ccca09..7b9960d6061 100644 --- a/toolkit/components/social/MozSocialAPI.jsm +++ b/toolkit/components/social/MozSocialAPI.jsm @@ -46,7 +46,7 @@ this.MozSocialAPI = { function injectController(doc, topic, data) { try { let window = doc.defaultView; - if (!window || PrivateBrowsingUtils.isWindowPrivate(window)) + if (!window || PrivateBrowsingUtils.isContentWindowPrivate(window)) return; // Do not attempt to load the API into about: error pages From 876b5366b5db6158d037ca124d13128b4f4da0ea Mon Sep 17 00:00:00 2001 From: Margaret Leibovic Date: Wed, 5 Nov 2014 16:17:55 -0800 Subject: [PATCH 14/25] Bug 1055657 - Add branding icons for search widget. r=mfinkle --- .../aurora/res/drawable-hdpi/widget_icon.png | Bin 0 -> 6299 bytes .../aurora/res/drawable-mdpi/widget_icon.png | Bin 0 -> 3225 bytes .../aurora/res/drawable-xhdpi/widget_icon.png | Bin 4381 -> 10378 bytes .../res/drawable-xxhdpi/widget_icon.png | Bin 0 -> 21479 bytes .../beta/res/drawable-hdpi/widget_icon.png | Bin 0 -> 6764 bytes .../beta/res/drawable-mdpi/widget_icon.png | Bin 0 -> 3615 bytes .../beta/res/drawable-xhdpi/widget_icon.png | Bin 4381 -> 10358 bytes .../beta/res/drawable-xxhdpi/widget_icon.png | Bin 0 -> 18347 bytes .../res/drawable-hdpi/widget_icon.png | Bin 0 -> 6085 bytes .../res/drawable-mdpi/widget_icon.png | Bin 0 -> 3259 bytes .../res/drawable-xhdpi/widget_icon.png | Bin 4381 -> 9409 bytes .../res/drawable-xxhdpi/widget_icon.png | Bin 0 -> 17424 bytes 12 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 mobile/android/branding/aurora/res/drawable-hdpi/widget_icon.png create mode 100644 mobile/android/branding/aurora/res/drawable-mdpi/widget_icon.png create mode 100644 mobile/android/branding/aurora/res/drawable-xxhdpi/widget_icon.png create mode 100644 mobile/android/branding/beta/res/drawable-hdpi/widget_icon.png create mode 100644 mobile/android/branding/beta/res/drawable-mdpi/widget_icon.png create mode 100644 mobile/android/branding/beta/res/drawable-xxhdpi/widget_icon.png create mode 100644 mobile/android/branding/official/res/drawable-hdpi/widget_icon.png create mode 100644 mobile/android/branding/official/res/drawable-mdpi/widget_icon.png create mode 100644 mobile/android/branding/official/res/drawable-xxhdpi/widget_icon.png diff --git a/mobile/android/branding/aurora/res/drawable-hdpi/widget_icon.png b/mobile/android/branding/aurora/res/drawable-hdpi/widget_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..519a83cfc523ede85a1ba2de2be4072886e33c5f GIT binary patch literal 6299 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 Rt!MxM002ovPDHLkV1hUHPH_ML literal 0 HcmV?d00001 diff --git a/mobile/android/branding/aurora/res/drawable-mdpi/widget_icon.png b/mobile/android/branding/aurora/res/drawable-mdpi/widget_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..39f3d0cd678de73347e85d1872182d1db35f2772 GIT binary patch literal 3225 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 o#dPx# literal 4381 zcmV+&5#sKNP)Px%`cO<%MF0Q*00s*H2MquL2><{900000001^7D*yrn z0000000sa92M8WP#P9YPB2xeZ1px~c00RR61_}TW9u*@}G?B;i^%W#j016ThFJgky^%N{$e9iIz6DD@f^>DS`5hPQH)%6f6 zU3bm$XuannL~;i%W*k0jBuRU9$nP&DOPy!b%Oqnm}mM1`~}Vv{CWj76BqHiNbqF=2eq^Lo(sQK!~y#_v*gq!ch+9w1K{ z8b%lxMIRzj9U)C0B~cq4N+Bp!9Uo2>AWj}2P#Ygh3qX1jG-)0qPaq{!5++s+J#`90 ze;OP}6eLp@DOw{dRt=QR5I1cRjK>Z-aRpeJ3SOTFTbvpvSQ{l(8+^J0qSz5;rW${} z0a20%M}!qGV*^!|BrRDOZmtEN)dWtB85>6qEMFCCs~0O?5Gh*?VWJ;)wiblJ6N$we zB2x~L%LPk`B`;eHE@A?v+Ye-<2%OUkm(Lz~xEO-J79C3#E?^WfW)P0a6^FwnGF=;S zu@fOt9dol2X{jo)`buX398;jwB>fu`87>_U=Vk;8>ieCkjWvN(i(}yG?mRqq0xFLbCNt>GrC;23MBE_<;!gSIz`zcilIDU!<%g}@f0*)m^^U%>50soOrD z)JATVJDJcC8sGH*002#NQchC1%GZT{;zv=e3G zNmzn3n`QGNrz{!Ef9VUV26Zt;f~1>wWv$KcMY6xTK+5UM^zyji!tNZ@BaDD8000eW zNkl&YUv$=`Zs0_t&MD-u;EIx8C}E{`9eb zThElapH=1WZ!Ar?+x**a|2gIE-qLdY>b2|c?jOy6>hEZqIqS`;{JPSFgy!ZOH%^`U z_1Bh`+S-DGf{oP|&QHDi@f!~;ZS1Vie$KB;PiRQ0s7Omovw{4ptK;J0@{GmB#Z4FA znEpV@ro8zxQgk?}Fg5k$$&QYmp5ETjP5uDdzGqKfj(5$E)tZ)Y21@PTX3yVdcsV zKZ2-lw*sm9c-%KYI&)@ej3r2JmS>wSoge&($wviq%@rrJI?ioawru4F@VEF|5Vf)T z`>((G^1CxjeSLkC4+cdAb>&89TRwdMkB-NqKj-gHhXhm{I+S{1=TGaG@u~#Wn(x2a z{@v;&OMO?Y+8ci~SE*EnL`9pQdFhWdp$H^2ryeT2ynE+Q|6XrXwKa6P|C%3=C?Ex{ zvgYiyEXr1Td3mX$qVLao0W>upNJs+Gj$Ns@b`C;qM5xtEd;_hO7VA1=w^^>-CY1v0 znHTR9C*-c7q2WYoYT=H{Cv67rLG3*lF7GV%D5;57N~Mufuasy0Ih6F&QUR5gwqw_ByTL)I zrBmxs3ePUC?C2Xgdn z83qV#5B8(PVzD&ku|Xk!JiqZkL(+~NI}RtM-8g(0P-ub>b|ImVg|8tC5QP=1)_t{b zp&6mneqJokn*96#d!JU-*+_>Ql9CW#>TlJ?AHL^f6)1@ET;Q`v9uTZfImQqMk}=Kx$AF$U9!M&@d}$Z> zt4OQpYr6deZtNQ%kMcyQ&4AJ2B8T9#tlIC`30)~8kJ4Hc<{CvKhCg=+Us+o|bW3u}H5S``?WoV?18ib5z{Pf?tn zl|5`vCx}Wt1beP-DsO)8jHu_O{UU{JQ3}Ls{q6 z0|S2Gmz`uApG{PtRlW~U*(KeHwpQs$eXEvLF|i{2Rl#3fUGvGTtgQ7=w-9I9N;?VJ zvv;C3s*xZ~WTPar5};P%s4)5VUpq6@LKrkx-*n zB->hL?I9_=`NkU^-4ER>2y@7!_;6Ar12ze{*l? zg$Qjb`0mRq-z|wjb%6&BB*F4b%r1$KF3LdTi#(#k#27(~RiI4FP#CF&7p%DwlLwMwtmn@U1o4{C^31lxtCcC>4n#qNC>6oAag2hbFfpY7RWFpDYN-wF zt-f&m`o`-Qr=CCGl-YER2lYwfNwB6Y3*yyY+lst^q(ga9={QoaHxSS+0>yn+>8aX+ zP1UROu3lSn{aRDz#mt<{Ye*3S*+}bn60E8CB52gHNGT$zC}>pq*;rZy|Hnnp_9=JW zYhh?hV)8PtUb~o?nVFoNoO#6#8cbRwkA{{@TRAi~ol46xHb;SzCK#u3aN+Vq5@jgcr?UDwO)PAjH+E$`XjGC>(NCq0km?RQ>5d?hCELHb=*e@A9tA-b zOL(}&Dkwtc1X8e?C&lUw7{`+^G(KD;ktjst_{W)#YA<}bG;?Z`CvXnN9|S$&@@`lt z#Q?HN0&{&NkwnX39G?L(MUi@mNJJ>`N&M5y>j-6CxOc%(!0Zc`mvqa6vdy{O#hwDl z)+ReiBvG&!B^YcguUAMUGL}*ZPYq9ed?7C;*|QS_g`?ZaTqEzwt%>&NJZJ|EB8hNT zhw)1t6Kl)#u@ckcK#>|5RN${*8;!zyihA||| z5D-!^Q!m3AQWExv{cFT~=QDFGx$*I^C+(F{^80Oz9fTys!e?>B(rfAR_A;HYim7sg zK}897GhZ(O%Gi}{$?XC;!Ej{;M`bA0MeXLzHgA3!G<_W}OGGLZW#x=5q9)K68`l2> zIr6=!IYvvAIlC)FsfMRtb%qk|6?IW-lnoRnlaZK?AqAF1W)MWN1})o0-~&WCIJ`Ku z*jQO2x0pi&61t$gq$wI{1`on<1xb)BA+w=4gN_wbVwTahVUYE{PVx0}lQGdJ+Z;82e-48f6NjH4+D{^X!9($9WSTp2G9C@CpQf#r=j zXoE{>13@cr8$lwnm&9NwH?idkf-uBVvi|2|o5c@1E!k0J9v(%0ky2?GVBiZ3MV_s1 zHECl-LrbPOYtS1+G~$nYWa#&$M~V~80YzmsMJXB$2x5*f48_#{&KVTnzN4-gc zgWlLMm!Tv_hnG8RqEm`AMaMJ@OVc#PvMfQjo~@S+oJw3?K8* z{ZQkb$G8o5`6NRFpJ8aYb1}BH+&~ZLdOh5F40KV2sc2e)k9&2v+ZgA2dgb8g1hR$= zpYYnhG87W{`z&WNv5@cqxr7I67>0@@X#xTjHrr*+@L@=l(8lb`sB zaGE1=2=l_9hCcZY=Pl1ydfpdLl29*}P z5qgnACK2IblUycF;59ip-ser$NHj&~F$m@|c^oc^Wdvc z<_ve^75y2=ZgV`)#td_Fn=sF1#^l-4#_=_6_M{mu^Cq~tfgb14ka5Qcc-;pyCxm;* z)pZOI=S-LgHDL}gTwPsxjMD>g>~DGj=QILKWTqz}S z8Fa}NOHLw{?N|~^DvFjOG8__1R!E8yK!N~?8SDnS8|dlvo9=z@&i71vSZn?A$J*!I zbMJfIXiO5N(s{MsIrmI=-~HXc>H8a&@Nd&iksk%~SNNa|7|N@Z@+2^&&>;ie;-mUw z5D@g=mOokkO+4t|*GHD#Nq^1Wsn5DPeZbV5_7l#k>SeK<16={>iy;#O7@V<8f{~#~ zxvPoXM!2OSyJWmB#^1~-wq@y4JO2*AZ@yHSFY)Bc6L<4VlWBN=b3Hu6IK0!>cHLFk zxvXir35t3}gC_(hbK4Z`sO4pZ&#N?_$%L9C8 zfIl3OE){4!fuml^b)8iNI%1*O40$_Pmn^;9GnfPVbiAmW9rI}sA+yT zTYdG5@>Nvthd+z~_`nC^{p_~26+id<^XP~F3-p_*!v9bK_?$j?_HEBCzi0G{{MhK4 zd}zAKWjhs_PGC|h#Y#r+bce7zBB>`B6A&YaC?a4?z$SnwCIK;u7{z1;u>mPee7-P9 zqR8?9$puLjESS|5B(q2=n2seG7)Tu6mpj27J{Q>kCH&1_Db7}}ES|#;e;D}yA2gTN zZrWsUN%DGVOs5f3tO-CUcQs5?^{bhdn_J=L?j`@*d^CLc!-RkH0aQeJ=Y_prGe16j z!Ti|p6?ta54Wk;IDw0^NS9-b7%>$-s5b=l=j6{%(D8?vAz|25vpA!RO6_bJ_#QRK; zjzN-uJ++KTfD}xxKsq^+C6K2`(Z%$ZF`XRK$srlx%FV6dHhwwiD?eSF-v1o|{mkEg zPkI5;^ju++-PGFUi51rvl1@Cog;n(v)ieuXBM(gvHy-15>Y@J^8=v(b{xAw(pH%*9 z1yFaMdE(ap&-|~ppW`nKubYdL5lm2Qo{$)WF@_F-fjF#pC}3;^NLqkqKp7L_b5@Ul zH32bTY`|C$I|C3TGf^@#!4xTU5=@aIMT!&!GFS#{kZvEz3MdAcVg=jnLlN-h^-`nq^6hkp$P{kjyLIhfZ+eP+esY>d|i1 z?EK!kfA3Fy)_px7{%ZkHr%zsa^=CT&`#YbLKexXj=MJYpqNLr7Rclx}-KX9vDOPgo zo4fJkn+uwz0D%EqGv3!Q>V)gUKwCMF35nA)NwxOMpc>9ZaVW zMIV#*p%@^=Iwn62MM0=vaDMuGzti0PmA^gyr`sRxJ@x&AWOcMga8^=daVoe(NJI%v zRT7UnRoB$&im7WtSx=VB-L;ph&;Rr@?#F)N7yKVu05|pFGu1y@`44V<(*Cv0m(7*2 z50HQngRkJ?g+7Br$8^8KW(L$_GeMY1)(ofxuofiH*hK(+{EX44LKDR#GXRC8l|Cs< z1TRZ4S&F17X0QZVA9Wtv8z9}K7QiJamXTrw@?|7jMY8i?a(weq7l!}SFUqZd_V@hj z7jE0`rPCCypz#)KtY~5p71xML?h|dKw$o%k1RVv>$T>G2kNV>mUj4P|Lm$S!RcZWJ z0^na&^8f5#yypWO|I+@gyI(f%+?*;tRXV)_H*tgtd=R=KTr?&g)(or`AZr3a1yJ(L zV?+@fuqI%VK$?aKk`37Q-qB(Xg)#`@uDPz6^WQDTmKq{N&_AA9`!y%eNfBLw)qrOFy~#H|~7W{Kbs} zEk;%;dKt|qAQjm`jUK}-y!21yK(BuJV?yJ zts==1Bt0-)z_x$&>x9wIyb^BxgP%1A%XdSudd?W_VI)&EiRrj?j7#(|`3e)WrB1eK z^iG)CJDz%Lvgh}H^W{q*r)};bHn$t{SFRZCOa-yJ8b70^+T= z*1C)5bN45I?uP%FkG^@R@ht)HBl>5D&?{N1e^_Q4w_(1;<;Ge*0C=@8Oh z&gzwdi;boF4XU~tqB;^gQ`Ff6hX9wO~AA|rNt|P zCd3!4Al85tOk!FvP4qUc#UwULW0JNjiymm&MQn}~%U}v5TSC%4qyxnEz~uK=Z}w4Z z27mMcEk+kaM@aE)>-0W&f$k5Sk>UqeNY|IdWQCZ$RGFkANf572#MVYkJvhJazWs;a zAAaE%p4We60II&@?8|>;?Qg&E(e(egF{QX`l%_GbN|+o5>PE16!us1*c=*a1x4v+I ztmh0?dfX|M(1+85ilSfRQbkVAW4qo12BCg>9zp&5!;Dh{D!vyl7G*D;?fzicMhcZj#cdW z1nCLc<2~|6RzNcRtw5MK328~~OPTu0)TUnAe8sPS`>uZUqxV;(-&6qizw*9^e)%W5 zKl{=b?4Q0Nfr$#PHh5=o-Y}iOsRx&_c}g|%+`ip##|fh(<)EBWGsaW0mK(0^ffd7w zuTbYfrB#O7fBmzkbTp}1dle{R2k|fZAC}|F94$=ac zb`jG>(jFvT#CBUzf3urG>=i5abc&ecE{I)8$uISVZ7ln2u=5C^gZ*35Y=?prWVM%OkE6kjfC8A$UPmXe#0D?^|W-ddb%7 z4V_*_VFD}tnj-V$dB&+TeezMsg*>HB84y{Wh>w|hA@J&N8dv8w%FFYXr#eGxy*ImQFG}^Ht zWW~d#dT0}OzhC$btI&V>*T3W2f8&2n{=e7uGOWEJ?U@QmQp5a~~ z%M8mM$NHLM&`-I1y2m*$bax%y35>5#2`%>GAI=6w=9<3yS)}b*;3P}pd0FeSo3&eE5b`V>96&v^#Z|-_6m%7!{N3)%_uOMDx^vDFpZ7j#O#_2 zvJfgn>6`tm8YT3|Ygq^-$u+MBQqLAfaJ(8ACcrXnr4XBIj zn{f+=QyM=BA$3M1puu7^l}?oyN}Dc^%?J3Px!1aWoww(I`rF_3i$5>F@andC*yk`Q z4dYT+xzNQK%i&1rtYoa8FW9+TGw21*tkeVzbkYp}{66(anM?y|p0aheOSM)&10e_@ z2-@C9kny|jAEOi}K1!NiLdKoqt zJeCy8^#jLdr4*y+$jlrcRXGu$&tkg;)78EOA*#_?FenR;Tkz((*BHbYFcCaG2_k?5 zP;mPewGP#qurq>bg`^E4B``syf>3{>UX0c76{qFxEeZ7myt76Eq9W?7WX_nXGTG)8 z`LKM00IELS`x}3)|KEOP(|)_}DAP)qG{V#gl^5zt86Gs8x!l1u(9dgnxu;!l@70#s=TLs(u+ z^d)&}Dt!1GP@$@rzx>Sd|LNu1$&dJ6psWq!Mku|Zbjsnd=COD8`LX}aMb^&bjPLH# z?+TOJP&Y#3h4+8QX|CL?u+zZx%(9bPuB>LP+$w22bEjoicW{*H)P)>yv`;fNI%8aP zX8(+7pEpOV1y4*=n}|hQ;Np8`k$!yL2;dEZqE6AKL9{_bO&A^$wztsn0osgFcL-tn z4auNM-2_>TNRpMS_xE1QAwg?iUkZIw68hPHe^umAk=6m zQ9mY3_Mth1<`8WTzhPBsx<9zimH+IA+~kG38q!KL>rqjBrP{Tc^eXwfotS^`()V7x zd6)lNooZ1zVOYbt2YQUg4V}XB;M@Cr&j-%(g@3roZ~n}Slx2g*GMXwTwIq2$zLaqD zZo^*b@gAOhtVhwh_Ig~>k2!M)~eJ5B?1@1 z67^1dER9A9Zyee*5E^KvP#vO^9dx<}%>gvSZ`dnMR{odov2Xj+?+@eGHgM{-PP{fr z&}O7=oa@&`rTyrWKbjphhyQ(vd{6C!(p!QG`};KyK0F}l2oF8D#Prkq>|NjEMen8(_uVBq0 zdyd$Qm^QWRruBI9j{B{_?y*?#EdhAGd+I-&3jddx zy$c$BwM&;ftSlAWx;^GxFU4FNlAN_9r1VFD<lG@m6@`p@N6TO0`{M z5)&gaIf}@R*SgFcNL>JH;qff@XJz5JHjJ<>fMyo7F9z$${2rTPY;r_oTMKHVMok3U zHQ418(--WL!SoE$OQ0)g9l*8O4mpZGWBJ?H8Q`0Xg=Xoc`o+KdPsCnQkJeRQHd~K% z-T&gxZv=kwYmmV2J^#H|CldbQuraHZGm*>j%Ia!HktbYxZO9-`SvP^MYY0Q=P67jC zS!#shbk6OmqnZYS5guO2cuXwgjVk8gMCJg>f>typlGU?y#Jntmr*pFwO`KqCyb|Wp z*M@h5FTT{DaltwGF;SNUOlvC%UZn6COI1vbNpO96C%g15S=qr_5>2 zc@fjBwo_UV=VgP75;)Jm&wgH1p$0LL*_q}2unTD;6M-^GirCp|0W_^@H5Ro=>&eCg zmASf9bQ%z2Ay1G3Bnx08MHERP^EFDNf((SDe&^DqpZbC}4IiwDsUv%&D#fI&w9UZF z5R*k$L~cn+QCAR9!L>DYA_yA55@x?wC$%+nWa14U0i0c zA%FjUzy7N~`jM^hlRwE@cVfQt(sy=BH9xgk$=hP~8Ii1&_#+iZ(=kumNq3 zUe}guCA7UtzV|PD?w{rB2Y0`we4vKxk8W4`p;PBNY;Bfwa>MB} zDL1b<2!ZA0f>oQMQsIJ$e}hJEQUM9d?Nqo`1v-W0*2`1Uj^*uZIa#eZjrqKjVc(3B zjs&&L*G#hKJgCN0lB%*8@vF{F(EZ~{y`RD|$c&vK1ywY(iDTCSG*bpu; z4B&fsPdf7Q*GCBDRz;Es?|%0xUwZBU=c6ik@M@0PsVG%2L88i^fu~BD3B{?5_mrO7 zm1ns~c)&w(;Fx+PO@uH{yDGDc-aH>L2WYm0po$4GGoh+zpyf;>kh++iII%>v{Y+GQ zM?ecQzc3OcNYr!!+9r?j962ZgDoGo5`j{)UQHm4~+MwD*dd*j0r-oC_l6X``h)J-WxBqB$`?vm1eqs3HTLQ2;JNW)XFYoR243l9jY5&Y; z_waQfZBP%C&5QZFPoD!N_6<3_M!kEsK-H6%8IHuDsnlrV zk)$N3!}Kq$h3xSkhfn>Vzbb$q)B+zR9EhAdAx zeKuoMDX9jMk&E`%5KmeLRUJrZjlU6+;{?k|!sVC>JwkIqOWva{TWQq$ycQOp)0iG= z-zc*W1VzG;sH!Tay}ZPjD7|j6nrh)lt!b~m_}z#{O;oEYH6k^b3T29zSkteXL&)N( z*A807W0N$GRGoMv1zd%uQ}8vKBp9>ym$t5T|NGMqOg7#Wz}L^nlT+valw^ix5?Ei$ z7!DmtYEZy=<#aFM^1J#x|H7DOUmH`oz@TUN&VGhYL(IRNk5V>RLFiA>P zb|B4gdyb`tLC3?npQ7_PFT_8<5N)6FQQaD1vR4c$bxV$?XiL>0Dfkq$wYOyG#Gy6; z=P-Q(wTl--Q$gkkR>(SM&kx-Be;;1?@7@%^#>-!-JlR7RawgLhBf^cH3EkWf0u+T| zG-~+7XAbcmMk9x{!V^!dvOH|q+MSSC^QQiTzQH;sg7d8Vg2O`0(5soL*x9+1R!uIP z+n^Efu=ukg!GklX^{8*vp7Sx|E;ZBPGSmGW6Dn*PnA|XsEgn&+6^lptOs3J`RNd~<>NdG^$apTfI zxP1BM^u7Q-c;@@gj=leZUXjG~PpuS1l)RweUEqPsU6y(YU;N@Bb?JG>lgm6%B=m1j z+1RSdT1lN(LfmJW1$8*Lf6R z;}BwnoWzDuLO@)IAR33-8m$C18KEu-O{~@q3e&raF%ht&c4S3}4$-m1Wb92;6F?kd zLR&ngtykIR7sWss(_5-3VbsQ=y&mG*3kpTcY5Y#BF*2)5!q{Qc{xhd^`X1nS?+f7A zH-7|^zHR@o+`ky+>+8tVGiwgqe5PX6;R@K0{EX1y2Ha-!fk9>*9$gH^g!c z<2}I|tP31e%d9MyROwkJTRBA%E#{*gfJ11};edz%C6SWIi8+hPyPLdja?~^+ild`+lkQjjkTod@*%R?SoN+F55J}5N6iZytr zIIkq;xWvs==1h%-dn8bgYEq8HgKg+A3n|)A!nZ0k7()mF@w4je=*)N+NFQiLQ}_IB8$=& znHXsUehD7!tW#}F(W-=|rooc*1?imySw@E={MKGfCfBs-u7FOX`ZkFrj6HPCqmwh~ zQ^04B0a)73cd5!bYn8)8<^1_oM&mKvZpL`x>2@qRkXfM;VI08Mi#Dt+Zw!ikazJvs z#1B1*JyMM`FpZoD3*=tsMrPC@5L7TaQ>X2kRjrvA+y@`?f$CekVOnQLK#fLe6~KC$ zCTIVkM=$~MgsNFX>k^-&-~(0zWTCa49@4goZ4bmpSG3s~QW{5RO$l}E+mGJN48TP& zp}aFD>>eVyfyUuRIVOxTt3#yQp}DpLbqykfrY-*$gO%viXkrMtlJrf1_&;$EfWe19 zsy0oMByjUq&2N45Hm6TV@cR9PCr@{nZq=l!tX%4H=k*EuhYeXGa|v@^SzgYldkNb+ zHKz+ptx&5nFmlZ9Edm)9d;z_W%|s>UAQhx#PGqs{&`0SEUfTwjqw4A?h0%dQ1Zf0G zJXy!Fd25Nhs}yG^>>UcBu1S}3Y@+ySh2|cDL%qdh79CbciG6iUHo?~^o#iTWpCO>) z5q0rr@gR;sio1K*y2C!6gK3GgT`~=npZp^D&}Lo)tw5&%oRB0EFBz#B%u&?)ce*kfL3KndD9CVE6KrZz9uWh_9P? zHHnYlg;u35ez}!~UgvI_WxF}tSuKz4?TYB zD5uf3q<*2~l9=-|3LOEzVtHk^X3$L-SYc8JUOs5}t}9*KX5I3NoXGvjQE_`Kdb97I zRmjiF6!dth=dmg@j#bnjIYlR0zZP56=47@+JL~I!ua#UzbWd9<9Z>I0$yQP%73#fd zl#me6;3AU~qP=T|j_FpQ+=Hf0$oc_w_1x>#5b)Z;9ZX41^$4XS99DD6DKbN|D^YQi zb{dC`gn6vH3Sa~InoUAtKKnQR>y6JQ0M6=DBF0MVCT?stOs4^NCfb?1w;J*s_5*kk zR%c|iz(I%}-)mFP#R&l6#}`GL5;tmG=8Z2`*s7U}iZ;5?q;(vBjB-urcl8N{1WOm;{=# zj>+g*#ehUrDFj5LnydCaZV3_-;_;y*wt}?+?O&wc*hFg=FG|m`iUYNAxI?G}SEnQ$ zAxs@0*hDa?N2iLU`rzD&@gfg})(-hL_{}oIo$ZotYREHTtO2!xG>W(JYy_aL0uQ`< zz~% zB3J@Gv?oQ5jO(nkDKgWuOuCPyg=vbbE#Br#_X|39%Fz4bP|?m8Y9FytirO<$Z`JWJzFUImK1+%5thK<(BHz zlAcut#<1eRPN2vwMqvu1_Q+EWEoBxK;zLm-NE<4&aiX-bgjw)NXK`UnCz*M~IIB+~ znCSQs+Fl3dbJXTdFfP7crv=wi{AL}(@+5}{ORlP34_p>r_XEQLm38-$GGvE{MYaDkl(o~T9xgjtzG zh}jQ6f2SO^i7`w2Kw^~Pq{Hr}GQ4qzq%fq3!DdR*%WyVDLP_O&$mOe;!#$>VCnPP+wMjg#dR7k;FvdgCWAxe>o$jGokFYzZm;G3zNwH71k-jb@jwtPPU=v+I55tNecBNVKh64WeY3toiQdIwam6DBoONxvR(#z-?grAX%uTi03;m)8yBkwbch;&jGK2Q|ZG%hF0t zRr=`B<%Xbvwrb(tY()D!D4`4_s;oTRUI&ih6NGh_vP&bMT0q4OriYA7QkKX0lOJ~@(57QhtcD}F|bD?Fx*MVjl zaFs^Nu=Ln&3b{e8A&5mK5YC(y0gc9pxY6l{J$Dcusu>Jrs~#|Mk6!Pf>?3$7Ae zE%?Ub>lgyLN|;<95<-GKcLsL0@jC|uZ^3ELAg2?fW?hipn^Y*G0%fg;F$_mFk3X@3 z$qkon%IjY~sp<`7d|5J!diCel7xf0^RyI$`q#%(6jiMQbgB zlchwhkJD@3pvzPM7hq@K@yLT6GK9W5Y7B1T85_7(dbT%8LLEq+=u_(4=RSQm6#-uucV9*Yx3okYOls* z!oimhkL;p>bSb6YYdHM!A=x0sPa2w$kJF>Xf{z!P%?+-JRc*#7!L-3stf<0!6Z4sE zX=CuQLQ!3$2Yo4NV#IdPH}6tXfwk3)!)=Ef2X=2(bP_oKK%cAcUFOx7ho}!25uSf_ ziV;{pmGbnNj3QUQv{5r|tI?*VBX<^Ql%;{t8>CzvB=p9fNfpRbA+&X(;RMCTEL*Wa zbgL4%P~<3dm=z*%)NgpyPamsL9nds}rjB3+g<>VA`|vW|@+Jo_W_U81s=?Que96+3 zz&N0l;wKFz6+#(7nH5bbKt&AT9aMW0^0h2Z?QkBOMEfmba4w!R#LVZyp$3COYH&5A zy^Q*xp&2X1`O`FaZ=y{WbDWJ&?Ah+sXC~Mm316jNcs%lGP?AKjMlb=IOt^WsA`y7_ zp`5kVjA|Mfj~x3uHDQqO!e&J|jn!cP{wE8qXSAgmMgzqXY*k&{6xN?wZVX-2a<#@*ScdnQFFk&Yo8!UZ57$13OsSS%f*NK*bpnZXRqJS@i}se z^bMVwuuyjB!{W~zdo6gOZY+IDuC5%izFu=W-N#eMYi7vjYIle0Jwcwq>HG+4sE-8eB(e;XCr65Q`GZC5+)Mj|KxDs4rXlhGS3!0=< zw-4}*FuhZvCZ(w@2X{2~pSYN$2C!#(SD%_b;mn1cyN3-A7|xto0nrQ(ra=&6KobdQ@y9^bXGvGEz=Zb*#$_>_t-K$-o93|I^IH6 zsP0avn=T@XuL9d&9#br(_{!s*VohwwVcydix!IYjo*h9vcEiq>4r3uxQ1-tvV)dy$ z+n+il39@`r#$uK03ookSy2?0hac|n*yAhwzz?72%P$Q1@)!15D^mXSpF7Xap5x+$4(lr^ z%S)DL-o1)Rg!jC6i7X5B`zbaxTs&J)T&wZBb=;hTn#k2$UlDpd{S{@4!twn3rs zn&6$p9+x02J+jQ``jn+dmpPr^V7x1&SI@BZd`+4KOakRFi=P$fpHcex0b~Z-6Ic?= z>Exf91cuRXlKX;}riS6r@#U{fsB2|&v*r`Oe+WkS;urV1{8*1BcF}O*LYE)-{Jb&yXts+60PGb;0IaJP{3UtrslvNDy1Hy2trY-}^k9Mgh z0gps}vm*}*U-c7xr+h4y<1qmd`i4b}=xql`wL-}=Y~ z(^7ft@jmbVjsfrg&{G6@@-s8^QhRMXUbUJ5e*YU!OBTlWP)Mbc-wTEezvh;w! z)(Dr(Y+nRpMyoGo>Sts6L{Ch_VnLlQ)YF<-jM&!Y>-^tLg=#y&OON^=oT8HAt{rf8 zN%+cbgR~7bVua8r`?ng>)s%9t##Vw6LpXM#4L2LnOmr`FsP}78~M;y;ubwmf6N=z`+BDLP;Gj`JDrW{^3nU8|9rwLoj+DXGgW$~f{vwW z6c=K#RxrZBM#<7cUDlskqjO5UwUDmOXp*K zsdq|Z<0Ogw9mmd2&2BrKV9B>>E3+_rX~Fa44Q%4c*X4wFdeloO_nAA{aym25bk>jP z7478QsdMVFi-kr3nrXlm370-_hU%a~#ZwMF^|+l~sz(=Bx|C3?<&-0j4=~;FIH&kJ zP>uqp-r1+vxJhTcM@_=bS2L142J=bg@j)0J2;EZ&mmh&N;SpFd9}YFIkob3IFofH`&^1SU)}B zhkob+fBw&1;VZ9<$aCS!0|jNRc!jJGtc6=Qr+neC!9Cd{OWS%9uQV>u_POF0S8EU5 z+zuYMohR2~fw1=m?+o6>Sj`86^X+5T+DtDvNl6Z-Jelor`oSE#n&G_CJ)d#qdsbP? z8_vG7j~c;wW%ca?k|j&+m2@?Wdr=gYstm0(#^Y^5?Ecf#GTfY!)e|}cWoNpC^MP4+ zpc*JkL%yETO()cwyQocDnzYTsWpeX^e0E|1*18Y8rxyFZ`|+XPE4^OAxicB#iDNQx zai|>8F5KO!dG|A?NRq&(K7GK`Pc3orLeA!$n&11>4lBzY`UA`D+fzp4Hto`ij&n-C zpAhQ6wXK@0XGv7CXA4%A63T;S{<}^NZ#8mn9C$oDlzRuhE=uDpfxRGkbHYvqRYReU z_0tLNbdQ4_Prj70yar2Od>Mb~6lDGuu%N{0Ya$w_(PjcH(U?jyOywX~zt=-AXvh(EhP_jJZ~ z=rbHDK|-uZaDigk&|6Ko`RpiOgr?2zH#%>(bD~Yi!XL~5OoRP$uHmk{0hwm4u)9}t z=WfI0OG`Lc@{T7uoIRUxd!xjdNN@v@?6z{8+-YZp+`dzCFl@MRAt&n?nh^H|>@VkS z!Bbl!lf=(|?1e)#i6`I97V%yeY@*{t?6?401W}K?*OT0;3f|k+4qAef*8l)UPaPR2s5r22u5gT$GT|0TTZw^Svg;@yV)T5(d#wBTDQjR z4C!6%amF7I90W1QS|4pMdKb)%&LipdIe<;dcB=Z?n^D@v2xaBD_WF?j```Kw-u=u4 zo_p?q)29lOL~u^O+UOd@3XNCx4;^W4NOQxq^4z#F0ef76np!E&} z&Lq(-2KXnOo5jy9h9UPO!<`r0f&{uCxYogOCMA&I&kgwUt2Mhf%UG$`F;uljQ-hbI z<8pd@&7@JRu>I^ELPA@RsMG<{R4K%fiRIz7nlSY=-mp1IV{Znr)Sg^k{M4zPy*Yqi z+WP1yM?Y)iO$G-^94vk~41D3)Z8kQCG|td8v48H&>1-Z)yb-k;+W9hvW5=ECnyj!q z^{zgTKHg(mMvy|=rDY1?q7yb>nGjN$tHecc{OqL68JmSG{^a`>C2;}hW2GPMgemXs zT)l?&acEVomxOR_f-OBEH8epv*lJk1)MtFy;57anv-{{-9(m5CQwHl6yOLA4fqJ7L zx#jH_9JUE~m!fw^_+U76mg3S1>`e)#WoEkanGeae@>qXhV)VB&^)B333YGVN*C~2k z;nb;=$!N$U59YkYwV-xJsVQ|( zmUByI6qwc_HqI;nF$3#fyBJ>!CjdSsnX0paAjg3`p;~8@o12Fh7Vj<28A2^wSQYG2 zg7Z*S9!=vuyj2ybUBJtc#QC<2#A&R*NjeE-n$lDaE(E3?PNx+~?I`P*I`SsL2f+lT zzkh)9U=pE%GJnwg@;wcnMOJ+zM|bZ#{3*mSBM)5d@k4*&6yNdfXLlL-Dq3s7WMh>e0+IYVFM2BY{6Sh*; za6;masn_G`Ht2Cy$1BIB@eLfEd*jE}PLj|~Qx0|;BsY|0U@~l|>%ibbpU$ZcwL4Pl z$Bt3Kp@hs**PhTzc;vB^v$;|^LtRGFn-DqC;hAOjyp7|?qV&DGck18^_l(-QHM})F z*L~pKrP!zR#AtMp=$P#8R{X(phg^HTVsF3V=B#j8zQR+tLw)Xsmly|*riMlr`z z!)&5$}H$aI5>3t-tX@*nRvFgYrgdSh$Iz;Bab3<2MObP`{adTyHo~CDKAewd+SlPxHe=s37BiWy*C2#=tLg3r(RETtw+wzBABXhSO~Y) z6JE@Oy&Z>Sc78!%Bdu0@J@&m0XuMKZ0o$?UOO^{yFLSUlVenW#?jkCRcZO;#WUD#Z zg)XC|jH>pS6qaJ=H|be^{+v8Je$%1nDgGaJG%T7fMB<$5Cm!!pFoYFYR1_`TIa`F|+_|WmWU*6=_i$h-CDsk^xg;bdgEk(z$*YkYh#v$7`4)M;j z*0U^Iq3MOK>5}`ouR68r+tZ_fxu^g#G=B@z`O^S0C`* z?O65>T%0CxV$i&`f)8-#ZpG)mu*=SVMY$h%`u!_hd1RH&B#`t98XHURXFxa>q>&TS zsCo~3wZ3D}Nh zc<9-_T`?Ngbk{os6*{Xq7vA2ZIt(;pp|Z-W6VEA>yl+{_gwstRO(9tM$N$q${K3Xo z1@Kq+l`0p0x}$nbJE}%vJ4uCU>A7{gWNkHLbuEbl>AM%iqsMxj&eC>X+p)${<#6AAOJjgrx!kDD*g`U?uf zoiFUN|B+jihbhH{4xg_b{??ezg#tIJxta<|24is}Gf4l*hvi2O zb{X^yzwys*vEIv>ygZE?SuMKzi*Ekn@L0L0zA2U?7~xePxZwi39n0%gpzIiaXQ$!v z>6D_1Qak(J`Pp({E*1R#){y1(oRxDq=P!16;vFmWiooOFy~g%t%`49y&|OX`r?J6j zxaa0m8fWusYznSwXv&7cddlfe2QKw_ZPhXz)m&N<4u%!yx{#!Sem_tJ`NePhd!PJ& z-j}Do-;*1|jpj=C@}x25&s5CEL{ry+%NKJ%IXHBv!jn%dbN%|5Br$K|g$nCy8C4bL z*^Q%;MbFtYIS)VF$N9i(*CuSh3F^T{%W^_FZtiW}Q@Z7YO*$JNwOj69DGG9K!uxGx-# zIiuy9JrgHqm@;btuc4ztx!Z8K zS>kJDKR4X=!b_jt;gM$s?B1>0IPN%s5C`%F)-FWO_|%1*gOTvcS1OwAlFMD;%bP<^ zU+Hox4Rq8qSXTDO_Gka(uYTh1z2Wu*Z}h^o@>+SZxU!=ne|8c_e`Bpsmde^%&e9-Z zXS-r!qvC-p1y`?jc;%Hb#t3#HvEK8v)(fZMbr!K!ft~s}nZsh9CK{2f6j!UOd?gbeg_F zd$tsY>p6@a9IR!$aD5ynFs6q61BVorD~Y9O;$Wa~Vs=fCdn?~Wp|hHBrz3p%wFyQe zsd3?<4%>I)$gHem@B!3&*3M;gmlO6j$K3kLE-$`NQCCWuD_O1-J#@r7-!p6?P4eXJLi`|WVXd!ln{qAkt)83%g}iZWPBnT{O&WlLIEwr)%*3K+Va zVJWO%$~m9F0~uVt*d=!ji8ibZguTXp`nO+R`>UVYeYyI&0R-46U%&fMaaFxBe|$QN zJER>K4eag5lG`(93SNHYkfIPCe4xkPUPG^IIddjsH1Z7Ff~HQ##_~EJRq~tBZ%1*W z;o9pHT%(*im2>@O#kTjXpDkb<%N4PU(=6oJ#-GkXdFWX4!n#vVIXEMR^w4t(Lpt`1 zCq7mJ+*51XIwG?v3qy%gs?gR>dsZkzx- zEG-8ULw7ylk37&t_DXJf$MkT*daA7TpiW$KeJlG5AAa_?zWi0U=y@wN*rWXipVi>L zZDNv#!puErn>k|ngmQ4`dH;8vVQYJgwL+(pas9@G!voJ?V0qwb5AOn#Nr>4BL+jMY zG4<)&oX*KkjWjh(N>5Rw2yl4l*=ic{zTs>qVKVY@gtd|Rkkv(dC^mAG)2VMuH)7#z z<=Q#hM()X49D%toph%!<0;d|t?$(@nY=zgmaP##s{pFOmy`xW61+G52MiUyIe$OhW zw`<|K>mW_$U71TiRpkt-R^l z6`n6394|gU-IGq{86r7ueox$k7{6fIU&#Em3!-U)ux@I9b8^c z+FpQoQG|APm@G9^^^wP_s&tBkM;`9;$}3|Yds~O9Qr4FX4uYe1uFGmSVLJ73x}%YK zhf)ON$elM<<|9t#YL?@nN4U>y?;!Jyabo4P#$iK~u_KuV&adRW_k-*7&*um^U-{w= zyE`RMuVwUiO59=KZZG2tw@RKlS8#5xLI}7tu$(D_6juAnP8B}$`5UW$`KzhUuL(ea z+tV9cSGx}kRpbZ9_u0zH7&tg=_#@wOnm_(W&+_VP2b?{f^9RojK@1xk)jWuw_3+tt zMC6PFP*s-t78RkY{ISkj)wqR0S$e+b{mVS^wjSp%bn#8#ux_Y(32%G2#}{9p5)?Wj zbLZojlXD^u7>+qUa_sdt%IVGDZ=kL`=`^tHKt_(O#B%+$DK}o;Xnik&kw1ruw>0K^?59bdtwxHIN_um zd7W}^;gg&Iv)xv~8(}(eod1qfm`hzg{?Xg~nZNi5-~CX|t>4|@uufUJn$fvlQ6M-I zNRmLBC~2zXd7xKV{nSSDzx(jBZ|-$|LjZmhG@l&)&T8k>`%05P)Z7Qeix+dA`_h?2T8&0ifoIl@XT6zZk zg!R>gKlXj+SzqmtT4n!M&E{)UcCL?^4m~C{3}(H1+`EzT@wwe{Ov=IuppQQ<_q@-C zHa0Xst&F|roqzrkWukoBm7MDHd))r?0V9_X1e#qJKVt$}5&_)Avy=rc3^HEWYyQqp ze(v}FuY8T04Sp>E3XtwmPEV!D$CvEjk4+>!?FkF}9mT|Lx0|rF-LznM4i9|0XOOhCdhYdD0SY!CYAMCNSTT%3shaT(k(9<2x zTv_JzuZ-r5iJnx8_fens&}DBRX(xdT#9<9tY6wQC$DVP=@b(`$Pr8=znV-Lgdv3&d zuVE6BIQOQl3B@RhRcxYc;yF{m11lLX?$y8a*FXL7zxpP_``;9lxB5QQjy}tP>f2Y} z{q`zZ{-v8Fk9c(pe5tawYDhE7)>ebHaigrdj*P^{MoCo#k|d^(v~89#CaPA`ZX@U0 zcD5*ucJ7@T6E6}Gc=+KCf96k}00WW@b%J{V*gZ&y!EseMBywao6{wxU; zNnm0;oy_z2YRb#Q`j`LKXI}nGBkoLQd#@}cP`+srxCo#H`nSrB+gFRV-|O1qPYp4> zS$HuoZgSD-SX(XV6qe1+lCtu=^Bv3Fxm%KFF&;E#p|{+~Las1|C^N^$%=QBmq1R2Y z7FJgZtO)T0LK|X_U|G z)x3DKV#hn=Y{rsg-1+ql@}RgRq4YBjAg+29L()A@ms*iImB>R2~1gP$ap$<(pGS7S`1;1ppv z^i0dpZvOn{N??{hoV_muWoap8GKrf;#m8FyPb1 zM3TGBd_4S6m(5Mb^Iw{9=Wa>bZkKbf`+qzTU!=tlXqw2q9-Pg1<@S{Ee#6Ezu;~Na zbztM5VQ1_(JdCYlSz&qb!7lq-C3txKZpFn5ecYal-&Y4@C8G+^MahzYO#@jPHx7Gw zSpEJ_zx2vq*)8vk!FJ;K!sEqq-zoqXBr%CwP^S6ncDZr0XYHrgZU5U!Nmpx*>e^-& z**T?CST0@aaClhr_+ta=IwpBfvN6Z10J6B{o%hk!>&nMQ*THb3Xsdgu3+DG*-X`A1TA&l%+w6^UB(KPU8aGcPkpN)WJ}e z%G-JwTcd`ppq#qWXEJegQH%s^q7V|g_4Sl24&~Gjib3zi^ z?H&?CVq^amh!L9@wcWeyd^w?c{+x6#BiX6R+=*}NOr4S>hBK#g4h|cJLr+}?&YtaZ z;k@v~4=0UkSF@bJS++}fT}c;OwVJ3O+Saj;$EMak1ZKNoUq zczHPa*spKB{&#kC?{%wbj#8?+5)BpNYP?i&2P*0l0QzqgfcF71HTWR0x!oGI(r)9P zbq~XIf8QT`>YQZhvSgPkY+BC)Xkl6gyjPZ&GQ3yb^UN}@zBZ!MN!hqlBVxF9bIis@ z$<-?zs#+Ni-MlE+yagIUPe|nKzO0p%GbwL-YQW*x@z4L~ZIZ;0rg0ks=af#*^7zAD z(gV+GVhN?kW`^sxr<_y6`P@>C9Q#8@k_$x|7^H@&^E;nE-2S=G3}5{PC!w~n@@C?L zPVtmTT~bR0RkZ-#VgUb^nV7E^zy%;3kVYoEo$;?K7*tJ=G}s__!ojnN)L%YFaXyoD zeTv|SvqM9G%a@D!?woh-R_yOP_76SRULR3(5;{d3_vL-N??g~UzV?Hi4O}0Wp7*_P ziT+B)XFjvb?OP2tiJWY#LXT7APYqIfwJ@FrT-PwH1F3`Mb}QI2fHy*#KtD62qRsWm z`1d|Fy7><_-0pMMB#H69gfRA@DG{awU(#p=QpF*a$E44FE$Z{@1@Jyw96W%I2MtelKG(jRO)?;h_gR)OGBdomP&E z=X+#n+f%1}T>#E*jZ@B_?@(10w>R9Jy)muVyR>Zi6MyU+H@`Awcj$QF@jj#NnzS{l zuH7pU5ju&`71*z*&wX)x_kVo3+WgH%>xm5};QiPKH&*-v@26-}(r6ha&n-%y`+C6p zTDZ{reQp*LrY#NB-sd@)7HE=_*bZt6YtjxzIv6QDUOT3bnbp3E$L&xq{IP@oQe z&RfoQ+cZ`v%RpY(w)$Im3swAI{R-4bs6G8upXZ)Cq|=R3zImtS?AeS5E)~4=(wJtd zv93pj;KM=*h)@_qR{|kauif=~zka>k`W&LA6{`e4CFsmy%r`Vx(-X zmIUR}g$%)PYhyy=W}IoPZu>?ga8|2Y6me+4pl`Un(Qs3oujCz1 zEU~*&b1-yNRV)ntMsKr903Tv1E414y851?ZthOc-O9AB6+vxO#1Hb#bcl6*Tg4S`D z6{!hsDn3+BOo{gu_zGz%YEwg5-^W>TU$4}CvjOBpke@ExCqNEG3Lzs+bI_E;=BUXr zrm$*qtjRoHF~+XjrK_i9@J?g;@Ai^i9y{q&Htr|8w489}Ou^pXbl#KkjUM#LvO#Gj z%^(ySNO6av)k{uCpWh4n&mM;HHbH{LLI{;7R0J&%U*mj@NJZV$a1U_q1aRS-b>hF7 zw}tp{4q&qIID$uvdN6to4>rl@8~qSiSe z@t{_ENpEdnyB7wgd)aF7s2Y3DlAU%)-;2pqDS}v<2hwh{c?_(R(iXlIC;3|m;2TkJ z$wE$XF+G)l#+9WBswpHXiCR>X_OrfiXil&;9hjn5P%K$VdYQ>jS;{OwqQW8GnLAMLsDyOSf0nxsI} z*7}KyyBCW`8c#Lfj@rZYeq(9At~AiUsQ}*Zcbj{&9QWiOPo%Soc9;0sXBQr4C&%(G z09eocmG)lR6D}?A<*|W>3sUq(&n;Fa>c7sD_=n*pC+z2<>XonZ+siQ6odYv)r|O1VGwGpIktkKVUkW|ZUTl&V!{ zBwiL<=jJ)j6ps|}5(1!AqETh7*=Lm5p3!QZF|x9=$*#G1UUTn%TcAJcmX4lk{FX{A zSJtdMCq_?oI>0)Qvliz);{ATN)>@&p#u!5o1Q>5IxPfe7p3WKd&r_Q-58ZTx8vbtq z^jkeLYgZ}$;8^UhuR1laoH#1Ah{QWQphQjHMJd$yS^$xWB?ww6GD?%rWoZfxM)@6u zKz(mYPX6(hqw~A}zX1JyuN1lmqML>z`|(n&W{s4}jCe;yU|it>6dA1uwL&X}s?Pvk z1n&hAA@M>ig7bn-ELorsD30#RA=zfivD?#{Re!xmkN(~DC(bDU$$;Lqv3hRrsQX{T zRe$>6$S9?1#3+h=VL+rIqck}Mg+SA6G&!v?4PaGjpb!D^LgYPT&Qo%pvhz6WX^j$& zE-0=$wvDEIfoFyc1LfMPLdY$5pVs=+e;H7@f8ms}mBX5E-u(Q;wPnln?MpxPiN4YJ zj{cEaeyBLgSZo;$14>~)Su0#%D2R{^1DcGcU^E3|$ZCaA3av=RS3rs2>x?GiiM&wp z!jN^ySdCz`MmwHcPH*F?#qF#dZss>VQKdKLwy*v0#2-zcv9+d_G5VhZI`WMLccLh? ze|qyx0KeQL`6s)J_wFf1@88ou#Au~P#X4#Nk=9tPiNb(#E=!WhLlDwtgs#BTS_hm_ zlcEbL$f(X}Nf=Pe zW+~-bDC8=-59IejN zkyx~K6iZcxdyBktA>4aKNTx8KXNG3*;zR$3^Iy1i@TfQTy(_$I@X^--8XWARukdjd z=qa}BJ2!pwjKBKEhT;i*yN8$d_x4k+S*qR>3s}JBvQ%<;GCJbA%)jy%EkEb1{L7eZ zp3e<`jJ5G}3Sojrlkpx?XVi%h3)H-);)JSqSTBfA^)nJ-L@8RFr#%-Soq2w;ZiKw9 zao5{caCZC2biL#4JQhh;_0iA$xcse_+w-R_{DC_0*9SFL=D-Wvm(6YWrQp7(rdnzx zlq;(@tgUt)zh*Q?aV%yuwp0>FE%8*Hp_FZ9x*6fV%w2r8<@-zz2O%4cAoqs&!o~*Fo0AW4#9_m?$Avs$yz!YOF-aMKKr8?CV@dBf368sz z&O(W~s+Z=lf^UM6=4Li!=5UET&sn(*lxZRtRCr|M6z(2)C%#L8_f$oQ{G>5T-Al@< z7fIiE56%r{^pQCYb7~`s!`=(PgH_zlj6u(B|fizim?JlBTk_#7-up1X%Y#j zlEtWmNHTnL&y`f0@?b4^1zO{^!Yg%P5IhOe3&uIZ#GwG?J+ZYoYw;pHxv|XW%2j^+ zp|d#u$SxjR^)$y#T|rhJ=E%+qsJ`o+tp4J5E_!*(GO6*f%CY4&Mfb*|r!J`u=!?dN zg{~Q%8Ap1;0yu4O+F-T8DUCB4s|<+*NT^UDWU?`9stdTQcmpa--N!@(Gy!UV25}zk zJb`nB)?*Z)HBKw6(TLW>)f$2KboZAima1IyXLDIJ?+7H?OIUdZbSu-QwX$2c67=qF z>X^H;<4bqie`&;}4+L5nQXS=eF#AZyw8K51@a`bSx&G|ZV7NtTf-N-)wF=5AvWX*` zq$~xA!z6Zc#Fij-WD-X(_|CE$YEm0SRof%a>?Y#B$gntkXR(K=)@9OOJE%)aTsO51XQgf z)`q`%_(c+HL1}cyTftS3>Q?eWg~eyIL%uZ!T>F|jI`4Ryode2M5H$%V#jExQD1Zm? zDOjvx&Z`(=i~-ET(gz{Va2u~o?5q=i%xEapc&PCB2wE9dM^2(0@i@%Z9iVp^39&7f~2od zi1!0Jbn8)~c|}}>S~;X+w8AldD|%R?jKb6` zQ}#MmMziUjdJM{1R2`@m!FYkhq7qA>H8`K9cGe@#A=V<+;+(@;_}NpNxM=Y_aKotV zR3zR8C`2kKTf;dPj}>!kGr62UNt+)|0NwnT^Rv!!hl&ZjOM@mk0IWd$;ZlHjRreDh zE@eE4VRW}(BdD}$GB}c&C+wU?`Q#JWRa!tMiZITiL?(yxM5PKYNpN+YGT9vB9Ns!` z7Go`eO%U&SdSjK|-o4D|s3ER|GFcD}rWxW9ObhC;`EF)uQa=Pk zh*v2nb3pDW>Xl;aR2`@SQDj;@m{tl4kD&9Eg;WNLw03pSdg`&<_gphWJ3DEr)y9)h z#QRh%D^;+Tzy0(=djkXyI5xR#ywnqmI6NlDgi%&YC0P1DA8U+ zuDgH>G*xka0;t65y((7tIy<83Z2C!KG@-9jXV#4~n*#NbV&)>pl(tryPdboWHSM-k#ZrdGpnC@d(mV%03Zvh{S`_@1+PdU-(iu64Mmg293DRC|Z` z{pUWz;P1OJxe$M#9~CR-`$Wlv*!oGv_S44$#5WaLz$vgGRwEH)nuG^CPv8YVn~Vl+ z6Nn=uiBk}93`q=ejEW+3wSq2>VUidVWDsX@NmL&(k|aK! zQ~eTjBFt(U!&pa#1X1Z1)(1Rk!&I}(!r|FY-Q+$>OnyQ1Vik~V@i&HD?#FIo-NFwka0N%wkIe(phrUZ`Ml=G7DL&f`ul?|fpN4pG#cn}`V;{iUe7kdIqnmAamh zz0kW!VXIKh=J;aa4fJHXIJu*rooWW&)~NcljH#4*ML9!Ih_w*M4S~Nyd5;o@_C5va z?F86-HKJC`0&CGD-8}#4#~57G`>IS%099B2+;x9&;Vfqj-Yd|8_G#23Y7(46Qt=f* zD`8)cruzj&t^i$Kj^*JrUScMJG5l`$aC|0%m>Nl4Y$w^Av_=AG>&PT=T6G9A1h$6u zHU%klHtVb^=TO$+T|Y_BuUPTnnt81N_Dz@%c>N2Gp*b`l^+Idh~5tW5K z8x_s%(A)v-t)38rA5|!C!Dx)PhVcUbS4DmBhr zwUhohL1~w=pblN0)}+6Qb>O{9ll}3aq3&X&F#_^}ixq`dXl@pAO+cWS(Ny7^M=a;q zOg~BF2$Gnw3P)P(yjMx}#jI{~v zahZ=)UuK~zLN3G9bI(DAA+AL8z$40aU-N4 zswy&B$QJ~i0TqA*n%Vg>mvrr`-U>6aWv)143m-e_IX-yO3tV;l zMixyQW?(c+|42xv94e_nRIQ7u1!u9&(Qa#eB;LXTS0YgXi*CP-6TW%}Q_eY?WTeR0 zwrxlpqk>>R$LTS;n|G61q;*4oh)Lh+tRfQ%K~~U4p@P&3 zTQtpq<+7=}IH`3X87!S)l@r_c@!olx`1}cLxa!C)9Nj+5jHU{6TE;m0h(4As-p9UC z!;8D~7^6`(fw+bWv)Cl2-B$TXvYiFKL@jaXFksDMHOtMp_aM(MR(s}ynMEmwp z-o68|7G=!-KxZx4%lXYMy`#Os70T(^*2#F|EA5kvH^UkbD+NYNT{RR0g3@*KA_|M< zhJU^mEs&}4&zLm(p+3g* zTIYoFkfO8)qN32()WqPNCi*1Dx1V1?;?g9-qG*f9xM^%1^IeI^!QwC9&YY{Stm5kH7IUW?p_7i*CPdLTvXw^ebMv`yMKrH&a#mA0`Ca7@o0C-s{J+ z60OiqaCJtrg$)u38Zltwg_eZoM=@G#SPBA7;L zONi2nY|fz&tU#NqaZ~lBI!IyBvM+Gt`)**{x4%m?un)10&42s%ob`k6aPmEOlAAe` z%Fdl^`_^}ud)>8koO&`UFym>oo&cK9_~iqh$Xk_F3Y?`L(Mam-l}y$~>yeW9lugqF zwUWk_Kx-ik(@k+ME$t>XMXdtS7*xlEbxDDrn^|lRTFC^4rh53GY>X8}n~%6D+Q@uc zByzB5*%vtK1Mep(7TNKGA7M)+Oj8s6k3Ye_r=DTTxo1<^xr>$W`v60$*Rb<}2MO|d z#&+$bDVrm*Ze&7q=_D3 zB51~r(fgdGShDFQ1z`Pr-r?hD^ zEejV=+PsC8@B08_Tebo)?F|?5XFvQN{ZB0Cckg}=I-5<85QvZs0;=L42@><}36j3_ zbL8e@yYdp7x5NpPv1xrygPZ-0lR6+12{J-UyHLp+?(Cky14CUr6}Rz7(!pppDGYuh+QFy2mv$F%liSLCUn2IPjA72Zu4M4p6|B1PLu98+VcLZkFzx*F7*@OMS^2(sZ3rx#dPMKa~O)1aXu_i`*Kq3&}3C8QA-cR_-#Ch5!=4R<;zAq7Z zIN^?EG%uLX`ek3H|A{A&B%%MekCB@`ooN@GKLNJ7dk=PWl(xl->G|nD5f2Vxlp)Bo zJKwI~^tP9`4ZWfzao5`6@=XgnJ5*xMi>;uvYOp%00o)|ZugJRqCyI{Ha_OuRCw5ku z*Bp^C!f0%$xyjbPOJZX0Y4Z^uF?(3x%aexZ#y_XHZao8!FGnez`b81?ANlQmU?+}2_Fr5SxA+{1RVc`TRG~+_p$l!{x=)G z`gK$oOk_SvYea;;2C#*>bJ_L4gSbi=Z2}@K%sf)l(ahKG-7xsVYj(U>U%c?<>PYan zHRlOJ2tq{=2qs94k{LHp28>CAf7ReGCuTDqc%(+H>I&6q*w>8GXRjMF&c-PbVq>~&7KyC>!12F)dF|^utnu`P$1aM7Wx02B5Tvdq2vo{uK+5ho zqXvwACA+8t7*?Qzv@W*oIbm$jqr}pA#_8ne%wcHdD$3p6oP5t+%z4*UX$Ss0-{bku z+zJY2z2(i!T5>t-Z~rpM=qO5SyoZ){m_1*U(S~AGzIO6MFW>sQ&M*L+^Y}~ae{l2i1JR8*5HWY;sL3Fy-It>}M93G{Ysi zf9tOoe*s=T^cjZ6*yjg(2A{ujT4yfn^|?+a6J{FL6FpKvza@Y8VNAdHB4%9rCgxmy6-jY~ zXRrHn#X_&B(fSm~4)GtDv{_)qZxVr1uES=%wBRihh6b@y3RPAt@r;UD{i=vT5lgS-gq&Y z&JMbN@=pvr{shs$K7ve!Bx7jK8(!QS{q~ymTR;0;xjayRR=a=OYk#2nP=}`*iYex{ zy*)qu$>7jkLy;W_EZA6xBZwnN60kAYq#oJ%^m<>9qgEbI%o}#Nsfk^`c#t(8`y{TG zcGQY5zC<*zkIK$n029>$oy`&i0b3-?OOj>pa5D7$z59OHAbE1A;@E2$Bh|pH0YV_R zu2vaXT`j*nLuWdsXfrEBDeKeNT#212Fyl=ZGxO3n zVVasa=2N#24-N7BEuSVSj-r)j(0IlQ!mLcx`@qo9o&P>sTn|J*wLZrOu==`y9tgOx zbYw=Ht35h4x^d9DfleKCwJXyWps?c=L<`kXkB#M!mB>c0Gv9m(Q_nvSTP(8Th8rnu z+Dwqi(o!%KI<>1N(bM<#^xymVNNIf?V5vUW4ge~z7pNTU>`8sN`mkH$sQ2MgaYNDB z!JJcvH!G9VUSVTTy>|V&UOEgJS-YO z@9F9LMQ@z!ssk(n8c#19*mU(>8`q0+ zeOH@+%n8lS$;HiWxy4RN#$L&UlLP)c4{E(|79)cH6OuFgL2ITW@L zoDBj4M-bqX0h4@(jgTb~C6WT5gv3fnE3G!n&hDg6FWet9s{n$s3tv~gdfhYAJ)i#m z!u$Q6;8PrruD5=-8?*=3Y13BL0XV{xGeYOasZ9UbGe!Jqo-h8|8y4-cqqgVbFIQr7 zYOM7!i8bSl5%m__+5?pow&Y0JopPMj8DBm(y3JpDd57rxe}h}FHJs8{GFKErbxy@P zV*&$-NK#eF>)<&8DJ23h#-OyNqz%PHV-n4HUvTP_HWDjxUBhO<#xT2J#YrOk ztKrJOp8T0?u4}cp5wl=@IOV^%!wtCa9ukP*{n%G|`6KG4~`{*X0v(ihrs_AzeQP;+44AkOT^Xv*K&tG51BRiQsCC$l(odh zVzh=t(KuKln<%mZCZ#3+FnbhBR(J8k&u?Mw(I@ie+hx*=uQJn4&V4=gmCa8dRJp!k zcYHKx#)LVjZzwT8x{p)}d`}}iFj)@oaqGBkp;UV`rbqn_DiFyLa4qYtgc@LG1HEIdW3kW7~?m z@Y+Ue+9!dRkr*optxuqQ;)+LXT^wO}XZIv3rXDxa5E_UyB1#ZpjErKuC?Orjq!W#i zlGt}qzDEQse=o;_FK*$KxqpZ2PeAlN!;F(BV-Nf6r21X{CHpJ47tV967~g4VZU>{Q z0$2oC_6;Klb&3-1fyrPjznxNZ)yK}*~jM*vA2ttcdAiNsP0lo$(AQ9+L(l#R@+_;ISR*vV^U>ut& z9_dt!0IapxMB!+IlOzyFD4k%E1nIa`kThjoR9>;EtB>QR4I@0wz)M5CaqXcb!!fuP zG{|(meuhby97i?N9bit2HMMgEHUS$+d{^;mYa3U0&0)*1LrTZkAix9xHV7b&uu5U2 zK&u!PR!~ueczA#)*URVzpPyWE3jG6R$TZORQV(xjc`Na7i1hZ$b6V*!Di(=Rwcr?m zF#=)iUf*-5Dkmd@6M;xejD>7i0U@xpBrL2Yt`sp*2(FJwB6L&%rI0Gd*OsBa0Z#kE z>Fk0Cpn{D8lr15&Lhc<2LdD3w0LeNI8_Kcr>OUM5tg2kuWQ38fHsD~Z zP#O>xAqCc0cD*Yo^a`3sIXo84VBMZ^q#Of&nP4y2J~%f~I7xyK;6)Xr*#~Ho80%?v zJ$pC3KVMB;hz|-@g^NV1qXbGnJe<46PmarfQh6JN0SX$dOvkE!hEwtlfAdE3W zf)E%4+DNPgi$(~E8<+8-GQt>yQJ@vE(oD?t)Ahr*p`el3)W_Cyt~SDIWwp`5(E=Q8 zs~XfytU_pPg~n!!Obh<4;dK<2XLA#=QX+&vSxJ+h(AhFf#!uKb*hpU~LrQC$r~<}d zwIVi#+3_G3RyNZ%V-}6a9L=t$pCQf-;-u62s_79pH)YnB3i1QTh{+m@)&f^pP+%Nz zB-A&U>f$d2Eq=_cQ(oaKEjxI!?=WHkI9p2(DdsjZh3JwkF6O~&67z? zY%H_l0WJ%+kgk-Nc+rJSIQtt+zVHIN?)fjepLmL-Si;ThQ&QL)zvQl6z32CylJk@? zqHd}VN4V=69bCe@Vq7^gC zySRAxUB=Ej9CvgFx>V*fci+K|#g8)a+;fQYdA8iXklyE)Qm$0CS`#1XiW^s`HK$L1 z-D)vUX^;}66nNOG-+3eDfkl--M&P6&bRC4OMsz-KsSLuv4#5lgR+gs6kk6zEl9xTrQeP*9!|-S5Hm{; zaY=b2V`fg{*!%7!GxkvOYt~|oX3MYd;Dl$MVACzPvGHd&lNmb}Q7q!5{0(g%yq~xL zvyXD#TD3yGBNBO3LKRHZ0G*N2L{wGHHd?$aEZ*GAs-AiTmO<;YOQxwv53iQbVk?+w z3tSRzr4GgDdGpx$_!Fes58<q!gMh-j8}S-s*gnQR{nWMZ?L45^ zY;B1jimlmVV@P5_979~2RjnGaNp+|QvPN_L^d27j{QF!swVzR`1Z6B0ZJB8bT&A{j z=&Zvz`kuS!d*MZ*fdSlX7OZ9M{Oj5C+*0P=`x`3VyV&;NBe-=gEfd6=z1^4708x{nL7U( zj<|k4tIoTC3Fmy1zGW}4{o&stTnDeAf#x|!G5GphhA^u-Y*G z?6a73;RQ^+@^UsWxD9Kdu|36vPM4v;J~9-9SMLw@k&Yjb5BB83nVGuRTBUo6k8D=^ zmF(757kFz$wE?mMDFnqlY+tW%TiQ9{$={KC?G4uc%XLh>>T(*VO{M3#C73AW@N52w z^*{PCUH31dWmJ~7u};)eHoyGWrO`DvZQmY!(q4(EDVYXR=d~Pi{JfTy|2!n^c52t+ z`qaz|j$55w58{fY=L3ySEYkOw{iA=U{e&-2*su}dNRX1YxpP_Z)idy$niyKUj!b%fdfOgMIZ=yV52$-Ptc2^!!8;S()Pz>yjKc`@UIoDl2uhZ| zZjI4Y%PXbmUGit@r*<;#>tAEt{2R!xUce~E2O5EfG|WD~x%J*Nn_6*&I54z6{D#(o);L12$C~xO7})c(4Pm$i zDAvY^V#&e4K9WlIJ523ulA83xfIr3ei_`1sey~j?=}2o&VO?ddYd~6CU2O!_rprNS zPl&{oGW>mh=#Lx1a7WFzq7V6){j__+V!xql?%>u&Efw#5*8ZKYs{LM$^gjE!&EI}E l{bTMI2k~3}QizW`{tu~Ac)WNdS1AAh002ovPDHLkV1ibK0T%!O literal 0 HcmV?d00001 diff --git a/mobile/android/branding/beta/res/drawable-xhdpi/widget_icon.png b/mobile/android/branding/beta/res/drawable-xhdpi/widget_icon.png index ef76eb342035c74cec6b6426231a9a75eded0a47..b03bc6e61a1131e383a889e44c5586a1e466a981 100644 GIT binary patch literal 10358 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 UhaB2#F8}}l07*qoM6N<$f+U@dApigX literal 4381 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 LNkvXXu0mjf{3ra# literal 0 HcmV?d00001 diff --git a/mobile/android/branding/official/res/drawable-mdpi/widget_icon.png b/mobile/android/branding/official/res/drawable-mdpi/widget_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..291da6033360633905d1c157310011e712a16bcb GIT binary patch literal 3259 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 literal 0 HcmV?d00001 diff --git a/mobile/android/branding/official/res/drawable-xhdpi/widget_icon.png b/mobile/android/branding/official/res/drawable-xhdpi/widget_icon.png index ef76eb342035c74cec6b6426231a9a75eded0a47..a1b4ba689d8f9cb6a748ade082a35fc2b841c6b7 100644 GIT binary patch literal 9409 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 Hu0mjfF%(u% literal 4381 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 TNXNo)00000NkvXXu0mjfjuIKH literal 0 HcmV?d00001 From 0bb1ace29ef4be5dddcae7e53e7290299e7f1773 Mon Sep 17 00:00:00 2001 From: Margaret Leibovic Date: Wed, 5 Nov 2014 16:17:55 -0800 Subject: [PATCH 15/25] Bug 1050405 - Add images for search widget preview. r=mfinkle --- .../res/drawable-hdpi/launcher_widget.png | Bin 0 -> 14001 bytes .../res/drawable-mdpi/launcher_widget.png | Bin 0 -> 7661 bytes .../res/drawable-xhdpi/launcher_widget.png | Bin 4611 -> 21223 bytes .../res/drawable-xxhdpi/launcher_widget.png | Bin 0 -> 32686 bytes .../res/drawable-hdpi/launcher_widget.png | Bin 0 -> 14158 bytes .../res/drawable-mdpi/launcher_widget.png | Bin 0 -> 7794 bytes .../res/drawable-xhdpi/launcher_widget.png | Bin 3917 -> 21434 bytes .../res/drawable-xxhdpi/launcher_widget.png | Bin 0 -> 31936 bytes .../res/drawable-hdpi/launcher_widget.png | Bin 0 -> 14001 bytes .../res/drawable-mdpi/launcher_widget.png | Bin 0 -> 7661 bytes .../res/drawable-xhdpi/launcher_widget.png | Bin 4283 -> 21223 bytes .../res/drawable-xxhdpi/launcher_widget.png | Bin 0 -> 32686 bytes .../res/drawable-hdpi/launcher_widget.png | Bin 0 -> 14158 bytes .../res/drawable-mdpi/launcher_widget.png | Bin 0 -> 7794 bytes .../res/drawable-xhdpi/launcher_widget.png | Bin 4706 -> 21434 bytes .../res/drawable-xxhdpi/launcher_widget.png | Bin 0 -> 31936 bytes .../res/drawable-hdpi/launcher_widget.png | Bin 0 -> 14001 bytes .../res/drawable-mdpi/launcher_widget.png | Bin 0 -> 7661 bytes .../res/drawable-xhdpi/launcher_widget.png | Bin 5335 -> 21223 bytes .../res/drawable-xxhdpi/launcher_widget.png | Bin 0 -> 32686 bytes 20 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 mobile/android/branding/aurora/res/drawable-hdpi/launcher_widget.png create mode 100644 mobile/android/branding/aurora/res/drawable-mdpi/launcher_widget.png create mode 100644 mobile/android/branding/aurora/res/drawable-xxhdpi/launcher_widget.png create mode 100644 mobile/android/branding/beta/res/drawable-hdpi/launcher_widget.png create mode 100644 mobile/android/branding/beta/res/drawable-mdpi/launcher_widget.png create mode 100644 mobile/android/branding/beta/res/drawable-xxhdpi/launcher_widget.png create mode 100644 mobile/android/branding/nightly/res/drawable-hdpi/launcher_widget.png create mode 100644 mobile/android/branding/nightly/res/drawable-mdpi/launcher_widget.png create mode 100644 mobile/android/branding/nightly/res/drawable-xxhdpi/launcher_widget.png create mode 100644 mobile/android/branding/official/res/drawable-hdpi/launcher_widget.png create mode 100644 mobile/android/branding/official/res/drawable-mdpi/launcher_widget.png create mode 100644 mobile/android/branding/official/res/drawable-xxhdpi/launcher_widget.png create mode 100644 mobile/android/branding/unofficial/res/drawable-hdpi/launcher_widget.png create mode 100644 mobile/android/branding/unofficial/res/drawable-mdpi/launcher_widget.png create mode 100644 mobile/android/branding/unofficial/res/drawable-xxhdpi/launcher_widget.png diff --git a/mobile/android/branding/aurora/res/drawable-hdpi/launcher_widget.png b/mobile/android/branding/aurora/res/drawable-hdpi/launcher_widget.png new file mode 100644 index 0000000000000000000000000000000000000000..4d7dc659a56596176d83c26b70a292975247fb18 GIT binary patch literal 14001 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 literal 0 HcmV?d00001 diff --git a/mobile/android/branding/aurora/res/drawable-mdpi/launcher_widget.png b/mobile/android/branding/aurora/res/drawable-mdpi/launcher_widget.png new file mode 100644 index 0000000000000000000000000000000000000000..23d966478fdf5690961c8b1e6c31dd9892579beb GIT binary patch literal 7661 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 literal 4611 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 bxzYInzi3HfswWd@00000NkvXXu0mjf1?UK( diff --git a/mobile/android/branding/beta/res/drawable-xxhdpi/launcher_widget.png b/mobile/android/branding/beta/res/drawable-xxhdpi/launcher_widget.png new file mode 100644 index 0000000000000000000000000000000000000000..6e41f409eb727bcb8cf1e93fcd0d6e49ba0d75bc GIT binary patch literal 31936 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

R<=L7iZ$;vt3-6-b=i-;#yH{&pz88e>wcbEWi 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 literal 0 HcmV?d00001 diff --git a/mobile/android/branding/nightly/res/drawable-hdpi/launcher_widget.png b/mobile/android/branding/nightly/res/drawable-hdpi/launcher_widget.png new file mode 100644 index 0000000000000000000000000000000000000000..4d7dc659a56596176d83c26b70a292975247fb18 GIT binary patch literal 14001 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 literal 0 HcmV?d00001 diff --git a/mobile/android/branding/nightly/res/drawable-mdpi/launcher_widget.png b/mobile/android/branding/nightly/res/drawable-mdpi/launcher_widget.png new file mode 100644 index 0000000000000000000000000000000000000000..23d966478fdf5690961c8b1e6c31dd9892579beb GIT binary patch literal 7661 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 literal 4283 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 diff --git a/mobile/android/branding/official/res/drawable-xxhdpi/launcher_widget.png b/mobile/android/branding/official/res/drawable-xxhdpi/launcher_widget.png new file mode 100644 index 0000000000000000000000000000000000000000..6e41f409eb727bcb8cf1e93fcd0d6e49ba0d75bc GIT binary patch literal 31936 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

R<=L7iZ$;vt3-6-b=i-;#yH{&pz88e>wcbEWi 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 literal 0 HcmV?d00001 diff --git a/mobile/android/branding/unofficial/res/drawable-hdpi/launcher_widget.png b/mobile/android/branding/unofficial/res/drawable-hdpi/launcher_widget.png new file mode 100644 index 0000000000000000000000000000000000000000..4d7dc659a56596176d83c26b70a292975247fb18 GIT binary patch literal 14001 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 literal 0 HcmV?d00001 diff --git a/mobile/android/branding/unofficial/res/drawable-mdpi/launcher_widget.png b/mobile/android/branding/unofficial/res/drawable-mdpi/launcher_widget.png new file mode 100644 index 0000000000000000000000000000000000000000..23d966478fdf5690961c8b1e6c31dd9892579beb GIT binary patch literal 7661 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 literal 5335 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 diff --git a/mobile/android/branding/unofficial/res/drawable-xxhdpi/launcher_widget.png b/mobile/android/branding/unofficial/res/drawable-xxhdpi/launcher_widget.png new file mode 100644 index 0000000000000000000000000000000000000000..279af3fff38b3c2b109cfe0bdc5a6706b0305e99 GIT binary patch literal 32686 zcmYg%1yoy2yESd`Vl7%6N`X?`o#IfOwzyNQxKkj3;_g!13Y6mR!CivWV!=HG4uH&i-v}VudF1ejfVE@7WH=xHYV!cH9;zf zh8EzdEGPZRXX&`}TL-o7x4nCb#>+K;(81Sq_HWH+ph3*#;}{;pKqBmseuji@G+7^( zFT+d;%1<*GoXwtIB%${veNV7bQVJyEj-IfvKJbN0v%iRtAu7>JZQ}W+F_kZ zZw%|cAP_*w`-781)KA;|-U3Vw#&awfbeiN&Lt&qbC7-&#J64!Wev|#Y!Hi$lZj@?j@3F|+d|Imdl7+5+uRNAp9^OiQYdi(kw zS{^M{cUgU(YNj^Xeyr)gO(wm;)r^;Dy0Du6di8PPcP6&4G?Co?e|qlinO;ISr&vS$ zv0PqrJ!#!@Iw8LGio^-*8~pZ^vFmXcZBhexo_tYKVh#Vy*7#_TC(C$_@xPD1G1XG_ zku^0+HxF?A*IO_Pngu#ft*$scJbrTte}Mykt?yhgtV>K>FQxgxm~qpD2%SNm5%n1V z#H5$F$DrKCnleCAQ1G(-rTKoB$2!B*(|2+Bs|H||< za>DuuIsbKM03ZXQj{FnQF?U}q2fB!L_P3nf-Zq-0P>|dHzo_oU*S4{x=*Y)3*LyI_1WMOg|fMGlS=j=-52F#6GUCxq|^* z&lIbS{wr0&nq{AI?<<`FM-DTA{$19l+EZNqlA7s+KBzIbzn|Zp!VRJqmwY)*{y*4` z!?^OjXeuZ;R8c|&LFDY2isB`CB%nC^H?{Wv0zg_Am@-xzt-qAwjAn!LU247MaXr}Z zF`42N=YLZ6PomETJac*p18(~4^^QBF=x^w%6(FyusJ?|$tN&L+57{UTIa_fTc44Dh zg5)*9Sa)JZ3P}E)X+$Ag@vyx~=;ASZA_&G#bQ7%&PZhPD`%lvTiFZipr+q&Gg50+1 z+fbm?GcAC9;_W~9`OhW%#D%(f_{ER2+J4nQxr_gbO~{MeQJaH^ha?$OjyKl>uK(4h zI$nx4miscy&f9szFO3KpbUJ5=kHcB}8J+Cuv)a#0WO!yV7{x9mEx2wU61^F!@xED| zk+RzF2&1C;|EIo-_ThbSW)GJP6*FEPRpzLXZf+|5LsuCw-hNDe zf+eWb9)XFe?R2UMBbRh^o(6 zxyEQGFj3m8dQYMqAy|icrg1=f8++m(Ko%2vseFUw*#eoCvLgk*8}1nX4W3UME+B2{ z47UbLWtBXUiyGkSOp1INUP%+~NHg~3n1~|WnuQ+swGo~<39+3@1xI9)ZDs9}MJ%Sh zYlW-@b&4By<$x!(MXFiqfF8FVHnD$J!rb1}f<-d=PMd?Lgws3Sw+mnK$R#+9#QNWq zk7Y|7^Zk4&vh#0}d_<$}WY*ZT&u`&O94&xpIkTguQYb(XUHjL~@}p}t zexH1}S3XW~;D^SD>CF83Ct$3d^>-?*dS>4QhQK+kN%n%VZeL%CmqE#Mna0xaNB%`r zTu!gHShO$WjafCQQ|uTstN&$EF6GkH)TVu89Q0@0%i>> zyUEK9TQ!E0{NxCKNsR*Sfh)k|a!dB3%b5bFu~vRWqEsQh%)e{bi_nKQ)qO=3Y`{Ai zQ{ltoIO7wiR`HdvI9Iy{1G^7E3#FI>8hh&eR9nXKi27fh>UgMbJAVPlic4Xwqq&xK zbHL>siW>b-UGHwyzAo9|FD$X2JHKr#(S(x46}^9(qTPaX@?}k0x2x@bgO1cfn4D}9 zlWlVGLDr}JqFEAvJ>HkiT=pC~OP3hw1CI=z1E%jIYsY0RToQX8RR$juQ-J>_DVHo_iaeK}=E%i+ zY@<{yz0J$Ec?sQBhGhYDBeG*pi`$!4$Ey|WXO8WK&%k1Pm~k-Y(@XN?FDlhupTCOY ze+e_IWyQPTfL93qk+Y0ZKSEYQ<>8IBww635aYn^5E4F4y=qbIPG}OgP)L0ld7=%(n z{W+-BqDRr|!hO$ieb64fJ)Ze|G*PPU-_3)CJ*kaL{B2VxL9>AWHM8V|PPFhSIxvYy z4hO14Jb`qEsi+mpJY5icH}uMQ}I zyjIO^%e6wI?6d+JEh*#}1oR5f~}$XE^fv6YwU4*q29(pY(yvo;%h zYa?*K+Hmib2^zseR4h>BtcSc1jjC~tnZb#B%3e{$ni=o-x;Cu?W*(~+@ajG1Uh=!e zQ~z|i))v-DF+T~I?|f>uSlSp+FzEk4?ivF6dGcIw{Gop%tqnXmTsrUcVgSdy@IWq; zet{`+@T*#Jri~)Hr{g|_tOG}4Bh%nZd!>c}KD#eQVgx_<=V|TF97JENXH-2gC7WKn z=ry&vx>YEJukxZ6-T0b4g$jmaYD0A4T6l&%}Puc-y;S!9gf5 zDFkj&9U{VfB3*INpUFBMlE@rG{6QqVwho-uR8WlnUE9{uHiUhJ)3%2%#${6Z%2bHIYj*ezHX=MWjJ>q*BMPw7}`Hxj*gV6*wfON99-GvAHC@QtT!az$|LBiRTUju zdUM$I7)aAjc#0(iN{D?eFQWDD4kdhon(4IZ!@clB5g^&NZIgjqWC@LZ?;j%O13-lU z2BGy5jsX>8Wri|8hl)YC^Gt+41xrf~T9?t!ofcNd8r(VQ8OZ9IMJlcbd*|o+$R{j@ zDN*0*ZXYh!uF-*+ht5#{&aMwMkD3d-#?BvEKiBp>X;>DP4j()LkVIkhs#9(GvMxSZ zly1+M@-`OFaRF=-owRn;l}U6bP8Z89-aCv~%dc#hn?Srm)@GR6p0 z+Jb1MA_QCu&jMT3RV(m0EPwD4<#+2v5zM*KZdsE49uS|OW+QPcL9< zxK79scKlKRC%)P|-0PE0`#t=7?L=qf(v=kySs^{}qKb#fTyArx=PX}ab}_6rj?sZ% zODhQX8TL~TqW3J_mg#EEfQ{(!-~@AQi0 zf0-f#CiG^b1ZsIak{TrG>gN0%GX&D?augOXa{DwJyQlO>C5+7DkNE8I+((P8*yFVI zScuP_y*VkqB_`NFckXsnuI#T%#~^^fguVZ1j4v z!gZsv8d^J}ROH!n`INlA?RR+96s49lqs1?aWe9Yi4DddjyRth~51Ptr9WK#@=zozS zel&k?`85jiI7QxqI2o!_{yz=*;|F3f#J(;T}}4g2=TmOz4wViVHWMNTf${NCyE?O%V6!xPDxqGQu~=jW7(?-0@hSV zOKI)*kJojS_iLRzdX;Zm2nNblW3ZC(2p9iI{w;6>^p3LbOurZnrDnz(P95XsjX86t zNX~frHJDgYSULh{44^j!{ESE=N4xqP^9d?$0l`R+qN=0GW)d=JE?&{N@<4wUfsf0 zfl^VLXRoF{nJ5#HtfXJ#8f4dWhPJ4+e;_hSz%(FZAXH8E+|}=s;nZ@U!J9mH+Y^YQ z<>Ql6caM@1Y}#*uq;Cd(@5tVOR268eugxGBUEO zgYhAnXT}Tc<=Pc#!bcu-ruDtiulp;V^# zAMO;(itXu0d=YlzS^q_uw|l&+*sfF@27aYI21&Iq7^SfENWPkQaLuhf&utGUg03#z ze+%uLiwe%0P5nD)K)s{ML3+08QQhVVKR6<&^o{N$6z`pDqM3uA*jOBSSzn)6euYaa z3@W}dtxwuKHu?Q4F2yl?+_2GOH^u5XKi0~U zgg02m@`U}-TZ&|cb&vj5v?Z-ys;j4c@pUW#M)W2#C~I`pnon*BXMy7U8y(x51|D0> z{CDSm23=V=HT?vCLp26H}zx#c}L_w3ZuCK+25}fNM0LAUNI1T3b#tZXqrWf2?8WXSBF6Mz2S22Be)JUC_%A?Hi(L;8c=Nk8 zEZI?Y(yNC86DZuu*52@^btW=!+f4u?EE?ANK5=SZ8*`T|J_UbFo6#dRWH;kWbVdu7 zw|Q!`4El7h+EVV+AnE6nrgw6gSF^hJcaPG({?dOri(=oY&rA#O<~(^K@GX>hE-kr2 z90Q)hr>x`1WCDuwL5R8?X;|&g&GNA7v9480AE1**$H{uItand#QVbPqzU7eY9(+%+ zDaSzU$AXv|dZ=bP{a;@QC5!}Z%Wu}QWnX`%pDybIsT*H&q_rx|M!d|7wB~eQ2JZnz zi=Vc-CCW&KtKn5mEFC>bJu?>_V60V6ZJd+?)!H3)Gy!m>qSwno$P>$It|*A{!UURT z=RPpNCl7J_WLG}G+pVA-R3`{Mw878u3im4QbKsME7mpsUUXhV&&pRFCs#8(K&l{u0 zzd#YAuE{*%hN8s5!Q~`uaghxQ2$7WMqsFK8ykv#gEKV0t*h)_q#6LaT|6kyv_PIDo zxVMoPGlr;ixK{yh)MewxZ zyG7-a(7_bfwWY(UC--0dgW?rMO3SQ3;pb5G_fv}sTp#czl!)zv-AL4) ze<)`8;G2gF)GaPtdb|5}@k7es?+|FhFXF;^|4Ye()tM##Rbs?*xi;v>y#-G0<1F%t z(V$tnjb<;9L)W5pH8?RKpM*Zg=Lf_KVuPj*&XO`7qEH*+&|Y(4^YWq2seTWVvn6FV zEf82{`r0^+^C_LH@4~;~XgW8SL6>dgmUh&27Y@0 zW=qB@MrR`nD*z^JCw&#Exji%5QQcqcP5}UzmRTxeB=I#YqeSF$sf1Q3-!eVH>zDM0 z#0XcfYG|+R!(FA61wVO1sCfGdu0* zrOi{wH6vox;9ge#;^SF0GUPrm0$g~}gu)5;jFf4fb6uLRDDlPUc!0G=jtvy)JJtph z5`2fhzj%Lf1fQS`%+U~WN$Gu(i6k&pD1G`VC$k?biwe^^HU%$bpeV?@jw-mu{xCIH|Ud{?sAJdGhC zVP?{Y&i&3;F`HrwKkY8=VMUKus#8?awI%61Q+Z9*yc%eqbeFy5{n^^Dy1m*xAMqmm z8bj>z4keAv$o@cyi1;aEs!X0#B~z05(xSC$Cl-8um+|MCLfFi6+}pV|S+QBU^1r1D z%XxIq5=2~mHhoV`E25?<|sts{2Kz(>tS9M^aG0*lN)oXmQE4F5(sfvR4?5#yB* z3JLsawEeU^Mc zNN}~P5i=P8oDRX8HD}5$Kw01~CH(>xzrV*MNQVGc)|BHJi*7IqrE>UZd*mxq+%G6a0XD{!& zDMSZ(S0gj*717OAiQa5in9EPU77QCMv5;&aGLW^X`vkPdsbml&bDa5f@6`5?KP=Sg z0l58oEn!b42S0FMrHk1X10?z_+w?CQ4_!Md!Xr-`Nz-cwC4&^{*=_6v&e6%l=;wim(em2w*eGHxB1xCNBi_o%)UU`Qnq;8os%Z#*v*SVH}#DoCG3uf2L@c(BN)5_}n*|Yl=nyU854D9!HZ$-t zDi_PxE!LDLS&;yxqiau{U^=U(`d1mp6Q!Hr(mlc`|Jmm8@h%p>E&)K#B|_j%mvBl8TW!FE2&GE!f9WK)jP#MjrKv=$@6>V z?DAdk&L2XTmJedP=ik0k>AVm$Fk|@IELWf=2Ym;|=@i~)npdcmWI}?vwEoN5c-m7HFodf^4ngq*o?f%FCU82I%1_oW{ zm-xDVjt4L6yu1br_xV=&E~;+tWgs+4J3=bB0nIGO_;CUf7ohJ;{+8T;LXiFVA}Nx2 zIs}LV)@tyA{d6^Z3h~y;o#nd?Zt!{&NxZ^p*0KJPQ-lPpH*~G&bqxwuvHl}O)T5D1 zMLpB{tSiOF32c&bl)$CK8XuQH_1kT|M{&wEMD3-u*YO~Dk6X0IQzEEUBxMUNDsSzI z$nRRM-goC$c115=5;q>=0p10U54f{Dyt+*~;?GjcoM85YpID8harhq@LJAEk-42S= z-6jMUHQC8_-s1+j%+z}x>HJgatZ{~bOm;W-_gNQ>y=l@-fvwc^|5R6{ENjwGl@a>s zklK=U)|cf|k%P9eO<_}PDLle~k;G9|vJ&n&@%8@q6q>0hPHDXV3GBGW=~WKyZ#d*z zbmt3}Xs*sNSyYW@&w)%ZKgkAul;oqE*1+ggp17`q{&fnGB7OkDJ~~pH$)xJ(ctmF6 zuVlyb_<}y0fCcDOUt0Di7%zJzpg(!1vHG4f{dLrq^hM{fMBGI0?Vwpqf!-*wz>&x9 zp>QrCB?|ryzLTl_P(kLXS*c(iIVi!Xr)y2dutxLWuNZeXEbxm_s$7n}^3xbb<(E$F zP(i2G9kM0p^^2~qXu}kxSZPcvNMExO0}>oKaam{Z;3-Js??xM>%?9J_vmumyS}t6n)2g^$dfBQbzn zsgO&?TM40i)jLb+H#pXAQc!idp6}Xo-4}p!gwfJr71)gHP5q><-G{DpFi*WbVTnk3 z$uoEc=5;!m$L#fec6d76c4EAcnmmhX+y2c`Jx8x^vL|_Vbev@y$2}S~SiV*LHUl8l z54&Hd710m1S;06meb_NQZ>$DDaU$=4qB#VnkGG46n<1&mx5AXr#ZuiMm&qc@9MgG;48kxTRSrSzrb3-wc*Cwbn5h+#{u1*+_pG zKa(tC)$coYcpmmUA3ttEZ|KR)t!HDm8U(7c!D8>d=P}?G;0T0)?0ao6ix8b2_usZ8 zZVmSI?WYIxsabc7e`NK&dZl0=uU;RS2i_1>&#cX##r6|2fcZ)CA+K!|$1ECpGO`$T zX?lFVO-Vzx--}A;*XUK2#l%njX~$Z;@+HQsJkTH1kVsv)WM2k7%6bq@D#B7_!Wo=K zhNP`%o^|Vu?ILN-o2IQ>43d&{gb)7KT4LoPSN3fADHT22Q8Q`Bk`77HbvM>E{F_G6^;ZfM+ zmH1i~GnsdC#Bw~Wwqmr(D37!a!%dPiP(8GA;wd<8D?x=HRp4+pQl0F}%9V}BGyi;O zxJY~hQ1HLZxbQr>XirAFV3gupJ`%Ysg~2#qt1LD%uLjt&GZQ0944KXFMQiz0UJGw= zn)7v!k+Q~D2MYJA@Vl0e_@lhlU*h4^BE3J8Goc0Dl$R?^#nVg!@WJROpf$VmQaT;TML|twl`-m7jK;Ct)%R0OWR*OsNR$sqiHt-YnWVREckPI8r(m-ZP{yLc_rJ*a_$vu zp(pnXk3LbUjx&9w85f+JCCe9_4%RYkifJL9&Bz*idPkW<5w=)mVU6Tm(T*HZ^d67C zE9Oq~FIE!cJ2>LNJXyYr$ZqIWR!L&I%X_>CAjqr=K!w)z{%Vmf%@0_tz0r15wKe*# zdi%)qQM4HXL>783K?MUYgaZ1OArIHY%lXxf$pOeL@L9Y!RD7RpmapDn`2h`ba}MFV ztvK>Is_qEmQ!xI=n)S(?*)*iP7lvSCrc1&d>DG0*Bx^@@-$)zQJrJzV2_f$NRvtZQ$6^iaGi4 zc2hlqmlB2X%E5AyGEO?{CgQDE!J~M0MwX|Iuec9Cit??F#UOU&LHgR;-Vhr;*J{2# ziRI{hZ~U7XxEITl3bojW3N=%e)iVw!GKocHnQh%uUFUp3qavfqm)=itceF*N3yz;2 zC>vkS~?zo+=mfR%!7Ao^y7sVYqb_J??JjtI!?vZemGzxeOkzn>a zxwTol&6Dy`O6*d)gm^!v^8qg-jw{7>e!fKCuv4+~IjhT(dU(|orr5#|iB0!P^e5_2 zmy`Lgoge=cx#Py|B2K54@*9~2(}Yzv;0{{2q_ns6mC~aG>2D%|q7g?DjkPP2ukS5dY$kt+xcnS)1M4 z71=Gl%8C?WD{f;PDxm8q-HxDlRV|y!j*l}cTsxnuedm*^S5cqwXH5{F{7{8l5q7}0 zAlqgO`bF<_Yka@lOSl&CX^$>zmz9(DuzpApHw4T`{{jabbwCPQ9|{CEqJ^*(ce)iiDD7X z8qYB_)+$_}VecDf>{qJS<(rY+(W^WF2f;hvtmbpIAJ?&PoFfMwPFC9y8-xMEHR4f> z|Ij(7mW?pteS@PXlDChmy-&*tKAllNY-O2_eBP^i4N=pa;_z|+<#gR|lYevhPSYdt zc*@`;3J2F8TLHtjPg(?p;z7&tm}o^vb- zaL_U+eQM&JhmwJ)`Mg#i&I=jK1$X6^T!C%y^u9XD*nl~&B|1`f$JtRw3Pu_7E?Cpu z%s4=?tv55XWiebVPQ{FnSNlW>6DaKpt07w)n^xQNrk~&)=EcW-Eqe^|<4a!l`dIOK zw+Q}fP=I&bvrT z?+DShbB!Kthk?W2iw@B>JU>-yu2mq*IwThYI&JvET*oAOAm5|L3&g zDfwF{IooY8UoNH_IXDs0Q7%xmkbl+j3x?~r%5s7qvyov{{d|64Oa zu@w0wo#@J%J{B@rUAk9<9JFpcah0jmd1J~}NR6d9(Om5=k(czmC{=t+hqGvwV1Im^ zQ`n-3Wp{*^qy}^Gg2JRTXenw(SWh)+oz!hkhqJWJ?G?g}HjBw)cUQBjua`SVAgpCo z*&bdw048T$VB2S9#CaB`TggQ5j2gr5T74w)UG}Gcgr@Hzq%hvTs&zNQ{+uq}UlQ!O zXxwc3t^V(J?GUY)bevLjB_Rj3-{eL!JNkNSJcT@ z@jsK5{&!=9W8Z}_`&HP9y;)JLXV&@0&tmBzQPP3G6W5K6eR}>y2OdvVi8ee$HJ#0w zOWzK>7%iFhhI|3Q8ec^WwrBi-al)d2R_yYNJy{ttYR9DsU>jIHt0VI8Y!+K;!7P@R z2>x6i_*i+g;_PTj(}kg^&wNCqslI?&UHZpv{)oTShT_6Phj8!P_K;@oP$FZ!$*2zZ`#IE z8NW6k%u)T3<7@CGoo&Cq)XBVH^wQ(oac>Fo`q>QG)`+Bh<;)E z4FW+8LQaGGr1YADnmU+$$1P2@UV}%~x0`f3L`K;B0w9m|`M=(+v8abDB6qO}V4tHgb5<#x?WW+^iIvTN?BDrO|{ zS56;X4^G8Rgm4bQK(?Z|grY?c&8q@P{^ZEgX>p=^@Y8JJUNsBVdTHUsZi8ql7U4KC zy=3P-znLS|OK+O1_P@{;TLxsrWXsP=xQK1Nhq~{NQ#Re7vam}5o*i+Dhc8@` zjDFr`vnuq$qOsGAy1rzO#&sqy2O5E`Z2Q>4bSlk!kJLXkRinxh$+5+Z2lfjU1qPM0 z$>4XXA1X|{a-qx3gzS*6fJYp^m}|)zEaCf_g^B7v-CxZ#Aa#B)$dkQnz%ZPq<+1&4 zOA3%9)&%C1w0?cmviXf`{nnn-<}SilBisQoJ>h><0&@euTn>F|V}hVIalMZgfxBiJ zu=qJ`X-IiK-@bUSBfsi)gYay zPS_vX%QtbW+8=yP9ty`q&N)L5sCK&}iVJRZ9Hyo@9nAkI3mq$y?n=^&jA zj4&Wl!8^O$sK>brs`=N5LFn=7akqVTRr@x9+nW~Vzc?nm!W=U4o$g|~>z2%1QX>}= zer%Xeehr9~x|t&T+NohQX84e|=<0HmULN;sb$C$Gueg*R*H;`Z{MppA^&AS+ zYJ1)6^;d#LjW0#`6Hn~LZScN2rTH@`meW`Sqk);xrR53*KG=sThH;M`yh6K<_FuNo zvf=S^%>)Y7fs+`!s8)qo?E~i$O)YVP`SEGB`=p8Oe!mt7ON-@h@*+i9&aJCRv@sBS z@gMl?cSh5qkeQ$E9f~5T?d&ULPrQ#dtk>!MgCf zq10w(JgB(TyxY_DqE+6rZ$gI!dRe+nO{Pvj89P{LMJ4DUT$0yn-WMh>6Y%vA{cW@| zz0oO>Rs@QDtFX6tQTPtLac%9jK`tM|E+!|g0NXKrIF|LdQ*oL4yu>HgipZ1fn|QqR z?l@fS0>1-)ySvX=zBQJ7NbEBGLez39b6>FBH4^Uh$Xs6SkKg6Fb@57SSU_L6JsztW z+>G~0d~_w2+;tfX7|sRNYq`dq)T_V5_|mdBt1xgWOx_w^g3*I8Ma$b*OtX)dPn)N?g+L~3VR|g%+&O(7(d-r{=vlQgsS}b zy80}`uzDM+OShw3U&PJnYck%qjKy+Gd%M2rmpR_l#)((rr z;j!6T0?(rvCkzKx8HTtYS@s*|I7?5ipzXsN8rrx^Em|>|nS~M}YTP2BxtR(=nIW+a z#yK_xdYrPLkjNx{HB-XOlUEXXh0bIRb7JC&)gKe{8du%xD?)c2B>4L4^95eN8x(%b z94qtYH#}*}`!(OI7c7`5(}<_PDxp_s&8LEFWYyhZbuq%KV8D^tv<|<0cy`mOM~e7cGvPB3S(5Utxzj14BT+eQQE58$r$->3EU z^(a>#HzdEEo{{*cZF#XyiM8`^^7F=;1Vh zy#6`Y6zFo}agZD+2pDc8xZA(zxCoB-u5DhIIltyQ&wac_1XDS1wD2~q^eC=9KD?2W z?523FGVT~+*fr5ktGLZ2{O)Eb9u)rw7@O<^4y8+8f@GuazIPoNn{MaO-8T6cs1I;1?|1`QGT`%D36}emAShdtXaPF0gIGJ{FgnxAiU85tbGq)u}}lZs=RD!NaVrOveN zhEd_x6L{pOk1hp}P+Npio?fBON6f+g2TL=Kt;Q=K*qR*i=Ox;r)8*YmM&FWs|3*Ns!Yj z>N-^*2#UD{MXpJE8(|6U6>a?l6A{tJUbl-7(hRnMG+u^(8VtwTJN!G8IpB^Sbjn|X zG6)?6vC=$6b1ZK&R2(4}9mI0`?c&HqU?>*|NsNcdPP@VNaN2dsMQ#c<1fIz|Py*a0 zVqtg7@my^`J`cFxR6+utlgEIak&RMa=>dp~(6<#x#9fzEcV36J`D)iL^6>^9Z9l^W z#DD>2RrZ(JtM60Enjcq9&&eUcFJ`NbrVm{X-_BregD?C$Ka+PQEP~bYz?lGcOjhm@{PdoQz9F8@1wqq89{u?nRO zw%oz$t}We`^Ozoz)rB||fsnc%FN|310zg?h4rA*WOpkAMq@CA%9&Tajp_~U@!=3BQl(o@QZhKp57 zZUv835W%hFSkf!(0J{{wZ~w~>!^oY+?KX_yG?^@(CD8m(9Olnl8R}g*@O5H1iqf?` zQi@ldsQB&KDxl{l^whUkiuhi_Qo?=;Pt&Y+i9RpY$3PuoUC%GE9`Pfq zHe%>5AQPOquT7)zb}ni1Pbtgs<1R>!x^v=(Od_#=TAo|%K-&lqiIkOPuY#O$Ugy6+r8xTWN>^FNmY~g6}JG@kyt$#Ic*c$20p1)56_`jt5lQ zrJ_3EQUU(!jB{(=e1wfvJ1ccDSl}2lQHkufs6jWL|sBz*;}Ws`)ihtd+oCR z61A*fpV)>pe*Drhd5qI_xuAPE>b5t%KZUqnnLc8c=j{*1_q6O+wg-;g=-w)xPrw~s zxBAWp@ff+(E`v7*DKJNigLQgl;h4&QqG#haMq9P?%d)w}-cD$!9g4MhAN^VkmA1vwWD- zB8tnMg0y?Xy6b4fyr^fvMqiOzTU#u1uKIwh>N6IT3^?#S?Tu;P8c^u*CZipph&pHN zGI8N^_B_{Hk8{xbVJuxwZ_Vc_%URrqUq1GH#uOCi?B5Vzda`$|Xy_nX3cKjNcgTD4 znOzfoA3YlgwF-|2LQU#>_nTt?gj#QjfPhO4c%`z2xM8GgxfnCmCvo(hHiY;@Jl_=O zx}P`QrVD_>kZBWj-~4i()3R9H6jGTs{~XTinv{rNG~ydqB*($s$QZwdE+fWmBxQ-v zhc4Z{U~3a7=Phqe5I6Lx(3;N{kC2)K3F3-tV|CF#osjS@?qt_80FD-Lep{b6B^W=_ z@=M3{U;yK!#r^@d)OsXM;4;5{Q{;Vm-%jw*{5TCIJTE6V6=-p>W|1;Zpz+w*DU~>| zJfbV3_m3I^1jcd&z)=dPx$7toyli^@T9SV~y)MrgQk(v~ir5mAOO_(*a$cxpxTEi& z!B1s5)wFD(vDF@>1(_1B$$N%mX1yUO4|B_IY#Xm*oZAzn{>4&ZP#>h0rNb-!$@;#{ zDkVyiYJt=8%dh^?Gjj!ncX*#w@N`uw^xI=rKRSv!eS6@mZ}Ts2Z@i%_5*YmHiBN`v zmT|dxC@O2MK?3>E@(HY1dx5IyXgLrsCfFc|+kBy%TPvPhbPz+wK`(lqlKlXQHgrK@ z+>V>WBykoy$%|>GoG8Vey#vrBU{!X5~jK}EkwOY+DCd2r;)CSyyIo}=_&BZ0^*MrYXFV?yq zo=YNY<4?)ykk|odivd0DrY$E4%N*4rNF2p{PRU2^2Wzh&F_``xpjvFtm02z=ug~f^ znSA(X^t&7KavS3|moWx>*KI$Aiyf{2#E@{4Fce zxTo8EOACK8DRFcL0i0Zz)C{X^*gRg#_P>xv3GD57`(Ybe*VVQg;B-afpgXA;T#ZL! znMs-7uo)`*=0&V;w3Vz#RBrJq0c-k&Fqt^kZpoplnksSF3)x0SEutBxCLB?kO<~pL zxwrBwT!*o_LW{H3E>H8ba#7~BC4c0^^+&Mc1$o=iY;y(6dHr6T0Beq!N9G|+FFNkE zC=On=-U2Z)Zi~Cql6+$1txj&!3mS!%+~{PuCRXG&ocURsjMQGR0D3HDeLGy6`qk#j zE3wJfMe6y7%`E^+_ zOCduXwju45$#kaor~7c4re5RWIT`MDUOr4In|crf;Fsk190c1>O_zF*FQMGofpsJb zbs-eiZg;7^9mNW{O)M3qT(q)^3yv)qd%nWU?O`APnshILw-VcNkh92<9k%|Q4xzgn z=V3VHVni)^5rna&*1bwdDB36CgEY%nK!Aaqy7+f0z9C|ClqtW&V9VmdUmROPKIU@T z9cWmrNFCP(L{?$-Zr#0msm{nwVqEiUyi-yw2iCSEHd-LENFT|VqP9G>(R~8-iwsKm z(AvF!!^>8sG0D8`&dD5SD`Y_77!jNxfmLGX{gj&IOEQ*U6U=JDu9SO2lu1hm=gWlI zEl}t)gn$x*Qnh;Sy?(Ty=xQ^2Wf#QQR6jWrdxqs4`SG?sYjy&?ChgWJ`fQ2lI1h~k zH~L68B$k;2Tr4W7z%39viZH7SZrN|4{9tJrGQlj0H?1X8Wx#NP9#df;{c@;6cYth>3?Sg!L1xh z6U-Nl(&c^L1^c^KDM3xzb9=$H_jc?e;a!yt|E}GFAYAS*q~OAIq+0TbOw!L3V)bWS z2r(zb<+t+dd@Gjt|5f!J;Ba+a+Y&?&BvB(ulpql;dXFBWixRy=@4bx?K}3(;j zqqh-+5p9$pq6~(NKKdBL_)nhqd*1K+U0jzj$KHF+-utYz?{%+xskxg!@m!5Nxz%`m z5d;@&mC9qU3&pNHBUOyhDtCK*@@m_9_#$f8y~TZ{31yxxTiJkJ>LHC57U=pwy-s$} znv5g(*}B~84{8z!LyXA`+VOp-Qo--a5bDOUSw-lZN4!Cc6rs}8MenFpl%-nIRR8#K%sRf6vBvw5t7VVqi9(n9 zlGCZ&@lE0Rz*JtE_kGz9nNO>tM;419_4PKAfzfGhJo@G#n`H~2qfx?P>Hjckg4cPi zf`7_w12j3)ubj)NFZkIYaCyEYW3V4>mU&Cui<(f(AA-U)#?mi1MDP-?<7p^%R}r6X|K9MAqxL{zIAgk z@k;12j28}+|45RYnySe zE$pqOY~i4ISjxqdA+%}a3n_KoFGitZ+da0WM77zDJLxAhF_k8+xRO!yl402=dyi77-sQenMB^?u!*;}^UyhD&0KXB0=vI-LIOGt6Ze_9 zD;wo`xrS))FTzX9xj|F3RD}9UMYn`0 z9{BbL(nuxQxX7>P_he>HBut73ra86mp0-z9JdWQ=E87X=*gdK^4=7^k=H2K>MyWt| zWzi~!4Q>P(r1&~&p{G!?0w+OIy$&sREJNj(EcGnrhv6`d3$4_YaQZ-2ngDIiTm${A z|AbzYG0$z0+@e7)@~0d`Ws_Az?z%kY2#zGB%(y@FYVXud3yzzhAt3T9Q%NrF8m~#c zCvwKPXmc3fF&^s_sUYZBqSQb!3*tUic{%W!2OI6P+h(H1JkEd#Nd_6Ve9{l`x6x6OEgGY6iuIx$q9~+%jZ%)%~um zi)7rJ$do$zPAlc^=H|;HUQy4_sK)@$MW0fkOW`iJ1hnCp=xfu9(vYcf=R{rW81^O{R(4 zwcYqADN38Ju{W4zGl$Qh>=eePd~yB>tMiDMQzfqB;rrT-q6ntStJ*gS()(!@Cy z4l}yV4{gy^sH>-*Az0c3ffL!|zKb3+Inc!?2n^n|2YMsj08Z1E@Q2w2+SjQ6W|V!&S+-M*Q9Ra}HzuQr zOl;%!YuRlfMsez4-?Ro!Q>2N~-H+NIojF-bv}4SLblA`~vM~W2Q`8II4EhxrIXT(I zLP8Ppq6$p?zkE`L9yto#d*@s=|C?CvA~;1J0`)YQlC`Uw`3NQWB;b$W|NH|@kL42G zF$ntvs;PXwN>pHyS!)Ix|H@bp@*B0JY*Gd1aR>MLvCF=2RQ_(d{k z$Bwmh+H`>c6(fJaCXbtgw*p(f?RfIVqYO$*$3>5pw(XjZ*7Zy?%DGSIIXL)KPZSq= z*m!oxdP!-u+u_6*hL^?;-Z_pwow4|4f3f{+6!lH~nC{B87A~4R1VtQO_G@1mcL$Gi zSl{_kPuV7bhhml*?vGXcNY<7pmO$nE{{1QZDF)t;WZj>x1)mhvLVSiEb*@l&N=T{< zZ@C8JUU*oHOJ91(T}*UPAxB{@=J}|`O8%&M&rMmhOn|&Rb|NAoHrCMia^cx)xo&Hj zmV(iR4m)xx3cvRju(EQN+JhZsW=z92nNPgD={rV%mrg^LWbfZ^hf9C)n~%RTM!aG} z-1`>xI$!DgUJ3staYp+1ZOKN)(VtaRFMdwsc$z;RV1DBLnN*sY49iqHtTwKv+(Ek{ zX?-_7Y4v50U926U#zc;*Ztky0W2Qc3@Aj^$fTd9`(hb$K1|F~gGvf6sYowi_uo^ihtz;^_#gAy+vBTTnre#-1(VTL?adF9McfL zaO4ijZkZAM8X$TSM!or3DNym7sZZHmBiCM|n3SgNH(_0v$7(A){c+R7uf)v%^2nU; zv9SCB@Y*cw8n=AxO#Jp|vuZjk-0#^lO!!scU$Xu?iu(Xsm#*;;pdX)v6abh>T^R24 zq1guCS{~wpYkQ{J4mps>J*Hstq3-s`2-Cq0pO_1{rM2WO<(ku_O9J0o$-H9j2E+=B zm?No{g$Ddw1-u&vgXG^zwtrb(_Z`!B@d?z-FksQGw!`|rT>Y9 z&+cFfSvA)%9sBb{eqsP!n*Un+;y``o55DA2gue!Fj&3?viJkRdSLnKyl(v^9b^Lif zh~*^qQAvO+7?{ij5Q~6Sk+3*y|98fS+kA8>4Y=aXb{o+N-GINuWx~l>VbE(bZt?Pb zA2QF7sl2lbl)MfAN%%0k^3At+I^s@ub+#H-CH_o7@FL{}0gM0)=FlHUyWrJF0jqaF z*nPfnJe|{wZjY7THfC-P71>>MGplo|qp=os^mr3`PFb*s(E>N3XgfF5b0i#E;4POCZPNWao~i6yP`BbS5V(hqWtH_WXd~D+OYDiVokUWO zlpyKQ@+V1b1sg=@v$E36fX+3A(xj{?XVy?VuSD(AJ*oI+v&gUQ^kspKEMAl7z~7MM zneDn@2pt0-4=t5)Zn=CfC{32 zQngC5KA{=1Pkq2fNtiJ6( z38`eBby=cTVp#tmS+69d19l{|5i;;-W2;u{Ik4QR+SRv+zJ=c1a7?rcy>5ApmDv8h z*{;3l_$5rVPFP}FANGxxK+BcWy#8!xe73CDhFeq{?ka~06o%3_UQ{#K^xfsHwGufw z5Vtz(VKb1RS^!f=1{f0?Q4K#Vd62)64i6&sgq}Tr@il3pwRKsTKV)om@>bsTMzW=^ z?HL1qe;!h9)rXicdg^@(Z zDjV{pzf6Yp0w`*bAH%(*S@~uMtV?;^pE`cC8$czf1i74cDa&(NV0=yy;maX>x3E9U<@^`EG3BQ`gy84NEWjVf#HowI>Z?{9P@9J{y`>Jc-jHL&@LmpYcYALlf z0}7Jt6*!cESJo042>nJmxCRv+dIgGIPihx2{Mimnwe29n4x`FeXS5321!SZzt zR}lOmnSmO(l%mhBG(D?!`5Sajx6dIh2_O+jVVPuSy2>Gk04w_(;KL97-gu;Dlh^}a2a+#aYkC#xLAx5-h&p|3la+hXXq*f>7>+y~7C>d1 zd93VppyfWcEhz$xW|{kt8e0ahKMVLaka%Bmw{a?HIf8`p(JA8ilXyM&^1S?v(Vy89 zzi8|QBOxg`a!1{f!xmo+Sk=nJWLbuiqTEbWnwIa3?5*QF!oQ0{1La>>a21@iw|K8_ z^pXRvE_nL{gp9Ph-}!9*P!x<4-&^bV1Q8n-)~71o6%>~2u`@#>Nf2F;vae=!-Uxtp z5Us~L;e|^yZy9Yb2d_=Yn{L6S*;fQ;M}6=Fvoz6Jr~K=W8tnJj4Ga zam#AURCs%{4Z~OC*cUoK*Y`@A`)u{tjXGNR-dlj0Jg9BoN{tMkq2@B(2W0}ZAj~iP z7JXf3Q$ftC3UU z5qQ=OK1O~a7YQxAX7#6#s-jYkOBB5=j_PxGbk(IE0rk5Ch%5vHcg3W?17e7j-V7^$ z!rW3n@McZeyq|H{By^|1`sCf#ST`!4;mtQa{nFlCwOU&wai#*Y+MeP! z5<|}};fSu~j7t#m2(o-XxxrofNDJJGEbH_O!<@Ct;DES4V(BDDg_=^>Y;U>JEOTjW z;~lN0Cu=9c6Q(q~^QTK!?XWZSmDg1X5?cme2p_~GS^9E#w%NV}zXvD=wijEo2VZ~) zk@9QIIP&`hGd;bfU$W1HA#W>o9!H-rZOr7uUJu$*G5;ps=Gb!>FCck-l_zF#WUgU# zg(F6uJrTc}qMxeOjoJhjgg=P{9*Hl+d8~V)J5I(;9s5o$W`-Z~29UO~$xyexHq3ZC z*_xyg?N1jG_>~9LFy}De%zUvC8hH4txqxWYXr@=YG+oPJ!~gAGl*GWYve4trPm8V~ z<1+DYTtb|T2=8CsR~!latXji2@*8D}#KfYeh1T_1{3c)22R?;`hg9G~eMis7>VL0LlKkN$fXjLQjc(O2`g%et7?Cbfy*vof|#_!odDu zR3JEp3bagk@dI)}8h!x_AHgB6z)R;dEk1n|;$CbTi zrO01)U45VK?^zEOmw&d+z%->L03tz$Bkk3W3x_Q)weiQs{8_9(9KZjGAx-e>>WQJw z!`*Jp&71O=&&l!R61%BK0NZAD&XGA}YEQMMJ!s|X?NsaQzKL21%s}n>Y^~(k74v*> zcEJf!e6JS#qXWBvhOXAh*B)0H@1we}zLw6&D*Pp@+ZoQSkJzio!25pS_dVz)V2tTj z1g`H(ITJy=`YDV4KhXC!%UX=O3S-ekFhwY_uRn1C#Rx^0~)7<5(<=JwFDpm97w(yFQ9Jb$C$+#b4#g+9V{)i3xKcZ_&@ z=_XV&t;Zepzt_1<$%W65I+T+Y2V845?(5n__2_AB6a^YfEq4xW@$Ty{m)#?-d|ZR< zuMGv_HI>Qx?<&Pvj7*o#`sLw>3oQEZ1-$!13arD;GMG`k^Pm89Q5&9x@-S_u_;yBH zi=<`+al>W56RCKwM|WanS(kOd>pn7uwxfyy6?I)3Z{bIDjv^GaNitdBDgW*PZn-mU zkJg~YVgW9QKQkJ;e6_lJwXze*0^@GiDQr0tc=h#mbA?5ev z9wPDj$eoIs|&qP1f#o7n8YX00C&vjqEN1?veo-9-$ z*K|u_$c`J38JM1)LXYoQ%SQ@j8x%fO0)GC%p^Et|D!LXdcZCdG z;^E#@@BM0jD1cJ7fh946whSQbxB6ff;t)71B=<5xf&F#J)wNS??Yo@Mn5dBkRYoRF zKBCA{9kKS(9BHpNmuYDtcay(ljo&Pi>P(>J9k}o7yehjee?t0f9LnQ*)J1 zUOJGe3#FoNXxKa;>Kqc>o~d$de9~(cbbb)YdhrH;NtUB!QIK#s&!E2hYtNWr-UrSq z5~GBwqsqc>BtE5m8~l=(-|UPPhGrD%yD(R5 zDk|r4rV%g-zR6&`bi8d`RUwognY8^{SSs_Q>zE@&8xNZ`tlyAJ3K979%9>;o28_vgxOzv80D(>{y>WX&({lu3FBo8JJ<;ZJztu#+g?{ zO~(B?YF&vo9wdEy6ZQtMokyRm1)z~*-l-aqu+^?s&TEf5$m_{ zv&ZiSlE*N^vzfjFSnj&v`aDO_rRu=!u;*WSXa{qUX$tFl!cp=FWUYb)(*;UAas2tg z=3+4ACvd|`RkC<>?hU}#y$!#-lAWXhBQS#g?VdG@sRBJKuec(U6*z2Y4<`v5^b4z7bG83{@~Sr^%yP{!TY0Lm62oL1+Ccbb zTk@w-&Bso+g!4i|O_>V@-%yNjptZc+{aHZObH?N_<0;RJP=|LpReuly=>#zbaH;5F zID(V=^8+Tk`tVlg3#;?VthJ*5=y5Ar1)cAgObrY^iqDG$*{i!QSY(-3zn%9;g=5za zC8b7B-!KHQ33pCKy6^lI?pf9T9nvQx*7a)gJ{>bxj3TIw@0ZR!z6EKwb{iz1mVYF@_jfk|X>T#hkDo(3P z{;WlD1dup{0G?yb%U;t+A0~}bj*4G_OuvPNe+Htp8t$0)?<`#=RGCF4*{(hqX@-m! z7L@8fGGJj=cog$-S^>vW8#E`nCZo6`g-Iv_H#mysQ;;6x+DN5b-Ol~p94uMdLY-L`~9;=4iQPy6&=ueiMiKN(~KBh zzU_oEk(Vl1{`R~X*Qwa#!wtbEL*&Z=*n8<~mTWq~ZZwsE)X{ZHDeZCZ>p3svhx%P2 zvxcYg^KTF~Wgv;F>A2L#y*2HwIKj|2NQqn3OvrV3x3adTf<(l3{3oqc8;*a3NPwhh z=csKSOaC4hkeYqn5{oZjH`6OImWMl@OLGUj_IIV)xT#9&{u^b2*UvI#b@qccHQ^ zVTt8$IF$oU8K_ggU(+6AOOiU$JAYXBMl6%_)~n_N8jaGv1P_^LiY&{)Tyi+7irx}7 z{soYcd-ls^s<4o_?EUY8o|j;PvT++Cy0;F5WlWinW|rFJ71UI0hDd3T&h}}>Ft4RI zUujcnel~z0zQ0UKxnqePG9HS!`;W>T;9VTArk<3_xZ0B<;7F+=FE83gj?sXxf?H4hwVo@ZNz z7g}2^zb(RN38pIKky^Iy=zgjnA)oyTqI%$-+3V@$_M5iIgxALJmXvCsVwD)t2^UYa zC<*=fkly!Ey7sj3{On$?+u~9?*f}Kth5($zPqJpP+D!dB2<|N^G5-$&SqiP z-MOgwX7%Bdr--)k+WgNTff{k|C#_g>7nyPHfl;<7@Z-~|u&1#KBy0*@5tJNE2z$&T z=4qF|G*~WqyDifG7UB8Q>L1VoC<$2SWxsDvNe2RR{*aRWQ^3vx<0r2l;p0q#FIKlL z2jl8<|9SFV1K)37xH&T7@tNq`DDarzD@f-PgQxs8LN=vO`BmTJ*!E0)XWrgZxd7v>Er5} z<1YG4UnX;N2M#VoED)b?>*tc@u;J!FlWxYtX|l3)C8nT#y{e=ihLuHHrg>7=MVWufLI&Nv7Hxy0mOEKq@i zTWed0_PX-R5({L({Ap_RTMHv&*-!Tt;L5U`@*=A4uiv-L-B22a>1PGI^Gts^tI1PY z;^TKtH*4buxX-y$Q$cYfPXv62S_tU!oHQ9$Liwkp1EzAbi@v%=4GrG5DeW12E=jvC z)ibJpTrd)gm{5o7SxMgZm)bA^5`(?FnA#Lmw$7fa0y%-rF2rq$vF7}c05S>9C+~_R z)sWwarVs3k%>B5Z8(^*_^nVwcF@0=T3b38LrQKCNGts-c1B|!!wP8cDjHd(HmL1Ue zTIdHzcu$$n_5T)#(7auIbqhrSmrR>dJzDb#PS@ulPC~EPdZn{da!57snajiQyB!Rc z^$E21XKWLC7?tdUZZgBNIeYZT#HkUB`gqHiEO|5gW_fW}Rby6H2kzxSa^6aH)DfGwZ&9Itk~r7 z@z(xCOaNS*OL%)&h9K$e$zR^Zgq~)o3nf9zhrZ$U!3>RC)ut-me($%2)(H|I!Hf)p zv>JdFHb<~o)#z4H2sea@*PvF;S-=jt)a{Z>7u&UKJBgKR-~Ux+1&+5~JFOdyhMfm< z(DdDFjsFL+a|k#pkc{!!#5as<+mUGHD{x!Oeg=jQF1`?7kq2|b3C zSbZVdv#?dUEI1}pGGIxwRz^niE>XIwOMb}7`kD*vY5+NP(~m52fFE_CfAC&^A9AY( zeOD8%|AnF+G{q%m4i?uo+?<{rBIW)cy|P}R{xqcr1Q$c({L7B>TxSP>7nd{%4lV3;iZ&!8Q40Mu z_Rd#)B|T=}mj&12rUYZF*-rH{*y_+ep0Qs2T+3Xb#f)vR*KVd1^MB*Uoc$o{$eXEu z<6M+efu#Eb2c^roN-bllE>V5rJcVZN6KIx^Yv&9;*G$7-x@#uXz|B~#pDH4U&9qnov3~{Rr{ut z@1Tx|s;e8#ib-TFazp`9;{R4Cck56{b+)$OFzyoLu~N^9r=ezabIM+-&l@u*oDFk9 zeKMZ~Y$Pxd&sNrCW-Nl_dfejM7D>E(S;%5qCp2E%`1(7P*d$HciD;cH{CLUAW|3?Y z&i6lKehc_yk9tjqzu1d{(I>`we1E*dSZDpcm`Rwp6Zc?3zM)k6zX~uu%S$A6sw-HQ znr$TQBzV8gHf2>eIv~VZOssX&GZw*J`AjO2 z%@)m>?FG>V(Jd_B?`6HsO9te^toDnGqb#8D&e_X{NK7a25*0E zkelSi8Q48ZRE^9s_r5_bOd)sT8E9L|usg6UwcI+QrD<@#Vj@TVy&37sPtK+lM$3vQ z2wb?ujy_sHrOuM%L4F=#neH=X>M|xjhT=Y+YE%myMb~fqOax(L`KNL3!5ny~SX#2o zJN493iBcPqsNnWnjWey1$)K|LhZcaO-ZZUU`a9R1_H9d31L17JffK6BG$97_^^(Qw z#xhq=mwb`&q;Cmk{e=dOZ&Cg$jCebV7AUfik}L$Iv&=Hu-5Pa>oHY*>>-O56Ykl<^ z0n`vds7O+d#y*mne8qnMU1K2H#$#R#Fddd*k3lToT|EnGgc%{*HT&Er4 zcDGFL=Z?~Kdo9j&UVNGI@(DJF!@QZj40>wncwBGZ*NRgTy~)9aUQ9@2PY_!Uady8d zmX~ntn(bc>qV$$73brPbw|cM{B|@or%CrL+$4tGO{B;vsd{=M$HFop<0U7^q&SjI{ zy3wDfyN!<9ep~(*F2wg?nsV)cNYz8D$|t#kbu-5S7LQ1DE9#5#P$Rr!$V<;K(jl(z z-ZFwYld@y~9WsneeUbhKk^Bfb{=v=Q-6ludv?zga^fmKJ^#t|Om6>M@D?B8#2ZOZn zZys*>?Q1;LC2P^=%FU7eJP6MqYi(mHn3H^#Quz{)5uDDQ{Kb=&>;V&?F}QQdsSMo? zRW1Oj6N^(yR2vA$+pPxB{fh~m-~(OsotqidBvW`{<0 zf5#x@go-^Ai=RRhCJbh$atpOzkfbZBks7%Y0Dil91yPMsu_+g+lBt0~mwT%u~PMD2l2ruzR2k#^#pnV?3 z{XPiazs++N7mgoOBH*0)WWPC3lyJ?}Ne2!veQ$12B#0$cF*@#jBT}a+)vaLPYe(_w z3*~=&YqCv*Ser0aVoDpCu1FG43Y=Pn3}U=3QYBu);d?KpwyU+cnHzfq=m55Qu_$jW zBj2jv1EGjW}C)OlEPZvt?y8%n|~My?TIMIhcbdzPO^Z&L=c@xqL3xrPoU}A zZ9=*KD{Wics^h86wPz4fn?4jWTRtph^S!@Zpw!gs42E{IanLB%qK@u=XY=^zst=PNN(yFHsId-@T+h<>5VCphKB{3Zt`izkqqAnF%ilA8yEYVC zCWG!hadO`W5V9mMe2^3&%tX2SUuOz-7g)+6t5e?jnhPB{Q_y&1>sg^1Kgv$m%|vf~ zU>j~b^-kzzal&Jo2N0OUb(7-k#Wu*{AOoOZ9!4dnY2vACQJ(-D)N0Tx=X1^|9-oY- z8SACr6$T?>nkNghA6oI)lw{Y+Wav|is{JloC3hyr~7Q$ z-;#LDd;huYO`kIM{uP^4Bf!~ecVyaNh(9Hx5wAg3dxFH^l7Y0bO+kh6=+M@rS!wVK zQt-bwKg#a!@-7@~nR&hXv+wAZY3Le=)s@fmz7KT3X;fDdzFipjxFwMuyQC9fn-S0E z-c&AV;tnh!y;sdl#8K6hQ^~vR#*b52zvzDc$&*MqQJ7OIEZM&{vrF^XKB4*N04!&& z{=Rq?**f==!^HlL>{YLft~|6|0LHRPDC|x!u?e7&xeZu(`?n#~-MZhL(#U+*Bew6h z{C;H=L2S;5y-si8%~%^W=6uUIj)6u+J_e0FgJ#8r&GsKn+Rf48QhWd1ssEUK4%&16 z8rK7v+S-Q;o#fq{O)-S-PmCcgaZST7Ku1XhJBy@AK6QHUHSUhTo58Ce_8FE4mNeT+ z)}T_N*b-%N&S;3@d{oiI1LMblH1iWc8U{8hi=CPjpx-AmWTZ|T*;$C(#vZXFOfU4W z&7KIx65BazYa1{zDz@>9i7^-#3%>xb^Dq$>TRrIZNuQNN`SDAJNfx4z!7R~=DIk8G z;t$*?)ZqHznh)TY;9vfCB7ky=y#|UcT=G*rb73uf`MXU^1|xYR{@44@X_Y$h#Ke1` z4T6>{KXLCaVg-^^hDtuC!S#4x>7TnX=Q(NEad7UwSFG0X2i^1Sz^rD*WlPZFbTSXW z-Z2#xZY(dK6bmmzgpM*sqCx=`(eAuF-|^oMo&DdN75FKB`>nZb)_CY-7;hf*gR3z7 zfN|i9%7u9$NKTE-s>tNI3Ro_S0|HMO4n6}@A~2zPVe0e$mQniaj+^&`jnl^B4MeSH zP!eRbM;nb6={~Jn3)A^fhwOQAG!lx#EH@IqWB{b2d1m_z!CN4-sUJ-#lgh%Lb^ThL zeLB)QJr`mhRKoCL+)aaiv=H zMWn@SA3O?*#zyH;$^-X)_>StGJW#SfQfWsnTr^O&4#G#Z$M&V=!2ddBt0X<_2(X97 zKT6Y;7H)lGcqSVg5Hg3Cj%%eZ-uD8LFsn(_=(t{q=-s}ReKDH1Bk45DJ&2N6Z_F?c z?qSrn64n$#A+cbt4RRW?Hp^o<$nXj-vf>=5PbEQFh*H=3_vHWA-=HRkd582ix$>ae zS)i;)97~%-3_5!4sA4dgEEotoB`Ed^t~M$bCRVCSc>M?gpY9V;$<)RCkTp1qjZiMF zy6*lc!I0F9Z>W^R#GQ0|l)DSfmC&P?&Ex+&dHx#NH1{DNC8cRFQQ?bVxA%?(O{wv4 z^PcmA$57NtD@!!!@t=xd>xR<{$d3)-z{~a3l^)Ki@1Rh-Yum>b-TwD%;LpC7} zcA=tsjCLaGB|x=BPQZVPl1Ku61Bx%EWeX-eZ{)gpJ(bhKqxuu`z|Jo#6qFAae7tfw zqB*w0#c0e;5L70E^@*MNIZ}T{C&828GoGaOk)~{d5lGM-!#Y+iCp2-~$~gS|gb|Ia zs4qkZuN?)0;2c@QE5VkTCGtG`%&-hoP%-SQy^_!WNQp<;aj#{Vk|@vd-MITq={MFK z*gM}#x_Qr<#B!E(#--Sj0N;Zxj(t^`8m1>j`hinfPqT!&N_$*&ip(}ZOC;D2#+mGq zxAqNs&s128$?kymP0x>fycWa+(lTuJWUaxV(4)6gkCKia$-`a-)cks4COPzI8zym- zZlC}4>%jAe5LGNQJ$#h?xJFuFE3Dht7mc%ov_fio=pzIGt-}8tL9{vlB0Rk*g}On7 zF-^eJbYG^Hetp(d;O?b*s_I4BPLqW8b3et3kFUg@evdA%<#a*n{4G0R(}VC|X_@(J zv0SS}o!p=HAhb?&zQ(@!h%qg}ao-S`jlc|0={*igClB_43bP`OwFRytX!krazd%B6f9#bLo!mBq z`71B{pHd}3pW?vrO>}m*2AmSq4K58PJin%2iR^Yu-?7$|lC(}xa75S7Jbg_u^Klcm zC>Czf{U#cMD8sbt^Uw@=doe|Cx5^qQz;blj(7Cq)Tz60%LoJn;HA(@3Gk*f*LBu8Wx5A2W_UIQ^dP^l=D1?h6LH7zO~Su*dNm0?>*j z*UJ*i?_K}8DF7|ahVR#t>O7cI5}8U@Xj~{EHD97 zApTF+e~G4gx34Z&Ln>n5M8CybC*z{=JuLAb{?9}I0TU{g;LgT>9ebTyYLoy_{_pGm zE~bB4{4aR;_kEb*25(sv6W71J0a!c!SL6wk{Qn*$fvb9BBWAcHnTo^f<_O45%09gR z?^Xvy=Lk$(e_M2c>kRWFNiVR8)@!=|qISSP9&pF44)h#{(mRr-$nXEker-xw_P+yT z3V&O4^sVO@r&#Ps^)+>|$rWui^#7H!g;%#Moo|9iq0eAu1Q~p~08-tM2U+xa2KMps zsBAL&!3G@FgFu;l_fsSPr(Gt0{MG3mmq^mnB;=W=L-Y2HFY4~M8`#s|et0oaVtt?+ z7o+h=1tk4TBbKC?jOFD=@dJm@+i#=ww`^YUv%lX^AP%M0GySPZ8KPVH{(-4jhs&g! zxb#ubpvU1(nxo}pXQO{NYtXNUp3-jG2q1-fe)Icmv)iM@7wudXe9pxkt9u%2ZK?i&p7xIE0@70&wjA^0W1V9$meaNUeqmt{9V&^)iAQ#;+Qzf7vC z4^#iNCapJa5!(g5a5`*)^%UoK=*{cZaV zMWbM|e2tuVlNwM^i+*^nC$KGWF))i6SN~DFw0K4uu><-NMpggM#oyj3gHP(uPN;ZE z7%7?>JAKirQ1l+o$Fs^Y8I9Zf*4?P8Dsl`9rA8R>L+lb*|LMSg^0)W#)~}QbwOp-H zSM1*T>DEW(?vELzxL4BWr_uNV2ZQQjLKI7O@cxL^r>7%(e{UuMfvff7zCUma?(!H) zZP^7k{@t~CURO0M=VDKia5TN0Yn#B=x-fXX8UiAF>az`{mx^P5`=1V{-?IyM``Yg9 z)W&e_ErnjxWd`mp4x;%w=8SLZTXMNa$xp6sfPaLTn_7WDTZ2k1R~K9E-C?(*eY;66 zTK?&L|3&kXtLe0oFXYM(mZ#GhwA#tNM_&aqk>tRsC?OIr2NOeGPoVS~WZ^RM!M0Tk z3&!U-{kCH`71=xm@$S7xNs|A}1OWq+-fK;)_QQ2|jdw8Q%*??bfs>6i90cq-8F!j= zk#@Y71oiam*4;q$gVXPxchQ>idKsn6{;e2Kux#X*kAjA-&O!X>c|%{ziyux?9J7<8 zzrN5!6D*D=SEUgJtdT_hbGxkHC?bLwf14bzgxbnO3kTukVVG~J`NDVVFQm`+YM?j6 z{+Zqx-^|Kpi+}0lsRGd;g#N5=nF6T#ue_vpV6&n<~lko*6zkB>m42i=x4n zJFe9c-Gx2OAEUb8gZ{Qhpl@gO$i{Q#(02RYV$Wm9Kf@FptcRRje7bqb9-cK$^7pD+ tAsh7Ab1nMwmM!nUuL Date: Wed, 5 Nov 2014 16:17:56 -0800 Subject: [PATCH 16/25] Bug 1094234 - Get rid of unused BrowserApp.shutdown method. r=mfinkle --- mobile/android/chrome/content/CastingApps.js | 16 --- mobile/android/chrome/content/Reader.js | 16 --- .../chrome/content/WebcompatReporter.js | 11 -- mobile/android/chrome/content/browser.js | 136 ------------------ 4 files changed, 179 deletions(-) diff --git a/mobile/android/chrome/content/CastingApps.js b/mobile/android/chrome/content/CastingApps.js index 8a1d6ef6870..82c8422aad8 100644 --- a/mobile/android/chrome/content/CastingApps.js +++ b/mobile/android/chrome/content/CastingApps.js @@ -84,22 +84,6 @@ var CastingApps = { BrowserApp.deck.addEventListener("ended", this, true); }, - uninit: function ca_uninit() { - BrowserApp.deck.removeEventListener("TabSelect", this, true); - BrowserApp.deck.removeEventListener("pageshow", this, true); - BrowserApp.deck.removeEventListener("playing", this, true); - BrowserApp.deck.removeEventListener("ended", this, true); - - Services.obs.removeObserver(this, "Casting:Play"); - Services.obs.removeObserver(this, "Casting:Pause"); - Services.obs.removeObserver(this, "Casting:Stop"); - Services.obs.removeObserver(this, "Casting:Mirror"); - Services.obs.removeObserver(this, "ssdp-service-found"); - Services.obs.removeObserver(this, "ssdp-service-lost"); - - NativeWindow.contextmenus.remove(this._castMenuId); - }, - _mirrorStarted: function(stopMirrorCallback) { this.stopMirrorCallback = stopMirrorCallback; NativeWindow.menu.update(this.mirrorStartMenuId, { visible: false }); diff --git a/mobile/android/chrome/content/Reader.js b/mobile/android/chrome/content/Reader.js index f8632e5643d..66a53d8b532 100644 --- a/mobile/android/chrome/content/Reader.js +++ b/mobile/android/chrome/content/Reader.js @@ -275,22 +275,6 @@ let Reader = { yield OS.File.remove(path); }), - uninit: function Reader_uninit() { - Services.prefs.removeObserver("reader.parse-on-load.", this); - - Services.obs.removeObserver(this, "Reader:Removed"); - - let requests = this._requests; - for (let url in requests) { - let request = requests[url]; - if (request.browser) { - let browser = request.browser; - browser.parentNode.removeChild(browser); - } - } - delete this._requests; - }, - log: function(msg) { if (this.DEBUG) dump("Reader: " + msg); diff --git a/mobile/android/chrome/content/WebcompatReporter.js b/mobile/android/chrome/content/WebcompatReporter.js index 3ca8449a5af..23ee35fbb28 100644 --- a/mobile/android/chrome/content/WebcompatReporter.js +++ b/mobile/android/chrome/content/WebcompatReporter.js @@ -18,17 +18,6 @@ var WebcompatReporter = { this.addMenuItem(); }, - uninit: function() { - Services.obs.removeObserver(this, "DesktopMode:Change"); - Services.obs.removeObserver(this, "chrome-document-global-created"); - Services.obs.removeObserver(this, "content-document-global-created"); - - if (this.menuItem) { - NativeWindow.menu.remove(this.menuItem); - this.menuItem = null; - } - }, - observe: function(subject, topic, data) { if (topic == "content-document-global-created" || topic == "chrome-document-global-created") { let win = subject; diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js index 8fb6542c8d5..0c1b83127eb 100644 --- a/mobile/android/chrome/content/browser.js +++ b/mobile/android/chrome/content/browser.js @@ -894,29 +894,6 @@ var BrowserApp = { } }, - shutdown: function shutdown() { - NativeWindow.uninit(); - LightWeightThemeWebInstaller.uninit(); - FormAssistant.uninit(); - IndexedDB.uninit(); - ViewportHandler.uninit(); - XPInstallObserver.uninit(); - HealthReportStatusListener.uninit(); - CharacterEncoding.uninit(); - SearchEngines.uninit(); - RemoteDebugger.uninit(); - Reader.uninit(); - UserAgentOverrides.uninit(); - DesktopUserAgent.uninit(); - ExternalApps.uninit(); - CastingApps.uninit(); - Distribution.uninit(); - Tabs.uninit(); -#ifdef NIGHTLY_BUILD - WebcompatReporter.uninit(); -#endif - }, - // This function returns false during periods where the browser displayed document is // different from the browser content document, so user actions and some kinds of viewport // updates should be ignored. This period starts when we start loading a new page or @@ -2026,14 +2003,6 @@ var NativeWindow = { this.contextmenus.init(); }, - uninit: function() { - Services.obs.removeObserver(this, "Menu:Clicked"); - Services.obs.removeObserver(this, "Doorhanger:Reply"); - Services.obs.removeObserver(this, "Toast:Click", false); - Services.obs.removeObserver(this, "Toast:Hidden", false); - this.contextmenus.uninit(); - }, - loadDex: function(zipFile, implClass) { Messaging.sendRequest({ type: "Dex:Load", @@ -2217,10 +2186,6 @@ var NativeWindow = { BrowserApp.deck.addEventListener("contextmenu", this.show.bind(this), false); }, - uninit: function() { - BrowserApp.deck.removeEventListener("contextmenu", this.show.bind(this), false); - }, - add: function() { let args; if (arguments.length == 1) { @@ -2878,12 +2843,6 @@ var LightWeightThemeWebInstaller = { BrowserApp.deck.addEventListener("ResetBrowserThemePreview", this, false, true); }, - uninit: function() { - BrowserApp.deck.removeEventListener("InstallBrowserTheme", this, false, true); - BrowserApp.deck.removeEventListener("PreviewBrowserTheme", this, false, true); - BrowserApp.deck.removeEventListener("ResetBrowserThemePreview", this, false, true); - }, - handleEvent: function (event) { switch (event.type) { case "InstallBrowserTheme": @@ -3001,10 +2960,6 @@ var DesktopUserAgent = { .replace(/Gecko\/[0-9\.]+/, "Gecko/20100101"); }, - uninit: function ua_uninit() { - Services.obs.removeObserver(this, "DesktopMode:Change"); - }, - onRequest: function(channel, defaultUA) { let channelWindow = this._getWindowForRequest(channel); let tab = BrowserApp.getTabForWindow(channelWindow); @@ -5528,21 +5483,6 @@ var FormAssistant = { LoginManagerParent.init(); }, - uninit: function() { - Services.obs.removeObserver(this, "FormAssist:AutoComplete"); - Services.obs.removeObserver(this, "FormAssist:Blocklisted"); - Services.obs.removeObserver(this, "FormAssist:Hidden"); - Services.obs.removeObserver(this, "FormAssist:Remove"); - Services.obs.removeObserver(this, "invalidformsubmit"); - Services.obs.removeObserver(this, "PanZoom:StateChange"); - - BrowserApp.deck.removeEventListener("focus", this); - BrowserApp.deck.removeEventListener("blur", this); - BrowserApp.deck.removeEventListener("click", this); - BrowserApp.deck.removeEventListener("input", this); - BrowserApp.deck.removeEventListener("pageshow", this); - }, - observe: function(aSubject, aTopic, aData) { switch (aTopic) { case "PanZoom:StateChange": @@ -5891,17 +5831,6 @@ let HealthReportStatusListener = { } }, - uninit: function () { - Services.obs.removeObserver(this, "HealthReport:RequestSnapshot"); - Services.prefs.removeObserver(this.PREF_ACCEPT_LANG, this); - Services.prefs.removeObserver(this.PREF_BLOCKLIST_ENABLED, this); - if (this.PREF_TELEMETRY_ENABLED) { - Services.prefs.removeObserver(this.PREF_TELEMETRY_ENABLED, this); - } - - AddonManager.removeAddonListener(this); - }, - observe: function (aSubject, aTopic, aData) { switch (aTopic) { case "HealthReport:RequestSnapshot": @@ -6068,13 +5997,6 @@ var XPInstallObserver = { AddonManager.addInstallListener(XPInstallObserver); }, - uninit: function xpi_uninit() { - Services.obs.removeObserver(XPInstallObserver, "addon-install-blocked"); - Services.obs.removeObserver(XPInstallObserver, "addon-install-started"); - - AddonManager.removeInstallListener(XPInstallObserver); - }, - observe: function xpi_observer(aSubject, aTopic, aData) { switch (aTopic) { case "addon-install-started": @@ -6253,11 +6175,6 @@ var ViewportHandler = { Services.obs.addObserver(this, "Window:Resize", false); }, - uninit: function uninit() { - removeEventListener("DOMMetaAdded", this, false); - Services.obs.removeObserver(this, "Window:Resize"); - }, - handleEvent: function handleEvent(aEvent) { switch (aEvent.type) { case "DOMMetaAdded": @@ -6578,12 +6495,6 @@ var IndexedDB = { Services.obs.addObserver(this, this._quotaCancel, false); }, - uninit: function IndexedDB_uninit() { - Services.obs.removeObserver(this, this._permissionsPrompt); - Services.obs.removeObserver(this, this._quotaPrompt); - Services.obs.removeObserver(this, this._quotaCancel); - }, - observe: function IndexedDB_observe(subject, topic, data) { if (topic != this._permissionsPrompt && topic != this._quotaPrompt && @@ -6680,11 +6591,6 @@ var CharacterEncoding = { this.sendState(); }, - uninit: function uninit() { - Services.obs.removeObserver(this, "CharEncoding:Get"); - Services.obs.removeObserver(this, "CharEncoding:Set"); - }, - observe: function observe(aSubject, aTopic, aData) { switch (aTopic) { case "CharEncoding:Get": @@ -7007,17 +6913,6 @@ var SearchEngines = { }); }, - uninit: function uninit() { - Services.obs.removeObserver(this, "SearchEngines:Add"); - Services.obs.removeObserver(this, "SearchEngines:GetVisible"); - Services.obs.removeObserver(this, "SearchEngines:Remove"); - Services.obs.removeObserver(this, "SearchEngines:RestoreDefaults"); - Services.obs.removeObserver(this, "SearchEngines:SetDefault"); - Services.obs.removeObserver(this, "browser-search-engine-modified"); - if (this._contextMenuId != null) - NativeWindow.contextmenus.remove(this._contextMenuId); - }, - // Fetch list of search engines. all ? All engines : Visible engines only. _handleSearchEnginesGetVisible: function _handleSearchEnginesGetVisible(rv, all) { if (!Components.isSuccessCode(rv)) { @@ -7346,11 +7241,6 @@ var RemoteDebugger = { } }, - uninit: function rd_uninit() { - Services.prefs.removeObserver("devtools.debugger.", this); - this._stop(); - }, - _getPort: function _rd_getPort() { return Services.prefs.getIntPref("devtools.debugger.remote-port"); }, @@ -7475,13 +7365,6 @@ var ExternalApps = { }, this.filter, this.openExternal); }, - uninit: function helper_uninit() { - if (this._contextMenuId !== null) { - NativeWindow.contextmenus.remove(this._contextMenuId); - } - this._contextMenuId = null; - }, - filter: { matches: function(aElement) { let uri = ExternalApps._getMediaLink(aElement); @@ -7611,12 +7494,6 @@ var Distribution = { this.readJSON(this._file, this.update); }, - uninit: function dc_uninit() { - Services.obs.removeObserver(this, "Distribution:Set"); - Services.obs.removeObserver(this, "prefservice:after-app-defaults"); - Services.obs.removeObserver(this, "Campaign:Set"); - }, - observe: function dc_observe(aSubject, aTopic, aData) { switch (aTopic) { case "Distribution:Set": @@ -7765,19 +7642,6 @@ var Tabs = { BrowserApp.deck.addEventListener("TabOpen", this, false); }, - uninit: function() { - if (!this._enableTabExpiration) { - // If _enableTabExpiration is true then we won't have this - // observer registered any more. - Services.obs.removeObserver(this, "memory-pressure"); - } - - Services.obs.removeObserver(this, "Session:Prefetch"); - - BrowserApp.deck.removeEventListener("pageshow", this); - BrowserApp.deck.removeEventListener("TabOpen", this); - }, - observe: function(aSubject, aTopic, aData) { switch (aTopic) { case "memory-pressure": From 5b7aa5ad693b3bc63543c7208090f6890a29b951 Mon Sep 17 00:00:00 2001 From: Margaret Leibovic Date: Wed, 5 Nov 2014 16:17:56 -0800 Subject: [PATCH 17/25] Bug 1087722 - Convert reader mode API to use promises. r=rnewman,bnicholson --- .../base/tests/testReadingListCache.js | 14 +- mobile/android/chrome/content/Reader.js | 357 ++++++++---------- mobile/android/chrome/content/aboutReader.js | 35 +- mobile/android/chrome/content/browser.js | 4 +- 4 files changed, 164 insertions(+), 246 deletions(-) diff --git a/mobile/android/base/tests/testReadingListCache.js b/mobile/android/base/tests/testReadingListCache.js index d9b7e1a9113..2d2d5ca626f 100644 --- a/mobile/android/base/tests/testReadingListCache.js +++ b/mobile/android/base/tests/testReadingListCache.js @@ -21,14 +21,14 @@ const ARTICLE = { const ARTICLE_URI = Services.io.newURI(ARTICLE.url, null, null); -add_task(function test_article_not_found() { +add_task(function* test_article_not_found() { let Reader = Services.wm.getMostRecentWindow("navigator:browser").Reader; let article = yield Reader.getArticleFromCache(ARTICLE_URI); do_check_eq(article, null); }); -add_task(function test_store_article() { +add_task(function* test_store_article() { let Reader = Services.wm.getMostRecentWindow("navigator:browser").Reader; yield Reader.storeArticleInCache(ARTICLE); @@ -37,7 +37,7 @@ add_task(function test_store_article() { checkArticle(article); }); -add_task(function test_remove_article() { +add_task(function* test_remove_article() { let Reader = Services.wm.getMostRecentWindow("navigator:browser").Reader; yield Reader.removeArticleFromCache(ARTICLE_URI); @@ -46,13 +46,11 @@ add_task(function test_remove_article() { do_check_eq(article, null); }); -add_test(function test_parse_article() { +add_task(function* test_parse_article() { let Reader = Services.wm.getMostRecentWindow("navigator:browser").Reader; - Reader.parseDocumentFromURL(ARTICLE.url, function parseCallback(article) { - checkArticle(article); - run_next_test(); - }); + let article = yield Reader._downloadAndParseDocument(ARTICLE.url); + checkArticle(article); }); function checkArticle(article) { diff --git a/mobile/android/chrome/content/Reader.js b/mobile/android/chrome/content/Reader.js index 66a53d8b532..2ba2ed63cd5 100644 --- a/mobile/android/chrome/content/Reader.js +++ b/mobile/android/chrome/content/Reader.js @@ -25,7 +25,7 @@ let Reader = { // Listen for future pref changes. Services.prefs.addObserver("reader.parse-on-load.", this, false); - return this.isEnabledForParseOnLoad = this.getStateForParseOnLoad(); + return this.isEnabledForParseOnLoad = this._getStateForParseOnLoad(); }, pageAction: { @@ -37,7 +37,7 @@ let Reader = { }, readerModeActiveCallback: function(tabID) { - Reader._addTabToReadingList(tabID); + Reader._addTabToReadingList(tabID).catch(e => Cu.reportError("Error adding tab to reading list: " + e)); UITelemetry.addEvent("save.1", "pageaction", null, "reader"); }, }, @@ -86,43 +86,31 @@ let Reader = { case "nsPref:changed": { if (aData.startsWith("reader.parse-on-load.")) { - this.isEnabledForParseOnLoad = this.getStateForParseOnLoad(); + this.isEnabledForParseOnLoad = this._getStateForParseOnLoad(); } break; } } }, - _addTabToReadingList: function(tabID) { + _addTabToReadingList: Task.async(function* (tabID) { let tab = BrowserApp.getTabForId(tabID); if (!tab) { - Cu.reportError("Can't add tab to reading list because no tab found for ID: " + tabID); - return; + throw new Error("Can't add tab to reading list because no tab found for ID: " + tabID); } + let uri = tab.browser.currentURI; + let urlWithoutRef = uri.specIgnoringRef; - this.getArticleFromCache(uri).then(article => { - // If the article is already in the cache, just use that. - if (article) { - this.addArticleToReadingList(article); - return; - } + let article = yield this.getArticle(urlWithoutRef, tabID); + if (!article) { + // If there was a problem getting the article, just store the + // URL and title from the tab. + article = { url: urlWithoutRef, title: tab.browser.contentDocument.title }; + } - // Otherwise, get the article data from the tab. - this.getArticleForTab(tabID, uri.specIgnoringRef, article => { - if (article) { - this.addArticleToReadingList(article); - } else { - // If there was a problem getting the article, just store the - // URL and title from the tab. - this.addArticleToReadingList({ - url: urlWithoutRef, - title: tab.browser.contentDocument.title, - }); - } - }); - }, e => Cu.reportError("Error trying to get article from cache: " + e)); - }, + this.addArticleToReadingList(article); + }), addArticleToReadingList: function(article) { if (!article || !article.url) { @@ -141,7 +129,7 @@ let Reader = { this.storeArticleInCache(article).catch(e => Cu.reportError("Error storing article in cache: " + e)); }, - getStateForParseOnLoad: function Reader_getStateForParseOnLoad() { + _getStateForParseOnLoad: function () { let isEnabled = Services.prefs.getBoolPref("reader.parse-on-load.enabled"); let isForceEnabled = Services.prefs.getBoolPref("reader.parse-on-load.force-enabled"); // For low-memory devices, don't allow reader mode since it takes up a lot of memory. @@ -149,92 +137,71 @@ let Reader = { return isForceEnabled || (isEnabled && !BrowserApp.isOnLowMemoryPlatform); }, - parseDocumentFromURL: function Reader_parseDocumentFromURL(url, callback) { - // If there's an on-going request for the same URL, simply append one - // more callback to it to be called when the request is done. - if (url in this._requests) { - let request = this._requests[url]; - request.callbacks.push(callback); - return; - } - - let request = { url: url, callbacks: [callback] }; - this._requests[url] = request; - - let uri = Services.io.newURI(url, null, null); - - // First, try to find a parsed article in the cache. - this.getArticleFromCache(uri).then(article => { - if (article) { - this.log("Page found in cache, return article immediately"); - this._runCallbacksAndFinish(request, article); - return; - } - - if (!this._requests) { - this.log("Reader has been destroyed, abort"); - return; - } - - // Article hasn't been found in the cache, we need to - // download the page and parse the article out of it. - this._downloadAndParseDocument(url, request); - }, e => { - Cu.reportError("Error trying to get article from cache: " + e); - this._runCallbacksAndFinish(request, null); - }); - }, - - getArticleForTab: function Reader_getArticleForTab(tabId, url, callback) { + /** + * Gets an article for a given URL. This method will download and parse a document + * if it does not find the article in the tab data or the cache. + * + * @param url The article URL. + * @param tabId (optional) The id of the tab where we can look for a saved article. + * @return {Promise} + * @resolves JS object representing the article, or null if no article is found. + */ + getArticle: Task.async(function* (url, tabId) { + // First, look for an article object stored on the tab. let tab = BrowserApp.getTabForId(tabId); if (tab) { let article = tab.savedArticle; if (article && article.url == url) { this.log("Saved article found in tab"); - callback(article); - return; + return article; } } - this.parseDocumentFromURL(url, callback); - }, + // Next, try to find a parsed article in the cache. + let uri = Services.io.newURI(url, null, null); + let article = yield this.getArticleFromCache(uri); + if (article) { + this.log("Saved article found in cache"); + return article; + } - parseDocumentFromTab: function (tab, callback) { + // Article hasn't been found in the cache, we need to + // download the page and parse the article out of it. + return yield this._downloadAndParseDocument(url); + }), + + /** + * Gets an article from a loaded tab's document. This method will parse the document + * if it does not find the article in the tab data or the cache. + * + * @param tab The loaded tab. + * @return {Promise} + * @resolves JS object representing the article, or null if no article is found. + */ + parseDocumentFromTab: Task.async(function* (tab) { let uri = tab.browser.currentURI; if (!this._shouldCheckUri(uri)) { - callback(null); - return; + this.log("Reader mode disabled for URI"); + return null; } // First, try to find a parsed article in the cache. - this.getArticleFromCache(uri).then(article => { - if (article) { - this.log("Page found in cache, return article immediately"); - callback(article); - return; - } + let article = yield this.getArticleFromCache(uri); + if (article) { + this.log("Page found in cache, return article immediately"); + return article; + } - let doc = tab.browser.contentWindow.document; - this._readerParse(uri, doc, article => { - if (!article) { - this.log("Failed to parse page"); - callback(null); - return; - } - callback(article); - }); - }, e => { - Cu.reportError("Error trying to get article from cache: " + e); - callback(null); - }); - }, + let doc = tab.browser.contentWindow.document; + return yield this._readerParse(uri, doc); + }), /** * Retrieves an article from the cache given an article URI. * * @param uri The article URI. - * @return Promise - * @resolve JS object representing the article, or null if no article is found. + * @return {Promise} + * @resolves JS object representing the article, or null if no article is found. * @rejects OS.File.Error */ getArticleFromCache: Task.async(function* (uri) { @@ -251,8 +218,8 @@ let Reader = { * Stores an article in the cache. * * @param article JS object representing article. - * @return Promise - * @resolve When the article is stored. + * @return {Promise} + * @resolves When the article is stored. * @rejects OS.File.Error */ storeArticleInCache: Task.async(function* (article) { @@ -266,8 +233,8 @@ let Reader = { * Removes an article from the cache given an article URI. * * @param uri The article URI. - * @return Promise - * @resolve When the article is removed. + * @return {Promise} + * @resolves When the article is removed. * @rejects OS.File.Error */ removeArticleFromCache: Task.async(function* (uri) { @@ -280,7 +247,7 @@ let Reader = { dump("Reader: " + msg); }, - _shouldCheckUri: function Reader_shouldCheckUri(uri) { + _shouldCheckUri: function (uri) { if ((uri.prePath + "/") === uri.spec) { this.log("Not parsing home page: " + uri.spec); return false; @@ -294,139 +261,109 @@ let Reader = { return true; }, - _readerParse: function Reader_readerParse(uri, doc, callback) { - let numTags = doc.getElementsByTagName("*").length; - if (numTags > this.MAX_ELEMS_TO_PARSE) { - this.log("Aborting parse for " + uri.spec + "; " + numTags + " elements found"); - callback(null); - return; - } + _readerParse: function (uri, doc) { + return new Promise((resolve, reject) => { + let numTags = doc.getElementsByTagName("*").length; + if (numTags > this.MAX_ELEMS_TO_PARSE) { + reject("Aborting parse for " + uri.spec + "; " + numTags + " elements found"); + return; + } - let worker = new ChromeWorker("readerWorker.js"); - worker.onmessage = function (evt) { - let article = evt.data; + let worker = new ChromeWorker("readerWorker.js"); + worker.onmessage = function (evt) { + let article = evt.data; - // Append URL to the article data. specIgnoringRef will ignore any hash - // in the URL. - if (article) { + if (!article) { + reject("Worker did not return an article"); + return; + } + + // Append URL to the article data. specIgnoringRef will ignore any hash + // in the URL. article.url = uri.specIgnoringRef; let flags = Ci.nsIDocumentEncoder.OutputSelectionOnly | Ci.nsIDocumentEncoder.OutputAbsoluteLinks; article.title = Cc["@mozilla.org/parserutils;1"].getService(Ci.nsIParserUtils) .convertToPlainText(article.title, flags, 0); + resolve(article); + }; + + try { + worker.postMessage({ + uri: { + spec: uri.spec, + host: uri.host, + prePath: uri.prePath, + scheme: uri.scheme, + pathBase: Services.io.newURI(".", null, uri).spec + }, + doc: new XMLSerializer().serializeToString(doc) + }); + } catch (e) { + reject("Reader: could not build Readability arguments: " + e); } - - callback(article); - }; - - try { - worker.postMessage({ - uri: { - spec: uri.spec, - host: uri.host, - prePath: uri.prePath, - scheme: uri.scheme, - pathBase: Services.io.newURI(".", null, uri).spec - }, - doc: new XMLSerializer().serializeToString(doc) - }); - } catch (e) { - Cu.reportError("Reader: could not build Readability arguments: " + e); - callback(null); - } - }, - - _runCallbacksAndFinish: function Reader_runCallbacksAndFinish(request, result) { - delete this._requests[request.url]; - - request.callbacks.forEach(function(callback) { - callback(result); }); }, - _downloadDocument: function Reader_downloadDocument(url, callback) { - // We want to parse those arbitrary pages safely, outside the privileged - // context of chrome. We create a hidden browser element to fetch the - // loaded page's document object then discard the browser element. + _downloadDocument: function (url) { + return new Promise((resolve, reject) => { + // We want to parse those arbitrary pages safely, outside the privileged + // context of chrome. We create a hidden browser element to fetch the + // loaded page's document object then discard the browser element. + let browser = document.createElement("browser"); + browser.setAttribute("type", "content"); + browser.setAttribute("collapsed", "true"); + browser.setAttribute("disablehistory", "true"); - let browser = document.createElement("browser"); - browser.setAttribute("type", "content"); - browser.setAttribute("collapsed", "true"); - browser.setAttribute("disablehistory", "true"); + document.documentElement.appendChild(browser); + browser.stop(); - document.documentElement.appendChild(browser); - browser.stop(); + browser.webNavigation.allowAuth = false; + browser.webNavigation.allowImages = false; + browser.webNavigation.allowJavascript = false; + browser.webNavigation.allowMetaRedirects = true; + browser.webNavigation.allowPlugins = false; - browser.webNavigation.allowAuth = false; - browser.webNavigation.allowImages = false; - browser.webNavigation.allowJavascript = false; - browser.webNavigation.allowMetaRedirects = true; - browser.webNavigation.allowPlugins = false; + browser.addEventListener("DOMContentLoaded", event => { + let doc = event.originalTarget; - browser.addEventListener("DOMContentLoaded", event => { - let doc = event.originalTarget; - - // ignore on frames and other documents - if (doc != browser.contentDocument) - return; - - this.log("Done loading: " + doc); - if (doc.location.href == "about:blank") { - callback(null); - - // Request has finished with error, remove browser element - browser.parentNode.removeChild(browser); - return; - } - - callback(doc); - }); - - browser.loadURIWithFlags(url, Ci.nsIWebNavigation.LOAD_FLAGS_NONE, - null, null, null); - - return browser; - }, - - _downloadAndParseDocument: function Reader_downloadAndParseDocument(url, request) { - try { - this.log("Needs to fetch page, creating request: " + url); - - request.browser = this._downloadDocument(url, doc => { - this.log("Finished loading page: " + doc); - - if (!doc) { - this.log("Error loading page"); - this._runCallbacksAndFinish(request, null); + // ignore on frames and other documents + if (doc != browser.contentDocument) { return; } - this.log("Parsing response with Readability"); + this.log("Done loading: " + doc); + if (doc.location.href == "about:blank") { + reject("about:blank loaded; aborting"); - let uri = Services.io.newURI(url, null, null); - this._readerParse(uri, doc, article => { - // Delete reference to the browser element as we've finished parsing. - let browser = request.browser; - if (browser) { - browser.parentNode.removeChild(browser); - delete request.browser; - } + // Request has finished with error, remove browser element + browser.parentNode.removeChild(browser); + return; + } - if (!article) { - this.log("Failed to parse page"); - this._runCallbacksAndFinish(request, null); - return; - } - - this.log("Parsing has been successful"); - this._runCallbacksAndFinish(request, article); - }); + resolve({ browser, doc }); }); - } catch (e) { - this.log("Error downloading and parsing document: " + e); - this._runCallbacksAndFinish(request, null); - } + + browser.loadURIWithFlags(url, Ci.nsIWebNavigation.LOAD_FLAGS_NONE, + null, null, null); + }); }, + _downloadAndParseDocument: Task.async(function* (url) { + this.log("Needs to fetch page, creating request: " + url); + let { browser, doc } = yield this._downloadDocument(url); + this.log("Finished loading page: " + doc); + + try { + this.log("Parsing response with Readability"); + let uri = Services.io.newURI(url, null, null); + let article = yield this._readerParse(uri, doc); + this.log("Document parsed successfully"); + return article; + } finally { + browser.parentNode.removeChild(browser); + } + }), + get _cryptoHash() { delete this._cryptoHash; return this._cryptoHash = Cc["@mozilla.org/security/hash;1"].createInstance(Ci.nsICryptoHash); diff --git a/mobile/android/chrome/content/aboutReader.js b/mobile/android/chrome/content/aboutReader.js index 2a6d86576f3..580214d64a9 100644 --- a/mobile/android/chrome/content/aboutReader.js +++ b/mobile/android/chrome/content/aboutReader.js @@ -130,13 +130,7 @@ let AboutReader = function(doc, win) { let url = queryArgs.url; let tabId = queryArgs.tabId; - if (tabId) { - dump("Loading from tab with ID: " + tabId + ", URL: " + url); - this._loadFromTab(tabId, url); - } else { - dump("Fetching page with URL: " + url); - this._loadFromURL(url); - } + this._loadArticle(url, tabId); } AboutReader.prototype = { @@ -515,27 +509,16 @@ AboutReader.prototype = { }); }, - _loadFromURL: function Reader_loadFromURL(url) { + _loadArticle: Task.async(function* (url, tabId) { this._showProgressDelayed(); - gChromeWin.Reader.parseDocumentFromURL(url, function(article) { - if (article) - this._showContent(article); - else - this._win.location.href = url; - }.bind(this)); - }, - - _loadFromTab: function Reader_loadFromTab(tabId, url) { - this._showProgressDelayed(); - - gChromeWin.Reader.getArticleForTab(tabId, url, function(article) { - if (article) - this._showContent(article); - else - this._showError(gStrings.GetStringFromName("aboutReader.loadError")); - }.bind(this)); - }, + try { + let article = yield gChromeWin.Reader.getArticle(url, tabId); + this._showContent(article); + } catch (e) { + this._win.location.href = url; + } + }), _requestFavicon: function Reader_requestFavicon() { Messaging.sendRequest({ diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js index 0c1b83127eb..794992b34cf 100644 --- a/mobile/android/chrome/content/browser.js +++ b/mobile/android/chrome/content/browser.js @@ -4218,7 +4218,7 @@ Tab.prototype = { return; // Once document is fully loaded, parse it - Reader.parseDocumentFromTab(this, function (article) { + Reader.parseDocumentFromTab(this).then(article => { // The loaded page may have changed while we were parsing the document. // Make sure we've got the current one. let uri = this.browser.currentURI; @@ -4250,7 +4250,7 @@ Tab.prototype = { if(!this.readerEnabled) this.readerEnabled = true; - }.bind(this)); + }, e => Cu.reportError(e)); } } }, From c5b24456498ba4a2df3288045f307f050bc2a5c1 Mon Sep 17 00:00:00 2001 From: Shane Caraveo Date: Wed, 5 Nov 2014 16:21:01 -0800 Subject: [PATCH 18/25] bug 1090563 fix shared iframe use in loop, r=jaws --- browser/base/content/browser-social.js | 4 - browser/modules/PanelFrame.jsm | 51 ++-- browser/modules/SharedFrame.jsm | 221 ------------------ browser/modules/moz.build | 2 - browser/modules/test/chrome/chrome.ini | 4 - browser/modules/test/chrome/sharedframe.xul | 174 -------------- .../modules/test/chrome/test_sharedframe.xul | 41 ---- 7 files changed, 24 insertions(+), 473 deletions(-) delete mode 100644 browser/modules/SharedFrame.jsm delete mode 100644 browser/modules/test/chrome/chrome.ini delete mode 100644 browser/modules/test/chrome/sharedframe.xul delete mode 100644 browser/modules/test/chrome/test_sharedframe.xul diff --git a/browser/base/content/browser-social.js b/browser/base/content/browser-social.js index ce1c02474fb..567fec817cc 100644 --- a/browser/base/content/browser-social.js +++ b/browser/base/content/browser-social.js @@ -12,9 +12,6 @@ let SocialUI, (function() { -XPCOMUtils.defineLazyModuleGetter(this, "SharedFrame", - "resource:///modules/SharedFrame.jsm"); - XPCOMUtils.defineLazyModuleGetter(this, "PanelFrame", "resource:///modules/PanelFrame.jsm"); @@ -1267,7 +1264,6 @@ SocialStatus = { let notificationFrameId = "social-status-" + origin; let frame = document.getElementById(notificationFrameId); if (frame) { - SharedFrame.forgetGroup(frame.id); frame.parentNode.removeChild(frame); } }, diff --git a/browser/modules/PanelFrame.jsm b/browser/modules/PanelFrame.jsm index f9f2d43800b..a116c63f4a9 100644 --- a/browser/modules/PanelFrame.jsm +++ b/browser/modules/PanelFrame.jsm @@ -14,8 +14,6 @@ Cu.import("resource://gre/modules/XPCOMUtils.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "CustomizableUI", "resource:///modules/CustomizableUI.jsm"); -XPCOMUtils.defineLazyModuleGetter(this, "SharedFrame", "resource:///modules/SharedFrame.jsm"); - XPCOMUtils.defineLazyModuleGetter(this, "DynamicResizeWatcher", "resource:///modules/Social.jsm"); // The minimum sizes for the auto-resize panel code. @@ -48,44 +46,44 @@ let PanelFrameInternal = { _attachNotificatonPanel: function(aWindow, aParent, aButton, aType, aOrigin, aSrc, aSize) { aParent.hidden = false; let notificationFrameId = aOrigin ? aType + "-status-" + aOrigin : aType; - let frame = aWindow.document.getElementById(notificationFrameId); + let doc = aWindow.document; + let frame = doc.getElementById(notificationFrameId); // If the button was customized to a new location, destroy the // iframe and start fresh. if (frame && frame.parentNode != aParent) { - SharedFrame.forgetGroup(frame.id); frame.parentNode.removeChild(frame); frame = null; } if (!frame) { let {width, height} = aSize ? aSize : {width: PANEL_MIN_WIDTH, height: PANEL_MIN_HEIGHT}; + frame = doc.createElement("browser"); + let attrs = { + "type": "content", + "mozbrowser": "true", + // All frames use social-panel-frame as the class. + "class": "social-panel-frame", + "id": notificationFrameId, + "tooltip": "aHTMLTooltip", + "context": "contentAreaContextMenu", + "flex": "1", - frame = SharedFrame.createFrame( - notificationFrameId, /* frame name */ - aParent, /* parent */ - { - "type": "content", - "mozbrowser": "true", - // All frames use social-panel-frame as the class. - "class": "social-panel-frame", - "id": notificationFrameId, - "tooltip": "aHTMLTooltip", - "context": "contentAreaContextMenu", - "flex": "1", + // work around bug 793057 - by making the panel roughly the final size + // we are more likely to have the anchor in the correct position. + "style": "width: " + width + "px; height: " + height + "px;", + "dynamicresizer": !aSize, - // work around bug 793057 - by making the panel roughly the final size - // we are more likely to have the anchor in the correct position. - "style": "width: " + width + "px; height: " + height + "px;", - "dynamicresizer": !aSize, - - "origin": aOrigin, - "src": aSrc - } - ); + "origin": aOrigin, + "src": aSrc + }; + for (let [k, v] of Iterator(attrs)) { + frame.setAttribute(k, v); + } + aParent.appendChild(frame); } else { frame.setAttribute("origin", aOrigin); - SharedFrame.updateURL(notificationFrameId, aSrc); + frame.setAttribute("src", aSrc); } aButton.setAttribute("notificationFrameId", notificationFrameId); } @@ -156,7 +154,6 @@ let PanelFrame = { panel.addEventListener("popupshown", function onpopupshown() { panel.removeEventListener("popupshown", onpopupshown); - SharedFrame.setOwner(notificationFrameId, notificationFrame); let initFrameShow = () => { notificationFrame.docShell.isActive = true; notificationFrame.docShell.isAppTab = true; diff --git a/browser/modules/SharedFrame.jsm b/browser/modules/SharedFrame.jsm deleted file mode 100644 index 4d248ae5ba2..00000000000 --- a/browser/modules/SharedFrame.jsm +++ /dev/null @@ -1,221 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -"use strict"; - -this.EXPORTED_SYMBOLS = [ "SharedFrame" ]; - -const Ci = Components.interfaces; -const Cu = Components.utils; - -/** - * The purpose of this module is to create and group various iframe - * elements that are meant to all display the same content and only - * one at a time. This makes it possible to have the content loaded - * only once, while the other iframes can be kept as placeholders to - * quickly move the content to them through the swapFrameLoaders function - * when another one of the placeholder is meant to be displayed. - * */ - -let Frames = new Map(); - -/** - * The Frames map is the main data structure that holds information - * about the groups being tracked. Each entry's key is the group name, - * and the object holds information about what is the URL being displayed - * on that group, and what is the active element on the group (the frame that - * holds the loaded content). - * The reference to the activeFrame is a weak reference, which allows the - * frame to go away at any time, and when that happens the module considers that - * there are no active elements in that group. The group can be reactivated - * by changing the URL, calling preload again or adding a new element. - * - * - * Frames = { - * "messages-panel": { - * url: string, - * activeFrame: weakref - * } - * } - * - * Each object on the map is called a _SharedFrameGroup, which is an internal - * class of this module which does not automatically keep track of its state. This - * object should not be used externally, and all control should be handled by the - * module's functions. - */ - -function UNLOADED_URL(aStr) "data:text/html;charset=utf-8,"; - - -this.SharedFrame = { - /** - * Creates an iframe element and track it as part of the specified group - * The module must create the iframe itself because it needs to do some special - * handling for the element's src attribute. - * - * @param aGroupName the name of the group to which this frame belongs - * @param aParent the parent element to which the frame will be appended to - * @param aFrameAttributes an object with a list of attributes to set in the iframe - * before appending it to the DOM. The "src" attribute has - * special meaning here and if it's not blank it specifies - * the URL that will be initially assigned to this group - * @param aPreload optional, tells if the URL specified in the src attribute - * should be preloaded in the frame being created, in case - * it's not yet preloaded in any other frame of the group. - * This parameter has no meaning if src is blank. - */ - createFrame: function (aGroupName, aParent, aFrameAttributes, aPreload = true) { - let frame = aParent.ownerDocument.createElement("iframe"); - - for (let [key, val] of Iterator(aFrameAttributes)) { - frame.setAttribute(key, val); - } - - let src = aFrameAttributes.src; - if (!src) { - aPreload = false; - } - - let group = Frames.get(aGroupName); - - if (group) { - // If this group has already been created - - if (aPreload && !group.isAlive) { - // If aPreload is set and the group is not already loaded, load it. - // This can happen if: - // - aPreload was not used while creating the previous frames of this group, or - // - the previously active frame went dead in the meantime - group.url = src; - this.preload(aGroupName, frame); - } else { - // If aPreload is not set, or the group is already loaded in a different frame, - // there's not much that we need to do here: just create this frame as an - // inactivate placeholder - frame.setAttribute("src", UNLOADED_URL(aGroupName)); - } - - } else { - // This is the first time we hear about this group, so let's start tracking it, - // and also preload it if the src attribute was set and aPreload = true - group = new _SharedFrameGroup(src); - Frames.set(aGroupName, group); - - if (aPreload) { - this.preload(aGroupName, frame); - } else { - frame.setAttribute("src", UNLOADED_URL(aGroupName)); - } - } - - aParent.appendChild(frame); - return frame; - - }, - - /** - * Function that moves the loaded content from one active frame to - * another one that is currently a placeholder. If there's no active - * frame in the group, the content is loaded/reloaded. - * - * @param aGroupName the name of the group - * @param aTargetFrame the frame element to which the content should - * be moved to. - */ - setOwner: function (aGroupName, aTargetFrame) { - let group = Frames.get(aGroupName); - let frame = group.activeFrame; - - if (frame == aTargetFrame) { - // nothing to do here - return; - } - - if (group.isAlive) { - // Move document ownership to the desired frame, and make it the active one - frame.QueryInterface(Ci.nsIFrameLoaderOwner).swapFrameLoaders(aTargetFrame); - group.activeFrame = aTargetFrame; - } else { - // Previous owner was dead, reload the document at the new owner and make it the active one - aTargetFrame.setAttribute("src", group.url); - group.activeFrame = aTargetFrame; - } - }, - - /** - * Updates the current URL in use by this group, and loads it into the active frame. - * - * @param aGroupName the name of the group - * @param aURL the new url - */ - updateURL: function (aGroupName, aURL) { - let group = Frames.get(aGroupName); - group.url = aURL; - - if (group.isAlive) { - group.activeFrame.setAttribute("src", aURL); - } - }, - - /** - * Loads the group's url into a target frame, if the group doesn't have a currently - * active frame. - * - * @param aGroupName the name of the group - * @param aTargetFrame the frame element which should be made active and - * have the group's content loaded to - */ - preload: function (aGroupName, aTargetFrame) { - let group = Frames.get(aGroupName); - if (!group.isAlive) { - aTargetFrame.setAttribute("src", group.url); - group.activeFrame = aTargetFrame; - } - }, - - /** - * Tells if a group currently have an active element. - * - * @param aGroupName the name of the group - */ - isGroupAlive: function (aGroupName) { - return Frames.get(aGroupName).isAlive; - }, - - /** - * Forgets about this group. This function doesn't need to be used - * unless the group's name needs to be reused. - * - * @param aGroupName the name of the group - */ - forgetGroup: function (aGroupName) { - Frames.delete(aGroupName); - } -} - - -function _SharedFrameGroup(aURL) { - this.url = aURL; - this._activeFrame = null; -} - -_SharedFrameGroup.prototype = { - get isAlive() { - let frame = this.activeFrame; - return !!(frame && - frame.contentDocument && - frame.contentDocument.location); - }, - - get activeFrame() { - return this._activeFrame && - this._activeFrame.get(); - }, - - set activeFrame(aActiveFrame) { - this._activeFrame = aActiveFrame - ? Cu.getWeakReference(aActiveFrame) - : null; - } -} diff --git a/browser/modules/moz.build b/browser/modules/moz.build index 06d5d740417..acdc37d82cd 100644 --- a/browser/modules/moz.build +++ b/browser/modules/moz.build @@ -5,7 +5,6 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. BROWSER_CHROME_MANIFESTS += ['test/browser.ini'] -MOCHITEST_CHROME_MANIFESTS += ['test/chrome/chrome.ini'] XPCSHELL_TESTS_MANIFESTS += [ 'test/unit/social/xpcshell.ini', 'test/xpcshell/xpcshell.ini', @@ -30,7 +29,6 @@ EXTRA_JS_MODULES += [ 'offlineAppCache.jsm', 'PanelFrame.jsm', 'RemotePrompt.jsm', - 'SharedFrame.jsm', 'SitePermissions.jsm', 'Social.jsm', 'TabCrashReporter.jsm', diff --git a/browser/modules/test/chrome/chrome.ini b/browser/modules/test/chrome/chrome.ini deleted file mode 100644 index 2cc1d7a058a..00000000000 --- a/browser/modules/test/chrome/chrome.ini +++ /dev/null @@ -1,4 +0,0 @@ -[DEFAULT] -support-files = sharedframe.xul - -[test_sharedframe.xul] diff --git a/browser/modules/test/chrome/sharedframe.xul b/browser/modules/test/chrome/sharedframe.xul deleted file mode 100644 index 6f63c868271..00000000000 --- a/browser/modules/test/chrome/sharedframe.xul +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - -

- -

-  
-  
Mozilla Bug 811247 - - - - From 93910d7feb732968fee6d2610c7880a2bf57c239 Mon Sep 17 00:00:00 2001 From: Matthew Noorenberghe Date: Wed, 5 Nov 2014 13:56:17 -0800 Subject: [PATCH 19/25] Bug 1091260 - Badge the Browser Toolbox dock icon on OS X to differentiate it from the main process. r=jryans,fitzgen --HG-- extra : rebase_source : 561016578d5a23c769090faf6c735b3060d4e741 --- browser/devtools/framework/moz.build | 1 - .../framework/toolbox-process-window.js | 31 +++++++++++++++++++ browser/devtools/jar.mn | 2 +- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/browser/devtools/framework/moz.build b/browser/devtools/framework/moz.build index 7950d4cb5f0..94694c63499 100644 --- a/browser/devtools/framework/moz.build +++ b/browser/devtools/framework/moz.build @@ -18,6 +18,5 @@ EXTRA_JS_MODULES.devtools.framework += [ 'toolbox-highlighter-utils.js', 'toolbox-hosts.js', 'toolbox-options.js', - 'toolbox-process-window.js', 'toolbox.js', ] diff --git a/browser/devtools/framework/toolbox-process-window.js b/browser/devtools/framework/toolbox-process-window.js index 556d5db574d..10f96280cb6 100644 --- a/browser/devtools/framework/toolbox-process-window.js +++ b/browser/devtools/framework/toolbox-process-window.js @@ -92,6 +92,37 @@ function onNewToolbox(toolbox) { function bindToolboxHandlers() { gToolbox.once("destroyed", quitApp); window.addEventListener("unload", onUnload); + +#ifdef XP_MACOSX + // Badge the dock icon to differentiate this process from the main application process. + updateBadgeText(false); + + // Check if the debugger panel is already loaded otherwise listen for it to be. + if (gToolbox.getPanel("jsdebugger")) { + setupThreadListeners(gToolbox.getPanel("jsdebugger")); + } else { + gToolbox.once("jsdebugger-ready", (e, panel) => setupThreadListeners(panel)); + } +#endif +} + +function setupThreadListeners(panel) { + updateBadgeText(panel._controller.activeThread.state == "paused"); + + let onPaused = updateBadgeText.bind(null, true); + let onResumed = updateBadgeText.bind(null, false); + panel.target.on("thread-paused", onPaused); + panel.target.on("thread-resumed", onResumed); + + panel.once("destroyed", () => { + panel.off("thread-paused", onPaused); + panel.off("thread-resumed", onResumed); + }); +} + +function updateBadgeText(paused) { + let dockSupport = Cc["@mozilla.org/widget/macdocksupport;1"].getService(Ci.nsIMacDockSupport); + dockSupport.badgeText = paused ? "▐▐ " : " ▶"; } function onUnload() { diff --git a/browser/devtools/jar.mn b/browser/devtools/jar.mn index b1ac5a12104..40303faec36 100644 --- a/browser/devtools/jar.mn +++ b/browser/devtools/jar.mn @@ -102,7 +102,7 @@ browser.jar: content/browser/devtools/framework/toolbox.xul (framework/toolbox.xul) content/browser/devtools/framework/options-panel.css (framework/options-panel.css) content/browser/devtools/framework/toolbox-process-window.xul (framework/toolbox-process-window.xul) - content/browser/devtools/framework/toolbox-process-window.js (framework/toolbox-process-window.js) +* content/browser/devtools/framework/toolbox-process-window.js (framework/toolbox-process-window.js) content/browser/devtools/framework/dev-edition-promo.xul (framework/dev-edition-promo/dev-edition-promo.xul) content/browser/devtools/framework/dev-edition-promo.css (framework/dev-edition-promo/dev-edition-promo.css) content/browser/devtools/framework/dev-edition-logo.png (framework/dev-edition-promo/dev-edition-logo.png) From 906240dc9c1f097b02158cca10a794be625f08df Mon Sep 17 00:00:00 2001 From: Matthew Noorenberghe Date: Wed, 5 Nov 2014 13:58:52 -0800 Subject: [PATCH 20/25] Bug 1093500 - Cleanup Loop registration by pulling push URLs from the push handler. r=pkerr --HG-- extra : rebase_source : 40639702a655b5e20eb7e00473c2f8c7676500dc --- browser/components/loop/MozLoopAPI.jsm | 5 +- browser/components/loop/MozLoopService.jsm | 210 ++++++++++-------- browser/components/loop/content/js/client.js | 28 +-- .../loop/test/desktop-local/client_test.js | 6 +- .../test/desktop-local/conversation_test.js | 4 + .../loop/test/mochitest/browser_fxa_login.js | 4 +- .../components/loop/test/mochitest/head.js | 2 +- .../loop/test/xpcshell/test_looprooms.js | 2 + .../test/xpcshell/test_loopservice_busy.js | 2 + .../test/xpcshell/test_loopservice_dnd.js | 2 + .../xpcshell/test_loopservice_notification.js | 2 + .../test/xpcshell/test_loopservice_restart.js | 6 +- .../test_loopservice_token_invalid.js | 2 + .../xpcshell/test_loopservice_token_save.js | 2 + .../xpcshell/test_loopservice_token_send.js | 2 + .../test_loopservice_token_validation.js | 2 + 16 files changed, 166 insertions(+), 115 deletions(-) diff --git a/browser/components/loop/MozLoopAPI.jsm b/browser/components/loop/MozLoopAPI.jsm index 87483d7561a..8051a0ab1d8 100644 --- a/browser/components/loop/MozLoopAPI.jsm +++ b/browser/components/loop/MozLoopAPI.jsm @@ -373,6 +373,7 @@ function injectLoopAPI(targetWindow) { * Callback parameters: * - err null on successful registration, non-null otherwise. * + * @param {LOOP_SESSION_TYPE} sessionType * @param {Function} callback Will be called once registration is complete, * or straight away if registration has already * happened. @@ -380,10 +381,10 @@ function injectLoopAPI(targetWindow) { ensureRegistered: { enumerable: true, writable: true, - value: function(callback) { + value: function(sessionType, callback) { // We translate from a promise to a callback, as we can't pass promises from // Promise.jsm across the priv versus unpriv boundary. - MozLoopService.promiseRegisteredWithServers().then(() => { + MozLoopService.promiseRegisteredWithServers(sessionType).then(() => { callback(null); }, err => { callback(cloneValueInto(err, targetWindow)); diff --git a/browser/components/loop/MozLoopService.jsm b/browser/components/loop/MozLoopService.jsm index 2955a0ff24a..13c3570a229 100644 --- a/browser/components/loop/MozLoopService.jsm +++ b/browser/components/loop/MozLoopService.jsm @@ -106,10 +106,6 @@ function getJSONPref(aName) { return !!value ? JSON.parse(value) : null; } -// The current deferred for the registration process. This is set if in progress -// or the registration was successful. This is null if a registration attempt was -// unsuccessful. -let gRegisteredDeferred = null; let gHawkClient = null; let gLocalizedStrings = null; let gFxAEnabled = true; @@ -132,6 +128,13 @@ let MozLoopServiceInternal = { webSocket: undefined, }, + /** + * The current deferreds for the registration processes. This is set if in progress + * or the registration was successful. This is null if a registration attempt was + * unsuccessful. + */ + deferredRegistrations: new Map(), + get pushHandler() this.mocks.pushHandler || MozLoopPushHandler, // The uri of the Loop server. @@ -310,35 +313,37 @@ let MozLoopServiceInternal = { }, /** - * Starts registration of Loop with the push server, and then will register - * with the Loop server as a GUEST. It will return early if already registered. + * Get endpoints with the push server and register for notifications. + * For now we register as both a Guest and FxA user and all must succeed. * - * @returns {Promise} a promise that is resolved with no params on completion, or - * rejected with an error code or string. + * @return {Promise} resolves with all push endpoints + * rejects if any of the push registrations failed */ - promiseRegisteredWithServers: function() { - if (gRegisteredDeferred) { - return gRegisteredDeferred.promise; - } - + promiseRegisteredWithPushServer: function() { // Wrap push notification registration call-back in a Promise. - let registerForNotification = function(channelID, onNotification) { + function registerForNotification(channelID, onNotification) { + log.debug("registerForNotification", channelID); return new Promise((resolve, reject) => { - let onRegistered = (error, pushUrl) => { + function onRegistered(error, pushUrl) { + log.debug("registerForNotification onRegistered:", error, pushUrl); if (error) { reject(Error(error)); } else { resolve(pushUrl); } - }; + } + + // If we're already registered, resolve with the existing push URL + let pushURL = MozLoopServiceInternal.pushHandler.registeredChannels[channelID]; + if (pushURL) { + log.debug("Using the existing push endpoint for channelID:", channelID); + resolve(pushURL); + return; + } + MozLoopServiceInternal.pushHandler.register(channelID, onRegistered, onNotification); }); - }; - - gRegisteredDeferred = Promise.defer(); - // We grab the promise early in case .initialize or its results sets - // it back to null on error. - let result = gRegisteredDeferred.promise; + } let options = this.mocks.webSocket ? { mockWebSocket: this.mocks.webSocket } : {}; this.pushHandler.initialize(options); @@ -355,27 +360,42 @@ let MozLoopServiceInternal = { let roomsRegFxA = registerForNotification(MozLoopService.channelIDs.roomsFxA, roomsPushNotification); - Promise.all([callsRegGuest, roomsRegGuest, callsRegFxA, roomsRegFxA]) - .then((pushUrls) => { - return this.registerWithLoopServer(LOOP_SESSION_TYPE.GUEST,{ - calls: pushUrls[0], - rooms: pushUrls[1], - }); + return Promise.all([callsRegGuest, roomsRegGuest, callsRegFxA, roomsRegFxA]); + }, + + /** + * Starts registration of Loop with the push server, and then will register + * with the Loop server. It will return early if already registered. + * + * @param {LOOP_SESSION_TYPE} sessionType + * @returns {Promise} a promise that is resolved with no params on completion, or + * rejected with an error code or string. + */ + promiseRegisteredWithServers: function(sessionType = LOOP_SESSION_TYPE.GUEST) { + if (this.deferredRegistrations.has(sessionType)) { + log.debug("promiseRegisteredWithServers: registration already completed or in progress:", sessionType); + return this.deferredRegistrations.get(sessionType).promise; + } + + let result = null; + let deferred = Promise.defer(); + log.debug("assigning to deferredRegistrations for sessionType:", sessionType); + this.deferredRegistrations.set(sessionType, deferred); + + // We grab the promise early in case one of the callers below delete it from the map. + result = deferred.promise; + + this.promiseRegisteredWithPushServer().then(() => { + return this.registerWithLoopServer(sessionType); }).then(() => { - // storeSessionToken could have rejected and nulled the promise if the token was malformed. - if (!gRegisteredDeferred) { - return; - } - gRegisteredDeferred.resolve("registered to guest status"); + deferred.resolve("registered to status:" + sessionType); // No need to clear the promise here, everything was good, so we don't need // to re-register. }, error => { - log.error("Failed to register with Loop server: ", error); - // registerWithLoopServer may have already made this null. - if (gRegisteredDeferred) { - gRegisteredDeferred.reject(error); - } - gRegisteredDeferred = null; + log.error("Failed to register with Loop server with sessionType " + sessionType, error); + deferred.reject(error); + this.deferredRegistrations.delete(sessionType); + log.debug("Cleared deferredRegistration for sessionType:", sessionType); }); return result; @@ -397,6 +417,7 @@ let MozLoopServiceInternal = { * rejected with this JSON-parsed response. */ hawkRequest: function(sessionType, path, method, payloadObj) { + log.debug("hawkRequest: " + path, sessionType); if (!gHawkClient) { gHawkClient = new HawkClient(this.loopServerUri); } @@ -488,15 +509,12 @@ let MozLoopServiceInternal = { } else { // XXX Bubble the precise details up to the UI somehow (bug 1013248). log.warn("Loop server sent an invalid session token"); - gRegisteredDeferred.reject("session-token-wrong-size"); - gRegisteredDeferred = null; return false; } } return true; }, - /** * Clear the loop session token so we don't use it for Hawk Requests anymore. * @@ -512,45 +530,62 @@ let MozLoopServiceInternal = { }, /** - * Registers with the Loop server either as a guest or a FxA user. + * Registers with the Loop server either as a guest or a FxA user. This method should only be + * called by promiseRegisteredWithServers since it prevents calling this while a registration is + * already in progress. * + * @private * @param {LOOP_SESSION_TYPE} sessionType The type of session e.g. guest or FxA - * @param {String} pushUrls The push url given by the push server. * @param {Boolean} [retry=true] Whether to retry if authentication fails. * @return {Promise} */ - registerWithLoopServer: function(sessionType, pushUrls, retry = true) { + registerWithLoopServer: function(sessionType, retry = true) { + log.debug("registerWithLoopServer with sessionType:", sessionType); + + let callsPushURL, roomsPushURL; + if (sessionType == LOOP_SESSION_TYPE.FXA) { + callsPushURL = this.pushHandler.registeredChannels[MozLoopService.channelIDs.callsFxA]; + roomsPushURL = this.pushHandler.registeredChannels[MozLoopService.channelIDs.roomsFxA]; + } else if (sessionType == LOOP_SESSION_TYPE.GUEST) { + callsPushURL = this.pushHandler.registeredChannels[MozLoopService.channelIDs.callsGuest]; + roomsPushURL = this.pushHandler.registeredChannels[MozLoopService.channelIDs.roomsGuest]; + } + + if (!callsPushURL || !roomsPushURL) { + return Promise.reject("Invalid sessionType or missing push URLs for registerWithLoopServer: " + sessionType); + } + // create a registration payload with a backwards compatible attribute (simplePushURL) // that will register only the calls notification. let msg = { - simplePushURL: pushUrls.calls, - simplePushURLs: pushUrls + simplePushURL: callsPushURL, + simplePushURLs: { + calls: callsPushURL, + rooms: roomsPushURL, + }, }; return this.hawkRequest(sessionType, "/registration", "POST", msg) .then((response) => { - // If this failed we got an invalid token. storeSessionToken rejects - // the gRegisteredDeferred promise for us, so here we just need to - // early return. + // If this failed we got an invalid token. if (!this.storeSessionToken(sessionType, response.headers)) { - return; + return Promise.reject("session-token-wrong-size"); } log.debug("Successfully registered with server for sessionType", sessionType); this.clearError("registration"); + return undefined; }, (error) => { // There's other errors than invalid auth token, but we should only do the reset // as a last resort. if (error.code === 401) { // Authorization failed, invalid token, we need to try again with a new token. if (retry) { - return this.registerWithLoopServer(sessionType, pushUrls, false); + return this.registerWithLoopServer(sessionType, false); } } log.error("Failed to register with the loop server. Error: ", error); this.setError("registration", error); - gRegisteredDeferred.reject(error); - gRegisteredDeferred = null; throw error; } ); @@ -567,7 +602,7 @@ let MozLoopServiceInternal = { * Guest or FxA have been unregistered with the LoopServer. * * @param {LOOP_SESSION_TYPE} sessionType The type of session e.g. guest or FxA - * @param {String} pushURLs The push URL previously given by the push server. + * @param {String} pushURL The push URL previously given by the push server. * This may not be necessary to unregister in the future. * @return {Promise} resolving when the unregistration request finishes */ @@ -970,28 +1005,27 @@ this.MozLoopService = { }); try { - yield this.promiseRegisteredWithServers(); + if (MozLoopServiceInternal.urlExpiryTimeIsInFuture()) { + yield this.promiseRegisteredWithServers(LOOP_SESSION_TYPE.GUEST); + } else { + log.debug("delayedInitialize: URL expiry time isn't in the future so not registering as a guest"); + } } catch (ex) { - log.debug("MozLoopService: Failure of initial registration", ex); + log.debug("MozLoopService: Failure of guest registration", ex); deferredInitialization.reject(ex); yield completedPromise; return; } if (!MozLoopServiceInternal.fxAOAuthTokenData) { - log.debug("MozLoopService: Initialized without an already logged-in account"); - deferredInitialization.resolve("initialized to guest status"); + log.debug("delayedInitialize: Initialized without an already logged-in account"); + deferredInitialization.resolve("initialized without FxA status"); yield completedPromise; return; } log.debug("MozLoopService: Initializing with already logged-in account"); - let pushURLs = { - calls: MozLoopServiceInternal.pushHandler.registeredChannels[this.channelIDs.callsFxA], - rooms: MozLoopServiceInternal.pushHandler.registeredChannels[this.channelIDs.roomsFxA] - }; - - MozLoopServiceInternal.registerWithLoopServer(LOOP_SESSION_TYPE.FXA, pushURLs).then(() => { + MozLoopServiceInternal.promiseRegisteredWithServers(LOOP_SESSION_TYPE.FXA).then(() => { deferredInitialization.resolve("initialized to logged-in status"); }, error => { log.debug("MozLoopService: error logging in using cached auth token"); @@ -1113,8 +1147,8 @@ this.MozLoopService = { /** * @see MozLoopServiceInternal.promiseRegisteredWithServers */ - promiseRegisteredWithServers: function() { - return MozLoopServiceInternal.promiseRegisteredWithServers(); + promiseRegisteredWithServers: function(sessionType = LOOP_SESSION_TYPE.GUEST) { + return MozLoopServiceInternal.promiseRegisteredWithServers(sessionType); }, /** @@ -1310,19 +1344,11 @@ this.MozLoopService = { MozLoopServiceInternal.fxAOAuthTokenData = tokenData; return tokenData; }).then(tokenData => { - return gRegisteredDeferred.promise.then(Task.async(function*() { - let callsUrl = MozLoopServiceInternal.pushHandler.registeredChannels[MozLoopService.channelIDs.callsFxA], - roomsUrl = MozLoopServiceInternal.pushHandler.registeredChannels[MozLoopService.channelIDs.roomsFxA]; - if (callsUrl && roomsUrl) { - yield MozLoopServiceInternal.registerWithLoopServer( - LOOP_SESSION_TYPE.FXA, {calls: callsUrl, rooms: roomsUrl}); - } else { - throw new Error("No pushUrls for FxA registration"); - } + return MozLoopServiceInternal.promiseRegisteredWithServers(LOOP_SESSION_TYPE.FXA).then(() => { MozLoopServiceInternal.clearError("login"); MozLoopServiceInternal.clearError("profile"); return MozLoopServiceInternal.fxAOAuthTokenData; - })); + }); }).then(tokenData => { let client = new FxAccountsProfileClient({ serverURL: gFxAOAuthClient.parameters.profile_uri, @@ -1341,6 +1367,7 @@ this.MozLoopService = { }).catch(error => { MozLoopServiceInternal.fxAOAuthTokenData = null; MozLoopServiceInternal.fxAOAuthProfile = null; + MozLoopServiceInternal.deferredRegistrations.delete(LOOP_SESSION_TYPE.FXA); throw error; }).catch((error) => { MozLoopServiceInternal.setError("login", error); @@ -1372,21 +1399,22 @@ this.MozLoopService = { throw error; } finally { MozLoopServiceInternal.clearSessionToken(LOOP_SESSION_TYPE.FXA); + + MozLoopServiceInternal.fxAOAuthTokenData = null; + MozLoopServiceInternal.fxAOAuthProfile = null; + MozLoopServiceInternal.deferredRegistrations.delete(LOOP_SESSION_TYPE.FXA); + + // Reset the client since the initial promiseFxAOAuthParameters() call is + // what creates a new session. + gFxAOAuthClient = null; + gFxAOAuthClientPromise = null; + + // clearError calls notifyStatusChanged so should be done last when the + // state is clean. + MozLoopServiceInternal.clearError("registration"); + MozLoopServiceInternal.clearError("login"); + MozLoopServiceInternal.clearError("profile"); } - - MozLoopServiceInternal.fxAOAuthTokenData = null; - MozLoopServiceInternal.fxAOAuthProfile = null; - - // Reset the client since the initial promiseFxAOAuthParameters() call is - // what creates a new session. - gFxAOAuthClient = null; - gFxAOAuthClientPromise = null; - - // clearError calls notifyStatusChanged so should be done last when the - // state is clean. - MozLoopServiceInternal.clearError("registration"); - MozLoopServiceInternal.clearError("login"); - MozLoopServiceInternal.clearError("profile"); }), openFxASettings: Task.async(function() { diff --git a/browser/components/loop/content/js/client.js b/browser/components/loop/content/js/client.js index bcf952a92f2..3a20151d8ce 100644 --- a/browser/components/loop/content/js/client.js +++ b/browser/components/loop/content/js/client.js @@ -87,10 +87,11 @@ loop.Client = (function($) { * Callback parameters: * - err null on successful registration, non-null otherwise. * + * @param {LOOP_SESSION_TYPE} sessionType Guest or FxA * @param {Function} cb Callback(err) */ - _ensureRegistered: function(cb) { - this.mozLoop.ensureRegistered(function(error) { + _ensureRegistered: function(sessionType, cb) { + this.mozLoop.ensureRegistered(sessionType, function(error) { if (error) { console.log("Error registering with Loop server, code: " + error); cb(error); @@ -110,17 +111,11 @@ loop.Client = (function($) { * -- callUrl: The url of the call * -- expiresAt: The amount of hours until expiry of the url * + * @param {LOOP_SESSION_TYPE} sessionType * @param {string} nickname the nickname of the future caller * @param {Function} cb Callback(err, callUrlData) */ - _requestCallUrlInternal: function(nickname, cb) { - var sessionType; - if (this.mozLoop.userProfile) { - sessionType = this.mozLoop.LOOP_SESSION_TYPE.FXA; - } else { - sessionType = this.mozLoop.LOOP_SESSION_TYPE.GUEST; - } - + _requestCallUrlInternal: function(sessionType, nickname, cb) { this.mozLoop.hawkRequest(sessionType, "/call-url/", "POST", {callerId: nickname}, function (error, responseText) { @@ -159,7 +154,7 @@ loop.Client = (function($) { * it does not make sense to display an error. **/ deleteCallUrl: function(token, sessionType, cb) { - this._ensureRegistered(function(err) { + this._ensureRegistered(sessionType, function(err) { if (err) { cb(err); return; @@ -206,13 +201,20 @@ loop.Client = (function($) { * @param {Function} cb Callback(err, callUrlData) */ requestCallUrl: function(nickname, cb) { - this._ensureRegistered(function(err) { + var sessionType; + if (this.mozLoop.userProfile) { + sessionType = this.mozLoop.LOOP_SESSION_TYPE.FXA; + } else { + sessionType = this.mozLoop.LOOP_SESSION_TYPE.GUEST; + } + + this._ensureRegistered(sessionType, function(err) { if (err) { cb(err); return; } - this._requestCallUrlInternal(nickname, cb); + this._requestCallUrlInternal(sessionType, nickname, cb); }.bind(this)); }, diff --git a/browser/components/loop/test/desktop-local/client_test.js b/browser/components/loop/test/desktop-local/client_test.js index 3e32f0af286..7054f46765d 100644 --- a/browser/components/loop/test/desktop-local/client_test.js +++ b/browser/components/loop/test/desktop-local/client_test.js @@ -32,7 +32,7 @@ describe("loop.Client", function() { .returns(null) .withArgs("hawk-session-token") .returns(fakeToken), - ensureRegistered: sinon.stub().callsArgWith(0, null), + ensureRegistered: sinon.stub().callsArgWith(1, null), noteCallUrlExpiry: sinon.spy(), hawkRequest: sinon.stub(), LOOP_SESSION_TYPE: { @@ -62,7 +62,7 @@ describe("loop.Client", function() { }); it("should send an error when registration fails", function() { - mozLoop.ensureRegistered.callsArgWith(0, "offline"); + mozLoop.ensureRegistered.callsArgWith(1, "offline"); client.deleteCallUrl("fakeToken", mozLoop.LOOP_SESSION_TYPE.FXA, callback); @@ -113,7 +113,7 @@ describe("loop.Client", function() { }); it("should send an error when registration fails", function() { - mozLoop.ensureRegistered.callsArgWith(0, "offline"); + mozLoop.ensureRegistered.callsArgWith(1, "offline"); client.requestCallUrl("foo", callback); diff --git a/browser/components/loop/test/desktop-local/conversation_test.js b/browser/components/loop/test/desktop-local/conversation_test.js index e189d28d722..34f755214de 100644 --- a/browser/components/loop/test/desktop-local/conversation_test.js +++ b/browser/components/loop/test/desktop-local/conversation_test.js @@ -44,6 +44,10 @@ describe("loop.conversation", function() { calls: { clearCallInProgress: sinon.stub() }, + LOOP_SESSION_TYPE: { + GUEST: 1, + FXA: 2 + }, startAlerting: sinon.stub(), stopAlerting: sinon.stub(), ensureRegistered: sinon.stub(), diff --git a/browser/components/loop/test/mochitest/browser_fxa_login.js b/browser/components/loop/test/mochitest/browser_fxa_login.js index 66c65308914..837e47c820d 100644 --- a/browser/components/loop/test/mochitest/browser_fxa_login.js +++ b/browser/components/loop/test/mochitest/browser_fxa_login.js @@ -342,7 +342,7 @@ add_task(function* logoutWithIncorrectPushURL() { const fxASessionPref = MozLoopServiceInternal.getSessionTokenPrefName(LOOP_SESSION_TYPE.FXA); Services.prefs.setCharPref(fxASessionPref, "X".repeat(HAWK_TOKEN_LENGTH)); - yield MozLoopServiceInternal.registerWithLoopServer(LOOP_SESSION_TYPE.FXA, {calls: pushURL}); + yield MozLoopServiceInternal.registerWithLoopServer(LOOP_SESSION_TYPE.FXA); let registrationResponse = yield promiseOAuthGetRegistration(BASE_URL); ise(registrationResponse.response.simplePushURLs.calls, pushURL, "Check registered push URL"); mockPushHandler.registeredChannels[MozLoopService.channelIDs.callsFxA] = "http://www.example.com/invalid"; @@ -365,7 +365,7 @@ add_task(function* logoutWithNoPushURL() { const fxASessionPref = MozLoopServiceInternal.getSessionTokenPrefName(LOOP_SESSION_TYPE.FXA); Services.prefs.setCharPref(fxASessionPref, "X".repeat(HAWK_TOKEN_LENGTH)); - yield MozLoopServiceInternal.registerWithLoopServer(LOOP_SESSION_TYPE.FXA, {calls: pushURL}); + yield MozLoopServiceInternal.registerWithLoopServer(LOOP_SESSION_TYPE.FXA); let registrationResponse = yield promiseOAuthGetRegistration(BASE_URL); ise(registrationResponse.response.simplePushURLs.calls, pushURL, "Check registered push URL"); mockPushHandler.registeredChannels[MozLoopService.channelIDs.callsFxA] = null; diff --git a/browser/components/loop/test/mochitest/head.js b/browser/components/loop/test/mochitest/head.js index f29ded9beb5..3c0ec2de605 100644 --- a/browser/components/loop/test/mochitest/head.js +++ b/browser/components/loop/test/mochitest/head.js @@ -120,7 +120,7 @@ function* resetFxA() { global.gHawkClient = null; global.gFxAOAuthClientPromise = null; global.gFxAOAuthClient = null; - global.gRegisteredDeferred = null; + MozLoopServiceInternal.deferredRegistrations.delete(LOOP_SESSION_TYPE.FXA); MozLoopServiceInternal.fxAOAuthProfile = null; MozLoopServiceInternal.fxAOAuthTokenData = null; const fxASessionPref = MozLoopServiceInternal.getSessionTokenPrefName(LOOP_SESSION_TYPE.FXA); diff --git a/browser/components/loop/test/xpcshell/test_looprooms.js b/browser/components/loop/test/xpcshell/test_looprooms.js index f221595b430..d22ad712142 100644 --- a/browser/components/loop/test/xpcshell/test_looprooms.js +++ b/browser/components/loop/test/xpcshell/test_looprooms.js @@ -229,6 +229,8 @@ add_task(function* setup_server() { res.finish(); }); + mockPushHandler.registrationPushURL = kEndPointUrl; + yield MozLoopService.promiseRegisteredWithServers(); }); diff --git a/browser/components/loop/test/xpcshell/test_loopservice_busy.js b/browser/components/loop/test/xpcshell/test_loopservice_busy.js index ab3ba458adc..d3223129670 100644 --- a/browser/components/loop/test/xpcshell/test_loopservice_busy.js +++ b/browser/components/loop/test/xpcshell/test_loopservice_busy.js @@ -24,6 +24,8 @@ let msgHandler = function(msg) { add_test(function test_busy_2guest_calls() { actionReceived = false; + mockPushHandler.registrationPushURL = kEndPointUrl; + MozLoopService.promiseRegisteredWithServers().then(() => { let opened = 0; let windowId; diff --git a/browser/components/loop/test/xpcshell/test_loopservice_dnd.js b/browser/components/loop/test/xpcshell/test_loopservice_dnd.js index 130af0909c3..5e41c9d24b6 100644 --- a/browser/components/loop/test/xpcshell/test_loopservice_dnd.js +++ b/browser/components/loop/test/xpcshell/test_loopservice_dnd.js @@ -31,6 +31,8 @@ add_test(function test_set_do_not_disturb() { add_test(function test_do_not_disturb_disabled_should_open_chat_window() { MozLoopService.doNotDisturb = false; + mockPushHandler.registrationPushURL = kEndPointUrl; + MozLoopService.promiseRegisteredWithServers().then(() => { let opened = false; Chat.open = function() { diff --git a/browser/components/loop/test/xpcshell/test_loopservice_notification.js b/browser/components/loop/test/xpcshell/test_loopservice_notification.js index f4ad6556fde..c27e7b822a6 100644 --- a/browser/components/loop/test/xpcshell/test_loopservice_notification.js +++ b/browser/components/loop/test/xpcshell/test_loopservice_notification.js @@ -10,6 +10,8 @@ let openChatOrig = Chat.open; add_test(function test_openChatWindow_on_notification() { Services.prefs.setCharPref("loop.seenToS", "unseen"); + mockPushHandler.registrationPushURL = kEndPointUrl; + MozLoopService.promiseRegisteredWithServers().then(() => { let opened = false; Chat.open = function() { diff --git a/browser/components/loop/test/xpcshell/test_loopservice_restart.js b/browser/components/loop/test/xpcshell/test_loopservice_restart.js index ee55abcf442..9cf96c80629 100644 --- a/browser/components/loop/test/xpcshell/test_loopservice_restart.js +++ b/browser/components/loop/test/xpcshell/test_loopservice_restart.js @@ -43,7 +43,7 @@ add_task(function test_initialize_with_urls_and_no_auth_token() { }); yield MozLoopService.initialize().then((msg) => { - Assert.equal(msg, "initialized to guest status", "Initialize should register as a " + + Assert.equal(msg, "initialized without FxA status", "Initialize should register as a " + "guest when no auth tokens but expired URLs"); }, (error) => { Assert.ok(false, error, "should have resolved the promise that initialize returned"); @@ -70,7 +70,7 @@ add_task(function test_initialize_with_invalid_fxa_token() { Assert.ok(false, "Initializing with an invalid token should reject the promise"); }, (error) => { - Assert.equal(MozLoopServiceInternal.pushHandler.pushUrl, kEndPointUrl, "Push URL should match"); + Assert.equal(MozLoopServiceInternal.pushHandler.registrationPushURL, kEndPointUrl, "Push URL should match"); Assert.equal(Services.prefs.getCharPref(LOOP_FXA_TOKEN_PREF), "", "FXA pref should be cleared if token was invalid"); Assert.equal(Services.prefs.getCharPref(LOOP_FXA_PROFILE_PREF), "", @@ -104,7 +104,7 @@ function run_test() { // Note, this is just used to speed up the test. Services.prefs.setIntPref(LOOP_INITIAL_DELAY_PREF, 0); MozLoopServiceInternal.mocks.pushHandler = mockPushHandler; - mockPushHandler.pushUrl = kEndPointUrl; + mockPushHandler.registrationPushURL = kEndPointUrl; do_register_cleanup(function() { MozLoopServiceInternal.mocks.pushHandler = undefined; diff --git a/browser/components/loop/test/xpcshell/test_loopservice_token_invalid.js b/browser/components/loop/test/xpcshell/test_loopservice_token_invalid.js index 49592446d24..7240f535a40 100644 --- a/browser/components/loop/test/xpcshell/test_loopservice_token_invalid.js +++ b/browser/components/loop/test/xpcshell/test_loopservice_token_invalid.js @@ -46,6 +46,8 @@ add_test(function test_registration_invalid_token() { function run_test() { setupFakeLoopServer(); + mockPushHandler.registrationPushURL = kEndPointUrl; + do_register_cleanup(function() { Services.prefs.clearUserPref("loop.hawk-session-token"); }); diff --git a/browser/components/loop/test/xpcshell/test_loopservice_token_save.js b/browser/components/loop/test/xpcshell/test_loopservice_token_save.js index d54ac694217..f4ba80c4d4b 100644 --- a/browser/components/loop/test/xpcshell/test_loopservice_token_save.js +++ b/browser/components/loop/test/xpcshell/test_loopservice_token_save.js @@ -34,6 +34,8 @@ add_test(function test_registration_returns_hawk_session_token() { function run_test() { setupFakeLoopServer(); + mockPushHandler.registrationPushURL = kEndPointUrl; + do_register_cleanup(function() { Services.prefs.clearUserPref("loop.hawk-session-token"); }); diff --git a/browser/components/loop/test/xpcshell/test_loopservice_token_send.js b/browser/components/loop/test/xpcshell/test_loopservice_token_send.js index eb0881a1aaa..11f4bc3cb07 100644 --- a/browser/components/loop/test/xpcshell/test_loopservice_token_send.js +++ b/browser/components/loop/test/xpcshell/test_loopservice_token_send.js @@ -35,6 +35,8 @@ add_test(function test_registration_uses_hawk_session_token() { function run_test() { setupFakeLoopServer(); + mockPushHandler.registrationPushURL = kEndPointUrl; + do_register_cleanup(function() { Services.prefs.clearUserPref("loop.hawk-session-token"); }); diff --git a/browser/components/loop/test/xpcshell/test_loopservice_token_validation.js b/browser/components/loop/test/xpcshell/test_loopservice_token_validation.js index ee121a96852..60c1539a0e8 100644 --- a/browser/components/loop/test/xpcshell/test_loopservice_token_validation.js +++ b/browser/components/loop/test/xpcshell/test_loopservice_token_validation.js @@ -39,6 +39,8 @@ add_test(function test_registration_handles_bogus_hawk_token() { function run_test() { setupFakeLoopServer(); + mockPushHandler.registrationPushURL = kEndPointUrl; + do_register_cleanup(function() { Services.prefs.clearUserPref("loop.hawk-session-token"); }); From 9b3a8b64fade7b5b66ca5b9580047e2d48629ec9 Mon Sep 17 00:00:00 2001 From: Jordan Santell Date: Wed, 5 Nov 2014 16:50:26 -0800 Subject: [PATCH 21/25] Bug 1093866 - Search bar in customize menu should use default styling in DevEdition;r=dao --HG-- extra : amend_source : 4acc8142ffe86e91224e1d21cd23365d0c798354 --- browser/themes/shared/devedition.inc.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/browser/themes/shared/devedition.inc.css b/browser/themes/shared/devedition.inc.css index 1c90625e975..dea8899c29c 100644 --- a/browser/themes/shared/devedition.inc.css +++ b/browser/themes/shared/devedition.inc.css @@ -118,8 +118,8 @@ toolbar[brighttext] #downloads-indicator-counter { } /* URL bar and search bar*/ -.searchbar-textbox, -#urlbar { +#urlbar, +#navigator-toolbox .searchbar-textbox { background-color: var(--url-and-searchbar-background-color) !important; background-image: none !important; color: var(--url-and-searchbar-color); From 234d88566d02dbe69899073e3dec1ff1c56b9010 Mon Sep 17 00:00:00 2001 From: Dave Townsend Date: Wed, 5 Nov 2014 16:52:46 -0800 Subject: [PATCH 22/25] Bug 1083327: Uplift Add-on SDK. https://github.com/mozilla/addon-sdk/compare/57b8a4a...1aee56d --- addon-sdk/moz.build | 5 +- addon-sdk/source/lib/dev/volcan.js | 94 +- .../source/lib/framescript/LoaderHelper.jsm | 33 + .../source/lib/framescript/tab-events.js | 21 +- addon-sdk/source/lib/sdk/base64.js | 7 +- addon-sdk/source/lib/sdk/clipboard.js | 3 +- .../source/lib/sdk/content/content-worker.js | 30 - addon-sdk/source/lib/sdk/content/thumbnail.js | 5 + .../source/lib/sdk/content/worker-child.js | 88 ++ .../source/lib/sdk/content/worker-parent.js | 184 ++++ addon-sdk/source/lib/sdk/context-menu.js | 3 +- addon-sdk/source/lib/sdk/core/heritage.js | 3 +- addon-sdk/source/lib/sdk/core/promise.js | 4 +- addon-sdk/source/lib/sdk/deprecated/cortex.js | 10 +- addon-sdk/source/lib/sdk/deprecated/list.js | 3 +- addon-sdk/source/lib/sdk/deprecated/traits.js | 15 +- .../source/lib/sdk/deprecated/traits/core.js | 35 +- .../lib/sdk/deprecated/unit-test-finder.js | 18 +- addon-sdk/source/lib/sdk/event/core.js | 9 +- addon-sdk/source/lib/sdk/event/target.js | 8 +- addon-sdk/source/lib/sdk/l10n/html.js | 18 +- addon-sdk/source/lib/sdk/page-mod.js | 18 +- addon-sdk/source/lib/sdk/panel.js | 5 +- addon-sdk/source/lib/sdk/selection.js | 13 +- addon-sdk/source/lib/sdk/self.js | 7 +- addon-sdk/source/lib/sdk/stylesheet/utils.js | 18 +- addon-sdk/source/lib/sdk/tabs/tab-fennec.js | 3 +- addon-sdk/source/lib/sdk/tabs/tab-firefox.js | 13 +- addon-sdk/source/lib/sdk/tabs/worker.js | 2 +- addon-sdk/source/lib/sdk/ui/button/action.js | 1 + .../source/lib/sdk/ui/button/contract.js | 23 +- addon-sdk/source/lib/sdk/ui/button/toggle.js | 1 + addon-sdk/source/lib/sdk/ui/button/view.js | 27 +- addon-sdk/source/lib/sdk/util/iteration.js | 24 - addon-sdk/source/lib/sdk/util/list.js | 5 +- addon-sdk/source/lib/sdk/util/object.js | 16 +- addon-sdk/source/lib/sdk/util/sequence.js | 5 +- addon-sdk/source/lib/sdk/windows/loader.js | 8 +- addon-sdk/source/lib/toolkit/loader.js | 18 +- addon-sdk/source/lib/toolkit/require.js | 54 + .../source/python-lib/cuddlefish/packaging.py | 7 +- .../source/python-lib/cuddlefish/prefs.py | 3 + .../source/test/addons/curly-id/lib/main.js | 5 - .../source/test/addons/curly-id/package.json | 4 +- .../test/addons/standard-id/lib/main.js | 5 - .../test/addons/standard-id/package.json | 4 +- .../fixtures/addon-sdk/data/border-style.css | 1 + .../addon-sdk/data/test-contentScriptFile.js | 5 + .../test/fixtures/addon-sdk/data/test.html | 13 + addon-sdk/source/test/jetpack-package.ini | 1 + addon-sdk/source/test/pagemod-test-helpers.js | 71 +- addon-sdk/source/test/test-base64.js | 7 +- addon-sdk/source/test/test-content-script.js | 3 +- .../source/test/test-content-worker-parent.js | 982 ++++++++++++++++++ addon-sdk/source/test/test-event-core.js | 23 +- addon-sdk/source/test/test-event-target.js | 25 +- addon-sdk/source/test/test-page-mod.js | 112 +- addon-sdk/source/test/test-panel.js | 4 +- addon-sdk/source/test/test-promise.js | 14 +- addon-sdk/source/test/test-self.js | 26 +- addon-sdk/source/test/test-shared-require.js | 35 + addon-sdk/source/test/test-tabs-common.js | 12 +- addon-sdk/source/test/test-traits-core.js | 10 +- .../source/test/test-ui-action-button.js | 610 +++++++---- .../source/test/test-ui-toggle-button.js | 648 +++++++----- addon-sdk/source/test/traits/assert.js | 9 +- 66 files changed, 2728 insertions(+), 768 deletions(-) create mode 100644 addon-sdk/source/lib/framescript/LoaderHelper.jsm create mode 100644 addon-sdk/source/lib/sdk/content/worker-child.js create mode 100644 addon-sdk/source/lib/sdk/content/worker-parent.js delete mode 100644 addon-sdk/source/lib/sdk/util/iteration.js create mode 100644 addon-sdk/source/lib/toolkit/require.js create mode 100644 addon-sdk/source/test/fixtures/addon-sdk/data/border-style.css create mode 100644 addon-sdk/source/test/fixtures/addon-sdk/data/test-contentScriptFile.js create mode 100644 addon-sdk/source/test/fixtures/addon-sdk/data/test.html create mode 100644 addon-sdk/source/test/test-content-worker-parent.js create mode 100644 addon-sdk/source/test/test-shared-require.js diff --git a/addon-sdk/moz.build b/addon-sdk/moz.build index 5760e72301f..30d3325ff93 100644 --- a/addon-sdk/moz.build +++ b/addon-sdk/moz.build @@ -172,6 +172,7 @@ EXTRA_JS_MODULES.commonjs.diffpatcher.test += [ EXTRA_JS_MODULES.commonjs.framescript += [ 'source/lib/framescript/FrameScriptManager.jsm', + 'source/lib/framescript/LoaderHelper.jsm', 'source/lib/framescript/tab-events.js', ] @@ -240,6 +241,8 @@ EXTRA_JS_MODULES.commonjs.sdk.content += [ 'source/lib/sdk/content/sandbox.js', 'source/lib/sdk/content/thumbnail.js', 'source/lib/sdk/content/utils.js', + 'source/lib/sdk/content/worker-child.js', + 'source/lib/sdk/content/worker-parent.js', 'source/lib/sdk/content/worker.js', ] @@ -429,7 +432,6 @@ EXTRA_JS_MODULES.commonjs.sdk.util += [ 'source/lib/sdk/util/contract.js', 'source/lib/sdk/util/deprecate.js', 'source/lib/sdk/util/dispatcher.js', - 'source/lib/sdk/util/iteration.js', 'source/lib/sdk/util/list.js', 'source/lib/sdk/util/match-pattern.js', 'source/lib/sdk/util/object.js', @@ -453,4 +455,5 @@ EXTRA_JS_MODULES.commonjs.sdk.zip += [ EXTRA_JS_MODULES.commonjs.toolkit += [ 'source/lib/toolkit/loader.js', + 'source/lib/toolkit/require.js', ] diff --git a/addon-sdk/source/lib/dev/volcan.js b/addon-sdk/source/lib/dev/volcan.js index cbead6af36f..62b4b603278 100644 --- a/addon-sdk/source/lib/dev/volcan.js +++ b/addon-sdk/source/lib/dev/volcan.js @@ -45,6 +45,7 @@ var Class = _dereq_("./class").Class; var TypeSystem = _dereq_("./type-system").TypeSystem; var values = _dereq_("./util").values; var Promise = _dereq_("es6-promise").Promise; +var MessageEvent = _dereq_("./event").MessageEvent; var specification = _dereq_("./specification/core.json"); @@ -136,7 +137,10 @@ var Client = Class({ var actor = this.get(packet.from) || this.root; var event = actor.events[packet.type]; if (event) { - actor.dispatchEvent(event.read(packet)); + var message = new MessageEvent(packet.type, { + data: event.read(packet) + }); + actor.dispatchEvent(message); } else { var index = this.requests.indexOf(actor.id); if (index >= 0) { @@ -207,12 +211,12 @@ var Client = Class({ if (workers) { workers.map(this.get).forEach(this.release) } - this.unergister(actor); + this.unregister(actor); } }); exports.Client = Client; -},{"./class":3,"./specification/core.json":23,"./specification/protocol.json":24,"./type-system":25,"./util":26,"es6-promise":2}],5:[function(_dereq_,module,exports){ +},{"./class":3,"./event":5,"./specification/core.json":23,"./specification/protocol.json":24,"./type-system":25,"./util":26,"es6-promise":2}],5:[function(_dereq_,module,exports){ "use strict"; var Symbol = _dereq_("es6-symbol") @@ -429,7 +433,10 @@ EventEmitter.prototype.addListener = function(type, listener) { 'leak detected. %d listeners added. ' + 'Use emitter.setMaxListeners() to increase limit.', this._events[type].length); - console.trace(); + if (typeof console.trace === 'function') { + // not supported in IE 10 + console.trace(); + } } } @@ -937,7 +944,84 @@ module.exports={ "consoleActor": "console", "traceActor": "trace" + }, + "methods": [ + { + "name": "attach", + "request": {}, + "response": { "_retval": "json" } + } + ], + "events": { + "tabNavigated": { + "typeName": "tabNavigated" + } } + }, + "console": { + "category": "actor", + "typeName": "console", + "methods": [ + { + "name": "evaluateJS", + "request": { + "text": { + "_option": 0, + "type": "string" + }, + "url": { + "_option": 1, + "type": "string" + }, + "bindObjectActor": { + "_option": 2, + "type": "nullable:string" + }, + "frameActor": { + "_option": 2, + "type": "nullable:string" + }, + "selectedNodeActor": { + "_option": 2, + "type": "nullable:string" + } + }, + "response": { + "_retval": "evaluatejsresponse" + } + } + ], + "events": {} + }, + "evaluatejsresponse": { + "category": "dict", + "typeName": "evaluatejsresponse", + "specializations": { + "result": "object", + "exception": "object", + "exceptionMessage": "string", + "input": "string" + } + }, + "object": { + "category": "actor", + "typeName": "object", + "methods": [ + { + "name": "property", + "request": { + "name": { + "_arg": 0, + "type": "string" + } + }, + "response": { + "descriptor": { + "_retval": "json" + } + } + } + ] } } } @@ -3755,6 +3839,6 @@ var findPath = function(object, key) { exports.findPath = findPath; },{}]},{},[1]) -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlcyI6WyIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3ZvbGNhbi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy92b2xjYW4vYnJvd3Nlci9pbmRleC5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvdm9sY2FuL2Jyb3dzZXIvcHJvbWlzZS5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvdm9sY2FuL2NsYXNzLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy92b2xjYW4vY2xpZW50LmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy92b2xjYW4vZXZlbnQuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3ZvbGNhbi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvdm9sY2FuL25vZGVfbW9kdWxlcy9lczYtc3ltYm9sL2luZGV4LmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy92b2xjYW4vbm9kZV9tb2R1bGVzL2VzNi1zeW1ib2wvaXMtaW1wbGVtZW50ZWQuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3ZvbGNhbi9ub2RlX21vZHVsZXMvZXM2LXN5bWJvbC9ub2RlX21vZHVsZXMvZC9pbmRleC5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvdm9sY2FuL25vZGVfbW9kdWxlcy9lczYtc3ltYm9sL25vZGVfbW9kdWxlcy9lczUtZXh0L29iamVjdC9hc3NpZ24vaW5kZXguanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3ZvbGNhbi9ub2RlX21vZHVsZXMvZXM2LXN5bWJvbC9ub2RlX21vZHVsZXMvZXM1LWV4dC9vYmplY3QvYXNzaWduL2lzLWltcGxlbWVudGVkLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy92b2xjYW4vbm9kZV9tb2R1bGVzL2VzNi1zeW1ib2wvbm9kZV9tb2R1bGVzL2VzNS1leHQvb2JqZWN0L2Fzc2lnbi9zaGltLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy92b2xjYW4vbm9kZV9tb2R1bGVzL2VzNi1zeW1ib2wvbm9kZV9tb2R1bGVzL2VzNS1leHQvb2JqZWN0L2lzLWNhbGxhYmxlLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy92b2xjYW4vbm9kZV9tb2R1bGVzL2VzNi1zeW1ib2wvbm9kZV9tb2R1bGVzL2VzNS1leHQvb2JqZWN0L2tleXMvaW5kZXguanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3ZvbGNhbi9ub2RlX21vZHVsZXMvZXM2LXN5bWJvbC9ub2RlX21vZHVsZXMvZXM1LWV4dC9vYmplY3Qva2V5cy9pcy1pbXBsZW1lbnRlZC5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvdm9sY2FuL25vZGVfbW9kdWxlcy9lczYtc3ltYm9sL25vZGVfbW9kdWxlcy9lczUtZXh0L29iamVjdC9rZXlzL3NoaW0uanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3ZvbGNhbi9ub2RlX21vZHVsZXMvZXM2LXN5bWJvbC9ub2RlX21vZHVsZXMvZXM1LWV4dC9vYmplY3Qvbm9ybWFsaXplLW9wdGlvbnMuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3ZvbGNhbi9ub2RlX21vZHVsZXMvZXM2LXN5bWJvbC9ub2RlX21vZHVsZXMvZXM1LWV4dC9vYmplY3QvdmFsaWQtdmFsdWUuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3ZvbGNhbi9ub2RlX21vZHVsZXMvZXM2LXN5bWJvbC9ub2RlX21vZHVsZXMvZXM1LWV4dC9zdHJpbmcvIy9jb250YWlucy9pbmRleC5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvdm9sY2FuL25vZGVfbW9kdWxlcy9lczYtc3ltYm9sL25vZGVfbW9kdWxlcy9lczUtZXh0L3N0cmluZy8jL2NvbnRhaW5zL2lzLWltcGxlbWVudGVkLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy92b2xjYW4vbm9kZV9tb2R1bGVzL2VzNi1zeW1ib2wvbm9kZV9tb2R1bGVzL2VzNS1leHQvc3RyaW5nLyMvY29udGFpbnMvc2hpbS5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvdm9sY2FuL25vZGVfbW9kdWxlcy9lczYtc3ltYm9sL3BvbHlmaWxsLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy92b2xjYW4vc3BlY2lmaWNhdGlvbi9jb3JlLmpzb24iLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3ZvbGNhbi9zcGVjaWZpY2F0aW9uL3Byb3RvY29sLmpzb24iLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3ZvbGNhbi90eXBlLXN5c3RlbS5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvdm9sY2FuL3V0aWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1U0E7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzdUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcmRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpfXZhciBmPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChmLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGYsZi5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIENsaWVudCA9IHJlcXVpcmUoXCIuLi9jbGllbnRcIikuQ2xpZW50O1xuXG5mdW5jdGlvbiBjb25uZWN0KHBvcnQpIHtcbiAgdmFyIGNsaWVudCA9IG5ldyBDbGllbnQoKTtcbiAgcmV0dXJuIGNsaWVudC5jb25uZWN0KHBvcnQpO1xufVxuZXhwb3J0cy5jb25uZWN0ID0gY29ubmVjdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLlByb21pc2UgPSBQcm9taXNlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBkZXNjcmliZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgQ2xhc3MgPSBmdW5jdGlvbihmaWVsZHMpIHtcbiAgdmFyIG5hbWVzID0gT2JqZWN0LmtleXMoZmllbGRzKTtcbiAgdmFyIGNvbnN0cnVjdG9yID0gbmFtZXMuaW5kZXhPZihcImNvbnN0cnVjdG9yXCIpID49IDAgPyBmaWVsZHMuY29uc3RydWN0b3IgOlxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHt9O1xuICB2YXIgYW5jZXN0b3IgPSBmaWVsZHMuZXh0ZW5kcyB8fCBPYmplY3Q7XG5cbiAgdmFyIGRlc2NyaXB0b3IgPSBuYW1lcy5yZWR1Y2UoZnVuY3Rpb24oZGVzY3JpcHRvciwga2V5KSB7XG4gICAgZGVzY3JpcHRvcltrZXldID0gZGVzY3JpYmUoZmllbGRzLCBrZXkpO1xuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9LCB7fSk7XG5cbiAgdmFyIHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoYW5jZXN0b3IucHJvdG90eXBlLCBkZXNjcmlwdG9yKTtcblxuICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBwcm90b3R5cGU7XG4gIHByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xuXG4gIHJldHVybiBjb25zdHJ1Y3Rvcjtcbn07XG5leHBvcnRzLkNsYXNzID0gQ2xhc3M7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIENsYXNzID0gcmVxdWlyZShcIi4vY2xhc3NcIikuQ2xhc3M7XG52YXIgVHlwZVN5c3RlbSA9IHJlcXVpcmUoXCIuL3R5cGUtc3lzdGVtXCIpLlR5cGVTeXN0ZW07XG52YXIgdmFsdWVzID0gcmVxdWlyZShcIi4vdXRpbFwiKS52YWx1ZXM7XG52YXIgUHJvbWlzZSA9IHJlcXVpcmUoXCJlczYtcHJvbWlzZVwiKS5Qcm9taXNlO1xuXG52YXIgc3BlY2lmaWNhdGlvbiA9IHJlcXVpcmUoXCIuL3NwZWNpZmljYXRpb24vY29yZS5qc29uXCIpO1xuXG5mdW5jdGlvbiByZWNvdmVyQWN0b3JEZXNjcmlwdGlvbnMoZXJyb3IpIHtcbiAgY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIGZldGNoIHByb3RvY29sIHNwZWNpZmljYXRpb24gKHNlZSByZWFzb24gYmVsb3cpLiBcIiArXG4gICAgICAgICAgICAgICBcIlVzaW5nIGEgZmFsbGJhY2sgcHJvdG9jYWwgc3BlY2lmaWNhdGlvbiFcIixcbiAgICAgICAgICAgICAgIGVycm9yKTtcbiAgcmV0dXJuIHJlcXVpcmUoXCIuL3NwZWNpZmljYXRpb24vcHJvdG9jb2wuanNvblwiKTtcbn1cblxuLy8gVHlwZSB0byByZXByZXNlbnQgc3VwZXJ2aXNlciBhY3RvciByZWxhdGlvbnMgdG8gYWN0b3JzIHRoZXkgc3VwZXJ2aXNlXG4vLyBpbiB0ZXJtcyBvZiBsaWZldGltZSBtYW5hZ2VtZW50LlxudmFyIFN1cGVydmlzb3IgPSBDbGFzcyh7XG4gIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihpZCkge1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLndvcmtlcnMgPSBbXTtcbiAgfVxufSk7XG5cbnZhciBUZWxlbWV0cnkgPSBDbGFzcyh7XG4gIGFkZDogZnVuY3Rpb24oaWQsIG1zKSB7XG4gICAgY29uc29sZS5sb2coXCJ0ZWxlbWV0cnk6OlwiLCBpZCwgbXMpXG4gIH1cbn0pO1xuXG4vLyBDb25zaWRlciBtYWtpbmcgY2xpZW50IGEgcm9vdCBhY3Rvci5cblxudmFyIENsaWVudCA9IENsYXNzKHtcbiAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucm9vdCA9IG51bGw7XG4gICAgdGhpcy50ZWxlbWV0cnkgPSBuZXcgVGVsZW1ldHJ5KCk7XG5cbiAgICB0aGlzLnNldHVwQ29ubmVjdGlvbigpO1xuICAgIHRoaXMuc2V0dXBMaWZlTWFuYWdlbWVudCgpO1xuICAgIHRoaXMuc2V0dXBUeXBlU3lzdGVtKCk7XG4gIH0sXG5cbiAgc2V0dXBDb25uZWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlcXVlc3RzID0gW107XG4gIH0sXG4gIHNldHVwTGlmZU1hbmFnZW1lbnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuZ3JhcGggPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuZ2V0ID0gdGhpcy5nZXQuYmluZCh0aGlzKTtcbiAgICB0aGlzLnJlbGVhc2UgPSB0aGlzLnJlbGVhc2UuYmluZCh0aGlzKTtcbiAgfSxcbiAgc2V0dXBUeXBlU3lzdGVtOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnR5cGVTeXN0ZW0gPSBuZXcgVHlwZVN5c3RlbSh0aGlzKTtcbiAgICB0aGlzLnR5cGVTeXN0ZW0ucmVnaXN0ZXJUeXBlcyhzcGVjaWZpY2F0aW9uKTtcbiAgfSxcblxuICBjb25uZWN0OiBmdW5jdGlvbihwb3J0KSB7XG4gICAgdmFyIGNsaWVudCA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgY2xpZW50LnBvcnQgPSBwb3J0O1xuICAgICAgcG9ydC5vbm1lc3NhZ2UgPSBjbGllbnQucmVjZWl2ZS5iaW5kKGNsaWVudCk7XG4gICAgICBjbGllbnQub25SZWFkeSA9IHJlc29sdmU7XG4gICAgICBjbGllbnQub25GYWlsID0gcmVqZWN0O1xuXG4gICAgICBwb3J0LnN0YXJ0KCk7XG4gICAgfSk7XG4gIH0sXG4gIHNlbmQ6IGZ1bmN0aW9uKHBhY2tldCkge1xuICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZShwYWNrZXQpO1xuICB9LFxuICByZXF1ZXN0OiBmdW5jdGlvbihwYWNrZXQpIHtcbiAgICB2YXIgY2xpZW50ID0gdGhpcztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBjbGllbnQucmVxdWVzdHMucHVzaChwYWNrZXQudG8sIHsgcmVzb2x2ZTogcmVzb2x2ZSwgcmVqZWN0OiByZWplY3QgfSk7XG4gICAgICBjbGllbnQuc2VuZChwYWNrZXQpO1xuICAgIH0pO1xuICB9LFxuXG4gIHJlY2VpdmU6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIHBhY2tldCA9IGV2ZW50LmRhdGE7XG4gICAgaWYgKCF0aGlzLnJvb3QpIHtcbiAgICAgIGlmIChwYWNrZXQuZnJvbSAhPT0gXCJyb290XCIpXG4gICAgICAgIHRocm93IEVycm9yKFwiSW5pdGlhbCBwYWNrZXQgbXVzdCBiZSBmcm9tIHJvb3RcIik7XG4gICAgICBpZiAoIShcImFwcGxpY2F0aW9uVHlwZVwiIGluIHBhY2tldCkpXG4gICAgICAgIHRocm93IEVycm9yKFwiSW5pdGlhbCBwYWNrZXQgbXVzdCBjb250YWluIGFwcGxpY2F0aW9uVHlwZSBmaWVsZFwiKTtcblxuICAgICAgdGhpcy5yb290ID0gdGhpcy50eXBlU3lzdGVtLnJlYWQoXCJyb290XCIsIG51bGwsIFwicm9vdFwiKTtcbiAgICAgIHRoaXMucm9vdFxuICAgICAgICAgIC5wcm90b2NvbERlc2NyaXB0aW9uKClcbiAgICAgICAgICAuY2F0Y2gocmVjb3ZlckFjdG9yRGVzY3JpcHRpb25zKVxuICAgICAgICAgIC50aGVuKHRoaXMudHlwZVN5c3RlbS5yZWdpc3RlclR5cGVzLmJpbmQodGhpcy50eXBlU3lzdGVtKSlcbiAgICAgICAgICAudGhlbih0aGlzLm9uUmVhZHkuYmluZCh0aGlzLCB0aGlzLnJvb3QpLCB0aGlzLm9uRmFpbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBhY3RvciA9IHRoaXMuZ2V0KHBhY2tldC5mcm9tKSB8fCB0aGlzLnJvb3Q7XG4gICAgICB2YXIgZXZlbnQgPSBhY3Rvci5ldmVudHNbcGFja2V0LnR5cGVdO1xuICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgIGFjdG9yLmRpc3BhdGNoRXZlbnQoZXZlbnQucmVhZChwYWNrZXQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMucmVxdWVzdHMuaW5kZXhPZihhY3Rvci5pZCk7XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgdmFyIHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RzLnNwbGljZShpbmRleCwgMikucG9wKCk7XG4gICAgICAgICAgaWYgKHBhY2tldC5lcnJvcilcbiAgICAgICAgICAgIHJlcXVlc3QucmVqZWN0KHBhY2tldCk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmVxdWVzdC5yZXNvbHZlKHBhY2tldCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihFcnJvcihcIlVuZXhwZWN0ZWQgcGFja2V0IFwiICsgSlNPTi5zdHJpbmdpZnkocGFja2V0LCAyLCAyKSksXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RzLnNsaWNlKDApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBnZXQ6IGZ1bmN0aW9uKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVbaWRdO1xuICB9LFxuICBzdXBlcnZpc29yT2Y6IGZ1bmN0aW9uKGFjdG9yKSB7XG4gICAgZm9yICh2YXIgaWQgaW4gdGhpcy5ncmFwaCkge1xuICAgICAgaWYgKHRoaXMuZ3JhcGhbaWRdLmluZGV4T2YoYWN0b3IuaWQpID49IDApIHtcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgd29ya2Vyc09mOiBmdW5jdGlvbihhY3Rvcikge1xuICAgIHJldHVybiB0aGlzLmdyYXBoW2FjdG9yLmlkXTtcbiAgfSxcbiAgc3VwZXJ2aXNlOiBmdW5jdGlvbihhY3Rvciwgd29ya2VyKSB7XG4gICAgdmFyIHdvcmtlcnMgPSB0aGlzLndvcmtlcnNPZihhY3RvcilcbiAgICBpZiAod29ya2Vycy5pbmRleE9mKHdvcmtlci5pZCkgPCAwKSB7XG4gICAgICB3b3JrZXJzLnB1c2god29ya2VyLmlkKTtcbiAgICB9XG4gIH0sXG4gIHVuc3VwZXJ2aXNlOiBmdW5jdGlvbihhY3Rvciwgd29ya2VyKSB7XG4gICAgdmFyIHdvcmtlcnMgPSB0aGlzLndvcmtlcnNPZihhY3Rvcik7XG4gICAgdmFyIGluZGV4ID0gd29ya2Vycy5pbmRleE9mKHdvcmtlci5pZClcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgd29ya2Vycy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgfVxuICB9LFxuXG4gIHJlZ2lzdGVyOiBmdW5jdGlvbihhY3Rvcikge1xuICAgIHZhciByZWdpc3RlcmVkID0gdGhpcy5nZXQoYWN0b3IuaWQpO1xuICAgIGlmICghcmVnaXN0ZXJlZCkge1xuICAgICAgdGhpcy5jYWNoZVthY3Rvci5pZF0gPSBhY3RvcjtcbiAgICAgIHRoaXMuZ3JhcGhbYWN0b3IuaWRdID0gW107XG4gICAgfSBlbHNlIGlmIChyZWdpc3RlcmVkICE9PSBhY3Rvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGlmZmVyZW50IGFjdG9yIHdpdGggc2FtZSBpZCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRcIik7XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVyOiBmdW5jdGlvbihhY3Rvcikge1xuICAgIGlmICh0aGlzLmdldChhY3Rvci5pZCkpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlW2FjdG9yLmlkXTtcbiAgICAgIGRlbGV0ZSB0aGlzLmdyYXBoW2FjdG9yLmlkXTtcbiAgICB9XG4gIH0sXG5cbiAgcmVsZWFzZTogZnVuY3Rpb24oYWN0b3IpIHtcbiAgICB2YXIgc3VwZXJ2aXNvciA9IHRoaXMuc3VwZXJ2aXNvck9mKGFjdG9yKTtcbiAgICBpZiAoc3VwZXJ2aXNvcilcbiAgICAgIHRoaXMudW5zdXBlcnZpc2Uoc3VwZXJ2aXNvciwgYWN0b3IpO1xuXG4gICAgdmFyIHdvcmtlcnMgPSB0aGlzLndvcmtlcnNPZihhY3RvcilcblxuICAgIGlmICh3b3JrZXJzKSB7XG4gICAgICB3b3JrZXJzLm1hcCh0aGlzLmdldCkuZm9yRWFjaCh0aGlzLnJlbGVhc2UpXG4gICAgfVxuICAgIHRoaXMudW5lcmdpc3RlcihhY3Rvcik7XG4gIH1cbn0pO1xuZXhwb3J0cy5DbGllbnQgPSBDbGllbnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIFN5bWJvbCA9IHJlcXVpcmUoXCJlczYtc3ltYm9sXCIpXG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZShcImV2ZW50c1wiKS5FdmVudEVtaXR0ZXI7XG52YXIgQ2xhc3MgPSByZXF1aXJlKFwiLi9jbGFzc1wiKS5DbGFzcztcblxudmFyICRib3VuZCA9IFN5bWJvbChcIkV2ZW50VGFyZ2V0L2hhbmRsZUV2ZW50XCIpO1xudmFyICRlbWl0dGVyID0gU3ltYm9sKFwiRXZlbnRUYXJnZXQvZW1pdHRlclwiKTtcblxuZnVuY3Rpb24gbWFrZUhhbmRsZXIoaGFuZGxlcikge1xuICByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBoYW5kbGVyLmhhbmRsZUV2ZW50KGV2ZW50KTtcbiAgfVxufVxuXG52YXIgRXZlbnRUYXJnZXQgPSBDbGFzcyh7XG4gIGNvbnN0cnVjdG9yOiBmdW5jdGlvbigpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJGVtaXR0ZXIsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogbmV3IEV2ZW50RW1pdHRlcigpXG4gICAgfSk7XG4gIH0sXG4gIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uKHR5cGUsIGhhbmRsZXIpIHtcbiAgICBpZiAodHlwZW9mKGhhbmRsZXIpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXNbJGVtaXR0ZXJdLm9uKHR5cGUsIGhhbmRsZXIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChoYW5kbGVyICYmIHR5cGVvZihoYW5kbGVyKSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgaWYgKCFoYW5kbGVyWyRib3VuZF0pIGhhbmRsZXJbJGJvdW5kXSA9IG1ha2VIYW5kbGVyKGhhbmRsZXIpO1xuICAgICAgdGhpc1skZW1pdHRlcl0ub24odHlwZSwgaGFuZGxlclskYm91bmRdKTtcbiAgICB9XG4gIH0sXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uKHR5cGUsIGhhbmRsZXIpIHtcbiAgICBpZiAodHlwZW9mKGhhbmRsZXIpID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICB0aGlzWyRlbWl0dGVyXS5yZW1vdmVMaXN0ZW5lcih0eXBlLCBoYW5kbGVyKTtcbiAgICBlbHNlIGlmIChoYW5kbGVyICYmIGhhbmRsZXJbJGJvdW5kXSlcbiAgICAgIHRoaXNbJGVtaXR0ZXJdLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGhhbmRsZXJbJGJvdW5kXSk7XG4gIH0sXG4gIGRpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgZXZlbnQudGFyZ2V0ID0gdGhpcztcbiAgICB0aGlzWyRlbWl0dGVyXS5lbWl0KGV2ZW50LnR5cGUsIGV2ZW50KTtcbiAgfVxufSk7XG5leHBvcnRzLkV2ZW50VGFyZ2V0ID0gRXZlbnRUYXJnZXQ7XG5cbnZhciBNZXNzYWdlRXZlbnQgPSBDbGFzcyh7XG4gIGNvbnN0cnVjdG9yOiBmdW5jdGlvbih0eXBlLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLmRhdGEgPSBvcHRpb25zLmRhdGEgPT09IHZvaWQoMCkgPyBudWxsIDogb3B0aW9ucy5kYXRhO1xuXG4gICAgdGhpcy5sYXN0RXZlbnRJZCA9IG9wdGlvbnMubGFzdEV2ZW50SWQgfHwgXCJcIjtcbiAgICB0aGlzLm9yaWdpbiA9IG9wdGlvbnMub3JpZ2luIHx8IFwiXCI7XG4gICAgdGhpcy5idWJibGVzID0gb3B0aW9ucy5idWJibGVzIHx8IGZhbHNlO1xuICAgIHRoaXMuY2FuY2VsYWJsZSA9IG9wdGlvbnMuY2FuY2VsYWJsZSB8fCBmYWxzZTtcbiAgfSxcbiAgc291cmNlOiBudWxsLFxuICBwb3J0czogbnVsbCxcbiAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkge1xuICB9LFxuICBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuICB9LFxuICBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuICB9XG59KTtcbmV4cG9ydHMuTWVzc2FnZUV2ZW50ID0gTWVzc2FnZUV2ZW50O1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgdGhpcy5fZXZlbnRzID0gdGhpcy5fZXZlbnRzIHx8IHt9O1xuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG5FdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbihuKSB7XG4gIGlmICghaXNOdW1iZXIobikgfHwgbiA8IDAgfHwgaXNOYU4obikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCduIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciBlciwgaGFuZGxlciwgbGVuLCBhcmdzLCBpLCBsaXN0ZW5lcnM7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgdGhpcy5fZXZlbnRzID0ge307XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAodHlwZSA9PT0gJ2Vycm9yJykge1xuICAgIGlmICghdGhpcy5fZXZlbnRzLmVycm9yIHx8XG4gICAgICAgIChpc09iamVjdCh0aGlzLl9ldmVudHMuZXJyb3IpICYmICF0aGlzLl9ldmVudHMuZXJyb3IubGVuZ3RoKSkge1xuICAgICAgZXIgPSBhcmd1bWVudHNbMV07XG4gICAgICBpZiAoZXIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IFR5cGVFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkIFwiZXJyb3JcIiBldmVudC4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVyID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChpc1VuZGVmaW5lZChoYW5kbGVyKSlcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKGlzRnVuY3Rpb24oaGFuZGxlcikpIHtcbiAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIC8vIGZhc3QgY2FzZXNcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0pO1xuICAgICAgICBicmVhaztcbiAgICAgIC8vIHNsb3dlclxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgYXJncyA9IG5ldyBBcnJheShsZW4gLSAxKTtcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKVxuICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICBoYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdChoYW5kbGVyKSkge1xuICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgYXJncyA9IG5ldyBBcnJheShsZW4gLSAxKTtcbiAgICBmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspXG4gICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcblxuICAgIGxpc3RlbmVycyA9IGhhbmRsZXIuc2xpY2UoKTtcbiAgICBsZW4gPSBsaXN0ZW5lcnMubGVuZ3RoO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgIGxpc3RlbmVyc1tpXS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBtO1xuXG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcblxuICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gIGlmICh0aGlzLl9ldmVudHMubmV3TGlzdGVuZXIpXG4gICAgdGhpcy5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgIGlzRnVuY3Rpb24obGlzdGVuZXIubGlzdGVuZXIpID9cbiAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gIGVsc2UgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkpXG4gICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcbiAgZWxzZVxuICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IFt0aGlzLl9ldmVudHNbdHlwZV0sIGxpc3RlbmVyXTtcblxuICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICBpZiAoaXNPYmplY3QodGhpcy5fZXZlbnRzW3R5cGVdKSAmJiAhdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCkge1xuICAgIHZhciBtO1xuICAgIGlmICghaXNVbmRlZmluZWQodGhpcy5fbWF4TGlzdGVuZXJzKSkge1xuICAgICAgbSA9IHRoaXMuX21heExpc3RlbmVycztcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICAgIH1cblxuICAgIGlmIChtICYmIG0gPiAwICYmIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGggPiBtKSB7XG4gICAgICB0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJyhub2RlKSB3YXJuaW5nOiBwb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5ICcgK1xuICAgICAgICAgICAgICAgICAgICAnbGVhayBkZXRlY3RlZC4gJWQgbGlzdGVuZXJzIGFkZGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1VzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0LicsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGgpO1xuICAgICAgY29uc29sZS50cmFjZSgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICB2YXIgZmlyZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBnKCkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgZyk7XG5cbiAgICBpZiAoIWZpcmVkKSB7XG4gICAgICBmaXJlZCA9IHRydWU7XG4gICAgICBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIGcubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgdGhpcy5vbih0eXBlLCBnKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZmYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIGxpc3QsIHBvc2l0aW9uLCBsZW5ndGgsIGk7XG5cbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgbGlzdCA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgbGVuZ3RoID0gbGlzdC5sZW5ndGg7XG4gIHBvc2l0aW9uID0gLTE7XG5cbiAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8XG4gICAgICAoaXNGdW5jdGlvbihsaXN0Lmxpc3RlbmVyKSAmJiBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIGlmICh0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuXG4gIH0gZWxzZSBpZiAoaXNPYmplY3QobGlzdCkpIHtcbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSA+IDA7KSB7XG4gICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHxcbiAgICAgICAgICAobGlzdFtpXS5saXN0ZW5lciAmJiBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpc3Quc3BsaWNlKHBvc2l0aW9uLCAxKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciBrZXksIGxpc3RlbmVycztcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gIGlmICghdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICBlbHNlIGlmICh0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgZm9yIChrZXkgaW4gdGhpcy5fZXZlbnRzKSB7XG4gICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGxpc3RlbmVycykpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gTElGTyBvcmRlclxuICAgIHdoaWxlIChsaXN0ZW5lcnMubGVuZ3RoKVxuICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbbGlzdGVuZXJzLmxlbmd0aCAtIDFdKTtcbiAgfVxuICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciByZXQ7XG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0ID0gW107XG4gIGVsc2UgaWYgKGlzRnVuY3Rpb24odGhpcy5fZXZlbnRzW3R5cGVdKSlcbiAgICByZXQgPSBbdGhpcy5fZXZlbnRzW3R5cGVdXTtcbiAgZWxzZVxuICAgIHJldCA9IHRoaXMuX2V2ZW50c1t0eXBlXS5zbGljZSgpO1xuICByZXR1cm4gcmV0O1xufTtcblxuRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7XG4gIHZhciByZXQ7XG4gIGlmICghZW1pdHRlci5fZXZlbnRzIHx8ICFlbWl0dGVyLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0ID0gMDtcbiAgZWxzZSBpZiAoaXNGdW5jdGlvbihlbWl0dGVyLl9ldmVudHNbdHlwZV0pKVxuICAgIHJldCA9IDE7XG4gIGVsc2VcbiAgICByZXQgPSBlbWl0dGVyLl9ldmVudHNbdHlwZV0ubGVuZ3RoO1xuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vaXMtaW1wbGVtZW50ZWQnKSgpID8gU3ltYm9sIDogcmVxdWlyZSgnLi9wb2x5ZmlsbCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHN5bWJvbDtcblx0aWYgKHR5cGVvZiBTeW1ib2wgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcblx0c3ltYm9sID0gU3ltYm9sKCd0ZXN0IHN5bWJvbCcpO1xuXHR0cnkge1xuXHRcdGlmIChTdHJpbmcoc3ltYm9sKSAhPT0gJ1N5bWJvbCAodGVzdCBzeW1ib2wpJykgcmV0dXJuIGZhbHNlO1xuXHR9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gJ3N5bWJvbCcpIHJldHVybiB0cnVlO1xuXG5cdC8vIFJldHVybiAndHJ1ZScgZm9yIHBvbHlmaWxsc1xuXHRpZiAodHlwZW9mIFN5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG5cdGlmICh0eXBlb2YgU3ltYm9sLmlzUmVnRXhwICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuXHRpZiAodHlwZW9mIFN5bWJvbC5pdGVyYXRvciAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcblx0aWYgKHR5cGVvZiBTeW1ib2wudG9QcmltaXRpdmUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG5cdGlmICh0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuXHRpZiAodHlwZW9mIFN5bWJvbC51bnNjb3BhYmxlcyAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcblxuXHRyZXR1cm4gdHJ1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBhc3NpZ24gICAgICAgID0gcmVxdWlyZSgnZXM1LWV4dC9vYmplY3QvYXNzaWduJylcbiAgLCBub3JtYWxpemVPcHRzID0gcmVxdWlyZSgnZXM1LWV4dC9vYmplY3Qvbm9ybWFsaXplLW9wdGlvbnMnKVxuICAsIGlzQ2FsbGFibGUgICAgPSByZXF1aXJlKCdlczUtZXh0L29iamVjdC9pcy1jYWxsYWJsZScpXG4gICwgY29udGFpbnMgICAgICA9IHJlcXVpcmUoJ2VzNS1leHQvc3RyaW5nLyMvY29udGFpbnMnKVxuXG4gICwgZDtcblxuZCA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRzY3IsIHZhbHVlLyosIG9wdGlvbnMqLykge1xuXHR2YXIgYywgZSwgdywgb3B0aW9ucywgZGVzYztcblx0aWYgKChhcmd1bWVudHMubGVuZ3RoIDwgMikgfHwgKHR5cGVvZiBkc2NyICE9PSAnc3RyaW5nJykpIHtcblx0XHRvcHRpb25zID0gdmFsdWU7XG5cdFx0dmFsdWUgPSBkc2NyO1xuXHRcdGRzY3IgPSBudWxsO1xuXHR9IGVsc2Uge1xuXHRcdG9wdGlvbnMgPSBhcmd1bWVudHNbMl07XG5cdH1cblx0aWYgKGRzY3IgPT0gbnVsbCkge1xuXHRcdGMgPSB3ID0gdHJ1ZTtcblx0XHRlID0gZmFsc2U7XG5cdH0gZWxzZSB7XG5cdFx0YyA9IGNvbnRhaW5zLmNhbGwoZHNjciwgJ2MnKTtcblx0XHRlID0gY29udGFpbnMuY2FsbChkc2NyLCAnZScpO1xuXHRcdHcgPSBjb250YWlucy5jYWxsKGRzY3IsICd3Jyk7XG5cdH1cblxuXHRkZXNjID0geyB2YWx1ZTogdmFsdWUsIGNvbmZpZ3VyYWJsZTogYywgZW51bWVyYWJsZTogZSwgd3JpdGFibGU6IHcgfTtcblx0cmV0dXJuICFvcHRpb25zID8gZGVzYyA6IGFzc2lnbihub3JtYWxpemVPcHRzKG9wdGlvbnMpLCBkZXNjKTtcbn07XG5cbmQuZ3MgPSBmdW5jdGlvbiAoZHNjciwgZ2V0LCBzZXQvKiwgb3B0aW9ucyovKSB7XG5cdHZhciBjLCBlLCBvcHRpb25zLCBkZXNjO1xuXHRpZiAodHlwZW9mIGRzY3IgIT09ICdzdHJpbmcnKSB7XG5cdFx0b3B0aW9ucyA9IHNldDtcblx0XHRzZXQgPSBnZXQ7XG5cdFx0Z2V0ID0gZHNjcjtcblx0XHRkc2NyID0gbnVsbDtcblx0fSBlbHNlIHtcblx0XHRvcHRpb25zID0gYXJndW1lbnRzWzNdO1xuXHR9XG5cdGlmIChnZXQgPT0gbnVsbCkge1xuXHRcdGdldCA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmICghaXNDYWxsYWJsZShnZXQpKSB7XG5cdFx0b3B0aW9ucyA9IGdldDtcblx0XHRnZXQgPSBzZXQgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoc2V0ID09IG51bGwpIHtcblx0XHRzZXQgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoIWlzQ2FsbGFibGUoc2V0KSkge1xuXHRcdG9wdGlvbnMgPSBzZXQ7XG5cdFx0c2V0ID0gdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChkc2NyID09IG51bGwpIHtcblx0XHRjID0gdHJ1ZTtcblx0XHRlID0gZmFsc2U7XG5cdH0gZWxzZSB7XG5cdFx0YyA9IGNvbnRhaW5zLmNhbGwoZHNjciwgJ2MnKTtcblx0XHRlID0gY29udGFpbnMuY2FsbChkc2NyLCAnZScpO1xuXHR9XG5cblx0ZGVzYyA9IHsgZ2V0OiBnZXQsIHNldDogc2V0LCBjb25maWd1cmFibGU6IGMsIGVudW1lcmFibGU6IGUgfTtcblx0cmV0dXJuICFvcHRpb25zID8gZGVzYyA6IGFzc2lnbihub3JtYWxpemVPcHRzKG9wdGlvbnMpLCBkZXNjKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9pcy1pbXBsZW1lbnRlZCcpKClcblx0PyBPYmplY3QuYXNzaWduXG5cdDogcmVxdWlyZSgnLi9zaGltJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgYXNzaWduID0gT2JqZWN0LmFzc2lnbiwgb2JqO1xuXHRpZiAodHlwZW9mIGFzc2lnbiAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuXHRvYmogPSB7IGZvbzogJ3JheicgfTtcblx0YXNzaWduKG9iaiwgeyBiYXI6ICdkd2EnIH0sIHsgdHJ6eTogJ3RyenknIH0pO1xuXHRyZXR1cm4gKG9iai5mb28gKyBvYmouYmFyICsgb2JqLnRyenkpID09PSAncmF6ZHdhdHJ6eSc7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIga2V5cyAgPSByZXF1aXJlKCcuLi9rZXlzJylcbiAgLCB2YWx1ZSA9IHJlcXVpcmUoJy4uL3ZhbGlkLXZhbHVlJylcblxuICAsIG1heCA9IE1hdGgubWF4O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkZXN0LCBzcmMvKiwg4oCmc3JjbiovKSB7XG5cdHZhciBlcnJvciwgaSwgbCA9IG1heChhcmd1bWVudHMubGVuZ3RoLCAyKSwgYXNzaWduO1xuXHRkZXN0ID0gT2JqZWN0KHZhbHVlKGRlc3QpKTtcblx0YXNzaWduID0gZnVuY3Rpb24gKGtleSkge1xuXHRcdHRyeSB7IGRlc3Rba2V5XSA9IHNyY1trZXldOyB9IGNhdGNoIChlKSB7XG5cdFx0XHRpZiAoIWVycm9yKSBlcnJvciA9IGU7XG5cdFx0fVxuXHR9O1xuXHRmb3IgKGkgPSAxOyBpIDwgbDsgKytpKSB7XG5cdFx0c3JjID0gYXJndW1lbnRzW2ldO1xuXHRcdGtleXMoc3JjKS5mb3JFYWNoKGFzc2lnbik7XG5cdH1cblx0aWYgKGVycm9yICE9PSB1bmRlZmluZWQpIHRocm93IGVycm9yO1xuXHRyZXR1cm4gZGVzdDtcbn07XG4iLCIvLyBEZXByZWNhdGVkXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nOyB9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vaXMtaW1wbGVtZW50ZWQnKSgpXG5cdD8gT2JqZWN0LmtleXNcblx0OiByZXF1aXJlKCcuL3NoaW0nKTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG5cdHRyeSB7XG5cdFx0T2JqZWN0LmtleXMoJ3ByaW1pdGl2ZScpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGtleXMgPSBPYmplY3Qua2V5cztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG5cdHJldHVybiBrZXlzKG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogT2JqZWN0KG9iamVjdCkpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGFzc2lnbiA9IHJlcXVpcmUoJy4vYXNzaWduJylcblxuICAsIGZvckVhY2ggPSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaFxuICAsIGNyZWF0ZSA9IE9iamVjdC5jcmVhdGUsIGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mXG5cbiAgLCBwcm9jZXNzO1xuXG5wcm9jZXNzID0gZnVuY3Rpb24gKHNyYywgb2JqKSB7XG5cdHZhciBwcm90byA9IGdldFByb3RvdHlwZU9mKHNyYyk7XG5cdHJldHVybiBhc3NpZ24ocHJvdG8gPyBwcm9jZXNzKHByb3RvLCBvYmopIDogb2JqLCBzcmMpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucy8qLCDigKZvcHRpb25zKi8pIHtcblx0dmFyIHJlc3VsdCA9IGNyZWF0ZShudWxsKTtcblx0Zm9yRWFjaC5jYWxsKGFyZ3VtZW50cywgZnVuY3Rpb24gKG9wdGlvbnMpIHtcblx0XHRpZiAob3B0aW9ucyA9PSBudWxsKSByZXR1cm47XG5cdFx0cHJvY2VzcyhPYmplY3Qob3B0aW9ucyksIHJlc3VsdCk7XG5cdH0pO1xuXHRyZXR1cm4gcmVzdWx0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0aWYgKHZhbHVlID09IG51bGwpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlIG51bGwgb3IgdW5kZWZpbmVkXCIpO1xuXHRyZXR1cm4gdmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vaXMtaW1wbGVtZW50ZWQnKSgpXG5cdD8gU3RyaW5nLnByb3RvdHlwZS5jb250YWluc1xuXHQ6IHJlcXVpcmUoJy4vc2hpbScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3RyID0gJ3JhemR3YXRyenknO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblx0aWYgKHR5cGVvZiBzdHIuY29udGFpbnMgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuICgoc3RyLmNvbnRhaW5zKCdkd2EnKSA9PT0gdHJ1ZSkgJiYgKHN0ci5jb250YWlucygnZm9vJykgPT09IGZhbHNlKSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW5kZXhPZiA9IFN0cmluZy5wcm90b3R5cGUuaW5kZXhPZjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2VhcmNoU3RyaW5nLyosIHBvc2l0aW9uKi8pIHtcblx0cmV0dXJuIGluZGV4T2YuY2FsbCh0aGlzLCBzZWFyY2hTdHJpbmcsIGFyZ3VtZW50c1sxXSkgPiAtMTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBkID0gcmVxdWlyZSgnZCcpXG5cbiAgLCBjcmVhdGUgPSBPYmplY3QuY3JlYXRlLCBkZWZpbmVQcm9wZXJ0aWVzID0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXNcbiAgLCBnZW5lcmF0ZU5hbWUsIFN5bWJvbDtcblxuZ2VuZXJhdGVOYW1lID0gKGZ1bmN0aW9uICgpIHtcblx0dmFyIGNyZWF0ZWQgPSBjcmVhdGUobnVsbCk7XG5cdHJldHVybiBmdW5jdGlvbiAoZGVzYykge1xuXHRcdHZhciBwb3N0Zml4ID0gMDtcblx0XHR3aGlsZSAoY3JlYXRlZFtkZXNjICsgKHBvc3RmaXggfHwgJycpXSkgKytwb3N0Zml4O1xuXHRcdGRlc2MgKz0gKHBvc3RmaXggfHwgJycpO1xuXHRcdGNyZWF0ZWRbZGVzY10gPSB0cnVlO1xuXHRcdHJldHVybiAnQEAnICsgZGVzYztcblx0fTtcbn0oKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sID0gZnVuY3Rpb24gKGRlc2NyaXB0aW9uKSB7XG5cdHZhciBzeW1ib2w7XG5cdGlmICh0aGlzIGluc3RhbmNlb2YgU3ltYm9sKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVHlwZUVycm9yOiBTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTtcblx0fVxuXHRzeW1ib2wgPSBjcmVhdGUoU3ltYm9sLnByb3RvdHlwZSk7XG5cdGRlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQgPyAnJyA6IFN0cmluZyhkZXNjcmlwdGlvbikpO1xuXHRyZXR1cm4gZGVmaW5lUHJvcGVydGllcyhzeW1ib2wsIHtcblx0XHRfX2Rlc2NyaXB0aW9uX186IGQoJycsIGRlc2NyaXB0aW9uKSxcblx0XHRfX25hbWVfXzogZCgnJywgZ2VuZXJhdGVOYW1lKGRlc2NyaXB0aW9uKSlcblx0fSk7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhTeW1ib2wsIHtcblx0Y3JlYXRlOiBkKCcnLCBTeW1ib2woJ2NyZWF0ZScpKSxcblx0aGFzSW5zdGFuY2U6IGQoJycsIFN5bWJvbCgnaGFzSW5zdGFuY2UnKSksXG5cdGlzQ29uY2F0U3ByZWFkYWJsZTogZCgnJywgU3ltYm9sKCdpc0NvbmNhdFNwcmVhZGFibGUnKSksXG5cdGlzUmVnRXhwOiBkKCcnLCBTeW1ib2woJ2lzUmVnRXhwJykpLFxuXHRpdGVyYXRvcjogZCgnJywgU3ltYm9sKCdpdGVyYXRvcicpKSxcblx0dG9QcmltaXRpdmU6IGQoJycsIFN5bWJvbCgndG9QcmltaXRpdmUnKSksXG5cdHRvU3RyaW5nVGFnOiBkKCcnLCBTeW1ib2woJ3RvU3RyaW5nVGFnJykpLFxuXHR1bnNjb3BhYmxlczogZCgnJywgU3ltYm9sKCd1bnNjb3BhYmxlcycpKVxufSk7XG5cbmRlZmluZVByb3BlcnRpZXMoU3ltYm9sLnByb3RvdHlwZSwge1xuXHRwcm9wZXJUb1N0cmluZzogZChmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuICdTeW1ib2wgKCcgKyB0aGlzLl9fZGVzY3JpcHRpb25fXyArICcpJztcblx0fSksXG5cdHRvU3RyaW5nOiBkKCcnLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9fbmFtZV9fOyB9KVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoU3ltYm9sLnByb3RvdHlwZSwgU3ltYm9sLnRvUHJpbWl0aXZlLCBkKCcnLFxuXHRmdW5jdGlvbiAoaGludCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJDb252ZXJzaW9uIG9mIHN5bWJvbCBvYmplY3RzIGlzIG5vdCBhbGxvd2VkXCIpO1xuXHR9KSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoU3ltYm9sLnByb3RvdHlwZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCBkKCdjJywgJ1N5bWJvbCcpKTtcbiIsIm1vZHVsZS5leHBvcnRzPXtcbiAgXCJ0eXBlc1wiOiB7XG4gICAgXCJyb290XCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcInJvb3RcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJlY2hvXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwic3RyaW5nXCI6IHsgXCJfYXJnXCI6IDAsIFwidHlwZVwiOiBcInN0cmluZ1wiIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJzdHJpbmdcIjogeyBcIl9yZXR2YWxcIjogXCJzdHJpbmdcIiB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwibGlzdFRhYnNcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge30sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7IFwiX3JldHZhbFwiOiBcInRhYmxpc3RcIiB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJwcm90b2NvbERlc2NyaXB0aW9uXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHt9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjogeyBcIl9yZXR2YWxcIjogXCJqc29uXCIgfVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge1xuICAgICAgICBcInRhYkxpc3RDaGFuZ2VkXCI6IHt9XG4gICAgICB9XG4gICAgfSxcbiAgICBcInRhYmxpc3RcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImRpY3RcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJ0YWJsaXN0XCIsXG4gICAgICBcInNwZWNpYWxpemF0aW9uc1wiOiB7XG4gICAgICAgIFwic2VsZWN0ZWRcIjogXCJudW1iZXJcIixcbiAgICAgICAgXCJ0YWJzXCI6IFwiYXJyYXk6dGFiXCIsXG4gICAgICAgIFwidXJsXCI6IFwic3RyaW5nXCIsXG4gICAgICAgIFwiY29uc29sZUFjdG9yXCI6IFwiY29uc29sZVwiLFxuICAgICAgICBcImluc3BlY3RvckFjdG9yXCI6IFwiaW5zcGVjdG9yXCIsXG4gICAgICAgIFwic3R5bGVTaGVldHNBY3RvclwiOiBcInN0eWxlc2hlZXRzXCIsXG4gICAgICAgIFwic3R5bGVFZGl0b3JBY3RvclwiOiBcInN0eWxlZWRpdG9yXCIsXG4gICAgICAgIFwibWVtb3J5QWN0b3JcIjogXCJtZW1vcnlcIixcbiAgICAgICAgXCJldmVudExvb3BMYWdBY3RvclwiOiBcImV2ZW50TG9vcExhZ1wiLFxuICAgICAgICBcInByZWZlcmVuY2VBY3RvclwiOiBcInByZWZlcmVuY2VcIixcbiAgICAgICAgXCJkZXZpY2VBY3RvclwiOiBcImRldmljZVwiLFxuXG4gICAgICAgIFwicHJvZmlsZXJBY3RvclwiOiBcInByb2ZpbGVyXCIsXG4gICAgICAgIFwiY2hyb21lRGVidWdnZXJcIjogXCJjaHJvbWVEZWJ1Z2dlclwiLFxuICAgICAgICBcIndlYmFwcHNBY3RvclwiOiBcIndlYmFwcHNcIlxuICAgICAgfVxuICAgIH0sXG4gICAgXCJ0YWJcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwidGFiXCIsXG4gICAgICBcImZpZWxkc1wiOiB7XG4gICAgICAgIFwidGl0bGVcIjogXCJzdHJpbmdcIixcbiAgICAgICAgXCJ1cmxcIjogXCJzdHJpbmdcIixcbiAgICAgICAgXCJvdXRlcldpbmRvd0lEXCI6IFwibnVtYmVyXCIsXG4gICAgICAgIFwiaW5zcGVjdG9yQWN0b3JcIjogXCJpbnNwZWN0b3JcIixcbiAgICAgICAgXCJjYWxsV2F0Y2hlckFjdG9yXCI6IFwiY2FsbC13YXRjaGVyXCIsXG4gICAgICAgIFwiY2FudmFzQWN0b3JcIjogXCJjYW52YXNcIixcbiAgICAgICAgXCJ3ZWJnbEFjdG9yXCI6IFwid2ViZ2xcIixcbiAgICAgICAgXCJ3ZWJhdWRpb0FjdG9yXCI6IFwid2ViYXVkaW9cIixcbiAgICAgICAgXCJzdG9yYWdlQWN0b3JcIjogXCJzdG9yYWdlXCIsXG4gICAgICAgIFwiZ2NsaUFjdG9yXCI6IFwiZ2NsaVwiLFxuICAgICAgICBcIm1lbW9yeUFjdG9yXCI6IFwibWVtb3J5XCIsXG4gICAgICAgIFwiZXZlbnRMb29wTGFnXCI6IFwiZXZlbnRMb29wTGFnXCIsXG4gICAgICAgIFwic3R5bGVTaGVldHNBY3RvclwiOiBcInN0eWxlc2hlZXRzXCIsXG4gICAgICAgIFwic3R5bGVFZGl0b3JBY3RvclwiOiBcInN0eWxlZWRpdG9yXCIsXG5cbiAgICAgICAgXCJjb25zb2xlQWN0b3JcIjogXCJjb25zb2xlXCIsXG4gICAgICAgIFwidHJhY2VBY3RvclwiOiBcInRyYWNlXCJcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzPXtcbiAgXCJ0eXBlc1wiOiB7XG4gICAgXCJsb25nc3RyYWN0b3JcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwibG9uZ3N0cmFjdG9yXCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwic3Vic3RyaW5nXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN1YnN0cmluZ1wiLFxuICAgICAgICAgICAgXCJzdGFydFwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJwcmltaXRpdmVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZW5kXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwic3Vic3RyaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJyZWxlYXNlXCIsXG4gICAgICAgICAgXCJyZWxlYXNlXCI6IHRydWUsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInJlbGVhc2VcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge31cbiAgICB9LFxuICAgIFwic3R5bGVzaGVldFwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiYWN0b3JcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJzdHlsZXNoZWV0XCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwidG9nZ2xlRGlzYWJsZWRcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwidG9nZ2xlRGlzYWJsZWRcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcImRpc2FibGVkXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiYm9vbGVhblwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0VGV4dFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRUZXh0XCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJ0ZXh0XCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwibG9uZ3N0cmluZ1wiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0T3JpZ2luYWxTb3VyY2VzXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldE9yaWdpbmFsU291cmNlc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwib3JpZ2luYWxTb3VyY2VzXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwibnVsbGFibGU6YXJyYXk6b3JpZ2luYWxzb3VyY2VcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdldE9yaWdpbmFsTG9jYXRpb25cIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0T3JpZ2luYWxMb2NhdGlvblwiLFxuICAgICAgICAgICAgXCJsaW5lXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjb2x1bW5cIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwibnVtYmVyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwib3JpZ2luYWxsb2NhdGlvbnJlc3BvbnNlXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJ1cGRhdGVcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwidXBkYXRlXCIsXG4gICAgICAgICAgICBcInRleHRcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRyYW5zaXRpb25cIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7XG4gICAgICAgIFwicHJvcGVydHktY2hhbmdlXCI6IHtcbiAgICAgICAgICBcInR5cGVcIjogXCJwcm9wZXJ0eUNoYW5nZVwiLFxuICAgICAgICAgIFwicHJvcGVydHlcIjoge1xuICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ2YWx1ZVwiOiB7XG4gICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImpzb25cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzdHlsZS1hcHBsaWVkXCI6IHtcbiAgICAgICAgICBcInR5cGVcIjogXCJzdHlsZUFwcGxpZWRcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBcIm9yaWdpbmFsc291cmNlXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcIm9yaWdpbmFsc291cmNlXCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0VGV4dFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRUZXh0XCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJ0ZXh0XCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwibG9uZ3N0cmluZ1wiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge31cbiAgICB9LFxuICAgIFwic3R5bGVzaGVldHNcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwic3R5bGVzaGVldHNcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRTdHlsZVNoZWV0c1wiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRTdHlsZVNoZWV0c1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwic3R5bGVTaGVldHNcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJhcnJheTpzdHlsZXNoZWV0XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJhZGRTdHlsZVNoZWV0XCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFkZFN0eWxlU2hlZXRcIixcbiAgICAgICAgICAgIFwidGV4dFwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcInN0eWxlU2hlZXRcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJzdHlsZXNoZWV0XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7fVxuICAgIH0sXG4gICAgXCJvcmlnaW5hbGxvY2F0aW9ucmVzcG9uc2VcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImRpY3RcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJvcmlnaW5hbGxvY2F0aW9ucmVzcG9uc2VcIixcbiAgICAgIFwic3BlY2lhbGl6YXRpb25zXCI6IHtcbiAgICAgICAgXCJzb3VyY2VcIjogXCJzdHJpbmdcIixcbiAgICAgICAgXCJsaW5lXCI6IFwibnVtYmVyXCIsXG4gICAgICAgIFwiY29sdW1uXCI6IFwibnVtYmVyXCJcbiAgICAgIH1cbiAgICB9LFxuICAgIFwiZG9tbm9kZVwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiYWN0b3JcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJkb21ub2RlXCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0Tm9kZVZhbHVlXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldE5vZGVWYWx1ZVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwidmFsdWVcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJsb25nc3RyaW5nXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJzZXROb2RlVmFsdWVcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic2V0Tm9kZVZhbHVlXCIsXG4gICAgICAgICAgICBcInZhbHVlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRJbWFnZURhdGFcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0SW1hZ2VEYXRhXCIsXG4gICAgICAgICAgICBcIm1heERpbVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJudWxsYWJsZTpudW1iZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJpbWFnZURhdGFcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcIm1vZGlmeUF0dHJpYnV0ZXNcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwibW9kaWZ5QXR0cmlidXRlc1wiLFxuICAgICAgICAgICAgXCJtb2RpZmljYXRpb25zXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5Ompzb25cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge31cbiAgICB9LFxuICAgIFwiYXBwbGllZHN0eWxlXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJkaWN0XCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwiYXBwbGllZHN0eWxlXCIsXG4gICAgICBcInNwZWNpYWxpemF0aW9uc1wiOiB7XG4gICAgICAgIFwicnVsZVwiOiBcImRvbXN0eWxlcnVsZSNhY3RvcmlkXCIsXG4gICAgICAgIFwiaW5oZXJpdGVkXCI6IFwibnVsbGFibGU6ZG9tbm9kZSNhY3RvcmlkXCJcbiAgICAgIH1cbiAgICB9LFxuICAgIFwibWF0Y2hlZHNlbGVjdG9yXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJkaWN0XCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwibWF0Y2hlZHNlbGVjdG9yXCIsXG4gICAgICBcInNwZWNpYWxpemF0aW9uc1wiOiB7XG4gICAgICAgIFwicnVsZVwiOiBcImRvbXN0eWxlcnVsZSNhY3RvcmlkXCIsXG4gICAgICAgIFwic2VsZWN0b3JcIjogXCJzdHJpbmdcIixcbiAgICAgICAgXCJ2YWx1ZVwiOiBcInN0cmluZ1wiLFxuICAgICAgICBcInN0YXR1c1wiOiBcIm51bWJlclwiXG4gICAgICB9XG4gICAgfSxcbiAgICBcIm1hdGNoZWRzZWxlY3RvcnJlc3BvbnNlXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJkaWN0XCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwibWF0Y2hlZHNlbGVjdG9ycmVzcG9uc2VcIixcbiAgICAgIFwic3BlY2lhbGl6YXRpb25zXCI6IHtcbiAgICAgICAgXCJydWxlc1wiOiBcImFycmF5OmRvbXN0eWxlcnVsZVwiLFxuICAgICAgICBcInNoZWV0c1wiOiBcImFycmF5OnN0eWxlc2hlZXRcIixcbiAgICAgICAgXCJtYXRjaGVkXCI6IFwiYXJyYXk6bWF0Y2hlZHNlbGVjdG9yXCJcbiAgICAgIH1cbiAgICB9LFxuICAgIFwiYXBwbGllZFN0eWxlc1JldHVyblwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiZGljdFwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcImFwcGxpZWRTdHlsZXNSZXR1cm5cIixcbiAgICAgIFwic3BlY2lhbGl6YXRpb25zXCI6IHtcbiAgICAgICAgXCJlbnRyaWVzXCI6IFwiYXJyYXk6YXBwbGllZHN0eWxlXCIsXG4gICAgICAgIFwicnVsZXNcIjogXCJhcnJheTpkb21zdHlsZXJ1bGVcIixcbiAgICAgICAgXCJzaGVldHNcIjogXCJhcnJheTpzdHlsZXNoZWV0XCJcbiAgICAgIH1cbiAgICB9LFxuICAgIFwicGFnZXN0eWxlXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcInBhZ2VzdHlsZVwiLFxuICAgICAgXCJtZXRob2RzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdldENvbXB1dGVkXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldENvbXB1dGVkXCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJtYXJrTWF0Y2hlZFwiOiB7XG4gICAgICAgICAgICAgIFwiX29wdGlvblwiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJib29sZWFuXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm9ubHlNYXRjaGVkXCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZmlsdGVyXCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiY29tcHV0ZWRcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJqc29uXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRNYXRjaGVkU2VsZWN0b3JzXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldE1hdGNoZWRTZWxlY3RvcnNcIixcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInByb3BlcnR5XCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJmaWx0ZXJcIjoge1xuICAgICAgICAgICAgICBcIl9vcHRpb25cIjogMixcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwibWF0Y2hlZHNlbGVjdG9ycmVzcG9uc2VcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdldEFwcGxpZWRcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0QXBwbGllZFwiLFxuICAgICAgICAgICAgXCJub2RlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImRvbW5vZGVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaW5oZXJpdGVkXCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibWF0Y2hlZFNlbGVjdG9yc1wiOiB7XG4gICAgICAgICAgICAgIFwiX29wdGlvblwiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJib29sZWFuXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImZpbHRlclwiOiB7XG4gICAgICAgICAgICAgIFwiX29wdGlvblwiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJhcHBsaWVkU3R5bGVzUmV0dXJuXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRMYXlvdXRcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0TGF5b3V0XCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJhdXRvTWFyZ2luc1wiOiB7XG4gICAgICAgICAgICAgIFwiX29wdGlvblwiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJib29sZWFuXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwianNvblwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge31cbiAgICB9LFxuICAgIFwiZG9tc3R5bGVydWxlXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcImRvbXN0eWxlcnVsZVwiLFxuICAgICAgXCJtZXRob2RzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcIm1vZGlmeVByb3BlcnRpZXNcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwibW9kaWZ5UHJvcGVydGllc1wiLFxuICAgICAgICAgICAgXCJtb2RpZmljYXRpb25zXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5Ompzb25cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcInJ1bGVcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJkb21zdHlsZXJ1bGVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZXZlbnRzXCI6IHt9XG4gICAgfSxcbiAgICBcImhpZ2hsaWdodGVyXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcImhpZ2hsaWdodGVyXCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwic2hvd0JveE1vZGVsXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInNob3dCb3hNb2RlbFwiLFxuICAgICAgICAgICAgXCJub2RlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImRvbW5vZGVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmVnaW9uXCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJoaWRlQm94TW9kZWxcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaGlkZUJveE1vZGVsXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInBpY2tcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwicGlja1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJjYW5jZWxQaWNrXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImNhbmNlbFBpY2tcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge31cbiAgICB9LFxuICAgIFwiaW1hZ2VEYXRhXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJkaWN0XCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwiaW1hZ2VEYXRhXCIsXG4gICAgICBcInNwZWNpYWxpemF0aW9uc1wiOiB7XG4gICAgICAgIFwiZGF0YVwiOiBcIm51bGxhYmxlOmxvbmdzdHJpbmdcIixcbiAgICAgICAgXCJzaXplXCI6IFwianNvblwiXG4gICAgICB9XG4gICAgfSxcbiAgICBcImRpc2Nvbm5lY3RlZE5vZGVcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImRpY3RcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJkaXNjb25uZWN0ZWROb2RlXCIsXG4gICAgICBcInNwZWNpYWxpemF0aW9uc1wiOiB7XG4gICAgICAgIFwibm9kZVwiOiBcImRvbW5vZGVcIixcbiAgICAgICAgXCJuZXdQYXJlbnRzXCI6IFwiYXJyYXk6ZG9tbm9kZVwiXG4gICAgICB9XG4gICAgfSxcbiAgICBcImRpc2Nvbm5lY3RlZE5vZGVBcnJheVwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiZGljdFwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcImRpc2Nvbm5lY3RlZE5vZGVBcnJheVwiLFxuICAgICAgXCJzcGVjaWFsaXphdGlvbnNcIjoge1xuICAgICAgICBcIm5vZGVzXCI6IFwiYXJyYXk6ZG9tbm9kZVwiLFxuICAgICAgICBcIm5ld1BhcmVudHNcIjogXCJhcnJheTpkb21ub2RlXCJcbiAgICAgIH1cbiAgICB9LFxuICAgIFwiZG9tbXV0YXRpb25cIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImRpY3RcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJkb21tdXRhdGlvblwiLFxuICAgICAgXCJzcGVjaWFsaXphdGlvbnNcIjoge31cbiAgICB9LFxuICAgIFwiZG9tbm9kZWxpc3RcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwiZG9tbm9kZWxpc3RcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJpdGVtXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIml0ZW1cIixcbiAgICAgICAgICAgIFwiaXRlbVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJwcmltaXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJkaXNjb25uZWN0ZWROb2RlXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJpdGVtc1wiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJpdGVtc1wiLFxuICAgICAgICAgICAgXCJzdGFydFwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJudWxsYWJsZTpudW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZW5kXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIm51bGxhYmxlOm51bWJlclwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImRpc2Nvbm5lY3RlZE5vZGVBcnJheVwiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwicmVsZWFzZVwiLFxuICAgICAgICAgIFwicmVsZWFzZVwiOiB0cnVlLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJyZWxlYXNlXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZXZlbnRzXCI6IHt9XG4gICAgfSxcbiAgICBcImRvbXRyYXZlcnNhbGFycmF5XCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJkaWN0XCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwiZG9tdHJhdmVyc2FsYXJyYXlcIixcbiAgICAgIFwic3BlY2lhbGl6YXRpb25zXCI6IHtcbiAgICAgICAgXCJub2Rlc1wiOiBcImFycmF5OmRvbW5vZGVcIlxuICAgICAgfVxuICAgIH0sXG4gICAgXCJkb213YWxrZXJcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwiZG9td2Fsa2VyXCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwicmVsZWFzZVwiLFxuICAgICAgICAgIFwicmVsZWFzZVwiOiB0cnVlLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJyZWxlYXNlXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInBpY2tcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwicGlja1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImRpc2Nvbm5lY3RlZE5vZGVcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImNhbmNlbFBpY2tcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiY2FuY2VsUGlja1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJoaWdobGlnaHRcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaGlnaGxpZ2h0XCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwibnVsbGFibGU6ZG9tbm9kZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJkb2N1bWVudFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJkb2N1bWVudFwiLFxuICAgICAgICAgICAgXCJub2RlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIm51bGxhYmxlOmRvbW5vZGVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJkb2N1bWVudEVsZW1lbnRcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9jdW1lbnRFbGVtZW50XCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwibnVsbGFibGU6ZG9tbm9kZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImRvbW5vZGVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInBhcmVudHNcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwicGFyZW50c1wiLFxuICAgICAgICAgICAgXCJub2RlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImRvbW5vZGVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic2FtZURvY3VtZW50XCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwibm9kZXNcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJhcnJheTpkb21ub2RlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJyZXRhaW5Ob2RlXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInJldGFpbk5vZGVcIixcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInVucmV0YWluTm9kZVwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJ1bnJldGFpbk5vZGVcIixcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInJlbGVhc2VOb2RlXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInJlbGVhc2VOb2RlXCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJmb3JjZVwiOiB7XG4gICAgICAgICAgICAgIFwiX29wdGlvblwiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJwcmltaXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiY2hpbGRyZW5cIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiY2hpbGRyZW5cIixcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm1heE5vZGVzXCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjZW50ZXJcIjoge1xuICAgICAgICAgICAgICBcIl9vcHRpb25cIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzdGFydFwiOiB7XG4gICAgICAgICAgICAgIFwiX29wdGlvblwiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIndoYXRUb1Nob3dcIjoge1xuICAgICAgICAgICAgICBcIl9vcHRpb25cIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiZG9tdHJhdmVyc2FsYXJyYXlcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInNpYmxpbmdzXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInNpYmxpbmdzXCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJtYXhOb2Rlc1wiOiB7XG4gICAgICAgICAgICAgIFwiX29wdGlvblwiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJwcmltaXRpdmVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2VudGVyXCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImRvbW5vZGVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic3RhcnRcIjoge1xuICAgICAgICAgICAgICBcIl9vcHRpb25cIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ3aGF0VG9TaG93XCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImRvbXRyYXZlcnNhbGFycmF5XCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJuZXh0U2libGluZ1wiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJuZXh0U2libGluZ1wiLFxuICAgICAgICAgICAgXCJub2RlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImRvbW5vZGVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwid2hhdFRvU2hvd1wiOiB7XG4gICAgICAgICAgICAgIFwiX29wdGlvblwiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJwcmltaXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJudWxsYWJsZTpkb21ub2RlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJwcmV2aW91c1NpYmxpbmdcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJldmlvdXNTaWJsaW5nXCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ3aGF0VG9TaG93XCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcIm51bGxhYmxlOmRvbW5vZGVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInF1ZXJ5U2VsZWN0b3JcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVlcnlTZWxlY3RvclwiLFxuICAgICAgICAgICAgXCJub2RlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImRvbW5vZGVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic2VsZWN0b3JcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiZGlzY29ubmVjdGVkTm9kZVwiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwicXVlcnlTZWxlY3RvckFsbFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJxdWVyeVNlbGVjdG9yQWxsXCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWxlY3RvclwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJwcmltaXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcImxpc3RcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJkb21ub2RlbGlzdFwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0U3VnZ2VzdGlvbnNGb3JRdWVyeVwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRTdWdnZXN0aW9uc0ZvclF1ZXJ5XCIsXG4gICAgICAgICAgICBcInF1ZXJ5XCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjb21wbGV0aW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWxlY3RvclN0YXRlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDIsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwibGlzdFwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImFycmF5OmFycmF5OnN0cmluZ1wiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiYWRkUHNldWRvQ2xhc3NMb2NrXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFkZFBzZXVkb0NsYXNzTG9ja1wiLFxuICAgICAgICAgICAgXCJub2RlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImRvbW5vZGVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicHNldWRvQ2xhc3NcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInBhcmVudHNcIjoge1xuICAgICAgICAgICAgICBcIl9vcHRpb25cIjogMixcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImhpZGVOb2RlXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImhpZGVOb2RlXCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJ1bmhpZGVOb2RlXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInVuaGlkZU5vZGVcIixcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInJlbW92ZVBzZXVkb0NsYXNzTG9ja1wiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJyZW1vdmVQc2V1ZG9DbGFzc0xvY2tcIixcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInBzZXVkb0NsYXNzXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwYXJlbnRzXCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDIsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJjbGVhclBzZXVkb0NsYXNzTG9ja3NcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiY2xlYXJQc2V1ZG9DbGFzc0xvY2tzXCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwibnVsbGFibGU6ZG9tbm9kZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJpbm5lckhUTUxcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaW5uZXJIVE1MXCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwidmFsdWVcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJsb25nc3RyaW5nXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJvdXRlckhUTUxcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwib3V0ZXJIVE1MXCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwidmFsdWVcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJsb25nc3RyaW5nXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJzZXRPdXRlckhUTUxcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic2V0T3V0ZXJIVE1MXCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ2YWx1ZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJwcmltaXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwicmVtb3ZlTm9kZVwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJyZW1vdmVOb2RlXCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwibmV4dFNpYmxpbmdcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJudWxsYWJsZTpkb21ub2RlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJpbnNlcnRCZWZvcmVcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaW5zZXJ0QmVmb3JlXCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwYXJlbnRcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzaWJsaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDIsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIm51bGxhYmxlOmRvbW5vZGVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0TXV0YXRpb25zXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldE11dGF0aW9uc1wiLFxuICAgICAgICAgICAgXCJjbGVhbnVwXCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwibXV0YXRpb25zXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiYXJyYXk6ZG9tbXV0YXRpb25cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImlzSW5ET01UcmVlXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImlzSW5ET01UcmVlXCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiYXR0YWNoZWRcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJib29sZWFuXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXROb2RlQWN0b3JGcm9tT2JqZWN0QWN0b3JcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0Tm9kZUFjdG9yRnJvbU9iamVjdEFjdG9yXCIsXG4gICAgICAgICAgICBcIm9iamVjdEFjdG9ySURcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJub2RlRnJvbnRcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJudWxsYWJsZTpkaXNjb25uZWN0ZWROb2RlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7XG4gICAgICAgIFwibmV3LW11dGF0aW9uc1wiOiB7XG4gICAgICAgICAgXCJ0eXBlXCI6IFwibmV3TXV0YXRpb25zXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJwaWNrZXItbm9kZS1waWNrZWRcIjoge1xuICAgICAgICAgIFwidHlwZVwiOiBcInBpY2tlck5vZGVQaWNrZWRcIixcbiAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJkaXNjb25uZWN0ZWROb2RlXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwicGlja2VyLW5vZGUtaG92ZXJlZFwiOiB7XG4gICAgICAgICAgXCJ0eXBlXCI6IFwicGlja2VyTm9kZUhvdmVyZWRcIixcbiAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJkaXNjb25uZWN0ZWROb2RlXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaGlnaGxpZ2h0ZXItcmVhZHlcIjoge1xuICAgICAgICAgIFwidHlwZVwiOiBcImhpZ2hsaWdodGVyLXJlYWR5XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJoaWdobGlnaHRlci1oaWRlXCI6IHtcbiAgICAgICAgICBcInR5cGVcIjogXCJoaWdobGlnaHRlci1oaWRlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgXCJpbnNwZWN0b3JcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwiaW5zcGVjdG9yXCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0V2Fsa2VyXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldFdhbGtlclwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwid2Fsa2VyXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiZG9td2Fsa2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRQYWdlU3R5bGVcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0UGFnZVN0eWxlXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJwYWdlU3R5bGVcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJwYWdlc3R5bGVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdldEhpZ2hsaWdodGVyXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldEhpZ2hsaWdodGVyXCIsXG4gICAgICAgICAgICBcImF1dG9oaWRlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcImhpZ2hsaWd0ZXJcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJoaWdobGlnaHRlclwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0SW1hZ2VEYXRhRnJvbVVSTFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRJbWFnZURhdGFGcm9tVVJMXCIsXG4gICAgICAgICAgICBcInVybFwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJwcmltaXRpdmVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibWF4RGltXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIm51bGxhYmxlOm51bWJlclwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImltYWdlRGF0YVwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge31cbiAgICB9LFxuICAgIFwiY2FsbC1zdGFjay1pdGVtXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJkaWN0XCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwiY2FsbC1zdGFjay1pdGVtXCIsXG4gICAgICBcInNwZWNpYWxpemF0aW9uc1wiOiB7XG4gICAgICAgIFwibmFtZVwiOiBcInN0cmluZ1wiLFxuICAgICAgICBcImZpbGVcIjogXCJzdHJpbmdcIixcbiAgICAgICAgXCJsaW5lXCI6IFwibnVtYmVyXCJcbiAgICAgIH1cbiAgICB9LFxuICAgIFwiY2FsbC1kZXRhaWxzXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJkaWN0XCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwiY2FsbC1kZXRhaWxzXCIsXG4gICAgICBcInNwZWNpYWxpemF0aW9uc1wiOiB7XG4gICAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgICBcIm5hbWVcIjogXCJzdHJpbmdcIixcbiAgICAgICAgXCJzdGFja1wiOiBcImFycmF5OmNhbGwtc3RhY2staXRlbVwiXG4gICAgICB9XG4gICAgfSxcbiAgICBcImZ1bmN0aW9uLWNhbGxcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwiZnVuY3Rpb24tY2FsbFwiLFxuICAgICAgXCJtZXRob2RzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdldERldGFpbHNcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0RGV0YWlsc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiaW5mb1wiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImNhbGwtZGV0YWlsc1wiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge31cbiAgICB9LFxuICAgIFwiY2FsbC13YXRjaGVyXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcImNhbGwtd2F0Y2hlclwiLFxuICAgICAgXCJtZXRob2RzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInNldHVwXCIsXG4gICAgICAgICAgXCJvbmV3YXlcIjogdHJ1ZSxcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic2V0dXBcIixcbiAgICAgICAgICAgIFwidHJhY2VkR2xvYmFsc1wiOiB7XG4gICAgICAgICAgICAgIFwiX29wdGlvblwiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJudWxsYWJsZTphcnJheTpzdHJpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidHJhY2VkRnVuY3Rpb25zXCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIm51bGxhYmxlOmFycmF5OnN0cmluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzdGFydFJlY29yZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwiX29wdGlvblwiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJib29sZWFuXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInBlcmZvcm1SZWxvYWRcIjoge1xuICAgICAgICAgICAgICBcIl9vcHRpb25cIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJmaW5hbGl6ZVwiLFxuICAgICAgICAgIFwib25ld2F5XCI6IHRydWUsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImZpbmFsaXplXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImlzUmVjb3JkaW5nXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImlzUmVjb3JkaW5nXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiYm9vbGVhblwiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwicmVzdW1lUmVjb3JkaW5nXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInJlc3VtZVJlY29yZGluZ1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJwYXVzZVJlY29yZGluZ1wiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJwYXVzZVJlY29yZGluZ1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiY2FsbHNcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJhcnJheTpmdW5jdGlvbi1jYWxsXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJlcmFzZVJlY29yZGluZ1wiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJlcmFzZVJlY29yZGluZ1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7fVxuICAgIH0sXG4gICAgXCJzbmFwc2hvdC1pbWFnZVwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiZGljdFwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcInNuYXBzaG90LWltYWdlXCIsXG4gICAgICBcInNwZWNpYWxpemF0aW9uc1wiOiB7XG4gICAgICAgIFwiaW5kZXhcIjogXCJudW1iZXJcIixcbiAgICAgICAgXCJ3aWR0aFwiOiBcIm51bWJlclwiLFxuICAgICAgICBcImhlaWdodFwiOiBcIm51bWJlclwiLFxuICAgICAgICBcImZsaXBwZWRcIjogXCJib29sZWFuXCIsXG4gICAgICAgIFwicGl4ZWxzXCI6IFwidWludDMyLWFycmF5XCJcbiAgICAgIH1cbiAgICB9LFxuICAgIFwic25hcHNob3Qtb3ZlcnZpZXdcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImRpY3RcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJzbmFwc2hvdC1vdmVydmlld1wiLFxuICAgICAgXCJzcGVjaWFsaXphdGlvbnNcIjoge1xuICAgICAgICBcImNhbGxzXCI6IFwiYXJyYXk6ZnVuY3Rpb24tY2FsbFwiLFxuICAgICAgICBcInRodW1ibmFpbHNcIjogXCJhcnJheTpzbmFwc2hvdC1pbWFnZVwiLFxuICAgICAgICBcInNjcmVlbnNob3RcIjogXCJzbmFwc2hvdC1pbWFnZVwiXG4gICAgICB9XG4gICAgfSxcbiAgICBcImZyYW1lLXNuYXBzaG90XCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcImZyYW1lLXNuYXBzaG90XCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0T3ZlcnZpZXdcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0T3ZlcnZpZXdcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIm92ZXJ2aWV3XCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwic25hcHNob3Qtb3ZlcnZpZXdcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdlbmVyYXRlU2NyZWVuc2hvdEZvclwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZW5lcmF0ZVNjcmVlbnNob3RGb3JcIixcbiAgICAgICAgICAgIFwiY2FsbFwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJmdW5jdGlvbi1jYWxsXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJzY3JlZW5zaG90XCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwic25hcHNob3QtaW1hZ2VcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZXZlbnRzXCI6IHt9XG4gICAgfSxcbiAgICBcImNhbnZhc1wiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiYWN0b3JcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJjYW52YXNcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJzZXR1cFwiLFxuICAgICAgICAgIFwib25ld2F5XCI6IHRydWUsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInNldHVwXCIsXG4gICAgICAgICAgICBcInJlbG9hZFwiOiB7XG4gICAgICAgICAgICAgIFwiX29wdGlvblwiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJib29sZWFuXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImZpbmFsaXplXCIsXG4gICAgICAgICAgXCJvbmV3YXlcIjogdHJ1ZSxcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZmluYWxpemVcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiaXNJbml0aWFsaXplZFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJpc0luaXRpYWxpemVkXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJpbml0aWFsaXplZFwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImJvb2xlYW5cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInJlY29yZEFuaW1hdGlvbkZyYW1lXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInJlY29yZEFuaW1hdGlvbkZyYW1lXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJzbmFwc2hvdFwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImZyYW1lLXNuYXBzaG90XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7fVxuICAgIH0sXG4gICAgXCJnbC1zaGFkZXJcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwiZ2wtc2hhZGVyXCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0VGV4dFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRUZXh0XCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJ0ZXh0XCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJjb21waWxlXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImNvbXBpbGVcIixcbiAgICAgICAgICAgIFwidGV4dFwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcImVycm9yXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwibnVsbGFibGU6anNvblwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge31cbiAgICB9LFxuICAgIFwiZ2wtcHJvZ3JhbVwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiYWN0b3JcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJnbC1wcm9ncmFtXCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0VmVydGV4U2hhZGVyXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldFZlcnRleFNoYWRlclwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwic2hhZGVyXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiZ2wtc2hhZGVyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRGcmFnbWVudFNoYWRlclwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRGcmFnbWVudFNoYWRlclwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwic2hhZGVyXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiZ2wtc2hhZGVyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJoaWdobGlnaHRcIixcbiAgICAgICAgICBcIm9uZXdheVwiOiB0cnVlLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJoaWdobGlnaHRcIixcbiAgICAgICAgICAgIFwidGludFwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheTpudW1iZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwidW5oaWdobGlnaHRcIixcbiAgICAgICAgICBcIm9uZXdheVwiOiB0cnVlLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJ1bmhpZ2hsaWdodFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJibGFja2JveFwiLFxuICAgICAgICAgIFwib25ld2F5XCI6IHRydWUsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImJsYWNrYm94XCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInVuYmxhY2tib3hcIixcbiAgICAgICAgICBcIm9uZXdheVwiOiB0cnVlLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJ1bmJsYWNrYm94XCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZXZlbnRzXCI6IHt9XG4gICAgfSxcbiAgICBcIndlYmdsXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcIndlYmdsXCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwic2V0dXBcIixcbiAgICAgICAgICBcIm9uZXdheVwiOiB0cnVlLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJzZXR1cFwiLFxuICAgICAgICAgICAgXCJyZWxvYWRcIjoge1xuICAgICAgICAgICAgICBcIl9vcHRpb25cIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJmaW5hbGl6ZVwiLFxuICAgICAgICAgIFwib25ld2F5XCI6IHRydWUsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImZpbmFsaXplXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdldFByb2dyYW1zXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldFByb2dyYW1zXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJwcm9ncmFtc1wiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImFycmF5OmdsLXByb2dyYW1cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZXZlbnRzXCI6IHtcbiAgICAgICAgXCJwcm9ncmFtLWxpbmtlZFwiOiB7XG4gICAgICAgICAgXCJ0eXBlXCI6IFwicHJvZ3JhbUxpbmtlZFwiLFxuICAgICAgICAgIFwicHJvZ3JhbVwiOiB7XG4gICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdsLXByb2dyYW1cIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgXCJhdWRpb25vZGVcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwiYXVkaW9ub2RlXCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0VHlwZVwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRUeXBlXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJpc1NvdXJjZVwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJpc1NvdXJjZVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwic291cmNlXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiYm9vbGVhblwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwic2V0UGFyYW1cIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic2V0UGFyYW1cIixcbiAgICAgICAgICAgIFwicGFyYW1cIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInZhbHVlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIm51bGxhYmxlOnByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiZXJyb3JcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJudWxsYWJsZTpqc29uXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRQYXJhbVwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRQYXJhbVwiLFxuICAgICAgICAgICAgXCJwYXJhbVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcInRleHRcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJudWxsYWJsZTpwcmltaXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdldFBhcmFtRmxhZ3NcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0UGFyYW1GbGFnc1wiLFxuICAgICAgICAgICAgXCJwYXJhbVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcImZsYWdzXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwibnVsbGFibGU6cHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRQYXJhbXNcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0UGFyYW1zXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJwYXJhbXNcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJqc29uXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7fVxuICAgIH0sXG4gICAgXCJ3ZWJhdWRpb1wiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiYWN0b3JcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJ3ZWJhdWRpb1wiLFxuICAgICAgXCJtZXRob2RzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInNldHVwXCIsXG4gICAgICAgICAgXCJvbmV3YXlcIjogdHJ1ZSxcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic2V0dXBcIixcbiAgICAgICAgICAgIFwicmVsb2FkXCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZmluYWxpemVcIixcbiAgICAgICAgICBcIm9uZXdheVwiOiB0cnVlLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJmaW5hbGl6ZVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7XG4gICAgICAgIFwic3RhcnQtY29udGV4dFwiOiB7XG4gICAgICAgICAgXCJ0eXBlXCI6IFwic3RhcnRDb250ZXh0XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb25uZWN0LW5vZGVcIjoge1xuICAgICAgICAgIFwidHlwZVwiOiBcImNvbm5lY3ROb2RlXCIsXG4gICAgICAgICAgXCJzb3VyY2VcIjoge1xuICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDAsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhdWRpb25vZGVcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJkZXN0XCI6IHtcbiAgICAgICAgICAgIFwiX29wdGlvblwiOiAwLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXVkaW9ub2RlXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiZGlzY29ubmVjdC1ub2RlXCI6IHtcbiAgICAgICAgICBcInR5cGVcIjogXCJkaXNjb25uZWN0Tm9kZVwiLFxuICAgICAgICAgIFwic291cmNlXCI6IHtcbiAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXVkaW9ub2RlXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiY29ubmVjdC1wYXJhbVwiOiB7XG4gICAgICAgICAgXCJ0eXBlXCI6IFwiY29ubmVjdFBhcmFtXCIsXG4gICAgICAgICAgXCJzb3VyY2VcIjoge1xuICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhdWRpb25vZGVcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXJhbVwiOiB7XG4gICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImNoYW5nZS1wYXJhbVwiOiB7XG4gICAgICAgICAgXCJ0eXBlXCI6IFwiY2hhbmdlUGFyYW1cIixcbiAgICAgICAgICBcInNvdXJjZVwiOiB7XG4gICAgICAgICAgICBcIl9vcHRpb25cIjogMCxcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImF1ZGlvbm9kZVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhcmFtXCI6IHtcbiAgICAgICAgICAgIFwiX29wdGlvblwiOiAwLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwidmFsdWVcIjoge1xuICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDAsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJjcmVhdGUtbm9kZVwiOiB7XG4gICAgICAgICAgXCJ0eXBlXCI6IFwiY3JlYXRlTm9kZVwiLFxuICAgICAgICAgIFwic291cmNlXCI6IHtcbiAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXVkaW9ub2RlXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFwib2xkLXN0eWxlc2hlZXRcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwib2xkLXN0eWxlc2hlZXRcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJ0b2dnbGVEaXNhYmxlZFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJ0b2dnbGVEaXNhYmxlZFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiZGlzYWJsZWRcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJib29sZWFuXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJmZXRjaFNvdXJjZVwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJmZXRjaFNvdXJjZVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJ1cGRhdGVcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwidXBkYXRlXCIsXG4gICAgICAgICAgICBcInRleHRcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRyYW5zaXRpb25cIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7XG4gICAgICAgIFwicHJvcGVydHktY2hhbmdlXCI6IHtcbiAgICAgICAgICBcInR5cGVcIjogXCJwcm9wZXJ0eUNoYW5nZVwiLFxuICAgICAgICAgIFwicHJvcGVydHlcIjoge1xuICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ2YWx1ZVwiOiB7XG4gICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImpzb25cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzb3VyY2UtbG9hZFwiOiB7XG4gICAgICAgICAgXCJ0eXBlXCI6IFwic291cmNlTG9hZFwiLFxuICAgICAgICAgIFwic291cmNlXCI6IHtcbiAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3R5bGUtYXBwbGllZFwiOiB7XG4gICAgICAgICAgXCJ0eXBlXCI6IFwic3R5bGVBcHBsaWVkXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgXCJzdHlsZWVkaXRvclwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiYWN0b3JcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJzdHlsZWVkaXRvclwiLFxuICAgICAgXCJtZXRob2RzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcIm5ld0RvY3VtZW50XCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIm5ld0RvY3VtZW50XCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcIm5ld1N0eWxlU2hlZXRcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwibmV3U3R5bGVTaGVldFwiLFxuICAgICAgICAgICAgXCJ0ZXh0XCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwic3R5bGVTaGVldFwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcIm9sZC1zdHlsZXNoZWV0XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7XG4gICAgICAgIFwiZG9jdW1lbnQtbG9hZFwiOiB7XG4gICAgICAgICAgXCJ0eXBlXCI6IFwiZG9jdW1lbnRMb2FkXCIsXG4gICAgICAgICAgXCJzdHlsZVNoZWV0c1wiOiB7XG4gICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5Om9sZC1zdHlsZXNoZWV0XCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFwiY29va2llb2JqZWN0XCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJkaWN0XCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwiY29va2llb2JqZWN0XCIsXG4gICAgICBcInNwZWNpYWxpemF0aW9uc1wiOiB7XG4gICAgICAgIFwibmFtZVwiOiBcInN0cmluZ1wiLFxuICAgICAgICBcInZhbHVlXCI6IFwibG9uZ3N0cmluZ1wiLFxuICAgICAgICBcInBhdGhcIjogXCJudWxsYWJsZTpzdHJpbmdcIixcbiAgICAgICAgXCJob3N0XCI6IFwic3RyaW5nXCIsXG4gICAgICAgIFwiaXNEb21haW5cIjogXCJib29sZWFuXCIsXG4gICAgICAgIFwiaXNTZWN1cmVcIjogXCJib29sZWFuXCIsXG4gICAgICAgIFwiaXNIdHRwT25seVwiOiBcImJvb2xlYW5cIixcbiAgICAgICAgXCJjcmVhdGlvblRpbWVcIjogXCJudW1iZXJcIixcbiAgICAgICAgXCJsYXN0QWNjZXNzZWRcIjogXCJudW1iZXJcIixcbiAgICAgICAgXCJleHBpcmVzXCI6IFwibnVtYmVyXCJcbiAgICAgIH1cbiAgICB9LFxuICAgIFwiY29va2llc3RvcmVvYmplY3RcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImRpY3RcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJjb29raWVzdG9yZW9iamVjdFwiLFxuICAgICAgXCJzcGVjaWFsaXphdGlvbnNcIjoge1xuICAgICAgICBcInRvdGFsXCI6IFwibnVtYmVyXCIsXG4gICAgICAgIFwib2Zmc2V0XCI6IFwibnVtYmVyXCIsXG4gICAgICAgIFwiZGF0YVwiOiBcImFycmF5Om51bGxhYmxlOmNvb2tpZW9iamVjdFwiXG4gICAgICB9XG4gICAgfSxcbiAgICBcInN0b3JhZ2VvYmplY3RcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImRpY3RcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJzdG9yYWdlb2JqZWN0XCIsXG4gICAgICBcInNwZWNpYWxpemF0aW9uc1wiOiB7XG4gICAgICAgIFwibmFtZVwiOiBcInN0cmluZ1wiLFxuICAgICAgICBcInZhbHVlXCI6IFwibG9uZ3N0cmluZ1wiXG4gICAgICB9XG4gICAgfSxcbiAgICBcInN0b3JhZ2VzdG9yZW9iamVjdFwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiZGljdFwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcInN0b3JhZ2VzdG9yZW9iamVjdFwiLFxuICAgICAgXCJzcGVjaWFsaXphdGlvbnNcIjoge1xuICAgICAgICBcInRvdGFsXCI6IFwibnVtYmVyXCIsXG4gICAgICAgIFwib2Zmc2V0XCI6IFwibnVtYmVyXCIsXG4gICAgICAgIFwiZGF0YVwiOiBcImFycmF5Om51bGxhYmxlOnN0b3JhZ2VvYmplY3RcIlxuICAgICAgfVxuICAgIH0sXG4gICAgXCJpZGJvYmplY3RcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImRpY3RcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJpZGJvYmplY3RcIixcbiAgICAgIFwic3BlY2lhbGl6YXRpb25zXCI6IHtcbiAgICAgICAgXCJuYW1lXCI6IFwibnVsbGFibGU6c3RyaW5nXCIsXG4gICAgICAgIFwiZGJcIjogXCJudWxsYWJsZTpzdHJpbmdcIixcbiAgICAgICAgXCJvYmplY3RTdG9yZVwiOiBcIm51bGxhYmxlOnN0cmluZ1wiLFxuICAgICAgICBcIm9yaWdpblwiOiBcIm51bGxhYmxlOnN0cmluZ1wiLFxuICAgICAgICBcInZlcnNpb25cIjogXCJudWxsYWJsZTpudW1iZXJcIixcbiAgICAgICAgXCJvYmplY3RTdG9yZXNcIjogXCJudWxsYWJsZTpudW1iZXJcIixcbiAgICAgICAgXCJrZXlQYXRoXCI6IFwibnVsbGFibGU6c3RyaW5nXCIsXG4gICAgICAgIFwiYXV0b0luY3JlbWVudFwiOiBcIm51bGxhYmxlOmJvb2xlYW5cIixcbiAgICAgICAgXCJpbmRleGVzXCI6IFwibnVsbGFibGU6c3RyaW5nXCIsXG4gICAgICAgIFwidmFsdWVcIjogXCJudWxsYWJsZTpsb25nc3RyaW5nXCJcbiAgICAgIH1cbiAgICB9LFxuICAgIFwiaWRic3RvcmVvYmplY3RcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImRpY3RcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJpZGJzdG9yZW9iamVjdFwiLFxuICAgICAgXCJzcGVjaWFsaXphdGlvbnNcIjoge1xuICAgICAgICBcInRvdGFsXCI6IFwibnVtYmVyXCIsXG4gICAgICAgIFwib2Zmc2V0XCI6IFwibnVtYmVyXCIsXG4gICAgICAgIFwiZGF0YVwiOiBcImFycmF5Om51bGxhYmxlOmlkYm9iamVjdFwiXG4gICAgICB9XG4gICAgfSxcbiAgICBcInN0b3JlVXBkYXRlT2JqZWN0XCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJkaWN0XCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwic3RvcmVVcGRhdGVPYmplY3RcIixcbiAgICAgIFwic3BlY2lhbGl6YXRpb25zXCI6IHtcbiAgICAgICAgXCJjaGFuZ2VkXCI6IFwibnVsbGFibGU6anNvblwiLFxuICAgICAgICBcImRlbGV0ZWRcIjogXCJudWxsYWJsZTpqc29uXCIsXG4gICAgICAgIFwiYWRkZWRcIjogXCJudWxsYWJsZTpqc29uXCJcbiAgICAgIH1cbiAgICB9LFxuICAgIFwiY29va2llc1wiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiYWN0b3JcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJjb29raWVzXCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0U3RvcmVPYmplY3RzXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldFN0b3JlT2JqZWN0c1wiLFxuICAgICAgICAgICAgXCJob3N0XCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc1wiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJudWxsYWJsZTphcnJheTpzdHJpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwib3B0aW9uc1wiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAyLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJudWxsYWJsZTpqc29uXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiY29va2llc3RvcmVvYmplY3RcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZXZlbnRzXCI6IHt9XG4gICAgfSxcbiAgICBcImxvY2FsU3RvcmFnZVwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiYWN0b3JcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJsb2NhbFN0b3JhZ2VcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRTdG9yZU9iamVjdHNcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0U3RvcmVPYmplY3RzXCIsXG4gICAgICAgICAgICBcImhvc3RcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIm51bGxhYmxlOmFycmF5OnN0cmluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJvcHRpb25zXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDIsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIm51bGxhYmxlOmpzb25cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJzdG9yYWdlc3RvcmVvYmplY3RcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZXZlbnRzXCI6IHt9XG4gICAgfSxcbiAgICBcInNlc3Npb25TdG9yYWdlXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcInNlc3Npb25TdG9yYWdlXCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0U3RvcmVPYmplY3RzXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldFN0b3JlT2JqZWN0c1wiLFxuICAgICAgICAgICAgXCJob3N0XCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc1wiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJudWxsYWJsZTphcnJheTpzdHJpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwib3B0aW9uc1wiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAyLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJudWxsYWJsZTpqc29uXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwic3RvcmFnZXN0b3Jlb2JqZWN0XCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7fVxuICAgIH0sXG4gICAgXCJpbmRleGVkREJcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwiaW5kZXhlZERCXCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0U3RvcmVPYmplY3RzXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldFN0b3JlT2JqZWN0c1wiLFxuICAgICAgICAgICAgXCJob3N0XCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuYW1lc1wiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJudWxsYWJsZTphcnJheTpzdHJpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwib3B0aW9uc1wiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAyLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJudWxsYWJsZTpqc29uXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiaWRic3RvcmVvYmplY3RcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZXZlbnRzXCI6IHt9XG4gICAgfSxcbiAgICBcInN0b3JlbGlzdFwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiZGljdFwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcInN0b3JlbGlzdFwiLFxuICAgICAgXCJzcGVjaWFsaXphdGlvbnNcIjoge1xuICAgICAgICBcImNvb2tpZXNcIjogXCJjb29raWVzXCIsXG4gICAgICAgIFwibG9jYWxTdG9yYWdlXCI6IFwibG9jYWxTdG9yYWdlXCIsXG4gICAgICAgIFwic2Vzc2lvblN0b3JhZ2VcIjogXCJzZXNzaW9uU3RvcmFnZVwiLFxuICAgICAgICBcImluZGV4ZWREQlwiOiBcImluZGV4ZWREQlwiXG4gICAgICB9XG4gICAgfSxcbiAgICBcInN0b3JhZ2VcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwic3RvcmFnZVwiLFxuICAgICAgXCJtZXRob2RzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImxpc3RTdG9yZXNcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwibGlzdFN0b3Jlc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcInN0b3JlbGlzdFwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge1xuICAgICAgICBcInN0b3Jlcy11cGRhdGVcIjoge1xuICAgICAgICAgIFwidHlwZVwiOiBcInN0b3Jlc1VwZGF0ZVwiLFxuICAgICAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0b3JlVXBkYXRlT2JqZWN0XCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3RvcmVzLWNsZWFyZWRcIjoge1xuICAgICAgICAgIFwidHlwZVwiOiBcInN0b3Jlc0NsZWFyZWRcIixcbiAgICAgICAgICBcImRhdGFcIjoge1xuICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJqc29uXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3RvcmVzLXJlbG9hZGVkXCI6IHtcbiAgICAgICAgICBcInR5cGVcIjogXCJzdG9yZXNSZWxhb2RlZFwiLFxuICAgICAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImpzb25cIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgXCJnY2xpXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcImdjbGlcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJzcGVjc1wiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJzcGVjc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImpzb25cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImV4ZWN1dGVcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZXhlY3V0ZVwiLFxuICAgICAgICAgICAgXCJ0eXBlZFwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJqc29uXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJzdGF0ZVwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdGF0ZVwiLFxuICAgICAgICAgICAgXCJ0eXBlZFwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic3RhcnRcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwibnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInJhbmtcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMixcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwibnVtYmVyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwianNvblwiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwidHlwZXBhcnNlXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInR5cGVwYXJzZVwiLFxuICAgICAgICAgICAgXCJ0eXBlZFwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicGFyYW1cIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwianNvblwiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwidHlwZWluY3JlbWVudFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJ0eXBlaW5jcmVtZW50XCIsXG4gICAgICAgICAgICBcInR5cGVkXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwYXJhbVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJzdHJpbmdcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInR5cGVkZWNyZW1lbnRcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwidHlwZWRlY3JlbWVudFwiLFxuICAgICAgICAgICAgXCJ0eXBlZFwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicGFyYW1cIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJzZWxlY3Rpb25pbmZvXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInNlbGVjdGlvbmluZm9cIixcbiAgICAgICAgICAgIFwidHlwZWRcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInBhcmFtXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJhY3Rpb25cIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwianNvblwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge31cbiAgICB9LFxuICAgIFwibWVtb3J5XCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcIm1lbW9yeVwiLFxuICAgICAgXCJtZXRob2RzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcIm1lYXN1cmVcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwibWVhc3VyZVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImpzb25cIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZXZlbnRzXCI6IHt9XG4gICAgfSxcbiAgICBcImV2ZW50TG9vcExhZ1wiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiYWN0b3JcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJldmVudExvb3BMYWdcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJzdGFydFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdGFydFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwic3VjY2Vzc1wiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcIm51bWJlclwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwic3RvcFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdG9wXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZXZlbnRzXCI6IHtcbiAgICAgICAgXCJldmVudC1sb29wLWxhZ1wiOiB7XG4gICAgICAgICAgXCJ0eXBlXCI6IFwiZXZlbnQtbG9vcC1sYWdcIixcbiAgICAgICAgICBcInRpbWVcIjoge1xuICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJudW1iZXJcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgXCJwcmVmZXJlbmNlXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcInByZWZlcmVuY2VcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRCb29sUHJlZlwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRCb29sUHJlZlwiLFxuICAgICAgICAgICAgXCJ2YWx1ZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJwcmltaXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcInZhbHVlXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiYm9vbGVhblwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0Q2hhclByZWZcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0Q2hhclByZWZcIixcbiAgICAgICAgICAgIFwidmFsdWVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJ2YWx1ZVwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0SW50UHJlZlwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRJbnRQcmVmXCIsXG4gICAgICAgICAgICBcInZhbHVlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwidmFsdWVcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJudW1iZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdldEFsbFByZWZzXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldEFsbFByZWZzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJ2YWx1ZVwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImpzb25cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInNldEJvb2xQcmVmXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInNldEJvb2xQcmVmXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInZhbHVlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJzZXRDaGFyUHJlZlwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJzZXRDaGFyUHJlZlwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ2YWx1ZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJwcmltaXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwic2V0SW50UHJlZlwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJzZXRJbnRQcmVmXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInZhbHVlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJjbGVhclVzZXJQcmVmXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImNsZWFyVXNlclByZWZcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJwcmltaXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge31cbiAgICB9LFxuICAgIFwiZGV2aWNlXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcImRldmljZVwiLFxuICAgICAgXCJtZXRob2RzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdldERlc2NyaXB0aW9uXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldERlc2NyaXB0aW9uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJ2YWx1ZVwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImpzb25cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdldFdhbGxwYXBlclwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRXYWxscGFwZXJcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcInZhbHVlXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwibG9uZ3N0cmluZ1wiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwic2NyZWVuc2hvdFRvRGF0YVVSTFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJzY3JlZW5zaG90VG9EYXRhVVJMXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJ2YWx1ZVwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImxvbmdzdHJpbmdcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdldFJhd1Blcm1pc3Npb25zVGFibGVcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0UmF3UGVybWlzc2lvbnNUYWJsZVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwidmFsdWVcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJqc29uXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7fVxuICAgIH1cbiAgfSxcbiAgXCJmcm9tXCI6IFwicm9vdFwiXG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIENsYXNzID0gcmVxdWlyZShcIi4vY2xhc3NcIikuQ2xhc3M7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG52YXIga2V5cyA9IHV0aWwua2V5cztcbnZhciB2YWx1ZXMgPSB1dGlsLnZhbHVlcztcbnZhciBwYWlycyA9IHV0aWwucGFpcnM7XG52YXIgcXVlcnkgPSB1dGlsLnF1ZXJ5O1xudmFyIGZpbmRQYXRoID0gdXRpbC5maW5kUGF0aDtcbnZhciBFdmVudFRhcmdldCA9IHJlcXVpcmUoXCIuL2V2ZW50XCIpLkV2ZW50VGFyZ2V0O1xuXG52YXIgVHlwZVN5c3RlbSA9IENsYXNzKHtcbiAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGNsaWVudCkge1xuICAgIHZhciB0eXBlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdmFyIHNwZWNpZmljYXRpb24gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgdGhpcy5zcGVjaWZpY2F0aW9uID0gc3BlY2lmaWNhdGlvbjtcbiAgICB0aGlzLnR5cGVzID0gdHlwZXM7XG5cbiAgICB2YXIgdHlwZUZvciA9IGZ1bmN0aW9uIHR5cGVGb3IodHlwZU5hbWUpIHtcbiAgICAgIHR5cGVOYW1lID0gdHlwZU5hbWUgfHwgXCJwcmltaXRpdmVcIjtcbiAgICAgIGlmICghdHlwZXNbdHlwZU5hbWVdKSB7XG4gICAgICAgIGRlZmluZVR5cGUodHlwZU5hbWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHlwZXNbdHlwZU5hbWVdO1xuICAgIH07XG4gICAgdGhpcy50eXBlRm9yID0gdHlwZUZvcjtcblxuICAgIHZhciBkZWZpbmVUeXBlID0gZnVuY3Rpb24oZGVzY3JpcHRvcikge1xuICAgICAgdmFyIHR5cGUgPSB2b2lkKDApO1xuICAgICAgaWYgKHR5cGVvZihkZXNjcmlwdG9yKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAoZGVzY3JpcHRvci5pbmRleE9mKFwiOlwiKSA+IDApXG4gICAgICAgICAgdHlwZSA9IG1ha2VDb21wb3VuZFR5cGUoZGVzY3JpcHRvcik7XG4gICAgICAgIGVsc2UgaWYgKGRlc2NyaXB0b3IuaW5kZXhPZihcIiNcIikgPiAwKVxuICAgICAgICAgIHR5cGUgPSBuZXcgQWN0b3JEZXRhaWwoZGVzY3JpcHRvcik7XG4gICAgICAgICAgZWxzZSBpZiAoc3BlY2lmaWNhdGlvbltkZXNjcmlwdG9yXSlcbiAgICAgICAgICAgIHR5cGUgPSBtYWtlQ2F0ZWdvcnlUeXBlKHNwZWNpZmljYXRpb25bZGVzY3JpcHRvcl0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZSA9IG1ha2VDYXRlZ29yeVR5cGUoZGVzY3JpcHRvcik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlKVxuICAgICAgICB0eXBlc1t0eXBlLm5hbWVdID0gdHlwZTtcbiAgICAgIGVsc2VcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlOiBcIiArIGRlc2NyaXB0b3IpO1xuICAgIH07XG4gICAgdGhpcy5kZWZpbmVUeXBlID0gZGVmaW5lVHlwZTtcblxuXG4gICAgdmFyIG1ha2VDb21wb3VuZFR5cGUgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgICB2YXIgaW5kZXggPSBuYW1lLmluZGV4T2YoXCI6XCIpO1xuICAgICAgdmFyIGJhc2VUeXBlID0gbmFtZS5zbGljZSgwLCBpbmRleCk7XG4gICAgICB2YXIgc3ViVHlwZSA9IG5hbWUuc2xpY2UoaW5kZXggKyAxKTtcblxuICAgICAgcmV0dXJuIGJhc2VUeXBlID09PSBcImFycmF5XCIgPyBuZXcgQXJyYXlPZihzdWJUeXBlKSA6XG4gICAgICBiYXNlVHlwZSA9PT0gXCJudWxsYWJsZVwiID8gbmV3IE1heWJlKHN1YlR5cGUpIDpcbiAgICAgIG51bGw7XG4gICAgfTtcblxuICAgIHZhciBtYWtlQ2F0ZWdvcnlUeXBlID0gZnVuY3Rpb24oZGVzY3JpcHRvcikge1xuICAgICAgdmFyIGNhdGVnb3J5ID0gZGVzY3JpcHRvci5jYXRlZ29yeTtcbiAgICAgIHJldHVybiBjYXRlZ29yeSA9PT0gXCJkaWN0XCIgPyBuZXcgRGljdGlvbmFyeShkZXNjcmlwdG9yKSA6XG4gICAgICBjYXRlZ29yeSA9PT0gXCJhY3RvclwiID8gbmV3IEFjdG9yKGRlc2NyaXB0b3IpIDpcbiAgICAgIG51bGw7XG4gICAgfTtcblxuICAgIHZhciByZWFkID0gZnVuY3Rpb24oaW5wdXQsIGNvbnRleHQsIHR5cGVOYW1lKSB7XG4gICAgICByZXR1cm4gdHlwZUZvcih0eXBlTmFtZSkucmVhZChpbnB1dCwgY29udGV4dCk7XG4gICAgfVxuICAgIHRoaXMucmVhZCA9IHJlYWQ7XG5cbiAgICB2YXIgd3JpdGUgPSBmdW5jdGlvbihpbnB1dCwgY29udGV4dCwgdHlwZU5hbWUpIHtcbiAgICAgIHJldHVybiB0eXBlRm9yKHR5cGVOYW1lKS53cml0ZShpbnB1dCk7XG4gICAgfTtcbiAgICB0aGlzLndyaXRlID0gd3JpdGU7XG5cblxuICAgIHZhciBUeXBlID0gQ2xhc3Moe1xuICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKCkge1xuICAgICAgfSxcbiAgICAgIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYXRlZ29yeSA/IHRoaXMuY2F0ZWdvcnkgKyBcIjpcIiArIHRoaXMudHlwZSA6XG4gICAgICAgIHRoaXMudHlwZTtcbiAgICAgIH0sXG4gICAgICByZWFkOiBmdW5jdGlvbihpbnB1dCwgY29udGV4dCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYFR5cGVgIHN1YmNsYXNzIG11c3QgaW1wbGVtZW50IGByZWFkYFwiKTtcbiAgICAgIH0sXG4gICAgICB3cml0ZTogZnVuY3Rpb24oaW5wdXQsIGNvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImBUeXBlYCBzdWJjbGFzcyBtdXN0IGltcGxlbWVudCBgd3JpdGVgXCIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIFByaW1pdHZlID0gQ2xhc3Moe1xuICAgICAgZXh0ZW5kczogVHlwZSxcbiAgICAgIGNvbnN0dWN0b3I6IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgIH0sXG4gICAgICByZWFkOiBmdW5jdGlvbihpbnB1dCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICB9LFxuICAgICAgd3JpdGU6IGZ1bmN0aW9uKGlucHV0LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHZhciBNYXliZSA9IENsYXNzKHtcbiAgICAgIGV4dGVuZHM6IFR5cGUsXG4gICAgICBjYXRlZ29yeTogXCJudWxsYWJsZVwiLFxuICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgIH0sXG4gICAgICByZWFkOiBmdW5jdGlvbihpbnB1dCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgPT09IG51bGwgPyBudWxsIDpcbiAgICAgICAgaW5wdXQgPT09IHZvaWQoMCkgPyB2b2lkKDApIDpcbiAgICAgICAgcmVhZChpbnB1dCwgY29udGV4dCwgdGhpcy50eXBlKTtcbiAgICAgIH0sXG4gICAgICB3cml0ZTogZnVuY3Rpb24oaW5wdXQsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09PSBudWxsID8gbnVsbCA6XG4gICAgICAgIGlucHV0ID09PSB2b2lkKDApID8gdm9pZCgwKSA6XG4gICAgICAgIHdyaXRlKGlucHV0LCBjb250ZXh0LCB0aGlzLnR5cGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIEFycmF5T2YgPSBDbGFzcyh7XG4gICAgICBleHRlbmRzOiBUeXBlLFxuICAgICAgY2F0ZWdvcnk6IFwiYXJyYXlcIixcbiAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbih0eXBlKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICB9LFxuICAgICAgcmVhZDogZnVuY3Rpb24oaW5wdXQsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHR5cGUgPSB0aGlzLnR5cGU7XG4gICAgICAgIHJldHVybiBpbnB1dC5tYXAoZnVuY3Rpb24oJCkgeyByZXR1cm4gcmVhZCgkLCBjb250ZXh0LCB0eXBlKSB9KTtcbiAgICAgIH0sXG4gICAgICB3cml0ZTogZnVuY3Rpb24oaW5wdXQsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHR5cGUgPSB0aGlzLnR5cGU7XG4gICAgICAgIHJldHVybiBpbnB1dC5tYXAoZnVuY3Rpb24oJCkgeyByZXR1cm4gd3JpdGUoJCwgY29udGV4dCwgdHlwZSkgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB2YXIgbWFrZUZpZWxkID0gZnVuY3Rpb24gbWFrZUZpZWxkKG5hbWUsIHR5cGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgbmFtZSwge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiByZWFkKHRoaXMuc3RhdGVbbmFtZV0sIHRoaXMuY29udGV4dCwgdHlwZSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdGhpc1tuYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgbWFrZUZpZWxkcyA9IGZ1bmN0aW9uKGRlc2NyaXB0b3IpIHtcbiAgICAgIHJldHVybiBwYWlycyhkZXNjcmlwdG9yKS5yZWR1Y2UoZnVuY3Rpb24oZmllbGRzLCBwYWlyKSB7XG4gICAgICAgIHZhciBuYW1lID0gcGFpclswXSwgdHlwZSA9IHBhaXJbMV07XG4gICAgICAgIGZpZWxkc1tuYW1lXSA9IG1ha2VGaWVsZChuYW1lLCB0eXBlKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkcztcbiAgICAgIH0sIHt9KTtcbiAgICB9XG5cbiAgICB2YXIgRGljdGlvbmFyeVR5cGUgPSBDbGFzcyh7fSk7XG5cbiAgICB2YXIgRGljdGlvbmFyeSA9IENsYXNzKHtcbiAgICAgIGV4dGVuZHM6IFR5cGUsXG4gICAgICBjYXRlZ29yeTogXCJkaWN0XCIsXG4gICAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMudHlwZTsgfSxcbiAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihkZXNjcmlwdG9yKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IGRlc2NyaXB0b3IudHlwZU5hbWU7XG4gICAgICAgIHRoaXMudHlwZXMgPSBkZXNjcmlwdG9yLnNwZWNpYWxpemF0aW9ucztcblxuICAgICAgICB2YXIgcHJvdG8gPSBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh7XG4gICAgICAgICAgZXh0ZW5kczogRGljdGlvbmFyeVR5cGUsXG4gICAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHN0YXRlLCBjb250ZXh0KSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBzdGF0ZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogY29udGV4dFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIG1ha2VGaWVsZHModGhpcy50eXBlcykpO1xuXG4gICAgICAgIHRoaXMuY2xhc3MgPSBuZXcgQ2xhc3MocHJvdG8pO1xuICAgICAgfSxcbiAgICAgIHJlYWQ6IGZ1bmN0aW9uKGlucHV0LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgdGhpcy5jbGFzcyhpbnB1dCwgY29udGV4dCk7XG4gICAgICB9LFxuICAgICAgd3JpdGU6IGZ1bmN0aW9uKGlucHV0LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSB7fTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGlucHV0KSB7XG4gICAgICAgICAgb3V0cHV0W2tleV0gPSB3cml0ZSh2YWx1ZSwgY29udGV4dCwgdHlwZXNba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHZhciBtYWtlTWV0aG9kcyA9IGZ1bmN0aW9uKGRlc2NyaXB0b3JzKSB7XG4gICAgICByZXR1cm4gZGVzY3JpcHRvcnMucmVkdWNlKGZ1bmN0aW9uKG1ldGhvZHMsIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgbWV0aG9kc1tkZXNjcmlwdG9yLm5hbWVdID0ge1xuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB2YWx1ZTogbWFrZU1ldGhvZChkZXNjcmlwdG9yKVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbWV0aG9kcztcbiAgICAgIH0sIHt9KTtcbiAgICB9O1xuXG4gICAgdmFyIG1ha2VFdmVudHMgPSBmdW5jdGlvbihkZXNjcmlwdG9ycykge1xuICAgICAgcmV0dXJuIHBhaXJzKGRlc2NyaXB0b3JzKS5yZWR1Y2UoZnVuY3Rpb24oZXZlbnRzLCBwYWlyKSB7XG4gICAgICAgIHZhciBuYW1lID0gcGFpclswXSwgZGVzY3JpcHRvciA9IHBhaXJbMV07XG4gICAgICAgIHZhciBldmVudCA9IG5ldyBFdmVudChuYW1lLCBkZXNjcmlwdG9yKTtcbiAgICAgICAgZXZlbnRzW2V2ZW50LmV2ZW50VHlwZV0gPSBldmVudDtcbiAgICAgICAgcmV0dXJuIGV2ZW50cztcbiAgICAgIH0sIE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICAgIH07XG5cbiAgICB2YXIgQWN0b3IgPSBDbGFzcyh7XG4gICAgICBleHRlbmRzOiBUeXBlLFxuICAgICAgY2F0ZWdvcnk6IFwiYWN0b3JcIixcbiAgICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy50eXBlOyB9LFxuICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRlc2NyaXB0b3IpIHtcbiAgICAgICAgdGhpcy50eXBlID0gZGVzY3JpcHRvci50eXBlTmFtZTtcblxuICAgICAgICB2YXIgZXZlbnRzID0gbWFrZUV2ZW50cyhkZXNjcmlwdG9yLmV2ZW50cyB8fCB7fSk7XG4gICAgICAgIHZhciBmaWVsZHMgPSBtYWtlRmllbGRzKGRlc2NyaXB0b3IuZmllbGRzIHx8IHt9KTtcbiAgICAgICAgdmFyIG1ldGhvZHMgPSBtYWtlTWV0aG9kcyhkZXNjcmlwdG9yLm1ldGhvZHMgfHwgW10pO1xuXG5cbiAgICAgICAgdmFyIHByb3RvID0ge1xuICAgICAgICAgIGV4dGVuZHM6IEZyb250LFxuICAgICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIEZyb250LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBldmVudHM6IGV2ZW50c1xuICAgICAgICB9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhwcm90bywgZmllbGRzKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocHJvdG8sIG1ldGhvZHMpO1xuXG4gICAgICAgIHRoaXMuY2xhc3MgPSBDbGFzcyhwcm90byk7XG4gICAgICB9LFxuICAgICAgcmVhZDogZnVuY3Rpb24oaW5wdXQsIGNvbnRleHQsIGRldGFpbCkge1xuICAgICAgICB2YXIgc3RhdGUgPSB0eXBlb2YoaW5wdXQpID09PSBcInN0cmluZ1wiID8geyBhY3RvcjogaW5wdXQgfSA6IGlucHV0O1xuXG4gICAgICAgIHZhciBhY3RvciA9IGNsaWVudC5nZXQoc3RhdGUuYWN0b3IpIHx8IG5ldyB0aGlzLmNsYXNzKHN0YXRlLCBjb250ZXh0KTtcbiAgICAgICAgYWN0b3IuZm9ybShzdGF0ZSwgZGV0YWlsLCBjb250ZXh0KTtcblxuICAgICAgICByZXR1cm4gYWN0b3I7XG4gICAgICB9LFxuICAgICAgd3JpdGU6IGZ1bmN0aW9uKGlucHV0LCBjb250ZXh0LCBkZXRhaWwpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0LmlkO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGV4cG9ydHMuQWN0b3IgPSBBY3RvcjtcblxuXG4gICAgdmFyIEFjdG9yRGV0YWlsID0gQ2xhc3Moe1xuICAgICAgZXh0ZW5kczogQWN0b3IsXG4gICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24obmFtZSkge1xuICAgICAgICB2YXIgcGFydHMgPSBuYW1lLnNwbGl0KFwiI1wiKVxuICAgICAgICB0aGlzLmFjdG9yVHlwZSA9IHBhcnRzWzBdXG4gICAgICAgIHRoaXMuZGV0YWlsID0gcGFydHNbMV07XG4gICAgICB9LFxuICAgICAgcmVhZDogZnVuY3Rpb24oaW5wdXQsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVGb3IodGhpcy5hY3RvclR5cGUpLnJlYWQoaW5wdXQsIGNvbnRleHQsIHRoaXMuZGV0YWlsKTtcbiAgICAgIH0sXG4gICAgICB3cml0ZTogZnVuY3Rpb24oaW5wdXQsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVGb3IodGhpcy5hY3RvclR5cGUpLndyaXRlKGlucHV0LCBjb250ZXh0LCB0aGlzLmRldGFpbCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZXhwb3J0cy5BY3RvckRldGFpbCA9IEFjdG9yRGV0YWlsO1xuXG4gICAgdmFyIE1ldGhvZCA9IENsYXNzKHtcbiAgICAgIGV4dGVuZHM6IFR5cGUsXG4gICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oZGVzY3JpcHRvcikge1xuICAgICAgICB0aGlzLnR5cGUgPSBkZXNjcmlwdG9yLm5hbWU7XG4gICAgICAgIHRoaXMucGF0aCA9IGZpbmRQYXRoKGRlc2NyaXB0b3IucmVzcG9uc2UsIFwiX3JldHZhbFwiKTtcbiAgICAgICAgdGhpcy5yZXNwb25zZVR5cGUgPSB0aGlzLnBhdGggJiYgcXVlcnkoZGVzY3JpcHRvci5yZXNwb25zZSwgdGhpcy5wYXRoKS5fcmV0dmFsO1xuICAgICAgICB0aGlzLnJlcXVlc3RUeXBlID0gZGVzY3JpcHRvci5yZXF1ZXN0LnR5cGU7XG5cbiAgICAgICAgdmFyIHBhcmFtcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGVzY3JpcHRvci5yZXF1ZXN0KSB7XG4gICAgICAgICAgaWYgKGtleSAhPT0gXCJ0eXBlXCIpIHtcbiAgICAgICAgICAgIHZhciBwYXJhbSA9IGRlc2NyaXB0b3IucmVxdWVzdFtrZXldO1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gXCJfYXJnXCIgaW4gcGFyYW0gPyBwYXJhbS5fYXJnIDogcGFyYW0uX29wdGlvbjtcbiAgICAgICAgICAgIHZhciBpc1BhcmFtID0gcGFyYW0uX29wdGlvbiA9PT0gaW5kZXg7XG4gICAgICAgICAgICB2YXIgaXNBcmd1bWVudCA9IHBhcmFtLl9hcmcgPT09IGluZGV4O1xuICAgICAgICAgICAgcGFyYW1zW2luZGV4XSA9IHtcbiAgICAgICAgICAgICAgdHlwZTogcGFyYW0udHlwZSxcbiAgICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICAgICAgaXNQYXJhbTogaXNQYXJhbSxcbiAgICAgICAgICAgICAgaXNBcmd1bWVudDogaXNBcmd1bWVudFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG4gICAgICB9LFxuICAgICAgcmVhZDogZnVuY3Rpb24oaW5wdXQsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHJlYWQocXVlcnkoaW5wdXQsIHRoaXMucGF0aCksIGNvbnRleHQsIHRoaXMucmVzcG9uc2VUeXBlKTtcbiAgICAgIH0sXG4gICAgICB3cml0ZTogZnVuY3Rpb24oaW5wdXQsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1zLnJlZHVjZShmdW5jdGlvbihyZXN1bHQsIHBhcmFtKSB7XG4gICAgICAgICAgcmVzdWx0W3BhcmFtLmtleV0gPSB3cml0ZShpbnB1dFtwYXJhbS5pbmRleF0sIGNvbnRleHQsIHBhcmFtLnR5cGUpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sIHt0eXBlOiB0aGlzLnR5cGV9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBleHBvcnRzLk1ldGhvZCA9IE1ldGhvZDtcblxuICAgIHZhciBwcm9maWxlciA9IGZ1bmN0aW9uKG1ldGhvZCwgaWQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gbmV3IERhdGUoKTtcbiAgICAgICAgcmV0dXJuIG1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgdmFyIGVuZCA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgY2xpZW50LnRlbGVtZXRyeS5hZGQoaWQsICtlbmQgLSBzdGFydCk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH07XG5cbiAgICB2YXIgZGVzdHJ1Y3RvciA9IGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICBjbGllbnQucmVsZWFzZSh0aGlzKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIG1ha2VNZXRob2QoZGVzY3JpcHRvcikge1xuICAgICAgdmFyIHR5cGUgPSBuZXcgTWV0aG9kKGRlc2NyaXB0b3IpO1xuICAgICAgdmFyIG1ldGhvZCA9IGRlc2NyaXB0b3Iub25ld2F5ID8gbWFrZVVuaWRpcmVjYXRpb25hbE1ldGhvZChkZXNjcmlwdG9yLCB0eXBlKSA6XG4gICAgICAgICAgICAgICAgICAgbWFrZUJpZGlyZWN0aW9uYWxNZXRob2QoZGVzY3JpcHRvciwgdHlwZSk7XG5cbiAgICAgIGlmIChkZXNjcmlwdG9yLnRlbGVtZXRyeSlcbiAgICAgICAgbWV0aG9kID0gcHJvZmlsZXIobWV0aG9kKTtcbiAgICAgIGlmIChkZXNjcmlwdG9yLnJlbGVhc2UpXG4gICAgICAgIG1ldGhvZCA9IGRlc3RydWN0b3IobWV0aG9kKTtcblxuICAgICAgcmV0dXJuIG1ldGhvZDtcbiAgICB9XG5cbiAgICB2YXIgbWFrZVVuaWRpcmVjYXRpb25hbE1ldGhvZCA9IGZ1bmN0aW9uKGRlc2NyaXB0b3IsIHR5cGUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHBhY2tldCA9IHR5cGUud3JpdGUoYXJndW1lbnRzLCB0aGlzKTtcbiAgICAgICAgcGFja2V0LnRvID0gdGhpcy5pZDtcbiAgICAgICAgY2xpZW50LnNlbmQocGFja2V0KTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2b2lkKDApKTtcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHZhciBtYWtlQmlkaXJlY3Rpb25hbE1ldGhvZCA9IGZ1bmN0aW9uKGRlc2NyaXB0b3IsIHR5cGUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIHZhciBwYWNrZXQgPSB0eXBlLndyaXRlKGFyZ3VtZW50cywgY29udGV4dCk7XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBwYWNrZXQudG8gPSB0aGlzLmlkO1xuICAgICAgICByZXR1cm4gY2xpZW50LnJlcXVlc3QocGFja2V0KS50aGVuKGZ1bmN0aW9uKHBhY2tldCkge1xuICAgICAgICAgIHJldHVybiB0eXBlLnJlYWQocGFja2V0LCBjb250ZXh0KTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH07XG5cbiAgICB2YXIgRXZlbnQgPSBDbGFzcyh7XG4gICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24obmFtZSwgZGVzY3JpcHRvcikge1xuICAgICAgICB0aGlzLm5hbWUgPSBkZXNjcmlwdG9yLnR5cGUgfHwgbmFtZTtcbiAgICAgICAgdGhpcy5ldmVudFR5cGUgPSBkZXNjcmlwdG9yLnR5cGUgfHwgbmFtZTtcbiAgICAgICAgdGhpcy50eXBlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAgICAgdmFyIHR5cGVzID0gdGhpcy50eXBlcztcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgICBpZiAoa2V5ID09PSBcInR5cGVcIikge1xuICAgICAgICAgICAgdHlwZXNba2V5XSA9IFwic3RyaW5nXCI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHR5cGVzW2tleV0gPSBkZXNjcmlwdG9yW2tleV0udHlwZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICByZWFkOiBmdW5jdGlvbihpbnB1dCwgY29udGV4dCkge1xuICAgICAgICB2YXIgb3V0cHV0ID0ge307XG4gICAgICAgIHZhciB0eXBlcyA9IHRoaXMudHlwZXM7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBpbnB1dCkge1xuICAgICAgICAgIG91dHB1dFtrZXldID0gcmVhZChpbnB1dFtrZXldLCBjb250ZXh0LCB0eXBlc1trZXldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgfSxcbiAgICAgIHdyaXRlOiBmdW5jdGlvbihpbnB1dCwgY29udGV4dCkge1xuICAgICAgICB2YXIgb3V0cHV0ID0ge307XG4gICAgICAgIHZhciB0eXBlcyA9IHRoaXMudHlwZXM7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnR5cGVzKSB7XG4gICAgICAgICAgb3V0cHV0W2tleV0gPSB3cml0ZShpbnB1dFtrZXldLCBjb250ZXh0LCB0eXBlc1trZXldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIEZyb250ID0gQ2xhc3Moe1xuICAgICAgZXh0ZW5kczogRXZlbnRUYXJnZXQsXG4gICAgICBFdmVudFRhcmdldDogRXZlbnRUYXJnZXQsXG4gICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oc3RhdGUpIHtcbiAgICAgICAgdGhpcy5FdmVudFRhcmdldCgpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCAge1xuICAgICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHN0YXRlXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjbGllbnQucmVnaXN0ZXIodGhpcyk7XG4gICAgICB9LFxuICAgICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5hY3RvcjtcbiAgICAgIH0sXG4gICAgICBnZXQgY29udGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgICAgZm9ybTogZnVuY3Rpb24oc3RhdGUsIGRldGFpbCwgY29udGV4dCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICBpZiAoZGV0YWlsKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlW2RldGFpbF0gPSBzdGF0ZVtkZXRhaWxdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYWlycyhzdGF0ZSkuZm9yRWFjaChmdW5jdGlvbihwYWlyKSB7XG4gICAgICAgICAgICAgIHZhciBrZXkgPSBwYWlyWzBdLCB2YWx1ZSA9IHBhaXJbMV07XG4gICAgICAgICAgICAgIHRoaXMuc3RhdGVba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQpIHtcbiAgICAgICAgICBjbGllbnQuc3VwZXJ2aXNlKGNvbnRleHQsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcmVxdWVzdFR5cGVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGNsaWVudC5yZXF1ZXN0KHtcbiAgICAgICAgICB0bzogdGhpcy5pZCxcbiAgICAgICAgICB0eXBlOiBcInJlcXVlc3RUeXBlc1wiXG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24ocGFja2V0KSB7XG4gICAgICAgICAgcmV0dXJuIHBhY2tldC5yZXF1ZXN0VHlwZXM7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHR5cGVzLnByaW1pdGl2ZSA9IG5ldyBQcmltaXR2ZShcInByaW1pdGl2ZVwiKTtcbiAgICB0eXBlcy5zdHJpbmcgPSBuZXcgUHJpbWl0dmUoXCJzdHJpbmdcIik7XG4gICAgdHlwZXMubnVtYmVyID0gbmV3IFByaW1pdHZlKFwibnVtYmVyXCIpO1xuICAgIHR5cGVzLmJvb2xlYW4gPSBuZXcgUHJpbWl0dmUoXCJib29sZWFuXCIpO1xuICAgIHR5cGVzLmpzb24gPSBuZXcgUHJpbWl0dmUoXCJqc29uXCIpO1xuICAgIHR5cGVzLmFycmF5ID0gbmV3IFByaW1pdHZlKFwiYXJyYXlcIik7XG4gIH0sXG4gIHJlZ2lzdGVyVHlwZXM6IGZ1bmN0aW9uKGRlc2NyaXB0b3IpIHtcbiAgICB2YXIgc3BlY2lmaWNhdGlvbiA9IHRoaXMuc3BlY2lmaWNhdGlvbjtcbiAgICB2YWx1ZXMoZGVzY3JpcHRvci50eXBlcykuZm9yRWFjaChmdW5jdGlvbihkZXNjcmlwdG9yKSB7XG4gICAgICBzcGVjaWZpY2F0aW9uW2Rlc2NyaXB0b3IudHlwZU5hbWVdID0gZGVzY3JpcHRvcjtcbiAgICB9KTtcbiAgfVxufSk7XG5leHBvcnRzLlR5cGVTeXN0ZW0gPSBUeXBlU3lzdGVtO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBrZXlzID0gT2JqZWN0LmtleXM7XG5leHBvcnRzLmtleXMgPSBrZXlzO1xuXG4vLyBSZXR1cm5zIGFycmF5IG9mIHZhbHVlcyBmb3IgdGhlIGdpdmVuIG9iamVjdC5cbnZhciB2YWx1ZXMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgcmV0dXJuIGtleXMob2JqZWN0KS5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIG9iamVjdFtrZXldXG4gIH0pO1xufTtcbmV4cG9ydHMudmFsdWVzID0gdmFsdWVzO1xuXG4vLyBSZXR1cm5zIFtrZXksIHZhbHVlXSBwYWlycyBmb3IgdGhlIGdpdmVuIG9iamVjdC5cbnZhciBwYWlycyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICByZXR1cm4ga2V5cyhvYmplY3QpLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gW2tleSwgb2JqZWN0W2tleV1dXG4gIH0pO1xufTtcbmV4cG9ydHMucGFpcnMgPSBwYWlycztcblxuXG4vLyBRdWVyaWVzIGFuIG9iamVjdCBmb3IgdGhlIGZpZWxkIG5lc3RlZCB3aXRoIGluIGl0LlxudmFyIHF1ZXJ5ID0gZnVuY3Rpb24ob2JqZWN0LCBwYXRoKSB7XG4gIHJldHVybiBwYXRoLnJlZHVjZShmdW5jdGlvbihvYmplY3QsIGVudHJ5KSB7XG4gICAgcmV0dXJuIG9iamVjdCAmJiBvYmplY3RbZW50cnldXG4gIH0sIG9iamVjdCk7XG59O1xuZXhwb3J0cy5xdWVyeSA9IHF1ZXJ5O1xuXG52YXIgaXNPYmplY3QgPSBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4ICYmIHR5cGVvZih4KSA9PT0gXCJvYmplY3RcIlxufVxuXG52YXIgZmluZFBhdGggPSBmdW5jdGlvbihvYmplY3QsIGtleSkge1xuICB2YXIgcGF0aCA9IHZvaWQoMCk7XG4gIGlmIChvYmplY3QgJiYgdHlwZW9mKG9iamVjdCkgPT09IFwib2JqZWN0XCIpIHtcbiAgICB2YXIgbmFtZXMgPSBrZXlzKG9iamVjdCk7XG4gICAgaWYgKG5hbWVzLmluZGV4T2Yoa2V5KSA+PSAwKSB7XG4gICAgICBwYXRoID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICB2YXIgY291bnQgPSBuYW1lcy5sZW5ndGg7XG4gICAgICB3aGlsZSAoaW5kZXggPCBjb3VudCAmJiAhcGF0aCl7XG4gICAgICAgIHZhciBoZWFkID0gbmFtZXNbaW5kZXhdO1xuICAgICAgICB2YXIgdGFpbCA9IGZpbmRQYXRoKG9iamVjdFtoZWFkXSwga2V5KTtcbiAgICAgICAgcGF0aCA9IHRhaWwgPyBbaGVhZF0uY29uY2F0KHRhaWwpIDogdGFpbDtcbiAgICAgICAgaW5kZXggPSBpbmRleCArIDFcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59O1xuZXhwb3J0cy5maW5kUGF0aCA9IGZpbmRQYXRoO1xuIl19 +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlcyI6WyIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3ZvbGNhbi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy92b2xjYW4vYnJvd3Nlci9pbmRleC5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvdm9sY2FuL2Jyb3dzZXIvcHJvbWlzZS5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvdm9sY2FuL2NsYXNzLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy92b2xjYW4vY2xpZW50LmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy92b2xjYW4vZXZlbnQuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3ZvbGNhbi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvdm9sY2FuL25vZGVfbW9kdWxlcy9lczYtc3ltYm9sL2luZGV4LmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy92b2xjYW4vbm9kZV9tb2R1bGVzL2VzNi1zeW1ib2wvaXMtaW1wbGVtZW50ZWQuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3ZvbGNhbi9ub2RlX21vZHVsZXMvZXM2LXN5bWJvbC9ub2RlX21vZHVsZXMvZC9pbmRleC5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvdm9sY2FuL25vZGVfbW9kdWxlcy9lczYtc3ltYm9sL25vZGVfbW9kdWxlcy9lczUtZXh0L29iamVjdC9hc3NpZ24vaW5kZXguanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3ZvbGNhbi9ub2RlX21vZHVsZXMvZXM2LXN5bWJvbC9ub2RlX21vZHVsZXMvZXM1LWV4dC9vYmplY3QvYXNzaWduL2lzLWltcGxlbWVudGVkLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy92b2xjYW4vbm9kZV9tb2R1bGVzL2VzNi1zeW1ib2wvbm9kZV9tb2R1bGVzL2VzNS1leHQvb2JqZWN0L2Fzc2lnbi9zaGltLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy92b2xjYW4vbm9kZV9tb2R1bGVzL2VzNi1zeW1ib2wvbm9kZV9tb2R1bGVzL2VzNS1leHQvb2JqZWN0L2lzLWNhbGxhYmxlLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy92b2xjYW4vbm9kZV9tb2R1bGVzL2VzNi1zeW1ib2wvbm9kZV9tb2R1bGVzL2VzNS1leHQvb2JqZWN0L2tleXMvaW5kZXguanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3ZvbGNhbi9ub2RlX21vZHVsZXMvZXM2LXN5bWJvbC9ub2RlX21vZHVsZXMvZXM1LWV4dC9vYmplY3Qva2V5cy9pcy1pbXBsZW1lbnRlZC5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvdm9sY2FuL25vZGVfbW9kdWxlcy9lczYtc3ltYm9sL25vZGVfbW9kdWxlcy9lczUtZXh0L29iamVjdC9rZXlzL3NoaW0uanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3ZvbGNhbi9ub2RlX21vZHVsZXMvZXM2LXN5bWJvbC9ub2RlX21vZHVsZXMvZXM1LWV4dC9vYmplY3Qvbm9ybWFsaXplLW9wdGlvbnMuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3ZvbGNhbi9ub2RlX21vZHVsZXMvZXM2LXN5bWJvbC9ub2RlX21vZHVsZXMvZXM1LWV4dC9vYmplY3QvdmFsaWQtdmFsdWUuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3ZvbGNhbi9ub2RlX21vZHVsZXMvZXM2LXN5bWJvbC9ub2RlX21vZHVsZXMvZXM1LWV4dC9zdHJpbmcvIy9jb250YWlucy9pbmRleC5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvdm9sY2FuL25vZGVfbW9kdWxlcy9lczYtc3ltYm9sL25vZGVfbW9kdWxlcy9lczUtZXh0L3N0cmluZy8jL2NvbnRhaW5zL2lzLWltcGxlbWVudGVkLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy92b2xjYW4vbm9kZV9tb2R1bGVzL2VzNi1zeW1ib2wvbm9kZV9tb2R1bGVzL2VzNS1leHQvc3RyaW5nLyMvY29udGFpbnMvc2hpbS5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvdm9sY2FuL25vZGVfbW9kdWxlcy9lczYtc3ltYm9sL3BvbHlmaWxsLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy92b2xjYW4vc3BlY2lmaWNhdGlvbi9jb3JlLmpzb24iLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3ZvbGNhbi9zcGVjaWZpY2F0aW9uL3Byb3RvY29sLmpzb24iLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3ZvbGNhbi90eXBlLXN5c3RlbS5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvdm9sY2FuL3V0aWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9TQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzdUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcmRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpfXZhciBmPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChmLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGYsZi5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIENsaWVudCA9IHJlcXVpcmUoXCIuLi9jbGllbnRcIikuQ2xpZW50O1xuXG5mdW5jdGlvbiBjb25uZWN0KHBvcnQpIHtcbiAgdmFyIGNsaWVudCA9IG5ldyBDbGllbnQoKTtcbiAgcmV0dXJuIGNsaWVudC5jb25uZWN0KHBvcnQpO1xufVxuZXhwb3J0cy5jb25uZWN0ID0gY29ubmVjdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLlByb21pc2UgPSBQcm9taXNlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBkZXNjcmliZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgQ2xhc3MgPSBmdW5jdGlvbihmaWVsZHMpIHtcbiAgdmFyIG5hbWVzID0gT2JqZWN0LmtleXMoZmllbGRzKTtcbiAgdmFyIGNvbnN0cnVjdG9yID0gbmFtZXMuaW5kZXhPZihcImNvbnN0cnVjdG9yXCIpID49IDAgPyBmaWVsZHMuY29uc3RydWN0b3IgOlxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHt9O1xuICB2YXIgYW5jZXN0b3IgPSBmaWVsZHMuZXh0ZW5kcyB8fCBPYmplY3Q7XG5cbiAgdmFyIGRlc2NyaXB0b3IgPSBuYW1lcy5yZWR1Y2UoZnVuY3Rpb24oZGVzY3JpcHRvciwga2V5KSB7XG4gICAgZGVzY3JpcHRvcltrZXldID0gZGVzY3JpYmUoZmllbGRzLCBrZXkpO1xuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9LCB7fSk7XG5cbiAgdmFyIHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoYW5jZXN0b3IucHJvdG90eXBlLCBkZXNjcmlwdG9yKTtcblxuICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBwcm90b3R5cGU7XG4gIHByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xuXG4gIHJldHVybiBjb25zdHJ1Y3Rvcjtcbn07XG5leHBvcnRzLkNsYXNzID0gQ2xhc3M7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIENsYXNzID0gcmVxdWlyZShcIi4vY2xhc3NcIikuQ2xhc3M7XG52YXIgVHlwZVN5c3RlbSA9IHJlcXVpcmUoXCIuL3R5cGUtc3lzdGVtXCIpLlR5cGVTeXN0ZW07XG52YXIgdmFsdWVzID0gcmVxdWlyZShcIi4vdXRpbFwiKS52YWx1ZXM7XG52YXIgUHJvbWlzZSA9IHJlcXVpcmUoXCJlczYtcHJvbWlzZVwiKS5Qcm9taXNlO1xudmFyIE1lc3NhZ2VFdmVudCA9IHJlcXVpcmUoXCIuL2V2ZW50XCIpLk1lc3NhZ2VFdmVudDtcblxudmFyIHNwZWNpZmljYXRpb24gPSByZXF1aXJlKFwiLi9zcGVjaWZpY2F0aW9uL2NvcmUuanNvblwiKTtcblxuZnVuY3Rpb24gcmVjb3ZlckFjdG9yRGVzY3JpcHRpb25zKGVycm9yKSB7XG4gIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBmZXRjaCBwcm90b2NvbCBzcGVjaWZpY2F0aW9uIChzZWUgcmVhc29uIGJlbG93KS4gXCIgK1xuICAgICAgICAgICAgICAgXCJVc2luZyBhIGZhbGxiYWNrIHByb3RvY2FsIHNwZWNpZmljYXRpb24hXCIsXG4gICAgICAgICAgICAgICBlcnJvcik7XG4gIHJldHVybiByZXF1aXJlKFwiLi9zcGVjaWZpY2F0aW9uL3Byb3RvY29sLmpzb25cIik7XG59XG5cbi8vIFR5cGUgdG8gcmVwcmVzZW50IHN1cGVydmlzZXIgYWN0b3IgcmVsYXRpb25zIHRvIGFjdG9ycyB0aGV5IHN1cGVydmlzZVxuLy8gaW4gdGVybXMgb2YgbGlmZXRpbWUgbWFuYWdlbWVudC5cbnZhciBTdXBlcnZpc29yID0gQ2xhc3Moe1xuICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oaWQpIHtcbiAgICB0aGlzLmlkID0gaWQ7XG4gICAgdGhpcy53b3JrZXJzID0gW107XG4gIH1cbn0pO1xuXG52YXIgVGVsZW1ldHJ5ID0gQ2xhc3Moe1xuICBhZGQ6IGZ1bmN0aW9uKGlkLCBtcykge1xuICAgIGNvbnNvbGUubG9nKFwidGVsZW1ldHJ5OjpcIiwgaWQsIG1zKVxuICB9XG59KTtcblxuLy8gQ29uc2lkZXIgbWFraW5nIGNsaWVudCBhIHJvb3QgYWN0b3IuXG5cbnZhciBDbGllbnQgPSBDbGFzcyh7XG4gIGNvbnN0cnVjdG9yOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJvb3QgPSBudWxsO1xuICAgIHRoaXMudGVsZW1ldHJ5ID0gbmV3IFRlbGVtZXRyeSgpO1xuXG4gICAgdGhpcy5zZXR1cENvbm5lY3Rpb24oKTtcbiAgICB0aGlzLnNldHVwTGlmZU1hbmFnZW1lbnQoKTtcbiAgICB0aGlzLnNldHVwVHlwZVN5c3RlbSgpO1xuICB9LFxuXG4gIHNldHVwQ29ubmVjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZXF1ZXN0cyA9IFtdO1xuICB9LFxuICBzZXR1cExpZmVNYW5hZ2VtZW50OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLmdyYXBoID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLmdldCA9IHRoaXMuZ2V0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5yZWxlYXNlID0gdGhpcy5yZWxlYXNlLmJpbmQodGhpcyk7XG4gIH0sXG4gIHNldHVwVHlwZVN5c3RlbTogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy50eXBlU3lzdGVtID0gbmV3IFR5cGVTeXN0ZW0odGhpcyk7XG4gICAgdGhpcy50eXBlU3lzdGVtLnJlZ2lzdGVyVHlwZXMoc3BlY2lmaWNhdGlvbik7XG4gIH0sXG5cbiAgY29ubmVjdDogZnVuY3Rpb24ocG9ydCkge1xuICAgIHZhciBjbGllbnQgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGNsaWVudC5wb3J0ID0gcG9ydDtcbiAgICAgIHBvcnQub25tZXNzYWdlID0gY2xpZW50LnJlY2VpdmUuYmluZChjbGllbnQpO1xuICAgICAgY2xpZW50Lm9uUmVhZHkgPSByZXNvbHZlO1xuICAgICAgY2xpZW50Lm9uRmFpbCA9IHJlamVjdDtcblxuICAgICAgcG9ydC5zdGFydCgpO1xuICAgIH0pO1xuICB9LFxuICBzZW5kOiBmdW5jdGlvbihwYWNrZXQpIHtcbiAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UocGFja2V0KTtcbiAgfSxcbiAgcmVxdWVzdDogZnVuY3Rpb24ocGFja2V0KSB7XG4gICAgdmFyIGNsaWVudCA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgY2xpZW50LnJlcXVlc3RzLnB1c2gocGFja2V0LnRvLCB7IHJlc29sdmU6IHJlc29sdmUsIHJlamVjdDogcmVqZWN0IH0pO1xuICAgICAgY2xpZW50LnNlbmQocGFja2V0KTtcbiAgICB9KTtcbiAgfSxcblxuICByZWNlaXZlOiBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBwYWNrZXQgPSBldmVudC5kYXRhO1xuICAgIGlmICghdGhpcy5yb290KSB7XG4gICAgICBpZiAocGFja2V0LmZyb20gIT09IFwicm9vdFwiKVxuICAgICAgICB0aHJvdyBFcnJvcihcIkluaXRpYWwgcGFja2V0IG11c3QgYmUgZnJvbSByb290XCIpO1xuICAgICAgaWYgKCEoXCJhcHBsaWNhdGlvblR5cGVcIiBpbiBwYWNrZXQpKVxuICAgICAgICB0aHJvdyBFcnJvcihcIkluaXRpYWwgcGFja2V0IG11c3QgY29udGFpbiBhcHBsaWNhdGlvblR5cGUgZmllbGRcIik7XG5cbiAgICAgIHRoaXMucm9vdCA9IHRoaXMudHlwZVN5c3RlbS5yZWFkKFwicm9vdFwiLCBudWxsLCBcInJvb3RcIik7XG4gICAgICB0aGlzLnJvb3RcbiAgICAgICAgICAucHJvdG9jb2xEZXNjcmlwdGlvbigpXG4gICAgICAgICAgLmNhdGNoKHJlY292ZXJBY3RvckRlc2NyaXB0aW9ucylcbiAgICAgICAgICAudGhlbih0aGlzLnR5cGVTeXN0ZW0ucmVnaXN0ZXJUeXBlcy5iaW5kKHRoaXMudHlwZVN5c3RlbSkpXG4gICAgICAgICAgLnRoZW4odGhpcy5vblJlYWR5LmJpbmQodGhpcywgdGhpcy5yb290KSwgdGhpcy5vbkZhaWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYWN0b3IgPSB0aGlzLmdldChwYWNrZXQuZnJvbSkgfHwgdGhpcy5yb290O1xuICAgICAgdmFyIGV2ZW50ID0gYWN0b3IuZXZlbnRzW3BhY2tldC50eXBlXTtcbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBNZXNzYWdlRXZlbnQocGFja2V0LnR5cGUsIHtcbiAgICAgICAgICBkYXRhOiBldmVudC5yZWFkKHBhY2tldClcbiAgICAgICAgfSk7XG4gICAgICAgIGFjdG9yLmRpc3BhdGNoRXZlbnQobWVzc2FnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLnJlcXVlc3RzLmluZGV4T2YoYWN0b3IuaWQpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgIHZhciByZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0cy5zcGxpY2UoaW5kZXgsIDIpLnBvcCgpO1xuICAgICAgICAgIGlmIChwYWNrZXQuZXJyb3IpXG4gICAgICAgICAgICByZXF1ZXN0LnJlamVjdChwYWNrZXQpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJlcXVlc3QucmVzb2x2ZShwYWNrZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoRXJyb3IoXCJVbmV4cGVjdGVkIHBhY2tldCBcIiArIEpTT04uc3RyaW5naWZ5KHBhY2tldCwgMiwgMikpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0cy5zbGljZSgwKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgZ2V0OiBmdW5jdGlvbihpZCkge1xuICAgIHJldHVybiB0aGlzLmNhY2hlW2lkXTtcbiAgfSxcbiAgc3VwZXJ2aXNvck9mOiBmdW5jdGlvbihhY3Rvcikge1xuICAgIGZvciAodmFyIGlkIGluIHRoaXMuZ3JhcGgpIHtcbiAgICAgIGlmICh0aGlzLmdyYXBoW2lkXS5pbmRleE9mKGFjdG9yLmlkKSA+PSAwKSB7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHdvcmtlcnNPZjogZnVuY3Rpb24oYWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5ncmFwaFthY3Rvci5pZF07XG4gIH0sXG4gIHN1cGVydmlzZTogZnVuY3Rpb24oYWN0b3IsIHdvcmtlcikge1xuICAgIHZhciB3b3JrZXJzID0gdGhpcy53b3JrZXJzT2YoYWN0b3IpXG4gICAgaWYgKHdvcmtlcnMuaW5kZXhPZih3b3JrZXIuaWQpIDwgMCkge1xuICAgICAgd29ya2Vycy5wdXNoKHdvcmtlci5pZCk7XG4gICAgfVxuICB9LFxuICB1bnN1cGVydmlzZTogZnVuY3Rpb24oYWN0b3IsIHdvcmtlcikge1xuICAgIHZhciB3b3JrZXJzID0gdGhpcy53b3JrZXJzT2YoYWN0b3IpO1xuICAgIHZhciBpbmRleCA9IHdvcmtlcnMuaW5kZXhPZih3b3JrZXIuaWQpXG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHdvcmtlcnMuc3BsaWNlKGluZGV4LCAxKVxuICAgIH1cbiAgfSxcblxuICByZWdpc3RlcjogZnVuY3Rpb24oYWN0b3IpIHtcbiAgICB2YXIgcmVnaXN0ZXJlZCA9IHRoaXMuZ2V0KGFjdG9yLmlkKTtcbiAgICBpZiAoIXJlZ2lzdGVyZWQpIHtcbiAgICAgIHRoaXMuY2FjaGVbYWN0b3IuaWRdID0gYWN0b3I7XG4gICAgICB0aGlzLmdyYXBoW2FjdG9yLmlkXSA9IFtdO1xuICAgIH0gZWxzZSBpZiAocmVnaXN0ZXJlZCAhPT0gYWN0b3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRpZmZlcmVudCBhY3RvciB3aXRoIHNhbWUgaWQgaXMgYWxyZWFkeSByZWdpc3RlcmVkXCIpO1xuICAgIH1cbiAgfSxcbiAgdW5yZWdpc3RlcjogZnVuY3Rpb24oYWN0b3IpIHtcbiAgICBpZiAodGhpcy5nZXQoYWN0b3IuaWQpKSB7XG4gICAgICBkZWxldGUgdGhpcy5jYWNoZVthY3Rvci5pZF07XG4gICAgICBkZWxldGUgdGhpcy5ncmFwaFthY3Rvci5pZF07XG4gICAgfVxuICB9LFxuXG4gIHJlbGVhc2U6IGZ1bmN0aW9uKGFjdG9yKSB7XG4gICAgdmFyIHN1cGVydmlzb3IgPSB0aGlzLnN1cGVydmlzb3JPZihhY3Rvcik7XG4gICAgaWYgKHN1cGVydmlzb3IpXG4gICAgICB0aGlzLnVuc3VwZXJ2aXNlKHN1cGVydmlzb3IsIGFjdG9yKTtcblxuICAgIHZhciB3b3JrZXJzID0gdGhpcy53b3JrZXJzT2YoYWN0b3IpXG5cbiAgICBpZiAod29ya2Vycykge1xuICAgICAgd29ya2Vycy5tYXAodGhpcy5nZXQpLmZvckVhY2godGhpcy5yZWxlYXNlKVxuICAgIH1cbiAgICB0aGlzLnVucmVnaXN0ZXIoYWN0b3IpO1xuICB9XG59KTtcbmV4cG9ydHMuQ2xpZW50ID0gQ2xpZW50O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBTeW1ib2wgPSByZXF1aXJlKFwiZXM2LXN5bWJvbFwiKVxudmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoXCJldmVudHNcIikuRXZlbnRFbWl0dGVyO1xudmFyIENsYXNzID0gcmVxdWlyZShcIi4vY2xhc3NcIikuQ2xhc3M7XG5cbnZhciAkYm91bmQgPSBTeW1ib2woXCJFdmVudFRhcmdldC9oYW5kbGVFdmVudFwiKTtcbnZhciAkZW1pdHRlciA9IFN5bWJvbChcIkV2ZW50VGFyZ2V0L2VtaXR0ZXJcIik7XG5cbmZ1bmN0aW9uIG1ha2VIYW5kbGVyKGhhbmRsZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgaGFuZGxlci5oYW5kbGVFdmVudChldmVudCk7XG4gIH1cbn1cblxudmFyIEV2ZW50VGFyZ2V0ID0gQ2xhc3Moe1xuICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICRlbWl0dGVyLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IG5ldyBFdmVudEVtaXR0ZXIoKVxuICAgIH0pO1xuICB9LFxuICBhZGRFdmVudExpc3RlbmVyOiBmdW5jdGlvbih0eXBlLCBoYW5kbGVyKSB7XG4gICAgaWYgKHR5cGVvZihoYW5kbGVyKSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzWyRlbWl0dGVyXS5vbih0eXBlLCBoYW5kbGVyKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaGFuZGxlciAmJiB0eXBlb2YoaGFuZGxlcikgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGlmICghaGFuZGxlclskYm91bmRdKSBoYW5kbGVyWyRib3VuZF0gPSBtYWtlSGFuZGxlcihoYW5kbGVyKTtcbiAgICAgIHRoaXNbJGVtaXR0ZXJdLm9uKHR5cGUsIGhhbmRsZXJbJGJvdW5kXSk7XG4gICAgfVxuICB9LFxuICByZW1vdmVFdmVudExpc3RlbmVyOiBmdW5jdGlvbih0eXBlLCBoYW5kbGVyKSB7XG4gICAgaWYgKHR5cGVvZihoYW5kbGVyKSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgdGhpc1skZW1pdHRlcl0ucmVtb3ZlTGlzdGVuZXIodHlwZSwgaGFuZGxlcik7XG4gICAgZWxzZSBpZiAoaGFuZGxlciAmJiBoYW5kbGVyWyRib3VuZF0pXG4gICAgICB0aGlzWyRlbWl0dGVyXS5yZW1vdmVMaXN0ZW5lcih0eXBlLCBoYW5kbGVyWyRib3VuZF0pO1xuICB9LFxuICBkaXNwYXRjaEV2ZW50OiBmdW5jdGlvbihldmVudCkge1xuICAgIGV2ZW50LnRhcmdldCA9IHRoaXM7XG4gICAgdGhpc1skZW1pdHRlcl0uZW1pdChldmVudC50eXBlLCBldmVudCk7XG4gIH1cbn0pO1xuZXhwb3J0cy5FdmVudFRhcmdldCA9IEV2ZW50VGFyZ2V0O1xuXG52YXIgTWVzc2FnZUV2ZW50ID0gQ2xhc3Moe1xuICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24odHlwZSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5kYXRhID0gb3B0aW9ucy5kYXRhID09PSB2b2lkKDApID8gbnVsbCA6IG9wdGlvbnMuZGF0YTtcblxuICAgIHRoaXMubGFzdEV2ZW50SWQgPSBvcHRpb25zLmxhc3RFdmVudElkIHx8IFwiXCI7XG4gICAgdGhpcy5vcmlnaW4gPSBvcHRpb25zLm9yaWdpbiB8fCBcIlwiO1xuICAgIHRoaXMuYnViYmxlcyA9IG9wdGlvbnMuYnViYmxlcyB8fCBmYWxzZTtcbiAgICB0aGlzLmNhbmNlbGFibGUgPSBvcHRpb25zLmNhbmNlbGFibGUgfHwgZmFsc2U7XG4gIH0sXG4gIHNvdXJjZTogbnVsbCxcbiAgcG9ydHM6IG51bGwsXG4gIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHtcbiAgfSxcbiAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtcbiAgfSxcbiAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtcbiAgfVxufSk7XG5leHBvcnRzLk1lc3NhZ2VFdmVudCA9IE1lc3NhZ2VFdmVudDtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxuRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24obikge1xuICBpZiAoIWlzTnVtYmVyKG4pIHx8IG4gPCAwIHx8IGlzTmFOKG4pKVxuICAgIHRocm93IFR5cGVFcnJvcignbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgZXIsIGhhbmRsZXIsIGxlbiwgYXJncywgaSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKHR5cGUgPT09ICdlcnJvcicpIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50cy5lcnJvciB8fFxuICAgICAgICAoaXNPYmplY3QodGhpcy5fZXZlbnRzLmVycm9yKSAmJiAhdGhpcy5fZXZlbnRzLmVycm9yLmxlbmd0aCkpIHtcbiAgICAgIGVyID0gYXJndW1lbnRzWzFdO1xuICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCBcImVycm9yXCIgZXZlbnQuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNVbmRlZmluZWQoaGFuZGxlcikpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGhhbmRsZXIpKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAvLyBmYXN0IGNhc2VzXG4gICAgICBjYXNlIDE6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBzbG93ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBsZW47IGkrKylcbiAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgaGFuZGxlci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoaGFuZGxlcikpIHtcbiAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKVxuICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG5cbiAgICBsaXN0ZW5lcnMgPSBoYW5kbGVyLnNsaWNlKCk7XG4gICAgbGVuID0gbGlzdGVuZXJzLmxlbmd0aDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkodGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgbTtcblxuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgdGhpcy5fZXZlbnRzID0ge307XG5cbiAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICBpZiAodGhpcy5fZXZlbnRzLm5ld0xpc3RlbmVyKVxuICAgIHRoaXMuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICBpc0Z1bmN0aW9uKGxpc3RlbmVyLmxpc3RlbmVyKSA/XG4gICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICBlbHNlIGlmIChpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pKVxuICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2VcbiAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBbdGhpcy5fZXZlbnRzW3R5cGVdLCBsaXN0ZW5lcl07XG5cbiAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkgJiYgIXRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQpIHtcbiAgICB2YXIgbTtcbiAgICBpZiAoIWlzVW5kZWZpbmVkKHRoaXMuX21heExpc3RlbmVycykpIHtcbiAgICAgIG0gPSB0aGlzLl9tYXhMaXN0ZW5lcnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgICB9XG5cbiAgICBpZiAobSAmJiBtID4gMCAmJiB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoID4gbSkge1xuICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmVycm9yKCcobm9kZSkgd2FybmluZzogcG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2xlYWsgZGV0ZWN0ZWQuICVkIGxpc3RlbmVycyBhZGRlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICdVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdC4nLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoKTtcbiAgICAgIGlmICh0eXBlb2YgY29uc29sZS50cmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIGluIElFIDEwXG4gICAgICAgIGNvbnNvbGUudHJhY2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgdmFyIGZpcmVkID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZygpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGcpO1xuXG4gICAgaWYgKCFmaXJlZCkge1xuICAgICAgZmlyZWQgPSB0cnVlO1xuICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH1cblxuICBnLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHRoaXMub24odHlwZSwgZyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBlbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWZmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZFxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBsaXN0LCBwb3NpdGlvbiwgbGVuZ3RoLCBpO1xuXG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIGxpc3QgPSB0aGlzLl9ldmVudHNbdHlwZV07XG4gIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICBwb3NpdGlvbiA9IC0xO1xuXG4gIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fFxuICAgICAgKGlzRnVuY3Rpb24obGlzdC5saXN0ZW5lcikgJiYgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyKTtcblxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGxpc3QpKSB7XG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gPiAwOykge1xuICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8XG4gICAgICAgICAgKGxpc3RbaV0ubGlzdGVuZXIgJiYgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICBsaXN0Lmxlbmd0aCA9IDA7XG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0LnNwbGljZShwb3NpdGlvbiwgMSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIga2V5LCBsaXN0ZW5lcnM7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICBpZiAoIXRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcikge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgZWxzZSBpZiAodGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGZvciAoa2V5IGluIHRoaXMuX2V2ZW50cykge1xuICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNGdW5jdGlvbihsaXN0ZW5lcnMpKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICB9IGVsc2Uge1xuICAgIC8vIExJRk8gb3JkZXJcbiAgICB3aGlsZSAobGlzdGVuZXJzLmxlbmd0aClcbiAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2xpc3RlbmVycy5sZW5ndGggLSAxXSk7XG4gIH1cbiAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgcmV0O1xuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIHJldCA9IFtdO1xuICBlbHNlIGlmIChpc0Z1bmN0aW9uKHRoaXMuX2V2ZW50c1t0eXBlXSkpXG4gICAgcmV0ID0gW3RoaXMuX2V2ZW50c1t0eXBlXV07XG4gIGVsc2VcbiAgICByZXQgPSB0aGlzLl9ldmVudHNbdHlwZV0uc2xpY2UoKTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICB2YXIgcmV0O1xuICBpZiAoIWVtaXR0ZXIuX2V2ZW50cyB8fCAhZW1pdHRlci5fZXZlbnRzW3R5cGVdKVxuICAgIHJldCA9IDA7XG4gIGVsc2UgaWYgKGlzRnVuY3Rpb24oZW1pdHRlci5fZXZlbnRzW3R5cGVdKSlcbiAgICByZXQgPSAxO1xuICBlbHNlXG4gICAgcmV0ID0gZW1pdHRlci5fZXZlbnRzW3R5cGVdLmxlbmd0aDtcbiAgcmV0dXJuIHJldDtcbn07XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2lzLWltcGxlbWVudGVkJykoKSA/IFN5bWJvbCA6IHJlcXVpcmUoJy4vcG9seWZpbGwnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBzeW1ib2w7XG5cdGlmICh0eXBlb2YgU3ltYm9sICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG5cdHN5bWJvbCA9IFN5bWJvbCgndGVzdCBzeW1ib2wnKTtcblx0dHJ5IHtcblx0XHRpZiAoU3RyaW5nKHN5bWJvbCkgIT09ICdTeW1ib2wgKHRlc3Qgc3ltYm9sKScpIHJldHVybiBmYWxzZTtcblx0fSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnKSByZXR1cm4gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gJ3RydWUnIGZvciBwb2x5ZmlsbHNcblx0aWYgKHR5cGVvZiBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuXHRpZiAodHlwZW9mIFN5bWJvbC5pc1JlZ0V4cCAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcblx0aWYgKHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG5cdGlmICh0eXBlb2YgU3ltYm9sLnRvUHJpbWl0aXZlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuXHRpZiAodHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcblx0aWYgKHR5cGVvZiBTeW1ib2wudW5zY29wYWJsZXMgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG5cblx0cmV0dXJuIHRydWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNzaWduICAgICAgICA9IHJlcXVpcmUoJ2VzNS1leHQvb2JqZWN0L2Fzc2lnbicpXG4gICwgbm9ybWFsaXplT3B0cyA9IHJlcXVpcmUoJ2VzNS1leHQvb2JqZWN0L25vcm1hbGl6ZS1vcHRpb25zJylcbiAgLCBpc0NhbGxhYmxlICAgID0gcmVxdWlyZSgnZXM1LWV4dC9vYmplY3QvaXMtY2FsbGFibGUnKVxuICAsIGNvbnRhaW5zICAgICAgPSByZXF1aXJlKCdlczUtZXh0L3N0cmluZy8jL2NvbnRhaW5zJylcblxuICAsIGQ7XG5cbmQgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkc2NyLCB2YWx1ZS8qLCBvcHRpb25zKi8pIHtcblx0dmFyIGMsIGUsIHcsIG9wdGlvbnMsIGRlc2M7XG5cdGlmICgoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHx8ICh0eXBlb2YgZHNjciAhPT0gJ3N0cmluZycpKSB7XG5cdFx0b3B0aW9ucyA9IHZhbHVlO1xuXHRcdHZhbHVlID0gZHNjcjtcblx0XHRkc2NyID0gbnVsbDtcblx0fSBlbHNlIHtcblx0XHRvcHRpb25zID0gYXJndW1lbnRzWzJdO1xuXHR9XG5cdGlmIChkc2NyID09IG51bGwpIHtcblx0XHRjID0gdyA9IHRydWU7XG5cdFx0ZSA9IGZhbHNlO1xuXHR9IGVsc2Uge1xuXHRcdGMgPSBjb250YWlucy5jYWxsKGRzY3IsICdjJyk7XG5cdFx0ZSA9IGNvbnRhaW5zLmNhbGwoZHNjciwgJ2UnKTtcblx0XHR3ID0gY29udGFpbnMuY2FsbChkc2NyLCAndycpO1xuXHR9XG5cblx0ZGVzYyA9IHsgdmFsdWU6IHZhbHVlLCBjb25maWd1cmFibGU6IGMsIGVudW1lcmFibGU6IGUsIHdyaXRhYmxlOiB3IH07XG5cdHJldHVybiAhb3B0aW9ucyA/IGRlc2MgOiBhc3NpZ24obm9ybWFsaXplT3B0cyhvcHRpb25zKSwgZGVzYyk7XG59O1xuXG5kLmdzID0gZnVuY3Rpb24gKGRzY3IsIGdldCwgc2V0LyosIG9wdGlvbnMqLykge1xuXHR2YXIgYywgZSwgb3B0aW9ucywgZGVzYztcblx0aWYgKHR5cGVvZiBkc2NyICE9PSAnc3RyaW5nJykge1xuXHRcdG9wdGlvbnMgPSBzZXQ7XG5cdFx0c2V0ID0gZ2V0O1xuXHRcdGdldCA9IGRzY3I7XG5cdFx0ZHNjciA9IG51bGw7XG5cdH0gZWxzZSB7XG5cdFx0b3B0aW9ucyA9IGFyZ3VtZW50c1szXTtcblx0fVxuXHRpZiAoZ2V0ID09IG51bGwpIHtcblx0XHRnZXQgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoIWlzQ2FsbGFibGUoZ2V0KSkge1xuXHRcdG9wdGlvbnMgPSBnZXQ7XG5cdFx0Z2V0ID0gc2V0ID0gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKHNldCA9PSBudWxsKSB7XG5cdFx0c2V0ID0gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKCFpc0NhbGxhYmxlKHNldCkpIHtcblx0XHRvcHRpb25zID0gc2V0O1xuXHRcdHNldCA9IHVuZGVmaW5lZDtcblx0fVxuXHRpZiAoZHNjciA9PSBudWxsKSB7XG5cdFx0YyA9IHRydWU7XG5cdFx0ZSA9IGZhbHNlO1xuXHR9IGVsc2Uge1xuXHRcdGMgPSBjb250YWlucy5jYWxsKGRzY3IsICdjJyk7XG5cdFx0ZSA9IGNvbnRhaW5zLmNhbGwoZHNjciwgJ2UnKTtcblx0fVxuXG5cdGRlc2MgPSB7IGdldDogZ2V0LCBzZXQ6IHNldCwgY29uZmlndXJhYmxlOiBjLCBlbnVtZXJhYmxlOiBlIH07XG5cdHJldHVybiAhb3B0aW9ucyA/IGRlc2MgOiBhc3NpZ24obm9ybWFsaXplT3B0cyhvcHRpb25zKSwgZGVzYyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vaXMtaW1wbGVtZW50ZWQnKSgpXG5cdD8gT2JqZWN0LmFzc2lnblxuXHQ6IHJlcXVpcmUoJy4vc2hpbScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGFzc2lnbiA9IE9iamVjdC5hc3NpZ24sIG9iajtcblx0aWYgKHR5cGVvZiBhc3NpZ24gIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcblx0b2JqID0geyBmb286ICdyYXonIH07XG5cdGFzc2lnbihvYmosIHsgYmFyOiAnZHdhJyB9LCB7IHRyenk6ICd0cnp5JyB9KTtcblx0cmV0dXJuIChvYmouZm9vICsgb2JqLmJhciArIG9iai50cnp5KSA9PT0gJ3JhemR3YXRyenknO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGtleXMgID0gcmVxdWlyZSgnLi4va2V5cycpXG4gICwgdmFsdWUgPSByZXF1aXJlKCcuLi92YWxpZC12YWx1ZScpXG5cbiAgLCBtYXggPSBNYXRoLm1heDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZGVzdCwgc3JjLyosIOKApnNyY24qLykge1xuXHR2YXIgZXJyb3IsIGksIGwgPSBtYXgoYXJndW1lbnRzLmxlbmd0aCwgMiksIGFzc2lnbjtcblx0ZGVzdCA9IE9iamVjdCh2YWx1ZShkZXN0KSk7XG5cdGFzc2lnbiA9IGZ1bmN0aW9uIChrZXkpIHtcblx0XHR0cnkgeyBkZXN0W2tleV0gPSBzcmNba2V5XTsgfSBjYXRjaCAoZSkge1xuXHRcdFx0aWYgKCFlcnJvcikgZXJyb3IgPSBlO1xuXHRcdH1cblx0fTtcblx0Zm9yIChpID0gMTsgaSA8IGw7ICsraSkge1xuXHRcdHNyYyA9IGFyZ3VtZW50c1tpXTtcblx0XHRrZXlzKHNyYykuZm9yRWFjaChhc3NpZ24pO1xuXHR9XG5cdGlmIChlcnJvciAhPT0gdW5kZWZpbmVkKSB0aHJvdyBlcnJvcjtcblx0cmV0dXJuIGRlc3Q7XG59O1xuIiwiLy8gRGVwcmVjYXRlZFxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJzsgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2lzLWltcGxlbWVudGVkJykoKVxuXHQ/IE9iamVjdC5rZXlzXG5cdDogcmVxdWlyZSgnLi9zaGltJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuXHR0cnkge1xuXHRcdE9iamVjdC5rZXlzKCdwcmltaXRpdmUnKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBrZXlzID0gT2JqZWN0LmtleXM7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCkge1xuXHRyZXR1cm4ga2V5cyhvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IE9iamVjdChvYmplY3QpKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuL2Fzc2lnbicpXG5cbiAgLCBmb3JFYWNoID0gQXJyYXkucHJvdG90eXBlLmZvckVhY2hcbiAgLCBjcmVhdGUgPSBPYmplY3QuY3JlYXRlLCBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZlxuXG4gICwgcHJvY2VzcztcblxucHJvY2VzcyA9IGZ1bmN0aW9uIChzcmMsIG9iaikge1xuXHR2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihzcmMpO1xuXHRyZXR1cm4gYXNzaWduKHByb3RvID8gcHJvY2Vzcyhwcm90bywgb2JqKSA6IG9iaiwgc3JjKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9wdGlvbnMvKiwg4oCmb3B0aW9ucyovKSB7XG5cdHZhciByZXN1bHQgPSBjcmVhdGUobnVsbCk7XG5cdGZvckVhY2guY2FsbChhcmd1bWVudHMsIGZ1bmN0aW9uIChvcHRpb25zKSB7XG5cdFx0aWYgKG9wdGlvbnMgPT0gbnVsbCkgcmV0dXJuO1xuXHRcdHByb2Nlc3MoT2JqZWN0KG9wdGlvbnMpLCByZXN1bHQpO1xuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdGlmICh2YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSBudWxsIG9yIHVuZGVmaW5lZFwiKTtcblx0cmV0dXJuIHZhbHVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2lzLWltcGxlbWVudGVkJykoKVxuXHQ/IFN0cmluZy5wcm90b3R5cGUuY29udGFpbnNcblx0OiByZXF1aXJlKCcuL3NoaW0nKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHN0ciA9ICdyYXpkd2F0cnp5JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG5cdGlmICh0eXBlb2Ygc3RyLmNvbnRhaW5zICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiAoKHN0ci5jb250YWlucygnZHdhJykgPT09IHRydWUpICYmIChzdHIuY29udGFpbnMoJ2ZvbycpID09PSBmYWxzZSkpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGluZGV4T2YgPSBTdHJpbmcucHJvdG90eXBlLmluZGV4T2Y7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNlYXJjaFN0cmluZy8qLCBwb3NpdGlvbiovKSB7XG5cdHJldHVybiBpbmRleE9mLmNhbGwodGhpcywgc2VhcmNoU3RyaW5nLCBhcmd1bWVudHNbMV0pID4gLTE7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZCA9IHJlcXVpcmUoJ2QnKVxuXG4gICwgY3JlYXRlID0gT2JqZWN0LmNyZWF0ZSwgZGVmaW5lUHJvcGVydGllcyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzXG4gICwgZ2VuZXJhdGVOYW1lLCBTeW1ib2w7XG5cbmdlbmVyYXRlTmFtZSA9IChmdW5jdGlvbiAoKSB7XG5cdHZhciBjcmVhdGVkID0gY3JlYXRlKG51bGwpO1xuXHRyZXR1cm4gZnVuY3Rpb24gKGRlc2MpIHtcblx0XHR2YXIgcG9zdGZpeCA9IDA7XG5cdFx0d2hpbGUgKGNyZWF0ZWRbZGVzYyArIChwb3N0Zml4IHx8ICcnKV0pICsrcG9zdGZpeDtcblx0XHRkZXNjICs9IChwb3N0Zml4IHx8ICcnKTtcblx0XHRjcmVhdGVkW2Rlc2NdID0gdHJ1ZTtcblx0XHRyZXR1cm4gJ0BAJyArIGRlc2M7XG5cdH07XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bWJvbCA9IGZ1bmN0aW9uIChkZXNjcmlwdGlvbikge1xuXHR2YXIgc3ltYm9sO1xuXHRpZiAodGhpcyBpbnN0YW5jZW9mIFN5bWJvbCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1R5cGVFcnJvcjogU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG5cdH1cblx0c3ltYm9sID0gY3JlYXRlKFN5bWJvbC5wcm90b3R5cGUpO1xuXHRkZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkID8gJycgOiBTdHJpbmcoZGVzY3JpcHRpb24pKTtcblx0cmV0dXJuIGRlZmluZVByb3BlcnRpZXMoc3ltYm9sLCB7XG5cdFx0X19kZXNjcmlwdGlvbl9fOiBkKCcnLCBkZXNjcmlwdGlvbiksXG5cdFx0X19uYW1lX186IGQoJycsIGdlbmVyYXRlTmFtZShkZXNjcmlwdGlvbikpXG5cdH0pO1xufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoU3ltYm9sLCB7XG5cdGNyZWF0ZTogZCgnJywgU3ltYm9sKCdjcmVhdGUnKSksXG5cdGhhc0luc3RhbmNlOiBkKCcnLCBTeW1ib2woJ2hhc0luc3RhbmNlJykpLFxuXHRpc0NvbmNhdFNwcmVhZGFibGU6IGQoJycsIFN5bWJvbCgnaXNDb25jYXRTcHJlYWRhYmxlJykpLFxuXHRpc1JlZ0V4cDogZCgnJywgU3ltYm9sKCdpc1JlZ0V4cCcpKSxcblx0aXRlcmF0b3I6IGQoJycsIFN5bWJvbCgnaXRlcmF0b3InKSksXG5cdHRvUHJpbWl0aXZlOiBkKCcnLCBTeW1ib2woJ3RvUHJpbWl0aXZlJykpLFxuXHR0b1N0cmluZ1RhZzogZCgnJywgU3ltYm9sKCd0b1N0cmluZ1RhZycpKSxcblx0dW5zY29wYWJsZXM6IGQoJycsIFN5bWJvbCgndW5zY29wYWJsZXMnKSlcbn0pO1xuXG5kZWZpbmVQcm9wZXJ0aWVzKFN5bWJvbC5wcm90b3R5cGUsIHtcblx0cHJvcGVyVG9TdHJpbmc6IGQoZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiAnU3ltYm9sICgnICsgdGhpcy5fX2Rlc2NyaXB0aW9uX18gKyAnKSc7XG5cdH0pLFxuXHR0b1N0cmluZzogZCgnJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fX25hbWVfXzsgfSlcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFN5bWJvbC5wcm90b3R5cGUsIFN5bWJvbC50b1ByaW1pdGl2ZSwgZCgnJyxcblx0ZnVuY3Rpb24gKGhpbnQpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ29udmVyc2lvbiBvZiBzeW1ib2wgb2JqZWN0cyBpcyBub3QgYWxsb3dlZFwiKTtcblx0fSkpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFN5bWJvbC5wcm90b3R5cGUsIFN5bWJvbC50b1N0cmluZ1RhZywgZCgnYycsICdTeW1ib2wnKSk7XG4iLCJtb2R1bGUuZXhwb3J0cz17XG4gIFwidHlwZXNcIjoge1xuICAgIFwicm9vdFwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiYWN0b3JcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJyb290XCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZWNob1wiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInN0cmluZ1wiOiB7IFwiX2FyZ1wiOiAwLCBcInR5cGVcIjogXCJzdHJpbmdcIiB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwic3RyaW5nXCI6IHsgXCJfcmV0dmFsXCI6IFwic3RyaW5nXCIgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImxpc3RUYWJzXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHt9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjogeyBcIl9yZXR2YWxcIjogXCJ0YWJsaXN0XCIgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwicHJvdG9jb2xEZXNjcmlwdGlvblwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7fSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHsgXCJfcmV0dmFsXCI6IFwianNvblwiIH1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZXZlbnRzXCI6IHtcbiAgICAgICAgXCJ0YWJMaXN0Q2hhbmdlZFwiOiB7fVxuICAgICAgfVxuICAgIH0sXG4gICAgXCJ0YWJsaXN0XCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJkaWN0XCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwidGFibGlzdFwiLFxuICAgICAgXCJzcGVjaWFsaXphdGlvbnNcIjoge1xuICAgICAgICBcInNlbGVjdGVkXCI6IFwibnVtYmVyXCIsXG4gICAgICAgIFwidGFic1wiOiBcImFycmF5OnRhYlwiLFxuICAgICAgICBcInVybFwiOiBcInN0cmluZ1wiLFxuICAgICAgICBcImNvbnNvbGVBY3RvclwiOiBcImNvbnNvbGVcIixcbiAgICAgICAgXCJpbnNwZWN0b3JBY3RvclwiOiBcImluc3BlY3RvclwiLFxuICAgICAgICBcInN0eWxlU2hlZXRzQWN0b3JcIjogXCJzdHlsZXNoZWV0c1wiLFxuICAgICAgICBcInN0eWxlRWRpdG9yQWN0b3JcIjogXCJzdHlsZWVkaXRvclwiLFxuICAgICAgICBcIm1lbW9yeUFjdG9yXCI6IFwibWVtb3J5XCIsXG4gICAgICAgIFwiZXZlbnRMb29wTGFnQWN0b3JcIjogXCJldmVudExvb3BMYWdcIixcbiAgICAgICAgXCJwcmVmZXJlbmNlQWN0b3JcIjogXCJwcmVmZXJlbmNlXCIsXG4gICAgICAgIFwiZGV2aWNlQWN0b3JcIjogXCJkZXZpY2VcIixcblxuICAgICAgICBcInByb2ZpbGVyQWN0b3JcIjogXCJwcm9maWxlclwiLFxuICAgICAgICBcImNocm9tZURlYnVnZ2VyXCI6IFwiY2hyb21lRGVidWdnZXJcIixcbiAgICAgICAgXCJ3ZWJhcHBzQWN0b3JcIjogXCJ3ZWJhcHBzXCJcbiAgICAgIH1cbiAgICB9LFxuICAgIFwidGFiXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcInRhYlwiLFxuICAgICAgXCJmaWVsZHNcIjoge1xuICAgICAgICBcInRpdGxlXCI6IFwic3RyaW5nXCIsXG4gICAgICAgIFwidXJsXCI6IFwic3RyaW5nXCIsXG4gICAgICAgIFwib3V0ZXJXaW5kb3dJRFwiOiBcIm51bWJlclwiLFxuICAgICAgICBcImluc3BlY3RvckFjdG9yXCI6IFwiaW5zcGVjdG9yXCIsXG4gICAgICAgIFwiY2FsbFdhdGNoZXJBY3RvclwiOiBcImNhbGwtd2F0Y2hlclwiLFxuICAgICAgICBcImNhbnZhc0FjdG9yXCI6IFwiY2FudmFzXCIsXG4gICAgICAgIFwid2ViZ2xBY3RvclwiOiBcIndlYmdsXCIsXG4gICAgICAgIFwid2ViYXVkaW9BY3RvclwiOiBcIndlYmF1ZGlvXCIsXG4gICAgICAgIFwic3RvcmFnZUFjdG9yXCI6IFwic3RvcmFnZVwiLFxuICAgICAgICBcImdjbGlBY3RvclwiOiBcImdjbGlcIixcbiAgICAgICAgXCJtZW1vcnlBY3RvclwiOiBcIm1lbW9yeVwiLFxuICAgICAgICBcImV2ZW50TG9vcExhZ1wiOiBcImV2ZW50TG9vcExhZ1wiLFxuICAgICAgICBcInN0eWxlU2hlZXRzQWN0b3JcIjogXCJzdHlsZXNoZWV0c1wiLFxuICAgICAgICBcInN0eWxlRWRpdG9yQWN0b3JcIjogXCJzdHlsZWVkaXRvclwiLFxuXG4gICAgICAgIFwiY29uc29sZUFjdG9yXCI6IFwiY29uc29sZVwiLFxuICAgICAgICBcInRyYWNlQWN0b3JcIjogXCJ0cmFjZVwiXG4gICAgICB9LFxuICAgICAgXCJtZXRob2RzXCI6IFtcbiAgICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJhdHRhY2hcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge30sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7IFwiX3JldHZhbFwiOiBcImpzb25cIiB9XG4gICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge1xuICAgICAgICBcInRhYk5hdmlnYXRlZFwiOiB7XG4gICAgICAgICAgIFwidHlwZU5hbWVcIjogXCJ0YWJOYXZpZ2F0ZWRcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBcImNvbnNvbGVcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwiY29uc29sZVwiLFxuICAgICAgXCJtZXRob2RzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImV2YWx1YXRlSlNcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0ZXh0XCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ1cmxcIjoge1xuICAgICAgICAgICAgICBcIl9vcHRpb25cIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImJpbmRPYmplY3RBY3RvclwiOiB7XG4gICAgICAgICAgICAgIFwiX29wdGlvblwiOiAyLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJudWxsYWJsZTpzdHJpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZnJhbWVBY3RvclwiOiB7XG4gICAgICAgICAgICAgIFwiX29wdGlvblwiOiAyLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJudWxsYWJsZTpzdHJpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic2VsZWN0ZWROb2RlQWN0b3JcIjoge1xuICAgICAgICAgICAgICBcIl9vcHRpb25cIjogMixcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwibnVsbGFibGU6c3RyaW5nXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiZXZhbHVhdGVqc3Jlc3BvbnNlXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7fVxuICAgIH0sXG4gICAgXCJldmFsdWF0ZWpzcmVzcG9uc2VcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImRpY3RcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJldmFsdWF0ZWpzcmVzcG9uc2VcIixcbiAgICAgIFwic3BlY2lhbGl6YXRpb25zXCI6IHtcbiAgICAgICAgXCJyZXN1bHRcIjogXCJvYmplY3RcIixcbiAgICAgICAgXCJleGNlcHRpb25cIjogXCJvYmplY3RcIixcbiAgICAgICAgXCJleGNlcHRpb25NZXNzYWdlXCI6IFwic3RyaW5nXCIsXG4gICAgICAgIFwiaW5wdXRcIjogXCJzdHJpbmdcIlxuICAgICAgfVxuICAgIH0sXG4gICAgXCJvYmplY3RcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwib2JqZWN0XCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICAge1xuICAgICAgICAgICBcIm5hbWVcIjogXCJwcm9wZXJ0eVwiLFxuICAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgICBcIm5hbWVcIjoge1xuICAgICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgfSxcbiAgICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICAgIFwiZGVzY3JpcHRvclwiOiB7XG4gICAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwianNvblwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgfVxuICAgICAgICAgfVxuICAgICAgXVxuICAgIH1cbiAgfVxufVxuIiwibW9kdWxlLmV4cG9ydHM9e1xuICBcInR5cGVzXCI6IHtcbiAgICBcImxvbmdzdHJhY3RvclwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiYWN0b3JcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJsb25nc3RyYWN0b3JcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJzdWJzdHJpbmdcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3Vic3RyaW5nXCIsXG4gICAgICAgICAgICBcInN0YXJ0XCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmRcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJzdWJzdHJpbmdcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJwcmltaXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInJlbGVhc2VcIixcbiAgICAgICAgICBcInJlbGVhc2VcIjogdHJ1ZSxcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwicmVsZWFzZVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7fVxuICAgIH0sXG4gICAgXCJzdHlsZXNoZWV0XCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcInN0eWxlc2hlZXRcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJ0b2dnbGVEaXNhYmxlZFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJ0b2dnbGVEaXNhYmxlZFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiZGlzYWJsZWRcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJib29sZWFuXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRUZXh0XCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldFRleHRcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcInRleHRcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJsb25nc3RyaW5nXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRPcmlnaW5hbFNvdXJjZXNcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0T3JpZ2luYWxTb3VyY2VzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJvcmlnaW5hbFNvdXJjZXNcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJudWxsYWJsZTphcnJheTpvcmlnaW5hbHNvdXJjZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0T3JpZ2luYWxMb2NhdGlvblwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRPcmlnaW5hbExvY2F0aW9uXCIsXG4gICAgICAgICAgICBcImxpbmVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwibnVtYmVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNvbHVtblwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJudW1iZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJvcmlnaW5hbGxvY2F0aW9ucmVzcG9uc2VcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInVwZGF0ZVwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJ1cGRhdGVcIixcbiAgICAgICAgICAgIFwidGV4dFwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidHJhbnNpdGlvblwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJib29sZWFuXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZXZlbnRzXCI6IHtcbiAgICAgICAgXCJwcm9wZXJ0eS1jaGFuZ2VcIjoge1xuICAgICAgICAgIFwidHlwZVwiOiBcInByb3BlcnR5Q2hhbmdlXCIsXG4gICAgICAgICAgXCJwcm9wZXJ0eVwiOiB7XG4gICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInZhbHVlXCI6IHtcbiAgICAgICAgICAgIFwiX2FyZ1wiOiAxLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwianNvblwiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInN0eWxlLWFwcGxpZWRcIjoge1xuICAgICAgICAgIFwidHlwZVwiOiBcInN0eWxlQXBwbGllZFwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFwib3JpZ2luYWxzb3VyY2VcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwib3JpZ2luYWxzb3VyY2VcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRUZXh0XCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldFRleHRcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcInRleHRcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJsb25nc3RyaW5nXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7fVxuICAgIH0sXG4gICAgXCJzdHlsZXNoZWV0c1wiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiYWN0b3JcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJzdHlsZXNoZWV0c1wiLFxuICAgICAgXCJtZXRob2RzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdldFN0eWxlU2hlZXRzXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldFN0eWxlU2hlZXRzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJzdHlsZVNoZWV0c1wiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImFycmF5OnN0eWxlc2hlZXRcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImFkZFN0eWxlU2hlZXRcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYWRkU3R5bGVTaGVldFwiLFxuICAgICAgICAgICAgXCJ0ZXh0XCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwic3R5bGVTaGVldFwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcInN0eWxlc2hlZXRcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZXZlbnRzXCI6IHt9XG4gICAgfSxcbiAgICBcIm9yaWdpbmFsbG9jYXRpb25yZXNwb25zZVwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiZGljdFwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcIm9yaWdpbmFsbG9jYXRpb25yZXNwb25zZVwiLFxuICAgICAgXCJzcGVjaWFsaXphdGlvbnNcIjoge1xuICAgICAgICBcInNvdXJjZVwiOiBcInN0cmluZ1wiLFxuICAgICAgICBcImxpbmVcIjogXCJudW1iZXJcIixcbiAgICAgICAgXCJjb2x1bW5cIjogXCJudW1iZXJcIlxuICAgICAgfVxuICAgIH0sXG4gICAgXCJkb21ub2RlXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcImRvbW5vZGVcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXROb2RlVmFsdWVcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0Tm9kZVZhbHVlXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJ2YWx1ZVwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImxvbmdzdHJpbmdcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInNldE5vZGVWYWx1ZVwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJzZXROb2RlVmFsdWVcIixcbiAgICAgICAgICAgIFwidmFsdWVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdldEltYWdlRGF0YVwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRJbWFnZURhdGFcIixcbiAgICAgICAgICAgIFwibWF4RGltXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIm51bGxhYmxlOm51bWJlclwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImltYWdlRGF0YVwiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwibW9kaWZ5QXR0cmlidXRlc1wiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJtb2RpZnlBdHRyaWJ1dGVzXCIsXG4gICAgICAgICAgICBcIm1vZGlmaWNhdGlvbnNcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXk6anNvblwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7fVxuICAgIH0sXG4gICAgXCJhcHBsaWVkc3R5bGVcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImRpY3RcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJhcHBsaWVkc3R5bGVcIixcbiAgICAgIFwic3BlY2lhbGl6YXRpb25zXCI6IHtcbiAgICAgICAgXCJydWxlXCI6IFwiZG9tc3R5bGVydWxlI2FjdG9yaWRcIixcbiAgICAgICAgXCJpbmhlcml0ZWRcIjogXCJudWxsYWJsZTpkb21ub2RlI2FjdG9yaWRcIlxuICAgICAgfVxuICAgIH0sXG4gICAgXCJtYXRjaGVkc2VsZWN0b3JcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImRpY3RcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJtYXRjaGVkc2VsZWN0b3JcIixcbiAgICAgIFwic3BlY2lhbGl6YXRpb25zXCI6IHtcbiAgICAgICAgXCJydWxlXCI6IFwiZG9tc3R5bGVydWxlI2FjdG9yaWRcIixcbiAgICAgICAgXCJzZWxlY3RvclwiOiBcInN0cmluZ1wiLFxuICAgICAgICBcInZhbHVlXCI6IFwic3RyaW5nXCIsXG4gICAgICAgIFwic3RhdHVzXCI6IFwibnVtYmVyXCJcbiAgICAgIH1cbiAgICB9LFxuICAgIFwibWF0Y2hlZHNlbGVjdG9ycmVzcG9uc2VcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImRpY3RcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJtYXRjaGVkc2VsZWN0b3JyZXNwb25zZVwiLFxuICAgICAgXCJzcGVjaWFsaXphdGlvbnNcIjoge1xuICAgICAgICBcInJ1bGVzXCI6IFwiYXJyYXk6ZG9tc3R5bGVydWxlXCIsXG4gICAgICAgIFwic2hlZXRzXCI6IFwiYXJyYXk6c3R5bGVzaGVldFwiLFxuICAgICAgICBcIm1hdGNoZWRcIjogXCJhcnJheTptYXRjaGVkc2VsZWN0b3JcIlxuICAgICAgfVxuICAgIH0sXG4gICAgXCJhcHBsaWVkU3R5bGVzUmV0dXJuXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJkaWN0XCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwiYXBwbGllZFN0eWxlc1JldHVyblwiLFxuICAgICAgXCJzcGVjaWFsaXphdGlvbnNcIjoge1xuICAgICAgICBcImVudHJpZXNcIjogXCJhcnJheTphcHBsaWVkc3R5bGVcIixcbiAgICAgICAgXCJydWxlc1wiOiBcImFycmF5OmRvbXN0eWxlcnVsZVwiLFxuICAgICAgICBcInNoZWV0c1wiOiBcImFycmF5OnN0eWxlc2hlZXRcIlxuICAgICAgfVxuICAgIH0sXG4gICAgXCJwYWdlc3R5bGVcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwicGFnZXN0eWxlXCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0Q29tcHV0ZWRcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0Q29tcHV0ZWRcIixcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm1hcmtNYXRjaGVkXCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwib25seU1hdGNoZWRcIjoge1xuICAgICAgICAgICAgICBcIl9vcHRpb25cIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJmaWx0ZXJcIjoge1xuICAgICAgICAgICAgICBcIl9vcHRpb25cIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJjb21wdXRlZFwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImpzb25cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdldE1hdGNoZWRTZWxlY3RvcnNcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0TWF0Y2hlZFNlbGVjdG9yc1wiLFxuICAgICAgICAgICAgXCJub2RlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImRvbW5vZGVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicHJvcGVydHlcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImZpbHRlclwiOiB7XG4gICAgICAgICAgICAgIFwiX29wdGlvblwiOiAyLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJtYXRjaGVkc2VsZWN0b3JyZXNwb25zZVwiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0QXBwbGllZFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRBcHBsaWVkXCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbmhlcml0ZWRcIjoge1xuICAgICAgICAgICAgICBcIl9vcHRpb25cIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJtYXRjaGVkU2VsZWN0b3JzXCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZmlsdGVyXCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImFwcGxpZWRTdHlsZXNSZXR1cm5cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdldExheW91dFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRMYXlvdXRcIixcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImF1dG9NYXJnaW5zXCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJqc29uXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7fVxuICAgIH0sXG4gICAgXCJkb21zdHlsZXJ1bGVcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwiZG9tc3R5bGVydWxlXCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwibW9kaWZ5UHJvcGVydGllc1wiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJtb2RpZnlQcm9wZXJ0aWVzXCIsXG4gICAgICAgICAgICBcIm1vZGlmaWNhdGlvbnNcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXk6anNvblwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwicnVsZVwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImRvbXN0eWxlcnVsZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge31cbiAgICB9LFxuICAgIFwiaGlnaGxpZ2h0ZXJcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwiaGlnaGxpZ2h0ZXJcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJzaG93Qm94TW9kZWxcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic2hvd0JveE1vZGVsXCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJyZWdpb25cIjoge1xuICAgICAgICAgICAgICBcIl9vcHRpb25cIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImhpZGVCb3hNb2RlbFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJoaWRlQm94TW9kZWxcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwicGlja1wiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJwaWNrXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImNhbmNlbFBpY2tcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiY2FuY2VsUGlja1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7fVxuICAgIH0sXG4gICAgXCJpbWFnZURhdGFcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImRpY3RcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJpbWFnZURhdGFcIixcbiAgICAgIFwic3BlY2lhbGl6YXRpb25zXCI6IHtcbiAgICAgICAgXCJkYXRhXCI6IFwibnVsbGFibGU6bG9uZ3N0cmluZ1wiLFxuICAgICAgICBcInNpemVcIjogXCJqc29uXCJcbiAgICAgIH1cbiAgICB9LFxuICAgIFwiZGlzY29ubmVjdGVkTm9kZVwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiZGljdFwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcImRpc2Nvbm5lY3RlZE5vZGVcIixcbiAgICAgIFwic3BlY2lhbGl6YXRpb25zXCI6IHtcbiAgICAgICAgXCJub2RlXCI6IFwiZG9tbm9kZVwiLFxuICAgICAgICBcIm5ld1BhcmVudHNcIjogXCJhcnJheTpkb21ub2RlXCJcbiAgICAgIH1cbiAgICB9LFxuICAgIFwiZGlzY29ubmVjdGVkTm9kZUFycmF5XCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJkaWN0XCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwiZGlzY29ubmVjdGVkTm9kZUFycmF5XCIsXG4gICAgICBcInNwZWNpYWxpemF0aW9uc1wiOiB7XG4gICAgICAgIFwibm9kZXNcIjogXCJhcnJheTpkb21ub2RlXCIsXG4gICAgICAgIFwibmV3UGFyZW50c1wiOiBcImFycmF5OmRvbW5vZGVcIlxuICAgICAgfVxuICAgIH0sXG4gICAgXCJkb21tdXRhdGlvblwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiZGljdFwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcImRvbW11dGF0aW9uXCIsXG4gICAgICBcInNwZWNpYWxpemF0aW9uc1wiOiB7fVxuICAgIH0sXG4gICAgXCJkb21ub2RlbGlzdFwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiYWN0b3JcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJkb21ub2RlbGlzdFwiLFxuICAgICAgXCJtZXRob2RzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcIml0ZW1cIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaXRlbVwiLFxuICAgICAgICAgICAgXCJpdGVtXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImRpc2Nvbm5lY3RlZE5vZGVcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcIml0ZW1zXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIml0ZW1zXCIsXG4gICAgICAgICAgICBcInN0YXJ0XCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIm51bGxhYmxlOm51bWJlclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmRcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwibnVsbGFibGU6bnVtYmVyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiZGlzY29ubmVjdGVkTm9kZUFycmF5XCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJyZWxlYXNlXCIsXG4gICAgICAgICAgXCJyZWxlYXNlXCI6IHRydWUsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInJlbGVhc2VcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge31cbiAgICB9LFxuICAgIFwiZG9tdHJhdmVyc2FsYXJyYXlcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImRpY3RcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJkb210cmF2ZXJzYWxhcnJheVwiLFxuICAgICAgXCJzcGVjaWFsaXphdGlvbnNcIjoge1xuICAgICAgICBcIm5vZGVzXCI6IFwiYXJyYXk6ZG9tbm9kZVwiXG4gICAgICB9XG4gICAgfSxcbiAgICBcImRvbXdhbGtlclwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiYWN0b3JcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJkb213YWxrZXJcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJyZWxlYXNlXCIsXG4gICAgICAgICAgXCJyZWxlYXNlXCI6IHRydWUsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInJlbGVhc2VcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwicGlja1wiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJwaWNrXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiZGlzY29ubmVjdGVkTm9kZVwiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiY2FuY2VsUGlja1wiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJjYW5jZWxQaWNrXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImhpZ2hsaWdodFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJoaWdobGlnaHRcIixcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJudWxsYWJsZTpkb21ub2RlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImRvY3VtZW50XCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImRvY3VtZW50XCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwibnVsbGFibGU6ZG9tbm9kZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImRvbW5vZGVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImRvY3VtZW50RWxlbWVudFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJkb2N1bWVudEVsZW1lbnRcIixcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJudWxsYWJsZTpkb21ub2RlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJub2RlXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwicGFyZW50c1wiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJwYXJlbnRzXCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzYW1lRG9jdW1lbnRcIjoge1xuICAgICAgICAgICAgICBcIl9vcHRpb25cIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJub2Rlc1wiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImFycmF5OmRvbW5vZGVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInJldGFpbk5vZGVcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwicmV0YWluTm9kZVwiLFxuICAgICAgICAgICAgXCJub2RlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImRvbW5vZGVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwidW5yZXRhaW5Ob2RlXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInVucmV0YWluTm9kZVwiLFxuICAgICAgICAgICAgXCJub2RlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImRvbW5vZGVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwicmVsZWFzZU5vZGVcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwicmVsZWFzZU5vZGVcIixcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImZvcmNlXCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJjaGlsZHJlblwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJjaGlsZHJlblwiLFxuICAgICAgICAgICAgXCJub2RlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImRvbW5vZGVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibWF4Tm9kZXNcIjoge1xuICAgICAgICAgICAgICBcIl9vcHRpb25cIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNlbnRlclwiOiB7XG4gICAgICAgICAgICAgIFwiX29wdGlvblwiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInN0YXJ0XCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImRvbW5vZGVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwid2hhdFRvU2hvd1wiOiB7XG4gICAgICAgICAgICAgIFwiX29wdGlvblwiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJwcmltaXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJkb210cmF2ZXJzYWxhcnJheVwiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwic2libGluZ3NcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic2libGluZ3NcIixcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm1heE5vZGVzXCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjZW50ZXJcIjoge1xuICAgICAgICAgICAgICBcIl9vcHRpb25cIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzdGFydFwiOiB7XG4gICAgICAgICAgICAgIFwiX29wdGlvblwiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIndoYXRUb1Nob3dcIjoge1xuICAgICAgICAgICAgICBcIl9vcHRpb25cIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiZG9tdHJhdmVyc2FsYXJyYXlcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcIm5leHRTaWJsaW5nXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIm5leHRTaWJsaW5nXCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ3aGF0VG9TaG93XCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcIm51bGxhYmxlOmRvbW5vZGVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInByZXZpb3VzU2libGluZ1wiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJwcmV2aW91c1NpYmxpbmdcIixcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIndoYXRUb1Nob3dcIjoge1xuICAgICAgICAgICAgICBcIl9vcHRpb25cIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJub2RlXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwibnVsbGFibGU6ZG9tbm9kZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwicXVlcnlTZWxlY3RvclwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJxdWVyeVNlbGVjdG9yXCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWxlY3RvclwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJwcmltaXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJkaXNjb25uZWN0ZWROb2RlXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJxdWVyeVNlbGVjdG9yQWxsXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInF1ZXJ5U2VsZWN0b3JBbGxcIixcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlbGVjdG9yXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwibGlzdFwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImRvbW5vZGVsaXN0XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRTdWdnZXN0aW9uc0ZvclF1ZXJ5XCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldFN1Z2dlc3Rpb25zRm9yUXVlcnlcIixcbiAgICAgICAgICAgIFwicXVlcnlcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNvbXBsZXRpbmdcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlbGVjdG9yU3RhdGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMixcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJsaXN0XCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiYXJyYXk6YXJyYXk6c3RyaW5nXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJhZGRQc2V1ZG9DbGFzc0xvY2tcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYWRkUHNldWRvQ2xhc3NMb2NrXCIsXG4gICAgICAgICAgICBcIm5vZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9tbm9kZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwc2V1ZG9DbGFzc1wiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJwcmltaXRpdmVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicGFyZW50c1wiOiB7XG4gICAgICAgICAgICAgIFwiX29wdGlvblwiOiAyLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJwcmltaXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiaGlkZU5vZGVcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaGlkZU5vZGVcIixcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInVuaGlkZU5vZGVcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwidW5oaWRlTm9kZVwiLFxuICAgICAgICAgICAgXCJub2RlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImRvbW5vZGVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwicmVtb3ZlUHNldWRvQ2xhc3NMb2NrXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInJlbW92ZVBzZXVkb0NsYXNzTG9ja1wiLFxuICAgICAgICAgICAgXCJub2RlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImRvbW5vZGVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicHNldWRvQ2xhc3NcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInBhcmVudHNcIjoge1xuICAgICAgICAgICAgICBcIl9vcHRpb25cIjogMixcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImNsZWFyUHNldWRvQ2xhc3NMb2Nrc1wiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJjbGVhclBzZXVkb0NsYXNzTG9ja3NcIixcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJudWxsYWJsZTpkb21ub2RlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImlubmVySFRNTFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJpbm5lckhUTUxcIixcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJ2YWx1ZVwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImxvbmdzdHJpbmdcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcIm91dGVySFRNTFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJvdXRlckhUTUxcIixcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJ2YWx1ZVwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImxvbmdzdHJpbmdcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInNldE91dGVySFRNTFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJzZXRPdXRlckhUTUxcIixcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInZhbHVlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJyZW1vdmVOb2RlXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInJlbW92ZU5vZGVcIixcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJuZXh0U2libGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcIm51bGxhYmxlOmRvbW5vZGVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImluc2VydEJlZm9yZVwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJpbnNlcnRCZWZvcmVcIixcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInBhcmVudFwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNpYmxpbmdcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMixcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwibnVsbGFibGU6ZG9tbm9kZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRNdXRhdGlvbnNcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0TXV0YXRpb25zXCIsXG4gICAgICAgICAgICBcImNsZWFudXBcIjoge1xuICAgICAgICAgICAgICBcIl9vcHRpb25cIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJtdXRhdGlvbnNcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJhcnJheTpkb21tdXRhdGlvblwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiaXNJbkRPTVRyZWVcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaXNJbkRPTVRyZWVcIixcbiAgICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJkb21ub2RlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJhdHRhY2hlZFwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImJvb2xlYW5cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdldE5vZGVBY3RvckZyb21PYmplY3RBY3RvclwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXROb2RlQWN0b3JGcm9tT2JqZWN0QWN0b3JcIixcbiAgICAgICAgICAgIFwib2JqZWN0QWN0b3JJRFwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIm5vZGVGcm9udFwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcIm51bGxhYmxlOmRpc2Nvbm5lY3RlZE5vZGVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZXZlbnRzXCI6IHtcbiAgICAgICAgXCJuZXctbXV0YXRpb25zXCI6IHtcbiAgICAgICAgICBcInR5cGVcIjogXCJuZXdNdXRhdGlvbnNcIlxuICAgICAgICB9LFxuICAgICAgICBcInBpY2tlci1ub2RlLXBpY2tlZFwiOiB7XG4gICAgICAgICAgXCJ0eXBlXCI6IFwicGlja2VyTm9kZVBpY2tlZFwiLFxuICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImRpc2Nvbm5lY3RlZE5vZGVcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJwaWNrZXItbm9kZS1ob3ZlcmVkXCI6IHtcbiAgICAgICAgICBcInR5cGVcIjogXCJwaWNrZXJOb2RlSG92ZXJlZFwiLFxuICAgICAgICAgIFwibm9kZVwiOiB7XG4gICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImRpc2Nvbm5lY3RlZE5vZGVcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJoaWdobGlnaHRlci1yZWFkeVwiOiB7XG4gICAgICAgICAgXCJ0eXBlXCI6IFwiaGlnaGxpZ2h0ZXItcmVhZHlcIlxuICAgICAgICB9LFxuICAgICAgICBcImhpZ2hsaWdodGVyLWhpZGVcIjoge1xuICAgICAgICAgIFwidHlwZVwiOiBcImhpZ2hsaWdodGVyLWhpZGVcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBcImluc3BlY3RvclwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiYWN0b3JcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJpbnNwZWN0b3JcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRXYWxrZXJcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0V2Fsa2VyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJ3YWxrZXJcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJkb213YWxrZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdldFBhZ2VTdHlsZVwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRQYWdlU3R5bGVcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcInBhZ2VTdHlsZVwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcInBhZ2VzdHlsZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0SGlnaGxpZ2h0ZXJcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0SGlnaGxpZ2h0ZXJcIixcbiAgICAgICAgICAgIFwiYXV0b2hpZGVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiaGlnaGxpZ3RlclwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImhpZ2hsaWdodGVyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRJbWFnZURhdGFGcm9tVVJMXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldEltYWdlRGF0YUZyb21VUkxcIixcbiAgICAgICAgICAgIFwidXJsXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJtYXhEaW1cIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwibnVsbGFibGU6bnVtYmVyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiaW1hZ2VEYXRhXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7fVxuICAgIH0sXG4gICAgXCJjYWxsLXN0YWNrLWl0ZW1cIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImRpY3RcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJjYWxsLXN0YWNrLWl0ZW1cIixcbiAgICAgIFwic3BlY2lhbGl6YXRpb25zXCI6IHtcbiAgICAgICAgXCJuYW1lXCI6IFwic3RyaW5nXCIsXG4gICAgICAgIFwiZmlsZVwiOiBcInN0cmluZ1wiLFxuICAgICAgICBcImxpbmVcIjogXCJudW1iZXJcIlxuICAgICAgfVxuICAgIH0sXG4gICAgXCJjYWxsLWRldGFpbHNcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImRpY3RcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJjYWxsLWRldGFpbHNcIixcbiAgICAgIFwic3BlY2lhbGl6YXRpb25zXCI6IHtcbiAgICAgICAgXCJ0eXBlXCI6IFwibnVtYmVyXCIsXG4gICAgICAgIFwibmFtZVwiOiBcInN0cmluZ1wiLFxuICAgICAgICBcInN0YWNrXCI6IFwiYXJyYXk6Y2FsbC1zdGFjay1pdGVtXCJcbiAgICAgIH1cbiAgICB9LFxuICAgIFwiZnVuY3Rpb24tY2FsbFwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiYWN0b3JcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJmdW5jdGlvbi1jYWxsXCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0RGV0YWlsc1wiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXREZXRhaWxzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJpbmZvXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiY2FsbC1kZXRhaWxzXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7fVxuICAgIH0sXG4gICAgXCJjYWxsLXdhdGNoZXJcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwiY2FsbC13YXRjaGVyXCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwic2V0dXBcIixcbiAgICAgICAgICBcIm9uZXdheVwiOiB0cnVlLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJzZXR1cFwiLFxuICAgICAgICAgICAgXCJ0cmFjZWRHbG9iYWxzXCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIm51bGxhYmxlOmFycmF5OnN0cmluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0cmFjZWRGdW5jdGlvbnNcIjoge1xuICAgICAgICAgICAgICBcIl9vcHRpb25cIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwibnVsbGFibGU6YXJyYXk6c3RyaW5nXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInN0YXJ0UmVjb3JkaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicGVyZm9ybVJlbG9hZFwiOiB7XG4gICAgICAgICAgICAgIFwiX29wdGlvblwiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJib29sZWFuXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImZpbmFsaXplXCIsXG4gICAgICAgICAgXCJvbmV3YXlcIjogdHJ1ZSxcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZmluYWxpemVcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiaXNSZWNvcmRpbmdcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaXNSZWNvcmRpbmdcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJib29sZWFuXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJyZXN1bWVSZWNvcmRpbmdcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwicmVzdW1lUmVjb3JkaW5nXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInBhdXNlUmVjb3JkaW5nXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInBhdXNlUmVjb3JkaW5nXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJjYWxsc1wiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImFycmF5OmZ1bmN0aW9uLWNhbGxcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImVyYXNlUmVjb3JkaW5nXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImVyYXNlUmVjb3JkaW5nXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZXZlbnRzXCI6IHt9XG4gICAgfSxcbiAgICBcInNuYXBzaG90LWltYWdlXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJkaWN0XCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwic25hcHNob3QtaW1hZ2VcIixcbiAgICAgIFwic3BlY2lhbGl6YXRpb25zXCI6IHtcbiAgICAgICAgXCJpbmRleFwiOiBcIm51bWJlclwiLFxuICAgICAgICBcIndpZHRoXCI6IFwibnVtYmVyXCIsXG4gICAgICAgIFwiaGVpZ2h0XCI6IFwibnVtYmVyXCIsXG4gICAgICAgIFwiZmxpcHBlZFwiOiBcImJvb2xlYW5cIixcbiAgICAgICAgXCJwaXhlbHNcIjogXCJ1aW50MzItYXJyYXlcIlxuICAgICAgfVxuICAgIH0sXG4gICAgXCJzbmFwc2hvdC1vdmVydmlld1wiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiZGljdFwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcInNuYXBzaG90LW92ZXJ2aWV3XCIsXG4gICAgICBcInNwZWNpYWxpemF0aW9uc1wiOiB7XG4gICAgICAgIFwiY2FsbHNcIjogXCJhcnJheTpmdW5jdGlvbi1jYWxsXCIsXG4gICAgICAgIFwidGh1bWJuYWlsc1wiOiBcImFycmF5OnNuYXBzaG90LWltYWdlXCIsXG4gICAgICAgIFwic2NyZWVuc2hvdFwiOiBcInNuYXBzaG90LWltYWdlXCJcbiAgICAgIH1cbiAgICB9LFxuICAgIFwiZnJhbWUtc25hcHNob3RcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwiZnJhbWUtc25hcHNob3RcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRPdmVydmlld1wiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRPdmVydmlld1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwib3ZlcnZpZXdcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJzbmFwc2hvdC1vdmVydmlld1wiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2VuZXJhdGVTY3JlZW5zaG90Rm9yXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdlbmVyYXRlU2NyZWVuc2hvdEZvclwiLFxuICAgICAgICAgICAgXCJjYWxsXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImZ1bmN0aW9uLWNhbGxcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcInNjcmVlbnNob3RcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJzbmFwc2hvdC1pbWFnZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge31cbiAgICB9LFxuICAgIFwiY2FudmFzXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcImNhbnZhc1wiLFxuICAgICAgXCJtZXRob2RzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInNldHVwXCIsXG4gICAgICAgICAgXCJvbmV3YXlcIjogdHJ1ZSxcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic2V0dXBcIixcbiAgICAgICAgICAgIFwicmVsb2FkXCI6IHtcbiAgICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZmluYWxpemVcIixcbiAgICAgICAgICBcIm9uZXdheVwiOiB0cnVlLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJmaW5hbGl6ZVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJpc0luaXRpYWxpemVkXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImlzSW5pdGlhbGl6ZWRcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcImluaXRpYWxpemVkXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiYm9vbGVhblwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwicmVjb3JkQW5pbWF0aW9uRnJhbWVcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwicmVjb3JkQW5pbWF0aW9uRnJhbWVcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcInNuYXBzaG90XCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiZnJhbWUtc25hcHNob3RcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZXZlbnRzXCI6IHt9XG4gICAgfSxcbiAgICBcImdsLXNoYWRlclwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiYWN0b3JcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJnbC1zaGFkZXJcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRUZXh0XCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldFRleHRcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcInRleHRcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImNvbXBpbGVcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiY29tcGlsZVwiLFxuICAgICAgICAgICAgXCJ0ZXh0XCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiZXJyb3JcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJudWxsYWJsZTpqc29uXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7fVxuICAgIH0sXG4gICAgXCJnbC1wcm9ncmFtXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcImdsLXByb2dyYW1cIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRWZXJ0ZXhTaGFkZXJcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0VmVydGV4U2hhZGVyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJzaGFkZXJcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJnbC1zaGFkZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdldEZyYWdtZW50U2hhZGVyXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldEZyYWdtZW50U2hhZGVyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJzaGFkZXJcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJnbC1zaGFkZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImhpZ2hsaWdodFwiLFxuICAgICAgICAgIFwib25ld2F5XCI6IHRydWUsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImhpZ2hsaWdodFwiLFxuICAgICAgICAgICAgXCJ0aW50XCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5Om51bWJlclwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJ1bmhpZ2hsaWdodFwiLFxuICAgICAgICAgIFwib25ld2F5XCI6IHRydWUsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInVuaGlnaGxpZ2h0XCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImJsYWNrYm94XCIsXG4gICAgICAgICAgXCJvbmV3YXlcIjogdHJ1ZSxcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYmxhY2tib3hcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwidW5ibGFja2JveFwiLFxuICAgICAgICAgIFwib25ld2F5XCI6IHRydWUsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInVuYmxhY2tib3hcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge31cbiAgICB9LFxuICAgIFwid2ViZ2xcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwid2ViZ2xcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJzZXR1cFwiLFxuICAgICAgICAgIFwib25ld2F5XCI6IHRydWUsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInNldHVwXCIsXG4gICAgICAgICAgICBcInJlbG9hZFwiOiB7XG4gICAgICAgICAgICAgIFwiX29wdGlvblwiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJib29sZWFuXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImZpbmFsaXplXCIsXG4gICAgICAgICAgXCJvbmV3YXlcIjogdHJ1ZSxcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZmluYWxpemVcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0UHJvZ3JhbXNcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0UHJvZ3JhbXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcInByb2dyYW1zXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwiYXJyYXk6Z2wtcHJvZ3JhbVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge1xuICAgICAgICBcInByb2dyYW0tbGlua2VkXCI6IHtcbiAgICAgICAgICBcInR5cGVcIjogXCJwcm9ncmFtTGlua2VkXCIsXG4gICAgICAgICAgXCJwcm9ncmFtXCI6IHtcbiAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2wtcHJvZ3JhbVwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBcImF1ZGlvbm9kZVwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiYWN0b3JcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJhdWRpb25vZGVcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRUeXBlXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldFR5cGVcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImlzU291cmNlXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImlzU291cmNlXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJzb3VyY2VcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJib29sZWFuXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJzZXRQYXJhbVwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJzZXRQYXJhbVwiLFxuICAgICAgICAgICAgXCJwYXJhbVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidmFsdWVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwibnVsbGFibGU6cHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJlcnJvclwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcIm51bGxhYmxlOmpzb25cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdldFBhcmFtXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldFBhcmFtXCIsXG4gICAgICAgICAgICBcInBhcmFtXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwidGV4dFwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcIm51bGxhYmxlOnByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0UGFyYW1GbGFnc1wiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRQYXJhbUZsYWdzXCIsXG4gICAgICAgICAgICBcInBhcmFtXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiZmxhZ3NcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJudWxsYWJsZTpwcmltaXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdldFBhcmFtc1wiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRQYXJhbXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcInBhcmFtc1wiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImpzb25cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZXZlbnRzXCI6IHt9XG4gICAgfSxcbiAgICBcIndlYmF1ZGlvXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcIndlYmF1ZGlvXCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwic2V0dXBcIixcbiAgICAgICAgICBcIm9uZXdheVwiOiB0cnVlLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJzZXR1cFwiLFxuICAgICAgICAgICAgXCJyZWxvYWRcIjoge1xuICAgICAgICAgICAgICBcIl9vcHRpb25cIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJmaW5hbGl6ZVwiLFxuICAgICAgICAgIFwib25ld2F5XCI6IHRydWUsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImZpbmFsaXplXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZXZlbnRzXCI6IHtcbiAgICAgICAgXCJzdGFydC1jb250ZXh0XCI6IHtcbiAgICAgICAgICBcInR5cGVcIjogXCJzdGFydENvbnRleHRcIlxuICAgICAgICB9LFxuICAgICAgICBcImNvbm5lY3Qtbm9kZVwiOiB7XG4gICAgICAgICAgXCJ0eXBlXCI6IFwiY29ubmVjdE5vZGVcIixcbiAgICAgICAgICBcInNvdXJjZVwiOiB7XG4gICAgICAgICAgICBcIl9vcHRpb25cIjogMCxcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImF1ZGlvbm9kZVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImRlc3RcIjoge1xuICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDAsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhdWRpb25vZGVcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkaXNjb25uZWN0LW5vZGVcIjoge1xuICAgICAgICAgIFwidHlwZVwiOiBcImRpc2Nvbm5lY3ROb2RlXCIsXG4gICAgICAgICAgXCJzb3VyY2VcIjoge1xuICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhdWRpb25vZGVcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJjb25uZWN0LXBhcmFtXCI6IHtcbiAgICAgICAgICBcInR5cGVcIjogXCJjb25uZWN0UGFyYW1cIixcbiAgICAgICAgICBcInNvdXJjZVwiOiB7XG4gICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImF1ZGlvbm9kZVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhcmFtXCI6IHtcbiAgICAgICAgICAgIFwiX2FyZ1wiOiAxLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiY2hhbmdlLXBhcmFtXCI6IHtcbiAgICAgICAgICBcInR5cGVcIjogXCJjaGFuZ2VQYXJhbVwiLFxuICAgICAgICAgIFwic291cmNlXCI6IHtcbiAgICAgICAgICAgIFwiX29wdGlvblwiOiAwLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXVkaW9ub2RlXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFyYW1cIjoge1xuICAgICAgICAgICAgXCJfb3B0aW9uXCI6IDAsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ2YWx1ZVwiOiB7XG4gICAgICAgICAgICBcIl9vcHRpb25cIjogMCxcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImNyZWF0ZS1ub2RlXCI6IHtcbiAgICAgICAgICBcInR5cGVcIjogXCJjcmVhdGVOb2RlXCIsXG4gICAgICAgICAgXCJzb3VyY2VcIjoge1xuICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhdWRpb25vZGVcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgXCJvbGQtc3R5bGVzaGVldFwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiYWN0b3JcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJvbGQtc3R5bGVzaGVldFwiLFxuICAgICAgXCJtZXRob2RzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInRvZ2dsZURpc2FibGVkXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInRvZ2dsZURpc2FibGVkXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJkaXNhYmxlZFwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImJvb2xlYW5cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImZldGNoU291cmNlXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImZldGNoU291cmNlXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInVwZGF0ZVwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJ1cGRhdGVcIixcbiAgICAgICAgICAgIFwidGV4dFwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidHJhbnNpdGlvblwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJib29sZWFuXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZXZlbnRzXCI6IHtcbiAgICAgICAgXCJwcm9wZXJ0eS1jaGFuZ2VcIjoge1xuICAgICAgICAgIFwidHlwZVwiOiBcInByb3BlcnR5Q2hhbmdlXCIsXG4gICAgICAgICAgXCJwcm9wZXJ0eVwiOiB7XG4gICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInZhbHVlXCI6IHtcbiAgICAgICAgICAgIFwiX2FyZ1wiOiAxLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwianNvblwiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNvdXJjZS1sb2FkXCI6IHtcbiAgICAgICAgICBcInR5cGVcIjogXCJzb3VyY2VMb2FkXCIsXG4gICAgICAgICAgXCJzb3VyY2VcIjoge1xuICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzdHlsZS1hcHBsaWVkXCI6IHtcbiAgICAgICAgICBcInR5cGVcIjogXCJzdHlsZUFwcGxpZWRcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBcInN0eWxlZWRpdG9yXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcInN0eWxlZWRpdG9yXCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwibmV3RG9jdW1lbnRcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwibmV3RG9jdW1lbnRcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwibmV3U3R5bGVTaGVldFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJuZXdTdHlsZVNoZWV0XCIsXG4gICAgICAgICAgICBcInRleHRcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJzdHlsZVNoZWV0XCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwib2xkLXN0eWxlc2hlZXRcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZXZlbnRzXCI6IHtcbiAgICAgICAgXCJkb2N1bWVudC1sb2FkXCI6IHtcbiAgICAgICAgICBcInR5cGVcIjogXCJkb2N1bWVudExvYWRcIixcbiAgICAgICAgICBcInN0eWxlU2hlZXRzXCI6IHtcbiAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXk6b2xkLXN0eWxlc2hlZXRcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgXCJjb29raWVvYmplY3RcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImRpY3RcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJjb29raWVvYmplY3RcIixcbiAgICAgIFwic3BlY2lhbGl6YXRpb25zXCI6IHtcbiAgICAgICAgXCJuYW1lXCI6IFwic3RyaW5nXCIsXG4gICAgICAgIFwidmFsdWVcIjogXCJsb25nc3RyaW5nXCIsXG4gICAgICAgIFwicGF0aFwiOiBcIm51bGxhYmxlOnN0cmluZ1wiLFxuICAgICAgICBcImhvc3RcIjogXCJzdHJpbmdcIixcbiAgICAgICAgXCJpc0RvbWFpblwiOiBcImJvb2xlYW5cIixcbiAgICAgICAgXCJpc1NlY3VyZVwiOiBcImJvb2xlYW5cIixcbiAgICAgICAgXCJpc0h0dHBPbmx5XCI6IFwiYm9vbGVhblwiLFxuICAgICAgICBcImNyZWF0aW9uVGltZVwiOiBcIm51bWJlclwiLFxuICAgICAgICBcImxhc3RBY2Nlc3NlZFwiOiBcIm51bWJlclwiLFxuICAgICAgICBcImV4cGlyZXNcIjogXCJudW1iZXJcIlxuICAgICAgfVxuICAgIH0sXG4gICAgXCJjb29raWVzdG9yZW9iamVjdFwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiZGljdFwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcImNvb2tpZXN0b3Jlb2JqZWN0XCIsXG4gICAgICBcInNwZWNpYWxpemF0aW9uc1wiOiB7XG4gICAgICAgIFwidG90YWxcIjogXCJudW1iZXJcIixcbiAgICAgICAgXCJvZmZzZXRcIjogXCJudW1iZXJcIixcbiAgICAgICAgXCJkYXRhXCI6IFwiYXJyYXk6bnVsbGFibGU6Y29va2llb2JqZWN0XCJcbiAgICAgIH1cbiAgICB9LFxuICAgIFwic3RvcmFnZW9iamVjdFwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiZGljdFwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcInN0b3JhZ2VvYmplY3RcIixcbiAgICAgIFwic3BlY2lhbGl6YXRpb25zXCI6IHtcbiAgICAgICAgXCJuYW1lXCI6IFwic3RyaW5nXCIsXG4gICAgICAgIFwidmFsdWVcIjogXCJsb25nc3RyaW5nXCJcbiAgICAgIH1cbiAgICB9LFxuICAgIFwic3RvcmFnZXN0b3Jlb2JqZWN0XCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJkaWN0XCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwic3RvcmFnZXN0b3Jlb2JqZWN0XCIsXG4gICAgICBcInNwZWNpYWxpemF0aW9uc1wiOiB7XG4gICAgICAgIFwidG90YWxcIjogXCJudW1iZXJcIixcbiAgICAgICAgXCJvZmZzZXRcIjogXCJudW1iZXJcIixcbiAgICAgICAgXCJkYXRhXCI6IFwiYXJyYXk6bnVsbGFibGU6c3RvcmFnZW9iamVjdFwiXG4gICAgICB9XG4gICAgfSxcbiAgICBcImlkYm9iamVjdFwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiZGljdFwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcImlkYm9iamVjdFwiLFxuICAgICAgXCJzcGVjaWFsaXphdGlvbnNcIjoge1xuICAgICAgICBcIm5hbWVcIjogXCJudWxsYWJsZTpzdHJpbmdcIixcbiAgICAgICAgXCJkYlwiOiBcIm51bGxhYmxlOnN0cmluZ1wiLFxuICAgICAgICBcIm9iamVjdFN0b3JlXCI6IFwibnVsbGFibGU6c3RyaW5nXCIsXG4gICAgICAgIFwib3JpZ2luXCI6IFwibnVsbGFibGU6c3RyaW5nXCIsXG4gICAgICAgIFwidmVyc2lvblwiOiBcIm51bGxhYmxlOm51bWJlclwiLFxuICAgICAgICBcIm9iamVjdFN0b3Jlc1wiOiBcIm51bGxhYmxlOm51bWJlclwiLFxuICAgICAgICBcImtleVBhdGhcIjogXCJudWxsYWJsZTpzdHJpbmdcIixcbiAgICAgICAgXCJhdXRvSW5jcmVtZW50XCI6IFwibnVsbGFibGU6Ym9vbGVhblwiLFxuICAgICAgICBcImluZGV4ZXNcIjogXCJudWxsYWJsZTpzdHJpbmdcIixcbiAgICAgICAgXCJ2YWx1ZVwiOiBcIm51bGxhYmxlOmxvbmdzdHJpbmdcIlxuICAgICAgfVxuICAgIH0sXG4gICAgXCJpZGJzdG9yZW9iamVjdFwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiZGljdFwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcImlkYnN0b3Jlb2JqZWN0XCIsXG4gICAgICBcInNwZWNpYWxpemF0aW9uc1wiOiB7XG4gICAgICAgIFwidG90YWxcIjogXCJudW1iZXJcIixcbiAgICAgICAgXCJvZmZzZXRcIjogXCJudW1iZXJcIixcbiAgICAgICAgXCJkYXRhXCI6IFwiYXJyYXk6bnVsbGFibGU6aWRib2JqZWN0XCJcbiAgICAgIH1cbiAgICB9LFxuICAgIFwic3RvcmVVcGRhdGVPYmplY3RcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImRpY3RcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJzdG9yZVVwZGF0ZU9iamVjdFwiLFxuICAgICAgXCJzcGVjaWFsaXphdGlvbnNcIjoge1xuICAgICAgICBcImNoYW5nZWRcIjogXCJudWxsYWJsZTpqc29uXCIsXG4gICAgICAgIFwiZGVsZXRlZFwiOiBcIm51bGxhYmxlOmpzb25cIixcbiAgICAgICAgXCJhZGRlZFwiOiBcIm51bGxhYmxlOmpzb25cIlxuICAgICAgfVxuICAgIH0sXG4gICAgXCJjb29raWVzXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcImNvb2tpZXNcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRTdG9yZU9iamVjdHNcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0U3RvcmVPYmplY3RzXCIsXG4gICAgICAgICAgICBcImhvc3RcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIm51bGxhYmxlOmFycmF5OnN0cmluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJvcHRpb25zXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDIsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIm51bGxhYmxlOmpzb25cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJjb29raWVzdG9yZW9iamVjdFwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge31cbiAgICB9LFxuICAgIFwibG9jYWxTdG9yYWdlXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcImxvY2FsU3RvcmFnZVwiLFxuICAgICAgXCJtZXRob2RzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdldFN0b3JlT2JqZWN0c1wiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRTdG9yZU9iamVjdHNcIixcbiAgICAgICAgICAgIFwiaG9zdFwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJwcmltaXRpdmVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibmFtZXNcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwibnVsbGFibGU6YXJyYXk6c3RyaW5nXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm9wdGlvbnNcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMixcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwibnVsbGFibGU6anNvblwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcInN0b3JhZ2VzdG9yZW9iamVjdFwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge31cbiAgICB9LFxuICAgIFwic2Vzc2lvblN0b3JhZ2VcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwic2Vzc2lvblN0b3JhZ2VcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRTdG9yZU9iamVjdHNcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0U3RvcmVPYmplY3RzXCIsXG4gICAgICAgICAgICBcImhvc3RcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIm51bGxhYmxlOmFycmF5OnN0cmluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJvcHRpb25zXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDIsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIm51bGxhYmxlOmpzb25cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJzdG9yYWdlc3RvcmVvYmplY3RcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZXZlbnRzXCI6IHt9XG4gICAgfSxcbiAgICBcImluZGV4ZWREQlwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiYWN0b3JcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJpbmRleGVkREJcIixcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRTdG9yZU9iamVjdHNcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0U3RvcmVPYmplY3RzXCIsXG4gICAgICAgICAgICBcImhvc3RcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5hbWVzXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIm51bGxhYmxlOmFycmF5OnN0cmluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJvcHRpb25zXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDIsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIm51bGxhYmxlOmpzb25cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJpZGJzdG9yZW9iamVjdFwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge31cbiAgICB9LFxuICAgIFwic3RvcmVsaXN0XCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJkaWN0XCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwic3RvcmVsaXN0XCIsXG4gICAgICBcInNwZWNpYWxpemF0aW9uc1wiOiB7XG4gICAgICAgIFwiY29va2llc1wiOiBcImNvb2tpZXNcIixcbiAgICAgICAgXCJsb2NhbFN0b3JhZ2VcIjogXCJsb2NhbFN0b3JhZ2VcIixcbiAgICAgICAgXCJzZXNzaW9uU3RvcmFnZVwiOiBcInNlc3Npb25TdG9yYWdlXCIsXG4gICAgICAgIFwiaW5kZXhlZERCXCI6IFwiaW5kZXhlZERCXCJcbiAgICAgIH1cbiAgICB9LFxuICAgIFwic3RvcmFnZVwiOiB7XG4gICAgICBcImNhdGVnb3J5XCI6IFwiYWN0b3JcIixcbiAgICAgIFwidHlwZU5hbWVcIjogXCJzdG9yYWdlXCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwibGlzdFN0b3Jlc1wiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJsaXN0U3RvcmVzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwic3RvcmVsaXN0XCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7XG4gICAgICAgIFwic3RvcmVzLXVwZGF0ZVwiOiB7XG4gICAgICAgICAgXCJ0eXBlXCI6IFwic3RvcmVzVXBkYXRlXCIsXG4gICAgICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RvcmVVcGRhdGVPYmplY3RcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzdG9yZXMtY2xlYXJlZFwiOiB7XG4gICAgICAgICAgXCJ0eXBlXCI6IFwic3RvcmVzQ2xlYXJlZFwiLFxuICAgICAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImpzb25cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzdG9yZXMtcmVsb2FkZWRcIjoge1xuICAgICAgICAgIFwidHlwZVwiOiBcInN0b3Jlc1JlbGFvZGVkXCIsXG4gICAgICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwianNvblwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBcImdjbGlcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwiZ2NsaVwiLFxuICAgICAgXCJtZXRob2RzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInNwZWNzXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInNwZWNzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwianNvblwiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZXhlY3V0ZVwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJleGVjdXRlXCIsXG4gICAgICAgICAgICBcInR5cGVkXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImpzb25cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInN0YXRlXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0YXRlXCIsXG4gICAgICAgICAgICBcInR5cGVkXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzdGFydFwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJudW1iZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmFua1wiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAyLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJudW1iZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJqc29uXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJ0eXBlcGFyc2VcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwidHlwZXBhcnNlXCIsXG4gICAgICAgICAgICBcInR5cGVkXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwYXJhbVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJqc29uXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJ0eXBlaW5jcmVtZW50XCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInR5cGVpbmNyZW1lbnRcIixcbiAgICAgICAgICAgIFwidHlwZWRcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInBhcmFtXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwidHlwZWRlY3JlbWVudFwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJ0eXBlZGVjcmVtZW50XCIsXG4gICAgICAgICAgICBcInR5cGVkXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwYXJhbVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJzdHJpbmdcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInNlbGVjdGlvbmluZm9cIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic2VsZWN0aW9uaW5mb1wiLFxuICAgICAgICAgICAgXCJ0eXBlZFwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicGFyYW1cIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImFjdGlvblwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAxLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJqc29uXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7fVxuICAgIH0sXG4gICAgXCJtZW1vcnlcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwibWVtb3J5XCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwibWVhc3VyZVwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJtZWFzdXJlXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwianNvblwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge31cbiAgICB9LFxuICAgIFwiZXZlbnRMb29wTGFnXCI6IHtcbiAgICAgIFwiY2F0ZWdvcnlcIjogXCJhY3RvclwiLFxuICAgICAgXCJ0eXBlTmFtZVwiOiBcImV2ZW50TG9vcExhZ1wiLFxuICAgICAgXCJtZXRob2RzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInN0YXJ0XCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0YXJ0XCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJzdWNjZXNzXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwibnVtYmVyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJzdG9wXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0b3BcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7fVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJldmVudHNcIjoge1xuICAgICAgICBcImV2ZW50LWxvb3AtbGFnXCI6IHtcbiAgICAgICAgICBcInR5cGVcIjogXCJldmVudC1sb29wLWxhZ1wiLFxuICAgICAgICAgIFwidGltZVwiOiB7XG4gICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBcInByZWZlcmVuY2VcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwicHJlZmVyZW5jZVwiLFxuICAgICAgXCJtZXRob2RzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImdldEJvb2xQcmVmXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldEJvb2xQcmVmXCIsXG4gICAgICAgICAgICBcInZhbHVlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwidmFsdWVcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJib29sZWFuXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRDaGFyUHJlZlwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRDaGFyUHJlZlwiLFxuICAgICAgICAgICAgXCJ2YWx1ZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJwcmltaXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcInZhbHVlXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJnZXRJbnRQcmVmXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldEludFByZWZcIixcbiAgICAgICAgICAgIFwidmFsdWVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJ2YWx1ZVwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcIm51bWJlclwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0QWxsUHJlZnNcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0QWxsUHJlZnNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcInZhbHVlXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwianNvblwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwic2V0Qm9vbFByZWZcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic2V0Qm9vbFByZWZcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJwcmltaXRpdmVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidmFsdWVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInNldENoYXJQcmVmXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInNldENoYXJQcmVmXCIsXG4gICAgICAgICAgICBcIm5hbWVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInZhbHVlXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDEsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJzZXRJbnRQcmVmXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInNldEludFByZWZcIixcbiAgICAgICAgICAgIFwibmFtZVwiOiB7XG4gICAgICAgICAgICAgIFwiX2FyZ1wiOiAwLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJwcmltaXRpdmVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidmFsdWVcIjoge1xuICAgICAgICAgICAgICBcIl9hcmdcIjogMSxcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicHJpbWl0aXZlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge31cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImNsZWFyVXNlclByZWZcIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiY2xlYXJVc2VyUHJlZlwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IHtcbiAgICAgICAgICAgICAgXCJfYXJnXCI6IDAsXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInByaW1pdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHt9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImV2ZW50c1wiOiB7fVxuICAgIH0sXG4gICAgXCJkZXZpY2VcIjoge1xuICAgICAgXCJjYXRlZ29yeVwiOiBcImFjdG9yXCIsXG4gICAgICBcInR5cGVOYW1lXCI6IFwiZGV2aWNlXCIsXG4gICAgICBcIm1ldGhvZHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0RGVzY3JpcHRpb25cIixcbiAgICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZ2V0RGVzY3JpcHRpb25cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcInZhbHVlXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwianNvblwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0V2FsbHBhcGVyXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImdldFdhbGxwYXBlclwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIFwidmFsdWVcIjoge1xuICAgICAgICAgICAgICBcIl9yZXR2YWxcIjogXCJsb25nc3RyaW5nXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJzY3JlZW5zaG90VG9EYXRhVVJMXCIsXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInNjcmVlbnNob3RUb0RhdGFVUkxcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBcInZhbHVlXCI6IHtcbiAgICAgICAgICAgICAgXCJfcmV0dmFsXCI6IFwibG9uZ3N0cmluZ1wiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2V0UmF3UGVybWlzc2lvbnNUYWJsZVwiLFxuICAgICAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJnZXRSYXdQZXJtaXNzaW9uc1RhYmxlXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgXCJ2YWx1ZVwiOiB7XG4gICAgICAgICAgICAgIFwiX3JldHZhbFwiOiBcImpzb25cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZXZlbnRzXCI6IHt9XG4gICAgfVxuICB9LFxuICBcImZyb21cIjogXCJyb290XCJcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgQ2xhc3MgPSByZXF1aXJlKFwiLi9jbGFzc1wiKS5DbGFzcztcbnZhciB1dGlsID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcbnZhciBrZXlzID0gdXRpbC5rZXlzO1xudmFyIHZhbHVlcyA9IHV0aWwudmFsdWVzO1xudmFyIHBhaXJzID0gdXRpbC5wYWlycztcbnZhciBxdWVyeSA9IHV0aWwucXVlcnk7XG52YXIgZmluZFBhdGggPSB1dGlsLmZpbmRQYXRoO1xudmFyIEV2ZW50VGFyZ2V0ID0gcmVxdWlyZShcIi4vZXZlbnRcIikuRXZlbnRUYXJnZXQ7XG5cbnZhciBUeXBlU3lzdGVtID0gQ2xhc3Moe1xuICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oY2xpZW50KSB7XG4gICAgdmFyIHR5cGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB2YXIgc3BlY2lmaWNhdGlvbiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICB0aGlzLnNwZWNpZmljYXRpb24gPSBzcGVjaWZpY2F0aW9uO1xuICAgIHRoaXMudHlwZXMgPSB0eXBlcztcblxuICAgIHZhciB0eXBlRm9yID0gZnVuY3Rpb24gdHlwZUZvcih0eXBlTmFtZSkge1xuICAgICAgdHlwZU5hbWUgPSB0eXBlTmFtZSB8fCBcInByaW1pdGl2ZVwiO1xuICAgICAgaWYgKCF0eXBlc1t0eXBlTmFtZV0pIHtcbiAgICAgICAgZGVmaW5lVHlwZSh0eXBlTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0eXBlc1t0eXBlTmFtZV07XG4gICAgfTtcbiAgICB0aGlzLnR5cGVGb3IgPSB0eXBlRm9yO1xuXG4gICAgdmFyIGRlZmluZVR5cGUgPSBmdW5jdGlvbihkZXNjcmlwdG9yKSB7XG4gICAgICB2YXIgdHlwZSA9IHZvaWQoMCk7XG4gICAgICBpZiAodHlwZW9mKGRlc2NyaXB0b3IpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGlmIChkZXNjcmlwdG9yLmluZGV4T2YoXCI6XCIpID4gMClcbiAgICAgICAgICB0eXBlID0gbWFrZUNvbXBvdW5kVHlwZShkZXNjcmlwdG9yKTtcbiAgICAgICAgZWxzZSBpZiAoZGVzY3JpcHRvci5pbmRleE9mKFwiI1wiKSA+IDApXG4gICAgICAgICAgdHlwZSA9IG5ldyBBY3RvckRldGFpbChkZXNjcmlwdG9yKTtcbiAgICAgICAgICBlbHNlIGlmIChzcGVjaWZpY2F0aW9uW2Rlc2NyaXB0b3JdKVxuICAgICAgICAgICAgdHlwZSA9IG1ha2VDYXRlZ29yeVR5cGUoc3BlY2lmaWNhdGlvbltkZXNjcmlwdG9yXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlID0gbWFrZUNhdGVnb3J5VHlwZShkZXNjcmlwdG9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGUpXG4gICAgICAgIHR5cGVzW3R5cGUubmFtZV0gPSB0eXBlO1xuICAgICAgZWxzZVxuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGU6IFwiICsgZGVzY3JpcHRvcik7XG4gICAgfTtcbiAgICB0aGlzLmRlZmluZVR5cGUgPSBkZWZpbmVUeXBlO1xuXG5cbiAgICB2YXIgbWFrZUNvbXBvdW5kVHlwZSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIHZhciBpbmRleCA9IG5hbWUuaW5kZXhPZihcIjpcIik7XG4gICAgICB2YXIgYmFzZVR5cGUgPSBuYW1lLnNsaWNlKDAsIGluZGV4KTtcbiAgICAgIHZhciBzdWJUeXBlID0gbmFtZS5zbGljZShpbmRleCArIDEpO1xuXG4gICAgICByZXR1cm4gYmFzZVR5cGUgPT09IFwiYXJyYXlcIiA/IG5ldyBBcnJheU9mKHN1YlR5cGUpIDpcbiAgICAgIGJhc2VUeXBlID09PSBcIm51bGxhYmxlXCIgPyBuZXcgTWF5YmUoc3ViVHlwZSkgOlxuICAgICAgbnVsbDtcbiAgICB9O1xuXG4gICAgdmFyIG1ha2VDYXRlZ29yeVR5cGUgPSBmdW5jdGlvbihkZXNjcmlwdG9yKSB7XG4gICAgICB2YXIgY2F0ZWdvcnkgPSBkZXNjcmlwdG9yLmNhdGVnb3J5O1xuICAgICAgcmV0dXJuIGNhdGVnb3J5ID09PSBcImRpY3RcIiA/IG5ldyBEaWN0aW9uYXJ5KGRlc2NyaXB0b3IpIDpcbiAgICAgIGNhdGVnb3J5ID09PSBcImFjdG9yXCIgPyBuZXcgQWN0b3IoZGVzY3JpcHRvcikgOlxuICAgICAgbnVsbDtcbiAgICB9O1xuXG4gICAgdmFyIHJlYWQgPSBmdW5jdGlvbihpbnB1dCwgY29udGV4dCwgdHlwZU5hbWUpIHtcbiAgICAgIHJldHVybiB0eXBlRm9yKHR5cGVOYW1lKS5yZWFkKGlucHV0LCBjb250ZXh0KTtcbiAgICB9XG4gICAgdGhpcy5yZWFkID0gcmVhZDtcblxuICAgIHZhciB3cml0ZSA9IGZ1bmN0aW9uKGlucHV0LCBjb250ZXh0LCB0eXBlTmFtZSkge1xuICAgICAgcmV0dXJuIHR5cGVGb3IodHlwZU5hbWUpLndyaXRlKGlucHV0KTtcbiAgICB9O1xuICAgIHRoaXMud3JpdGUgPSB3cml0ZTtcblxuXG4gICAgdmFyIFR5cGUgPSBDbGFzcyh7XG4gICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oKSB7XG4gICAgICB9LFxuICAgICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhdGVnb3J5ID8gdGhpcy5jYXRlZ29yeSArIFwiOlwiICsgdGhpcy50eXBlIDpcbiAgICAgICAgdGhpcy50eXBlO1xuICAgICAgfSxcbiAgICAgIHJlYWQ6IGZ1bmN0aW9uKGlucHV0LCBjb250ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJgVHlwZWAgc3ViY2xhc3MgbXVzdCBpbXBsZW1lbnQgYHJlYWRgXCIpO1xuICAgICAgfSxcbiAgICAgIHdyaXRlOiBmdW5jdGlvbihpbnB1dCwgY29udGV4dCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYFR5cGVgIHN1YmNsYXNzIG11c3QgaW1wbGVtZW50IGB3cml0ZWBcIik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB2YXIgUHJpbWl0dmUgPSBDbGFzcyh7XG4gICAgICBleHRlbmRzOiBUeXBlLFxuICAgICAgY29uc3R1Y3RvcjogZnVuY3Rpb24odHlwZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgfSxcbiAgICAgIHJlYWQ6IGZ1bmN0aW9uKGlucHV0LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgIH0sXG4gICAgICB3cml0ZTogZnVuY3Rpb24oaW5wdXQsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIE1heWJlID0gQ2xhc3Moe1xuICAgICAgZXh0ZW5kczogVHlwZSxcbiAgICAgIGNhdGVnb3J5OiBcIm51bGxhYmxlXCIsXG4gICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24odHlwZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgfSxcbiAgICAgIHJlYWQ6IGZ1bmN0aW9uKGlucHV0LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PT0gbnVsbCA/IG51bGwgOlxuICAgICAgICBpbnB1dCA9PT0gdm9pZCgwKSA/IHZvaWQoMCkgOlxuICAgICAgICByZWFkKGlucHV0LCBjb250ZXh0LCB0aGlzLnR5cGUpO1xuICAgICAgfSxcbiAgICAgIHdyaXRlOiBmdW5jdGlvbihpbnB1dCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgPT09IG51bGwgPyBudWxsIDpcbiAgICAgICAgaW5wdXQgPT09IHZvaWQoMCkgPyB2b2lkKDApIDpcbiAgICAgICAgd3JpdGUoaW5wdXQsIGNvbnRleHQsIHRoaXMudHlwZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB2YXIgQXJyYXlPZiA9IENsYXNzKHtcbiAgICAgIGV4dGVuZHM6IFR5cGUsXG4gICAgICBjYXRlZ29yeTogXCJhcnJheVwiLFxuICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgIH0sXG4gICAgICByZWFkOiBmdW5jdGlvbihpbnB1dCwgY29udGV4dCkge1xuICAgICAgICB2YXIgdHlwZSA9IHRoaXMudHlwZTtcbiAgICAgICAgcmV0dXJuIGlucHV0Lm1hcChmdW5jdGlvbigkKSB7IHJldHVybiByZWFkKCQsIGNvbnRleHQsIHR5cGUpIH0pO1xuICAgICAgfSxcbiAgICAgIHdyaXRlOiBmdW5jdGlvbihpbnB1dCwgY29udGV4dCkge1xuICAgICAgICB2YXIgdHlwZSA9IHRoaXMudHlwZTtcbiAgICAgICAgcmV0dXJuIGlucHV0Lm1hcChmdW5jdGlvbigkKSB7IHJldHVybiB3cml0ZSgkLCBjb250ZXh0LCB0eXBlKSB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHZhciBtYWtlRmllbGQgPSBmdW5jdGlvbiBtYWtlRmllbGQobmFtZSwgdHlwZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBuYW1lLCB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IHJlYWQodGhpcy5zdGF0ZVtuYW1lXSwgdGhpcy5jb250ZXh0LCB0eXBlKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0aGlzW25hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBtYWtlRmllbGRzID0gZnVuY3Rpb24oZGVzY3JpcHRvcikge1xuICAgICAgcmV0dXJuIHBhaXJzKGRlc2NyaXB0b3IpLnJlZHVjZShmdW5jdGlvbihmaWVsZHMsIHBhaXIpIHtcbiAgICAgICAgdmFyIG5hbWUgPSBwYWlyWzBdLCB0eXBlID0gcGFpclsxXTtcbiAgICAgICAgZmllbGRzW25hbWVdID0gbWFrZUZpZWxkKG5hbWUsIHR5cGUpO1xuICAgICAgICByZXR1cm4gZmllbGRzO1xuICAgICAgfSwge30pO1xuICAgIH1cblxuICAgIHZhciBEaWN0aW9uYXJ5VHlwZSA9IENsYXNzKHt9KTtcblxuICAgIHZhciBEaWN0aW9uYXJ5ID0gQ2xhc3Moe1xuICAgICAgZXh0ZW5kczogVHlwZSxcbiAgICAgIGNhdGVnb3J5OiBcImRpY3RcIixcbiAgICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy50eXBlOyB9LFxuICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRlc2NyaXB0b3IpIHtcbiAgICAgICAgdGhpcy50eXBlID0gZGVzY3JpcHRvci50eXBlTmFtZTtcbiAgICAgICAgdGhpcy50eXBlcyA9IGRlc2NyaXB0b3Iuc3BlY2lhbGl6YXRpb25zO1xuXG4gICAgICAgIHZhciBwcm90byA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHtcbiAgICAgICAgICBleHRlbmRzOiBEaWN0aW9uYXJ5VHlwZSxcbiAgICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oc3RhdGUsIGNvbnRleHQpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgICAgICAgc3RhdGU6IHtcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHN0YXRlXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjb250ZXh0XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgbWFrZUZpZWxkcyh0aGlzLnR5cGVzKSk7XG5cbiAgICAgICAgdGhpcy5jbGFzcyA9IG5ldyBDbGFzcyhwcm90byk7XG4gICAgICB9LFxuICAgICAgcmVhZDogZnVuY3Rpb24oaW5wdXQsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLmNsYXNzKGlucHV0LCBjb250ZXh0KTtcbiAgICAgIH0sXG4gICAgICB3cml0ZTogZnVuY3Rpb24oaW5wdXQsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIG91dHB1dCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gaW5wdXQpIHtcbiAgICAgICAgICBvdXRwdXRba2V5XSA9IHdyaXRlKHZhbHVlLCBjb250ZXh0LCB0eXBlc1trZXldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIG1ha2VNZXRob2RzID0gZnVuY3Rpb24oZGVzY3JpcHRvcnMpIHtcbiAgICAgIHJldHVybiBkZXNjcmlwdG9ycy5yZWR1Y2UoZnVuY3Rpb24obWV0aG9kcywgZGVzY3JpcHRvcikge1xuICAgICAgICBtZXRob2RzW2Rlc2NyaXB0b3IubmFtZV0gPSB7XG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIHZhbHVlOiBtYWtlTWV0aG9kKGRlc2NyaXB0b3IpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBtZXRob2RzO1xuICAgICAgfSwge30pO1xuICAgIH07XG5cbiAgICB2YXIgbWFrZUV2ZW50cyA9IGZ1bmN0aW9uKGRlc2NyaXB0b3JzKSB7XG4gICAgICByZXR1cm4gcGFpcnMoZGVzY3JpcHRvcnMpLnJlZHVjZShmdW5jdGlvbihldmVudHMsIHBhaXIpIHtcbiAgICAgICAgdmFyIG5hbWUgPSBwYWlyWzBdLCBkZXNjcmlwdG9yID0gcGFpclsxXTtcbiAgICAgICAgdmFyIGV2ZW50ID0gbmV3IEV2ZW50KG5hbWUsIGRlc2NyaXB0b3IpO1xuICAgICAgICBldmVudHNbZXZlbnQuZXZlbnRUeXBlXSA9IGV2ZW50O1xuICAgICAgICByZXR1cm4gZXZlbnRzO1xuICAgICAgfSwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgfTtcblxuICAgIHZhciBBY3RvciA9IENsYXNzKHtcbiAgICAgIGV4dGVuZHM6IFR5cGUsXG4gICAgICBjYXRlZ29yeTogXCJhY3RvclwiLFxuICAgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLnR5cGU7IH0sXG4gICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oZGVzY3JpcHRvcikge1xuICAgICAgICB0aGlzLnR5cGUgPSBkZXNjcmlwdG9yLnR5cGVOYW1lO1xuXG4gICAgICAgIHZhciBldmVudHMgPSBtYWtlRXZlbnRzKGRlc2NyaXB0b3IuZXZlbnRzIHx8IHt9KTtcbiAgICAgICAgdmFyIGZpZWxkcyA9IG1ha2VGaWVsZHMoZGVzY3JpcHRvci5maWVsZHMgfHwge30pO1xuICAgICAgICB2YXIgbWV0aG9kcyA9IG1ha2VNZXRob2RzKGRlc2NyaXB0b3IubWV0aG9kcyB8fCBbXSk7XG5cblxuICAgICAgICB2YXIgcHJvdG8gPSB7XG4gICAgICAgICAgZXh0ZW5kczogRnJvbnQsXG4gICAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgRnJvbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGV2ZW50czogZXZlbnRzXG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHByb3RvLCBmaWVsZHMpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhwcm90bywgbWV0aG9kcyk7XG5cbiAgICAgICAgdGhpcy5jbGFzcyA9IENsYXNzKHByb3RvKTtcbiAgICAgIH0sXG4gICAgICByZWFkOiBmdW5jdGlvbihpbnB1dCwgY29udGV4dCwgZGV0YWlsKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHR5cGVvZihpbnB1dCkgPT09IFwic3RyaW5nXCIgPyB7IGFjdG9yOiBpbnB1dCB9IDogaW5wdXQ7XG5cbiAgICAgICAgdmFyIGFjdG9yID0gY2xpZW50LmdldChzdGF0ZS5hY3RvcikgfHwgbmV3IHRoaXMuY2xhc3Moc3RhdGUsIGNvbnRleHQpO1xuICAgICAgICBhY3Rvci5mb3JtKHN0YXRlLCBkZXRhaWwsIGNvbnRleHQpO1xuXG4gICAgICAgIHJldHVybiBhY3RvcjtcbiAgICAgIH0sXG4gICAgICB3cml0ZTogZnVuY3Rpb24oaW5wdXQsIGNvbnRleHQsIGRldGFpbCkge1xuICAgICAgICByZXR1cm4gaW5wdXQuaWQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZXhwb3J0cy5BY3RvciA9IEFjdG9yO1xuXG5cbiAgICB2YXIgQWN0b3JEZXRhaWwgPSBDbGFzcyh7XG4gICAgICBleHRlbmRzOiBBY3RvcixcbiAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIHZhciBwYXJ0cyA9IG5hbWUuc3BsaXQoXCIjXCIpXG4gICAgICAgIHRoaXMuYWN0b3JUeXBlID0gcGFydHNbMF1cbiAgICAgICAgdGhpcy5kZXRhaWwgPSBwYXJ0c1sxXTtcbiAgICAgIH0sXG4gICAgICByZWFkOiBmdW5jdGlvbihpbnB1dCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdHlwZUZvcih0aGlzLmFjdG9yVHlwZSkucmVhZChpbnB1dCwgY29udGV4dCwgdGhpcy5kZXRhaWwpO1xuICAgICAgfSxcbiAgICAgIHdyaXRlOiBmdW5jdGlvbihpbnB1dCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdHlwZUZvcih0aGlzLmFjdG9yVHlwZSkud3JpdGUoaW5wdXQsIGNvbnRleHQsIHRoaXMuZGV0YWlsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBleHBvcnRzLkFjdG9yRGV0YWlsID0gQWN0b3JEZXRhaWw7XG5cbiAgICB2YXIgTWV0aG9kID0gQ2xhc3Moe1xuICAgICAgZXh0ZW5kczogVHlwZSxcbiAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihkZXNjcmlwdG9yKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IGRlc2NyaXB0b3IubmFtZTtcbiAgICAgICAgdGhpcy5wYXRoID0gZmluZFBhdGgoZGVzY3JpcHRvci5yZXNwb25zZSwgXCJfcmV0dmFsXCIpO1xuICAgICAgICB0aGlzLnJlc3BvbnNlVHlwZSA9IHRoaXMucGF0aCAmJiBxdWVyeShkZXNjcmlwdG9yLnJlc3BvbnNlLCB0aGlzLnBhdGgpLl9yZXR2YWw7XG4gICAgICAgIHRoaXMucmVxdWVzdFR5cGUgPSBkZXNjcmlwdG9yLnJlcXVlc3QudHlwZTtcblxuICAgICAgICB2YXIgcGFyYW1zID0gW107XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBkZXNjcmlwdG9yLnJlcXVlc3QpIHtcbiAgICAgICAgICBpZiAoa2V5ICE9PSBcInR5cGVcIikge1xuICAgICAgICAgICAgdmFyIHBhcmFtID0gZGVzY3JpcHRvci5yZXF1ZXN0W2tleV07XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBcIl9hcmdcIiBpbiBwYXJhbSA/IHBhcmFtLl9hcmcgOiBwYXJhbS5fb3B0aW9uO1xuICAgICAgICAgICAgdmFyIGlzUGFyYW0gPSBwYXJhbS5fb3B0aW9uID09PSBpbmRleDtcbiAgICAgICAgICAgIHZhciBpc0FyZ3VtZW50ID0gcGFyYW0uX2FyZyA9PT0gaW5kZXg7XG4gICAgICAgICAgICBwYXJhbXNbaW5kZXhdID0ge1xuICAgICAgICAgICAgICB0eXBlOiBwYXJhbS50eXBlLFxuICAgICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgICBpc1BhcmFtOiBpc1BhcmFtLFxuICAgICAgICAgICAgICBpc0FyZ3VtZW50OiBpc0FyZ3VtZW50XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICAgIH0sXG4gICAgICByZWFkOiBmdW5jdGlvbihpbnB1dCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gcmVhZChxdWVyeShpbnB1dCwgdGhpcy5wYXRoKSwgY29udGV4dCwgdGhpcy5yZXNwb25zZVR5cGUpO1xuICAgICAgfSxcbiAgICAgIHdyaXRlOiBmdW5jdGlvbihpbnB1dCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJhbXMucmVkdWNlKGZ1bmN0aW9uKHJlc3VsdCwgcGFyYW0pIHtcbiAgICAgICAgICByZXN1bHRbcGFyYW0ua2V5XSA9IHdyaXRlKGlucHV0W3BhcmFtLmluZGV4XSwgY29udGV4dCwgcGFyYW0udHlwZSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSwge3R5cGU6IHRoaXMudHlwZX0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGV4cG9ydHMuTWV0aG9kID0gTWV0aG9kO1xuXG4gICAgdmFyIHByb2ZpbGVyID0gZnVuY3Rpb24obWV0aG9kLCBpZCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSBuZXcgRGF0ZSgpO1xuICAgICAgICByZXR1cm4gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICB2YXIgZW5kID0gbmV3IERhdGUoKTtcbiAgICAgICAgICBjbGllbnQudGVsZW1ldHJ5LmFkZChpZCwgK2VuZCAtIHN0YXJ0KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHZhciBkZXN0cnVjdG9yID0gZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGhpcywgYXJndW1lbnRzKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIGNsaWVudC5yZWxlYXNlKHRoaXMpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbWFrZU1ldGhvZChkZXNjcmlwdG9yKSB7XG4gICAgICB2YXIgdHlwZSA9IG5ldyBNZXRob2QoZGVzY3JpcHRvcik7XG4gICAgICB2YXIgbWV0aG9kID0gZGVzY3JpcHRvci5vbmV3YXkgPyBtYWtlVW5pZGlyZWNhdGlvbmFsTWV0aG9kKGRlc2NyaXB0b3IsIHR5cGUpIDpcbiAgICAgICAgICAgICAgICAgICBtYWtlQmlkaXJlY3Rpb25hbE1ldGhvZChkZXNjcmlwdG9yLCB0eXBlKTtcblxuICAgICAgaWYgKGRlc2NyaXB0b3IudGVsZW1ldHJ5KVxuICAgICAgICBtZXRob2QgPSBwcm9maWxlcihtZXRob2QpO1xuICAgICAgaWYgKGRlc2NyaXB0b3IucmVsZWFzZSlcbiAgICAgICAgbWV0aG9kID0gZGVzdHJ1Y3RvcihtZXRob2QpO1xuXG4gICAgICByZXR1cm4gbWV0aG9kO1xuICAgIH1cblxuICAgIHZhciBtYWtlVW5pZGlyZWNhdGlvbmFsTWV0aG9kID0gZnVuY3Rpb24oZGVzY3JpcHRvciwgdHlwZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgcGFja2V0ID0gdHlwZS53cml0ZShhcmd1bWVudHMsIHRoaXMpO1xuICAgICAgICBwYWNrZXQudG8gPSB0aGlzLmlkO1xuICAgICAgICBjbGllbnQuc2VuZChwYWNrZXQpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZvaWQoMCkpO1xuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdmFyIG1ha2VCaWRpcmVjdGlvbmFsTWV0aG9kID0gZnVuY3Rpb24oZGVzY3JpcHRvciwgdHlwZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgdmFyIHBhY2tldCA9IHR5cGUud3JpdGUoYXJndW1lbnRzLCBjb250ZXh0KTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIHBhY2tldC50byA9IHRoaXMuaWQ7XG4gICAgICAgIHJldHVybiBjbGllbnQucmVxdWVzdChwYWNrZXQpLnRoZW4oZnVuY3Rpb24ocGFja2V0KSB7XG4gICAgICAgICAgcmV0dXJuIHR5cGUucmVhZChwYWNrZXQsIGNvbnRleHQpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHZhciBFdmVudCA9IENsYXNzKHtcbiAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihuYW1lLCBkZXNjcmlwdG9yKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IGRlc2NyaXB0b3IudHlwZSB8fCBuYW1lO1xuICAgICAgICB0aGlzLmV2ZW50VHlwZSA9IGRlc2NyaXB0b3IudHlwZSB8fCBuYW1lO1xuICAgICAgICB0aGlzLnR5cGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgICAgICB2YXIgdHlwZXMgPSB0aGlzLnR5cGVzO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGVzY3JpcHRvcikge1xuICAgICAgICAgIGlmIChrZXkgPT09IFwidHlwZVwiKSB7XG4gICAgICAgICAgICB0eXBlc1trZXldID0gXCJzdHJpbmdcIjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHlwZXNba2V5XSA9IGRlc2NyaXB0b3Jba2V5XS50eXBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHJlYWQ6IGZ1bmN0aW9uKGlucHV0LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSB7fTtcbiAgICAgICAgdmFyIHR5cGVzID0gdGhpcy50eXBlcztcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGlucHV0KSB7XG4gICAgICAgICAgb3V0cHV0W2tleV0gPSByZWFkKGlucHV0W2tleV0sIGNvbnRleHQsIHR5cGVzW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICB9LFxuICAgICAgd3JpdGU6IGZ1bmN0aW9uKGlucHV0LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSB7fTtcbiAgICAgICAgdmFyIHR5cGVzID0gdGhpcy50eXBlcztcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMudHlwZXMpIHtcbiAgICAgICAgICBvdXRwdXRba2V5XSA9IHdyaXRlKGlucHV0W2tleV0sIGNvbnRleHQsIHR5cGVzW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB2YXIgRnJvbnQgPSBDbGFzcyh7XG4gICAgICBleHRlbmRzOiBFdmVudFRhcmdldCxcbiAgICAgIEV2ZW50VGFyZ2V0OiBFdmVudFRhcmdldCxcbiAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihzdGF0ZSkge1xuICAgICAgICB0aGlzLkV2ZW50VGFyZ2V0KCk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsICB7XG4gICAgICAgICAgc3RhdGU6IHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogc3RhdGVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNsaWVudC5yZWdpc3Rlcih0aGlzKTtcbiAgICAgIH0sXG4gICAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmFjdG9yO1xuICAgICAgfSxcbiAgICAgIGdldCBjb250ZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICBmb3JtOiBmdW5jdGlvbihzdGF0ZSwgZGV0YWlsLCBjb250ZXh0KSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICAgIGlmIChkZXRhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVbZGV0YWlsXSA9IHN0YXRlW2RldGFpbF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhaXJzKHN0YXRlKS5mb3JFYWNoKGZ1bmN0aW9uKHBhaXIpIHtcbiAgICAgICAgICAgICAgdmFyIGtleSA9IHBhaXJbMF0sIHZhbHVlID0gcGFpclsxXTtcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dCkge1xuICAgICAgICAgIGNsaWVudC5zdXBlcnZpc2UoY29udGV4dCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICByZXF1ZXN0VHlwZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gY2xpZW50LnJlcXVlc3Qoe1xuICAgICAgICAgIHRvOiB0aGlzLmlkLFxuICAgICAgICAgIHR5cGU6IFwicmVxdWVzdFR5cGVzXCJcbiAgICAgICAgfSkudGhlbihmdW5jdGlvbihwYWNrZXQpIHtcbiAgICAgICAgICByZXR1cm4gcGFja2V0LnJlcXVlc3RUeXBlcztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdHlwZXMucHJpbWl0aXZlID0gbmV3IFByaW1pdHZlKFwicHJpbWl0aXZlXCIpO1xuICAgIHR5cGVzLnN0cmluZyA9IG5ldyBQcmltaXR2ZShcInN0cmluZ1wiKTtcbiAgICB0eXBlcy5udW1iZXIgPSBuZXcgUHJpbWl0dmUoXCJudW1iZXJcIik7XG4gICAgdHlwZXMuYm9vbGVhbiA9IG5ldyBQcmltaXR2ZShcImJvb2xlYW5cIik7XG4gICAgdHlwZXMuanNvbiA9IG5ldyBQcmltaXR2ZShcImpzb25cIik7XG4gICAgdHlwZXMuYXJyYXkgPSBuZXcgUHJpbWl0dmUoXCJhcnJheVwiKTtcbiAgfSxcbiAgcmVnaXN0ZXJUeXBlczogZnVuY3Rpb24oZGVzY3JpcHRvcikge1xuICAgIHZhciBzcGVjaWZpY2F0aW9uID0gdGhpcy5zcGVjaWZpY2F0aW9uO1xuICAgIHZhbHVlcyhkZXNjcmlwdG9yLnR5cGVzKS5mb3JFYWNoKGZ1bmN0aW9uKGRlc2NyaXB0b3IpIHtcbiAgICAgIHNwZWNpZmljYXRpb25bZGVzY3JpcHRvci50eXBlTmFtZV0gPSBkZXNjcmlwdG9yO1xuICAgIH0pO1xuICB9XG59KTtcbmV4cG9ydHMuVHlwZVN5c3RlbSA9IFR5cGVTeXN0ZW07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGtleXMgPSBPYmplY3Qua2V5cztcbmV4cG9ydHMua2V5cyA9IGtleXM7XG5cbi8vIFJldHVybnMgYXJyYXkgb2YgdmFsdWVzIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LlxudmFyIHZhbHVlcyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICByZXR1cm4ga2V5cyhvYmplY3QpLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0W2tleV1cbiAgfSk7XG59O1xuZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXM7XG5cbi8vIFJldHVybnMgW2tleSwgdmFsdWVdIHBhaXJzIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LlxudmFyIHBhaXJzID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gIHJldHVybiBrZXlzKG9iamVjdCkubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBba2V5LCBvYmplY3Rba2V5XV1cbiAgfSk7XG59O1xuZXhwb3J0cy5wYWlycyA9IHBhaXJzO1xuXG5cbi8vIFF1ZXJpZXMgYW4gb2JqZWN0IGZvciB0aGUgZmllbGQgbmVzdGVkIHdpdGggaW4gaXQuXG52YXIgcXVlcnkgPSBmdW5jdGlvbihvYmplY3QsIHBhdGgpIHtcbiAgcmV0dXJuIHBhdGgucmVkdWNlKGZ1bmN0aW9uKG9iamVjdCwgZW50cnkpIHtcbiAgICByZXR1cm4gb2JqZWN0ICYmIG9iamVjdFtlbnRyeV1cbiAgfSwgb2JqZWN0KTtcbn07XG5leHBvcnRzLnF1ZXJ5ID0gcXVlcnk7XG5cbnZhciBpc09iamVjdCA9IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHggJiYgdHlwZW9mKHgpID09PSBcIm9iamVjdFwiXG59XG5cbnZhciBmaW5kUGF0aCA9IGZ1bmN0aW9uKG9iamVjdCwga2V5KSB7XG4gIHZhciBwYXRoID0gdm9pZCgwKTtcbiAgaWYgKG9iamVjdCAmJiB0eXBlb2Yob2JqZWN0KSA9PT0gXCJvYmplY3RcIikge1xuICAgIHZhciBuYW1lcyA9IGtleXMob2JqZWN0KTtcbiAgICBpZiAobmFtZXMuaW5kZXhPZihrZXkpID49IDApIHtcbiAgICAgIHBhdGggPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgIHZhciBjb3VudCA9IG5hbWVzLmxlbmd0aDtcbiAgICAgIHdoaWxlIChpbmRleCA8IGNvdW50ICYmICFwYXRoKXtcbiAgICAgICAgdmFyIGhlYWQgPSBuYW1lc1tpbmRleF07XG4gICAgICAgIHZhciB0YWlsID0gZmluZFBhdGgob2JqZWN0W2hlYWRdLCBrZXkpO1xuICAgICAgICBwYXRoID0gdGFpbCA/IFtoZWFkXS5jb25jYXQodGFpbCkgOiB0YWlsO1xuICAgICAgICBpbmRleCA9IGluZGV4ICsgMVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcGF0aDtcbn07XG5leHBvcnRzLmZpbmRQYXRoID0gZmluZFBhdGg7XG4iXX0= (1) }); diff --git a/addon-sdk/source/lib/framescript/LoaderHelper.jsm b/addon-sdk/source/lib/framescript/LoaderHelper.jsm new file mode 100644 index 00000000000..baf60f69373 --- /dev/null +++ b/addon-sdk/source/lib/framescript/LoaderHelper.jsm @@ -0,0 +1,33 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +"use strict"; + +const { utils: Cu, classes: Cc, interfaces: Ci } = Components; +const { Loader } = Cu.import('resource://gre/modules/commonjs/toolkit/loader.js', {}); +const cpmm = Cc['@mozilla.org/childprocessmessagemanager;1'].getService(Ci.nsISyncMessageSender); + +// one Loader instance per addon (per @loader/options to be precise) +let addons = new Map(); + +cpmm.addMessageListener('sdk/loader/unload', ({ data: options }) => { + let key = JSON.stringify(options); + let addon = addons.get(key); + if (addon) + addon.loader.unload(); + addons.delete(key); +}) + +// create a Loader instance from @loader/options +function loader(options) { + let key = JSON.stringify(options); + let addon = addons.get(key) || {}; + if (!addon.loader) { + addon.loader = Loader.Loader(options); + addon.require = Loader.Require(addon.loader, { id: 'LoaderHelper' }); + addons.set(key, addon); + } + return addon; +} + +const EXPORTED_SYMBOLS = ['loader']; diff --git a/addon-sdk/source/lib/framescript/tab-events.js b/addon-sdk/source/lib/framescript/tab-events.js index 669c6312e05..bd31939b925 100644 --- a/addon-sdk/source/lib/framescript/tab-events.js +++ b/addon-sdk/source/lib/framescript/tab-events.js @@ -3,8 +3,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; -const observerSvc = Components.classes["@mozilla.org/observer-service;1"]. - getService(Components.interfaces.nsIObserverService); +const { classes: Cc, interfaces: Ci, utils: Cu } = Components; +const observerSvc = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService); // map observer topics to tab event names const EVENTS = { @@ -32,3 +32,20 @@ addEventListener('pageshow', ({ target, type, persisted }) => { if (target === content.document) sendAsyncMessage('sdk/tab/event', { type, persisted }); }, true); + + +// workers for windows in this tab +let keepAlive = new Map(); + +addMessageListener('sdk/worker/create', ({ data: { options, addon }}) => { + options.manager = this; + let { loader } = Cu.import(addon.paths[''] + 'framescript/LoaderHelper.jsm', {}); + let { WorkerChild } = loader(addon).require('sdk/content/worker-child'); + sendAsyncMessage('sdk/worker/attach', { id: options.id }); + keepAlive.set(options.id, new WorkerChild(options)); +}) + +addMessageListener('sdk/worker/event', ({ data: { id, args: [event]}}) => { + if (event === 'detach') + keepAlive.delete(id); +}) diff --git a/addon-sdk/source/lib/sdk/base64.js b/addon-sdk/source/lib/sdk/base64.js index e96dd8534ea..6eaa175a2dc 100644 --- a/addon-sdk/source/lib/sdk/base64.js +++ b/addon-sdk/source/lib/sdk/base64.js @@ -29,14 +29,15 @@ function isUTF8(charset) { exports.decode = function (data, charset) { if (isUTF8(charset)) - return decodeURIComponent(escape(atob(data))) + return decodeURIComponent(escape(atob(data))) - return atob(data); + return atob(data); } exports.encode = function (data, charset) { if (isUTF8(charset)) return btoa(unescape(encodeURIComponent(data))) - return btoa(data); + data = String.fromCharCode(...[(c.charCodeAt(0) & 0xff) for (c of data)]); + return btoa(data); } diff --git a/addon-sdk/source/lib/sdk/clipboard.js b/addon-sdk/source/lib/sdk/clipboard.js index 8e1ca9874e3..f3e71b06561 100644 --- a/addon-sdk/source/lib/sdk/clipboard.js +++ b/addon-sdk/source/lib/sdk/clipboard.js @@ -8,7 +8,8 @@ module.metadata = { "stability": "stable", "engines": { // TODO Fennec Support 789757 - "Firefox": "*" + "Firefox": "*", + "SeaMonkey": "*" } }; diff --git a/addon-sdk/source/lib/sdk/content/content-worker.js b/addon-sdk/source/lib/sdk/content/content-worker.js index 4fef8c84307..3be3477a69e 100644 --- a/addon-sdk/source/lib/sdk/content/content-worker.js +++ b/addon-sdk/source/lib/sdk/content/content-worker.js @@ -280,36 +280,6 @@ Object.freeze({ Object.defineProperty(exports, "self", { value: self }); - - exports.on = function deprecatedOn() { - console.error("DEPRECATED: The global `on()` function in content " + - "scripts is deprecated in favor of the `self.on()` " + - "function, which works the same. Replace calls to `on()` " + - "with calls to `self.on()`" + - "For more info on `self.on`, see " + - "."); - return self.on.apply(null, arguments); - }; - - // Deprecated use of `onMessage` from globals - let onMessage = null; - Object.defineProperty(exports, "onMessage", { - get: function () onMessage, - set: function (v) { - if (onMessage) - self.removeListener("message", onMessage); - console.error("DEPRECATED: The global `onMessage` function in content" + - "scripts is deprecated in favor of the `self.on()` " + - "function. Replace `onMessage = function (data){}` " + - "definitions with calls to `self.on('message', " + - "function (data){})`. " + - "For more info on `self.on`, see " + - "."); - onMessage = v; - if (typeof onMessage == "function") - self.on("message", onMessage); - } - }); }, injectOptions: function (exports, options) { diff --git a/addon-sdk/source/lib/sdk/content/thumbnail.js b/addon-sdk/source/lib/sdk/content/thumbnail.js index 9e57274ccda..783615fc636 100644 --- a/addon-sdk/source/lib/sdk/content/thumbnail.js +++ b/addon-sdk/source/lib/sdk/content/thumbnail.js @@ -44,3 +44,8 @@ exports.getThumbnailCanvasForWindow = getThumbnailCanvasForWindow; exports.getThumbnailURIForWindow = function getThumbnailURIForWindow(window) { return getThumbnailCanvasForWindow(window).toDataURL() }; + +// default 80x45 blank when not available +exports.BLANK = 'data:image/png;base64,' + + 'iVBORw0KGgoAAAANSUhEUgAAAFAAAAAtCAYAAAA5reyyAAAAJElEQVRoge3BAQ'+ + 'EAAACCIP+vbkhAAQAAAAAAAAAAAAAAAADXBjhtAAGQ0AF/AAAAAElFTkSuQmCC'; diff --git a/addon-sdk/source/lib/sdk/content/worker-child.js b/addon-sdk/source/lib/sdk/content/worker-child.js new file mode 100644 index 00000000000..3e80c5ab8b8 --- /dev/null +++ b/addon-sdk/source/lib/sdk/content/worker-child.js @@ -0,0 +1,88 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +'use strict'; + +const { merge } = require('../util/object'); +const { Class } = require('../core/heritage'); +const { EventTarget } = require('../event/target'); +const { getInnerId, getByInnerId } = require('../window/utils'); +const { instanceOf, isObject } = require('../lang/type'); +const { on: observe } = require('../system/events'); +const { WorkerSandbox } = require('./sandbox'); +const { Ci } = require('chrome'); + +const EVENTS = { + 'chrome-page-shown': 'pageshow', + 'content-page-shown': 'pageshow', + 'chrome-page-hidden': 'pagehide', + 'content-page-hidden': 'pagehide', + 'inner-window-destroyed': 'detach', +} + +const WorkerChild = Class({ + implements: [EventTarget], + initialize(options) { + merge(this, options); + + this.port = EventTarget(); + this.port.on('*', this.send.bind(this, 'event')); + this.on('*', this.send.bind(this)); + + this.observe = this.observe.bind(this); + + for (let topic in EVENTS) + observe(topic, this.observe); + + this.receive = this.receive.bind(this); + this.manager.addMessageListener('sdk/worker/message', this.receive); + + this.sandbox = WorkerSandbox(this, getByInnerId(this.window)); + }, + // messages + receive({ data: { id, args }}) { + if (id !== this.id) + return; + this.sandbox.emit(...args); + if (args[0] === 'detach') + this.destroy(args[1]); + }, + send(...args) { + args = JSON.parse(JSON.stringify(args, exceptions)); + if (this.manager.content) + this.manager.sendAsyncMessage('sdk/worker/event', { id: this.id, args }); + }, + // notifications + observe({ type, subject }) { + if (!this.sandbox) + return; + if (subject.defaultView && getInnerId(subject.defaultView) === this.window) { + this.sandbox.emitSync(EVENTS[type]); + this.send(EVENTS[type]); + } + if (type === 'inner-window-destroyed' && + subject.QueryInterface(Ci.nsISupportsPRUint64).data === this.window) { + this.destroy(); + } + }, + // detach/destroy: unload and release the sandbox + destroy(reason) { + if (!this.sandbox) + return; + if (this.manager.content) + this.manager.removeMessageListener('sdk/worker/message', this.receive); + this.sandbox.destroy(reason); + this.sandbox = null; + this.send('detach'); + } +}) +exports.WorkerChild = WorkerChild; + +// Error instances JSON poorly +function exceptions(key, value) { + if (!isObject(value) || !instanceOf(value, Error)) + return value; + let _errorType = value.constructor.name; + let { message, fileName, lineNumber, stack, name } = value; + return { _errorType, message, fileName, lineNumber, stack, name }; +} diff --git a/addon-sdk/source/lib/sdk/content/worker-parent.js b/addon-sdk/source/lib/sdk/content/worker-parent.js new file mode 100644 index 00000000000..a129fc43dc7 --- /dev/null +++ b/addon-sdk/source/lib/sdk/content/worker-parent.js @@ -0,0 +1,184 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +"use strict"; + +module.metadata = { + "stability": "unstable" +}; + +const { emit } = require('../event/core'); +const { omit } = require('../util/object'); +const { Class } = require('../core/heritage'); +const { method } = require('../lang/functional'); +const { getInnerId } = require('../window/utils'); +const { EventTarget } = require('../event/target'); +const { when, ensure } = require('../system/unload'); +const { getTabForWindow } = require('../tabs/helpers'); +const { getTabForContentWindow, getBrowserForTab } = require('../tabs/utils'); +const { isPrivate } = require('../private-browsing/utils'); +const { getFrameElement } = require('../window/utils'); +const { attach, detach, destroy } = require('./utils'); +const { on: observe } = require('../system/events'); +const { uuid } = require('../util/uuid'); +const { Ci, Cc } = require('chrome'); + +const ppmm = Cc["@mozilla.org/parentprocessmessagemanager;1"]. + getService(Ci.nsIMessageBroadcaster); + +// null-out cycles in .modules to make @loader/options JSONable +const ADDON = omit(require('@loader/options'), ['modules', 'globals']); + +const workers = new WeakMap(); +let modelFor = (worker) => workers.get(worker); + +const ERR_DESTROYED = "Couldn't find the worker to receive this message. " + + "The script may not be initialized yet, or may already have been unloaded."; + +const ERR_FROZEN = "The page is currently hidden and can no longer be used " + + "until it is visible again."; + +// a handle for communication between content script and addon code +const Worker = Class({ + implements: [EventTarget], + initialize(options = {}) { + + let model = { + inited: false, + earlyEvents: [], // fired before worker was inited + frozen: true, // document is in BFcache, let it go + options, + }; + workers.set(this, model); + + ensure(this, 'destroy'); + this.on('detach', this.detach); + EventTarget.prototype.initialize.call(this, options); + + this.receive = this.receive.bind(this); + + model.observe = ({ subject }) => { + let id = subject.QueryInterface(Ci.nsISupportsPRUint64).data; + if (model.window && getInnerId(model.window) === id) + this.detach(); + } + + observe('inner-window-destroyed', model.observe); + + this.port = EventTarget(); + this.port.emit = this.send.bind(this, 'event'); + this.postMessage = this.send.bind(this, 'message'); + + if ('window' in options) + attach(this, options.window); + }, + // messages + receive({ data: { id, args }}) { + let model = modelFor(this); + if (id !== model.id || !model.childWorker) + return; + if (args[0] === 'event') + emit(this.port, ...args.slice(1)) + else + emit(this, ...args); + }, + send(...args) { + let model = modelFor(this); + if (!model.inited) { + model.earlyEvents.push(args); + return; + } + if (!model.childWorker && args[0] !== 'detach') + throw new Error(ERR_DESTROYED); + if (model.frozen && args[0] !== 'detach') + throw new Error(ERR_FROZEN); + try { + model.manager.sendAsyncMessage('sdk/worker/message', { id: model.id, args }); + } catch (e) { + // + } + }, + // properties + get url() { + let { window } = modelFor(this); + return window && window.document.location.href; + }, + get contentURL() { + let { window } = modelFor(this); + return window && window.document.URL; + }, + get tab() { + let { window } = modelFor(this); + return window && getTabForWindow(window); + }, + toString: () => '[object Worker]', + // methods + attach: method(attach), + detach: method(detach), + destroy: method(destroy), +}) +exports.Worker = Worker; + +attach.define(Worker, function(worker, window) { + let model = modelFor(worker); + + model.window = window; + model.options.window = getInnerId(window); + model.id = model.options.id = String(uuid()); + + let tab = getTabForContentWindow(window); + if (tab) { + model.manager = getBrowserForTab(tab).messageManager; + } else { + model.manager = getFrameElement(window.top).frameLoader.messageManager; + } + + model.manager.addMessageListener('sdk/worker/event', worker.receive); + model.manager.addMessageListener('sdk/worker/attach', attach); + + model.manager.sendAsyncMessage('sdk/worker/create', { + options: model.options, + addon: ADDON + }); + + function attach({ data }) { + if (data.id !== model.id) + return; + model.manager.removeMessageListener('sdk/worker/attach', attach); + model.childWorker = true; + + worker.on('pageshow', () => model.frozen = false); + worker.on('pagehide', () => model.frozen = true); + + model.inited = true; + model.frozen = false; + + model.earlyEvents.forEach(args => worker.send(...args)); + emit(worker, 'attach', window); + } +}) + +// unload and release the child worker, release window reference +detach.define(Worker, function(worker, reason) { + let model = modelFor(worker); + worker.send('detach', reason); + if (!model.childWorker) + return; + + model.childWorker = null; + model.earlyEvents = []; + model.window = null; + emit(worker, 'detach'); + model.manager.removeMessageListener('sdk/worker/event', this.receive); +}) + +isPrivate.define(Worker, ({ tab }) => isPrivate(tab)); + +// unlod worker, release references +destroy.define(Worker, function(worker, reason) { + detach(worker, reason); + modelFor(worker).inited = true; +}) + +// unload Loaders used for creating WorkerChild instances in each process +when(() => ppmm.broadcastAsyncMessage('sdk/loader/unload', { data: ADDON })); diff --git a/addon-sdk/source/lib/sdk/context-menu.js b/addon-sdk/source/lib/sdk/context-menu.js index 4fe0baffc66..1d53508e107 100644 --- a/addon-sdk/source/lib/sdk/context-menu.js +++ b/addon-sdk/source/lib/sdk/context-menu.js @@ -7,7 +7,8 @@ module.metadata = { "stability": "stable", "engines": { // TODO Fennec support Bug 788334 - "Firefox": "*" + "Firefox": "*", + "SeaMonkey": "*" } }; diff --git a/addon-sdk/source/lib/sdk/core/heritage.js b/addon-sdk/source/lib/sdk/core/heritage.js index 3dd98a2841a..fc87ba1f5dd 100644 --- a/addon-sdk/source/lib/sdk/core/heritage.js +++ b/addon-sdk/source/lib/sdk/core/heritage.js @@ -8,7 +8,8 @@ module.metadata = { }; var getPrototypeOf = Object.getPrototypeOf; -var getNames = Object.getOwnPropertyNames; +var getNames = x => [...Object.getOwnPropertyNames(x), + ...Object.getOwnPropertySymbols(x)]; var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; var create = Object.create; var freeze = Object.freeze; diff --git a/addon-sdk/source/lib/sdk/core/promise.js b/addon-sdk/source/lib/sdk/core/promise.js index 9a2256f5c49..7c96f02cf5d 100644 --- a/addon-sdk/source/lib/sdk/core/promise.js +++ b/addon-sdk/source/lib/sdk/core/promise.js @@ -58,9 +58,9 @@ let promised = (function() { promise.then(console.log) // => [ 1, 2, 3 ] **/ - return function promised() { + return function promised(...args) { // create array of [ f, this, args... ] - return concat.apply([ f, this ], arguments). + return [f, this, ...args]. // reduce it via `promisedConcat` to get promised array of fulfillments reduce(promisedConcat, resolve([], prototype)). // finally map that to promise of `f.apply(this, args...)` diff --git a/addon-sdk/source/lib/sdk/deprecated/cortex.js b/addon-sdk/source/lib/sdk/deprecated/cortex.js index 95d4e53843a..f06c9c10a25 100644 --- a/addon-sdk/source/lib/sdk/deprecated/cortex.js +++ b/addon-sdk/source/lib/sdk/deprecated/cortex.js @@ -8,6 +8,10 @@ module.metadata = { "stability": "deprecated" }; +const getOwnIdentifiers = x => [...Object.getOwnPropertyNames(x), + ...Object.getOwnPropertySymbols(x)]; + + // `var` is being used in the module in order to make it reusable in // environments in which `let` and `const` is not yet supported. @@ -46,7 +50,7 @@ function createAliasProperty(object, name) { descriptor.get = property.get.bind(object); if ("set" in property && property.set) descriptor.set = property.set.bind(object); - + // If original property was a value property. if ("value" in property) { // If original property is a method using it's `object` bounded copy. @@ -104,8 +108,8 @@ exports.Cortex = function Cortex(object, names, prototype) { // properties of the original `object` that are contained in `names` array. // If `names` array is not provided then all the properties that don't // start with `"_"` are aliased. - Object.getOwnPropertyNames(object).forEach(function (name) { - if ((!names && "_" !== name.charAt(0)) || (names && ~names.indexOf(name))) + getOwnIdentifiers(object).forEach(function (name) { + if ((!names && "_" !== name.toString().charAt(0)) || (names && ~names.indexOf(name))) defineAlias(object, cortex, name); }); return cortex; diff --git a/addon-sdk/source/lib/sdk/deprecated/list.js b/addon-sdk/source/lib/sdk/deprecated/list.js index f2f6385c29c..1fa6847604e 100644 --- a/addon-sdk/source/lib/sdk/deprecated/list.js +++ b/addon-sdk/source/lib/sdk/deprecated/list.js @@ -8,7 +8,6 @@ module.metadata = { }; const { Trait } = require('../deprecated/traits'); -const { iteratorSymbol } = require('../util/iteration'); /** * @see https://developer.mozilla.org/en-US/Add-ons/SDK/Low-Level_APIs/util_list @@ -116,7 +115,7 @@ const listOptions = { yield onKeyValue ? [++i, element] : onKeys ? ++i : element; }, }; -listOptions[iteratorSymbol] = function* iterator() { +listOptions[Symbol.iterator] = function* iterator() { let array = this._keyValueMap.slice(0); for (let element of array) diff --git a/addon-sdk/source/lib/sdk/deprecated/traits.js b/addon-sdk/source/lib/sdk/deprecated/traits.js index 04c515a8592..b558207bb6d 100644 --- a/addon-sdk/source/lib/sdk/deprecated/traits.js +++ b/addon-sdk/source/lib/sdk/deprecated/traits.js @@ -1,7 +1,6 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - "use strict"; module.metadata = { @@ -17,9 +16,10 @@ const { required, } = require('./traits/core'); -const defineProperties = Object.defineProperties, - freeze = Object.freeze, - create = Object.create; +const { getOwnPropertyIdentifiers } = require('../util/object'); +const defineProperties = Object.defineProperties; +const freeze = Object.freeze; +const create = Object.create; /** * Work around bug 608959 by defining the _create function here instead of @@ -31,7 +31,7 @@ const defineProperties = Object.defineProperties, */ function _create(proto, trait) { let properties = {}, - keys = Object.getOwnPropertyNames(trait); + keys = getOwnPropertyIdentifiers(trait); for (let key of keys) { let descriptor = trait[key]; if (descriptor.required && @@ -72,9 +72,9 @@ function TraitDescriptor(object) function Public(instance, trait) { let result = {}, - keys = Object.getOwnPropertyNames(trait); + keys = getOwnPropertyIdentifiers(trait); for (let key of keys) { - if ('_' === key.charAt(0) && '__iterator__' !== key ) + if (typeof key === 'string' && '_' === key.charAt(0) && '__iterator__' !== key ) continue; let property = trait[key], descriptor = { @@ -184,4 +184,3 @@ const Trait = Composition({ }); TraitProto = Trait.prototype; exports.Trait = Trait; - diff --git a/addon-sdk/source/lib/sdk/deprecated/traits/core.js b/addon-sdk/source/lib/sdk/deprecated/traits/core.js index 46f6a13b82e..8b25f359137 100644 --- a/addon-sdk/source/lib/sdk/deprecated/traits/core.js +++ b/addon-sdk/source/lib/sdk/deprecated/traits/core.js @@ -1,7 +1,6 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - "use strict"; module.metadata = { @@ -10,11 +9,10 @@ module.metadata = { // Design inspired by: http://www.traitsjs.org/ -// shortcuts -const getOwnPropertyNames = Object.getOwnPropertyNames, - getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor, - hasOwn = Object.prototype.hasOwnProperty, - _create = Object.create; +const { getOwnPropertyIdentifiers } = require('../../util/object'); +const getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; +const hasOwn = Object.prototype.hasOwnProperty; +const _create = Object.create; function doPropertiesMatch(object1, object2, name) { // If `object1` has property with the given `name` @@ -114,12 +112,12 @@ function Conflict(name) { */ function trait(properties) { let result = {}, - keys = getOwnPropertyNames(properties); - for (let key of keys) { - let descriptor = getOwnPropertyDescriptor(properties, key); - result[key] = (required === descriptor.value) ? Required(key) : descriptor; - } - return result; + keys = getOwnPropertyIdentifiers(properties); + for (let key of keys) { + let descriptor = getOwnPropertyDescriptor(properties, key); + result[key] = (required === descriptor.value) ? Required(key) : descriptor; + } + return result; } exports.Trait = exports.trait = trait; @@ -140,7 +138,7 @@ function compose(trait1, trait2) { let traits = Array.slice(arguments, 0), result = {}; for (let trait of traits) { - let keys = getOwnPropertyNames(trait); + let keys = getOwnPropertyIdentifiers(trait); for (let key of keys) { let descriptor = trait[key]; // if property already exists and it's not a requirement @@ -174,7 +172,7 @@ function exclude(keys, trait) { let exclusions = Map(keys), result = {}; - keys = getOwnPropertyNames(trait); + keys = getOwnPropertyIdentifiers(trait); for (let key of keys) { if (!hasOwn.call(exclusions, key) || trait[key].required) @@ -210,7 +208,7 @@ function override() { let traits = Array.slice(arguments, 0), result = {}; for (let trait of traits) { - let keys = getOwnPropertyNames(trait); + let keys = getOwnPropertyIdentifiers(trait); for (let key of keys) { let descriptor = trait[key]; if (!hasOwn.call(result, key) || result[key].required) @@ -236,7 +234,7 @@ exports.override = override; */ function rename(map, trait) { let result = {}, - keys = getOwnPropertyNames(trait); + keys = getOwnPropertyIdentifiers(trait); for (let key of keys) { // must be renamed & it's not requirement if (hasOwn.call(map, key) && !trait[key].required) { @@ -281,7 +279,7 @@ function rename(map, trait) { function resolve(resolutions, trait) { let renames = {}, exclusions = [], - keys = getOwnPropertyNames(resolutions); + keys = getOwnPropertyIdentifiers(resolutions); for (let key of keys) { // pre-process renamed and excluded properties if (resolutions[key]) // old name -> new name renames[key] = resolutions[key]; @@ -306,7 +304,7 @@ exports.resolve = resolve; */ function create(proto, trait) { let properties = {}, - keys = getOwnPropertyNames(trait); + keys = getOwnPropertyIdentifiers(trait); for (let key of keys) { let descriptor = trait[key]; if (descriptor.required && !hasOwn.call(proto, key)) @@ -319,4 +317,3 @@ function create(proto, trait) { return _create(proto, properties); } exports.create = create; - diff --git a/addon-sdk/source/lib/sdk/deprecated/unit-test-finder.js b/addon-sdk/source/lib/sdk/deprecated/unit-test-finder.js index e70dedb7e9f..2f062b5b357 100644 --- a/addon-sdk/source/lib/sdk/deprecated/unit-test-finder.js +++ b/addon-sdk/source/lib/sdk/deprecated/unit-test-finder.js @@ -26,7 +26,8 @@ const { AddonManager } = Cu.import("resource://gre/modules/AddonManager.jsm", {} var ios = Cc['@mozilla.org/network/io-service;1'] .getService(Ci.nsIIOService); -const TEST_REGEX = /(([^\/]+\/)(?:lib\/)?)?(tests?\/test-[^\.\/]+)\.js$/; +const CFX_TEST_REGEX = /(([^\/]+\/)(?:lib\/)?)?(tests?\/test-[^\.\/]+)\.js$/; +const JPM_TEST_REGEX = /^()(tests?\/test-[^\.\/]+)\.js$/; const { mapcat, map, filter, fromEnumerator } = require("sdk/util/sequence"); @@ -51,6 +52,8 @@ const removeDups = (array) => array.reduce((result, value) => { }, []); const getSuites = function getSuites({ id, filter }) { + const TEST_REGEX = isNative ? JPM_TEST_REGEX : CFX_TEST_REGEX; + return getAddon(id).then(addon => { let fileURI = addon.getResourceURI("tests/"); let isPacked = fileURI.scheme == "jar"; @@ -77,9 +80,13 @@ const getSuites = function getSuites({ id, filter }) { suites = removeDups(suites.sort()); return suites; }) - } else { - let tests = getTestEntries(file); - [...tests].forEach(addEntry); + } + else { + let tests = [...getTestEntries(file)]; + let rootURI = addon.getResourceURI("/"); + tests.forEach((entry) => { + addEntry(entry.replace(rootURI.spec, "")); + }); } // sort and remove dups @@ -102,7 +109,8 @@ const makeFilters = function makeFilters(options) { if (colonPos === -1) { filterFileRegex = new RegExp(options.filter); filterNameRegex = { test: () => true } - } else { + } + else { filterFileRegex = new RegExp(options.filter.substr(0, colonPos)); filterNameRegex = new RegExp(options.filter.substr(colonPos + 1)); } diff --git a/addon-sdk/source/lib/sdk/event/core.js b/addon-sdk/source/lib/sdk/event/core.js index 114d82fe179..67e26180943 100644 --- a/addon-sdk/source/lib/sdk/event/core.js +++ b/addon-sdk/source/lib/sdk/event/core.js @@ -1,7 +1,6 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - "use strict"; module.metadata = { @@ -80,14 +79,16 @@ exports.once = once; * Arguments that will be passed to listeners. */ function emit (target, type, ...args) { + let all = observers(target, '*').length; let state = observers(target, type); let listeners = state.slice(); let count = listeners.length; let index = 0; - // If error event and there are no handlers then print error message - // into a console. - if (count === 0 && type === 'error') console.exception(args[0]); + // If error event and there are no handlers (explicit or catch-all) + // then print error message to the console. + if (count === 0 && type === 'error' && all === 0) + console.exception(args[0]); while (index < count) { try { let listener = listeners[index]; diff --git a/addon-sdk/source/lib/sdk/event/target.js b/addon-sdk/source/lib/sdk/event/target.js index 246f11507af..3a1f5e5f018 100644 --- a/addon-sdk/source/lib/sdk/event/target.js +++ b/addon-sdk/source/lib/sdk/event/target.js @@ -1,7 +1,6 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - 'use strict'; module.metadata = { @@ -68,9 +67,8 @@ const EventTarget = Class({ off(this, type, listener); return this; }, - off: function(type, listener) { - off(this, type, listener); - return this; - } + // but we can wrap `off` here, as the semantics are the same + off: chainable(method(off)) + }); exports.EventTarget = EventTarget; diff --git a/addon-sdk/source/lib/sdk/l10n/html.js b/addon-sdk/source/lib/sdk/l10n/html.js index cf1514fc623..8285a147ec3 100644 --- a/addon-sdk/source/lib/sdk/l10n/html.js +++ b/addon-sdk/source/lib/sdk/l10n/html.js @@ -7,15 +7,14 @@ module.metadata = { "stability": "unstable" }; -const { Ci, Cu } = require("chrome"); +const { Ci } = require("chrome"); const events = require("../system/events"); const core = require("./core"); +const { loadSheet, removeSheet } = require("../stylesheet/utils"); const assetsURI = require('../self').data.url(); -const { Services } = Cu.import("resource://gre/modules/Services.jsm"); -const hideContentStyle = "data:text/css,:root {visibility: hidden !important;}"; -const hideSheetUri = Services.io.newURI(hideContentStyle, null, null); +const hideSheetUri = "data:text/css,:root {visibility: hidden !important;}"; // Taken from Gaia: // https://github.com/andreasgal/gaia/blob/04fde2640a7f40314643016a5a6c98bf3755f5fd/webapi.js#L1470 @@ -46,11 +45,8 @@ function onDocumentReady2Translate(event) { try { // Finally display document when we finished replacing all text content - if (document.defaultView) { - let winUtils = document.defaultView.QueryInterface(Ci.nsIInterfaceRequestor) - .getInterface(Ci.nsIDOMWindowUtils); - winUtils.removeSheet(hideSheetUri, winUtils.USER_SHEET); - } + if (document.defaultView) + removeSheet(document.defaultView, hideSheetUri, 'user'); } catch(e) { console.exception(e); @@ -76,9 +72,7 @@ function onContentWindow(event) { try { // First hide content of the document in order to have content blinking // between untranslated and translated states - let winUtils = document.defaultView.QueryInterface(Ci.nsIInterfaceRequestor) - .getInterface(Ci.nsIDOMWindowUtils); - winUtils.loadSheet(hideSheetUri, winUtils.USER_SHEET); + loadSheet(document.defaultView, hideSheetUri, 'user'); } catch(e) { console.exception(e); diff --git a/addon-sdk/source/lib/sdk/page-mod.js b/addon-sdk/source/lib/sdk/page-mod.js index 2356451bac0..e4073c3f661 100644 --- a/addon-sdk/source/lib/sdk/page-mod.js +++ b/addon-sdk/source/lib/sdk/page-mod.js @@ -14,11 +14,10 @@ const { getAttachEventType, WorkerHost } = require('./content/utils'); const { Class } = require('./core/heritage'); const { Disposable } = require('./core/disposable'); const { WeakReference } = require('./core/reference'); -const { Worker } = require('./content/worker'); +const { Worker } = require('./content/worker-parent'); const { EventTarget } = require('./event/target'); const { on, emit, once, setListeners } = require('./event/core'); const { on: domOn, removeListener: domOff } = require('./dom/events'); -const { pipe } = require('./event/utils'); const { isRegExp, isUndefined } = require('./lang/type'); const { merge } = require('./util/object'); const { windowIterator } = require('./deprecated/window-utils'); @@ -114,7 +113,6 @@ const PageMod = Class({ modContract.properties(modelFor), EventTarget, Disposable, - WeakReference ], extends: WorkerHost(workerFor), setup: function PageMod(options) { @@ -213,11 +211,15 @@ function createWorker (mod, window) { onError: (e) => emit(mod, 'error', e) }); workers.set(mod, worker); - pipe(worker, mod); - emit(mod, 'attach', worker); - once(worker, 'detach', function detach() { - worker.destroy(); - }); + worker.on('*', (event, ...args) => { + // worker's "attach" event passes a window as the argument + // page-mod's "attach" event needs a worker + if (event === 'attach') + emit(mod, event, worker) + else + emit(mod, event, ...args); + }) + once(worker, 'detach', () => worker.destroy()); } function onContent (mod, window) { diff --git a/addon-sdk/source/lib/sdk/panel.js b/addon-sdk/source/lib/sdk/panel.js index be1581eec81..881f5828c62 100644 --- a/addon-sdk/source/lib/sdk/panel.js +++ b/addon-sdk/source/lib/sdk/panel.js @@ -3,12 +3,13 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; -// The panel module currently supports only Firefox. +// The panel module currently supports only Firefox and SeaMonkey. // See: https://bugzilla.mozilla.org/show_bug.cgi?id=jetpack-panel-apps module.metadata = { "stability": "stable", "engines": { - "Firefox": "*" + "Firefox": "*", + "SeaMonkey": "*" } }; diff --git a/addon-sdk/source/lib/sdk/selection.js b/addon-sdk/source/lib/sdk/selection.js index bdb96bc3a50..7c58b593808 100644 --- a/addon-sdk/source/lib/sdk/selection.js +++ b/addon-sdk/source/lib/sdk/selection.js @@ -7,7 +7,8 @@ module.metadata = { "stability": "stable", "engines": { - "Firefox": "*" + "Firefox": "*", + "SeaMonkey": "*" } }; @@ -22,8 +23,7 @@ const { Ci, Cc } = require("chrome"), { getTabs, getTabContentWindow, getTabForContentWindow, getAllTabContentWindows } = require('./tabs/utils'), winUtils = require("./window/utils"), - events = require("./system/events"), - { iteratorSymbol, forInIterator } = require("./util/iteration"); + events = require("./system/events"); // The selection types const HTML = 0x01, @@ -116,9 +116,12 @@ function* forOfIterator() { } const selectionIteratorOptions = { - __iterator__: forInIterator + __iterator__: function() { + for (let item of this) + yield item; + } } -selectionIteratorOptions[iteratorSymbol] = forOfIterator; +selectionIteratorOptions[Symbol.iterator] = forOfIterator; const selectionIterator = obscure(selectionIteratorOptions); /** diff --git a/addon-sdk/source/lib/sdk/self.js b/addon-sdk/source/lib/sdk/self.js index a772447ee8a..1a4d88680d7 100644 --- a/addon-sdk/source/lib/sdk/self.js +++ b/addon-sdk/source/lib/sdk/self.js @@ -30,13 +30,18 @@ const isPacked = rootURI && rootURI.indexOf("jar:") === 0; const uri = (path="") => path.contains(":") ? path : addonDataURI + path.replace(/^\.\//, ""); +let { preferencesBranch } = options; +if (/[^\w{@}.-]/.test(preferencesBranch)) { + preferencesBranch = id; + console.warn("Ignoring preferences-branch (not a valid branch name)"); +} // Some XPCOM APIs require valid URIs as an argument for certain operations // (see `nsILoginManager` for example). This property represents add-on // associated unique URI string that can be used for that. exports.uri = 'addon:' + id; exports.id = id; -exports.preferencesBranch = options.preferencesBranch || id; +exports.preferencesBranch = preferencesBranch || id; exports.name = name; exports.loadReason = loadReason; exports.version = version; diff --git a/addon-sdk/source/lib/sdk/stylesheet/utils.js b/addon-sdk/source/lib/sdk/stylesheet/utils.js index 9220954d574..844996bf3b8 100644 --- a/addon-sdk/source/lib/sdk/stylesheet/utils.js +++ b/addon-sdk/source/lib/sdk/stylesheet/utils.js @@ -1,17 +1,13 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - "use strict"; module.metadata = { "stability": "experimental" }; -const { Cc, Ci } = require("chrome"); - -const io = Cc['@mozilla.org/network/io-service;1']. - getService(Ci.nsIIOService); +const { Ci } = require("chrome"); const SHEET_TYPE = { "agent": "AGENT_SHEET", @@ -36,12 +32,12 @@ function loadSheet(window, url, type) { type = SHEET_TYPE[type]; - if (!(url instanceof Ci.nsIURI)) - url = io.newURI(url, null, null); + if (url instanceof Ci.nsIURI) + url = url.spec; let winUtils = getDOMWindowUtils(window); try { - winUtils.loadSheet(url, winUtils[type]); + winUtils.loadSheetUsingURIString(url, winUtils[type]); } catch (e) {}; }; @@ -57,13 +53,13 @@ function removeSheet(window, url, type) { type = SHEET_TYPE[type]; - if (!(url instanceof Ci.nsIURI)) - url = io.newURI(url, null, null); + if (url instanceof Ci.nsIURI) + url = url.spec; let winUtils = getDOMWindowUtils(window); try { - winUtils.removeSheet(url, winUtils[type]); + winUtils.removeSheetUsingURIString(url, winUtils[type]); } catch (e) {}; }; diff --git a/addon-sdk/source/lib/sdk/tabs/tab-fennec.js b/addon-sdk/source/lib/sdk/tabs/tab-fennec.js index e823d51053e..53d08aba57b 100644 --- a/addon-sdk/source/lib/sdk/tabs/tab-fennec.js +++ b/addon-sdk/source/lib/sdk/tabs/tab-fennec.js @@ -14,6 +14,7 @@ const { emit } = require('../event/core'); const { isPrivate } = require('../private-browsing/utils'); const { isWindowPrivate } = require('../window/utils'); const { when: unload } = require('../system/unload'); +const { BLANK } = require('../content/thumbnail'); const { viewFor } = require('../view/core'); const { EVENTS } = require('./events'); @@ -94,7 +95,7 @@ const Tab = Class({ console.error(ERR_FENNEC_MSG); // return 80x45 blank default - return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAtCAYAAAA5reyyAAAAJElEQVRoge3BAQEAAACCIP+vbkhAAQAAAAAAAAAAAAAAAADXBjhtAAGQ0AF/AAAAAElFTkSuQmCC'; + return BLANK; }, /** diff --git a/addon-sdk/source/lib/sdk/tabs/tab-firefox.js b/addon-sdk/source/lib/sdk/tabs/tab-firefox.js index 33385f060d4..d9740cc0399 100644 --- a/addon-sdk/source/lib/sdk/tabs/tab-firefox.js +++ b/addon-sdk/source/lib/sdk/tabs/tab-firefox.js @@ -9,7 +9,7 @@ const { defer } = require("../lang/functional"); const { has } = require("../util/array"); const { each } = require("../util/object"); const { EVENTS } = require("./events"); -const { getThumbnailURIForWindow } = require("../content/thumbnail"); +const { getThumbnailURIForWindow, BLANK } = require("../content/thumbnail"); const { getFaviconURIForLocation } = require("../io/data"); const { activateTab, getOwnerWindow, getBrowserForTab, getTabTitle, setTabTitle, getTabContentDocument, getTabURL, setTabURL, @@ -199,8 +199,15 @@ const TabTrait = Trait.compose(EventEmitter, { * Thumbnail data URI of the page currently loaded in this tab. * @type {String} */ - getThumbnail: function getThumbnail() - this._tab ? getThumbnailURIForWindow(this._contentWindow) : undefined, + getThumbnail() { + if (!this._tab) + return undefined; + if (this._tab.getAttribute('remote')) { + console.error('This method is not supported with E10S'); + return BLANK; + } + return getThumbnailURIForWindow(this._contentWindow); + }, /** * Whether or not tab is pinned (Is an app-tab). * @type {Boolean} diff --git a/addon-sdk/source/lib/sdk/tabs/worker.js b/addon-sdk/source/lib/sdk/tabs/worker.js index d2ba336960c..bf1893b4fd1 100644 --- a/addon-sdk/source/lib/sdk/tabs/worker.js +++ b/addon-sdk/source/lib/sdk/tabs/worker.js @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 'use strict'; -const ContentWorker = require('../content/worker').Worker; +const ContentWorker = require('../content/worker-parent').Worker; function Worker(options, window) { options.window = window; diff --git a/addon-sdk/source/lib/sdk/ui/button/action.js b/addon-sdk/source/lib/sdk/ui/button/action.js index dcf7f66ed72..623c85175f2 100644 --- a/addon-sdk/source/lib/sdk/ui/button/action.js +++ b/addon-sdk/source/lib/sdk/ui/button/action.js @@ -108,4 +108,5 @@ on(actionButtonStateEvents, 'data', ({target, window, state}) => { view.setIcon(id, window, state.icon); view.setLabel(id, window, state.label); view.setDisabled(id, window, state.disabled); + view.setBadge(id, window, state.badge, state.badgeColor); }); diff --git a/addon-sdk/source/lib/sdk/ui/button/contract.js b/addon-sdk/source/lib/sdk/ui/button/contract.js index b6cd5e3c1d9..7b6327c8f55 100644 --- a/addon-sdk/source/lib/sdk/ui/button/contract.js +++ b/addon-sdk/source/lib/sdk/ui/button/contract.js @@ -6,14 +6,13 @@ const { contract } = require('../../util/contract'); const { isLocalURL } = require('../../url'); const { isNil, isObject, isString } = require('../../lang/type'); -const { required, either, string, boolean, object } = require('../../deprecated/api-utils'); +const { required, either, string, boolean, object, number } = require('../../deprecated/api-utils'); const { merge } = require('../../util/object'); const { freeze } = Object; -function isIconSet(icons) { - return Object.keys(icons). - every(size => String(size >>> 0) === size && isLocalURL(icons[size])) -} +const isIconSet = (icons) => + Object.keys(icons). + every(size => String(size >>> 0) === size && isLocalURL(icons[size])); let iconSet = { is: either(object, string), @@ -36,10 +35,22 @@ let label = { msg: 'The option "label" must be a non empty string' } +let badge = { + is: either(string, number), + msg: 'The option "badge" must be a string or a number' +} + +let badgeColor = { + is: string, + msg: 'The option "badgeColor" must be a string' +} + let stateContract = contract({ label: label, icon: iconSet, - disabled: boolean + disabled: boolean, + badge: badge, + badgeColor: badgeColor }); exports.stateContract = stateContract; diff --git a/addon-sdk/source/lib/sdk/ui/button/toggle.js b/addon-sdk/source/lib/sdk/ui/button/toggle.js index 525610ec84f..bff30fc7645 100644 --- a/addon-sdk/source/lib/sdk/ui/button/toggle.js +++ b/addon-sdk/source/lib/sdk/ui/button/toggle.js @@ -100,6 +100,7 @@ on(toggleButtonStateEvents, 'data', ({target, window, state}) => { view.setLabel(id, window, state.label); view.setDisabled(id, window, state.disabled); view.setChecked(id, window, state.checked); + view.setBadge(id, window, state.badge, state.badgeColor); }); on(clickEvents, 'data', ({target: id, window, checked }) => { diff --git a/addon-sdk/source/lib/sdk/ui/button/view.js b/addon-sdk/source/lib/sdk/ui/button/view.js index 414d51964bf..02731a15d86 100644 --- a/addon-sdk/source/lib/sdk/ui/button/view.js +++ b/addon-sdk/source/lib/sdk/ui/button/view.js @@ -15,7 +15,7 @@ const { on, off, emit } = require('../../event/core'); const { data } = require('sdk/self'); -const { isObject } = require('../../lang/type'); +const { isObject, isNil } = require('../../lang/type'); const { getMostRecentBrowserWindow } = require('../../window/utils'); const { ignoreWindow } = require('../../private-browsing/utils'); @@ -114,7 +114,7 @@ function nodeFor(id, window=getMostRecentBrowserWindow()) { exports.nodeFor = nodeFor; function create(options) { - let { id, label, icon, type } = options; + let { id, label, icon, type, badge } = options; if (views.has(id)) throw new Error('The ID "' + id + '" seems already used.'); @@ -137,7 +137,7 @@ function create(options) { node.style.display = 'none'; node.setAttribute('id', this.id); - node.setAttribute('class', 'toolbarbutton-1 chromeclass-toolbar-additional'); + node.setAttribute('class', 'toolbarbutton-1 chromeclass-toolbar-additional badged-button'); node.setAttribute('type', type); node.setAttribute('label', label); node.setAttribute('tooltiptext', label); @@ -213,6 +213,27 @@ function setChecked(id, window, checked) { } exports.setChecked = setChecked; +function setBadge(id, window, badge, color) { + let node = nodeFor(id, window); + + if (node) { + // `Array.from` is needed to handle unicode symbol properly: + // '𝐀𝐁'.length is 4 where Array.from('𝐀𝐁').length is 2 + let text = isNil(badge) + ? '' + : Array.from(String(badge)).slice(0, 4).join(''); + + node.setAttribute('badge', text); + + let badgeNode = node.ownerDocument.getAnonymousElementByAttribute(node, + 'class', 'toolbarbutton-badge'); + + if (badgeNode) + badgeNode.style.backgroundColor = isNil(color) ? '' : color; + } +} +exports.setBadge = setBadge; + function click(id) { let node = nodeFor(id); diff --git a/addon-sdk/source/lib/sdk/util/iteration.js b/addon-sdk/source/lib/sdk/util/iteration.js deleted file mode 100644 index d15fb351cbc..00000000000 --- a/addon-sdk/source/lib/sdk/util/iteration.js +++ /dev/null @@ -1,24 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -'use strict'; - -module.metadata = { - "stability": "experimental" -}; - -// This is known as @@iterator in the ES6 spec. In builds that have ES6 -// Symbols, use Symbol.iterator; otherwise use the legacy method name, -// "@@iterator". -const JS_HAS_SYMBOLS = typeof Symbol === "function"; -exports.iteratorSymbol = JS_HAS_SYMBOLS ? Symbol.iterator : "@@iterator"; - -// An adaptor that, given an object that is iterable with for-of, is -// suitable for being bound to __iterator__ in order to make the object -// iterable in the same way via for-in. -function forInIterator() { - for (let item of this) - yield item; -} - -exports.forInIterator = forInIterator; diff --git a/addon-sdk/source/lib/sdk/util/list.js b/addon-sdk/source/lib/sdk/util/list.js index 45741434858..5c2b0b286be 100644 --- a/addon-sdk/source/lib/sdk/util/list.js +++ b/addon-sdk/source/lib/sdk/util/list.js @@ -9,7 +9,6 @@ module.metadata = { const { Class } = require('../core/heritage'); const listNS = require('../core/namespace').ns(); -const { iteratorSymbol } = require('../util/iteration'); const listOptions = { /** @@ -48,8 +47,8 @@ const listOptions = { yield onKeyValue ? [++i, element] : onKeys ? ++i : element; }, }; -listOptions[iteratorSymbol] = function iterator() { - return listNS(this).keyValueMap.slice(0)[iteratorSymbol](); +listOptions[Symbol.iterator] = function iterator() { + return listNS(this).keyValueMap.slice(0)[Symbol.iterator](); }; const List = Class(listOptions); exports.List = List; diff --git a/addon-sdk/source/lib/sdk/util/object.js b/addon-sdk/source/lib/sdk/util/object.js index 50cb0cab453..ef3f640ceb6 100644 --- a/addon-sdk/source/lib/sdk/util/object.js +++ b/addon-sdk/source/lib/sdk/util/object.js @@ -1,7 +1,6 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - "use strict"; module.metadata = { @@ -36,7 +35,7 @@ function merge(source) { // converted to `true` where `null` and `undefined` becames `false`. Therefore // the `filter` method will keep only objects that are defined and not null. Array.slice(arguments, 1).filter(Boolean).forEach(function onEach(properties) { - Object.getOwnPropertyNames(properties).forEach(function(name) { + getOwnPropertyIdentifiers(properties).forEach(function(name) { descriptor[name] = Object.getOwnPropertyDescriptor(properties, name); }); }); @@ -85,8 +84,19 @@ function omit(source, ...values) { let copy = {}; let keys = flatten(values); for (let prop in source) - if (!~keys.indexOf(prop)) + if (!~keys.indexOf(prop)) copy[prop] = source[prop]; return copy; } exports.omit = omit; + +// get object's own property Symbols and/or Names, including nonEnumerables by default +function getOwnPropertyIdentifiers(object, options = { names: true, symbols: true, nonEnumerables: true }) { + const symbols = !options.symbols ? [] : + Object.getOwnPropertySymbols(object); + const names = !options.names ? [] : + options.nonEnumerables ? Object.getOwnPropertyNames(object) : + Object.keys(object); + return [...names, ...symbols]; +} +exports.getOwnPropertyIdentifiers = getOwnPropertyIdentifiers; diff --git a/addon-sdk/source/lib/sdk/util/sequence.js b/addon-sdk/source/lib/sdk/util/sequence.js index d65089cdeb2..afb19985b7e 100644 --- a/addon-sdk/source/lib/sdk/util/sequence.js +++ b/addon-sdk/source/lib/sdk/util/sequence.js @@ -22,13 +22,12 @@ module.metadata = { // - `_` used for argument(s) or variable(s) who's values are ignored. const { complement, flip, identity } = require("../lang/functional"); -const { iteratorSymbol } = require("../util/iteration"); const { isArray, isArguments, isMap, isSet, isString, isBoolean, isNumber } = require("../lang/type"); const Sequence = function Sequence(iterator) { if (iterator.isGenerator && iterator.isGenerator()) - this[iteratorSymbol] = iterator; + this[Symbol.iterator] = iterator; else throw TypeError("Expected generator argument"); }; @@ -216,7 +215,7 @@ const map = (f, ...sequences) => seq(function* () { let index = 0; while (index < count) { - inputs[index] = sequences[index][iteratorSymbol](); + inputs[index] = sequences[index][Symbol.iterator](); index = index + 1; } diff --git a/addon-sdk/source/lib/sdk/windows/loader.js b/addon-sdk/source/lib/sdk/windows/loader.js index a828074af47..eef2eb4e69b 100644 --- a/addon-sdk/source/lib/sdk/windows/loader.js +++ b/addon-sdk/source/lib/sdk/windows/loader.js @@ -59,8 +59,11 @@ const WindowLoader = Trait.compose({ if (window !== _window) { if (_window) { - _window.removeEventListener(ON_UNLOAD, this.__unloadListener, false); - _window.removeEventListener(ON_LOAD, this.__loadListener, false); + if (this.__unloadListener) + _window.removeEventListener(ON_UNLOAD, this.__unloadListener, false); + + if (this.__loadListener) + _window.removeEventListener(ON_LOAD, this.__loadListener, false); } if (window) { @@ -123,4 +126,3 @@ const WindowLoader = Trait.compose({ __unloadListener: null }); exports.WindowLoader = WindowLoader; - diff --git a/addon-sdk/source/lib/toolkit/loader.js b/addon-sdk/source/lib/toolkit/loader.js index 1078b8e2263..96053029a80 100644 --- a/addon-sdk/source/lib/toolkit/loader.js +++ b/addon-sdk/source/lib/toolkit/loader.js @@ -45,12 +45,13 @@ const { join: pathJoin, normalize, dirname } = Cu.import("resource://gre/modules // Define some shortcuts. const bind = Function.call.bind(Function.bind); -const getOwnPropertyNames = Object.getOwnPropertyNames; const getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; const define = Object.defineProperties; const prototypeOf = Object.getPrototypeOf; const create = Object.create; const keys = Object.keys; +const getOwnIdentifiers = x => [...Object.getOwnPropertyNames(x), + ...Object.getOwnPropertySymbols(x)]; const NODE_MODULES = ["assert", "buffer_ieee754", "buffer", "child_process", "cluster", "console", "constants", "crypto", "_debugger", "dgram", "dns", "domain", "events", "freelist", "fs", "http", "https", "_linklist", "module", "net", "os", "path", "punycode", "querystring", "readline", "repl", "stream", "string_decoder", "sys", "timers", "tls", "tty", "url", "util", "vm", "zlib"]; @@ -84,7 +85,7 @@ function freeze(object) { // Returns map of given `object`-s own property descriptors. const descriptor = iced(function descriptor(object) { let value = {}; - getOwnPropertyNames(object).forEach(function(name) { + getOwnIdentifiers(object).forEach(function(name) { value[name] = getOwnPropertyDescriptor(object, name) }); return value; @@ -121,7 +122,7 @@ function iced(f) { const override = iced(function override(target, source) { let properties = descriptor(target) let extension = descriptor(source || {}) - getOwnPropertyNames(extension).forEach(function(name) { + getOwnIdentifiers(extension).forEach(function(name) { properties[name] = extension[name]; }); return define({}, properties); @@ -294,7 +295,7 @@ const load = iced(function load(loader, module) { // the scope object for this particular module sandbox = new loader.sharedGlobalSandbox.Object(); // Inject all expected globals in the scope object - getOwnPropertyNames(globals).forEach(function(name) { + getOwnIdentifiers(globals).forEach(function(name) { descriptors[name] = getOwnPropertyDescriptor(globals, name) }); define(sandbox, descriptors); @@ -521,7 +522,7 @@ const resolveURI = iced(function resolveURI(id, mapping) { let count = mapping.length, index = 0; // Do not resolve if already a resource URI - if (isResourceURI(id)) return normalizeExt(id); + if (isAbsoluteURI(id)) return normalizeExt(id); while (index < count) { let [ path, uri ] = mapping[index ++]; @@ -844,7 +845,9 @@ exports.Loader = Loader; let isJSONURI = uri => uri.substr(-5) === '.json'; let isJSMURI = uri => uri.substr(-4) === '.jsm'; let isJSURI = uri => uri.substr(-3) === '.js'; -let isResourceURI = uri => uri.substr(0, 11) === 'resource://'; +let isAbsoluteURI = uri => uri.indexOf("resource://") >= 0 || + uri.indexOf("chrome://") >= 0 || + uri.indexOf("file://") >= 0 let isRelative = id => id[0] === '.' const generateMap = iced(function generateMap(options, callback) { @@ -928,7 +931,7 @@ function findAllModuleIncludes (uri, options, results, callback) { // Given a resource URI or source, return an array of strings passed into // the require statements from the source function findModuleIncludes (uri, callback) { - let src = isResourceURI(uri) ? readURI(uri) : uri; + let src = isAbsoluteURI(uri) ? readURI(uri) : uri; let modules = []; walk(src, function (node) { @@ -979,4 +982,3 @@ function isRequire (node) { } }); - diff --git a/addon-sdk/source/lib/toolkit/require.js b/addon-sdk/source/lib/toolkit/require.js new file mode 100644 index 00000000000..27b4e1c7197 --- /dev/null +++ b/addon-sdk/source/lib/toolkit/require.js @@ -0,0 +1,54 @@ +const make = (exports, rootURI, components) => { + const { Loader: { Loader, Require, Module, main } } = + components.utils.import(rootURI + "toolkit/loader.js", {}); + + const loader = Loader({ + id: "toolkit/require", + rootURI: rootURI, + isNative: true, + paths: { + "": rootURI, + "devtools/": "resource://gre/modules/devtools/" + } + }); + + // Below we define `require` & `require.resolve` that resolve passed + // module id relative to the caller URI. This is not perfect but good + // enough for common case & there is always an option to pass absolute + // id when that + // but presumably well enough to cover + + const require = id => { + const requirerURI = components.stack.caller.filename; + const requirer = Module(requirerURI, requirerURI); + return Require(loader, requirer)(id); + }; + + require.resolve = id => { + const requirerURI = components.stack.caller.filename; + const requirer = Module(requirerURI, requirerURI); + return Require(loader, requirer).resolve(id); + }; + + exports.require = require; +} + +// If loaded in the context of commonjs module, reload as JSM into an +// exports object. +if (typeof(require) === "function" && typeof(module) === "object") { + require("chrome").Cu.import(module.uri, module.exports); +} +// If loaded in the context of JSM make a loader & require and define +// new symbols as exported ones. +else if (typeof(__URI__) === "string" && this["Components"]) { + const builtin = Object.keys(this); + const uri = __URI__.replace("toolkit/require.js", ""); + make(this, uri, this["Components"]); + + this.EXPORTED_SYMBOLS = Object. + keys(this). + filter($ => builtin.indexOf($) < 0); +} +else { + throw Error("Loading require.js in this environment isn't supported") +} diff --git a/addon-sdk/source/python-lib/cuddlefish/packaging.py b/addon-sdk/source/python-lib/cuddlefish/packaging.py index d642503e19c..ab38f103424 100644 --- a/addon-sdk/source/python-lib/cuddlefish/packaging.py +++ b/addon-sdk/source/python-lib/cuddlefish/packaging.py @@ -401,12 +401,7 @@ def generate_build_for_target(pkg_cfg, target, deps, build['preferencesBranch'] = jid if 'preferences-branch' in target_cfg: - # check it's a non-empty, valid branch name - preferencesBranch = target_cfg['preferences-branch'] - if re.match('^[\w{@}-]+$', preferencesBranch): - build['preferencesBranch'] = preferencesBranch - elif not is_running_tests: - print >>sys.stderr, "IGNORING preferences-branch (not a valid branch name)" + build['preferencesBranch'] = target_cfg['preferences-branch'] return build diff --git a/addon-sdk/source/python-lib/cuddlefish/prefs.py b/addon-sdk/source/python-lib/cuddlefish/prefs.py index 6a5cc86dad9..bbee9ef0ae8 100644 --- a/addon-sdk/source/python-lib/cuddlefish/prefs.py +++ b/addon-sdk/source/python-lib/cuddlefish/prefs.py @@ -34,6 +34,9 @@ DEFAULT_COMMON_PREFS = { # Allow installing extensions dropped into the profile folder 'extensions.autoDisableScopes' : 10, + # shut up some warnings on `about:` page + 'app.releaseNotesURL': 'http://localhost/app-dummy/', + 'app.vendorURL': 'http://localhost/app-dummy/' } DEFAULT_NO_CONNECTIONS_PREFS = { diff --git a/addon-sdk/source/test/addons/curly-id/lib/main.js b/addon-sdk/source/test/addons/curly-id/lib/main.js index 594b16fcd53..8b3f256459e 100644 --- a/addon-sdk/source/test/addons/curly-id/lib/main.js +++ b/addon-sdk/source/test/addons/curly-id/lib/main.js @@ -17,11 +17,6 @@ exports.testCurlyID = function(assert) { assert.equal(service.get('extensions.{34a1eae1-c20a-464f-9b0e-000000000000}.test14'), simple.prefs.test14, 'simple test14 also 15'); } -exports.testInvalidPreferencesBranch = function(assert) { - assert.notEqual(preferencesBranch, 'invalid^branch*name', 'invalid preferences-branch value ignored'); - assert.equal(preferencesBranch, '{34a1eae1-c20a-464f-9b0e-000000000000}', 'preferences-branch is {34a1eae1-c20a-464f-9b0e-000000000000}'); -} - // from `/test/test-self.js`, adapted to `sdk/test/assert` API exports.testSelfID = function*(assert) { assert.equal(typeof(id), 'string', 'self.id is a string'); diff --git a/addon-sdk/source/test/addons/curly-id/package.json b/addon-sdk/source/test/addons/curly-id/package.json index 1d47b4d812a..8b387d633ec 100644 --- a/addon-sdk/source/test/addons/curly-id/package.json +++ b/addon-sdk/source/test/addons/curly-id/package.json @@ -8,7 +8,5 @@ "type": "integer", "title": "test13", "value": 26 - }], - - "preferences-branch": "invalid^branch*name" + }] } diff --git a/addon-sdk/source/test/addons/standard-id/lib/main.js b/addon-sdk/source/test/addons/standard-id/lib/main.js index afb78594a1c..bd1b5f9ce6c 100644 --- a/addon-sdk/source/test/addons/standard-id/lib/main.js +++ b/addon-sdk/source/test/addons/standard-id/lib/main.js @@ -19,11 +19,6 @@ exports.testStandardID = function(assert) { assert.equal(service.get('extensions.standard-id@jetpack.test14'), simple.prefs.test14, 'simple test14 also 15'); } -exports.testInvalidPreferencesBranch = function(assert) { - assert.notEqual(preferencesBranch, 'invalid^branch*name', 'invalid preferences-branch value ignored'); - assert.equal(preferencesBranch, 'standard-id@jetpack', 'preferences-branch is standard-id@jetpack'); -} - // from `/test/test-self.js`, adapted to `sdk/test/assert` API exports.testSelfID = function*(assert) { assert.equal(typeof(id), 'string', 'self.id is a string'); diff --git a/addon-sdk/source/test/addons/standard-id/package.json b/addon-sdk/source/test/addons/standard-id/package.json index 3d3e0ce801f..dfcf390cbc3 100644 --- a/addon-sdk/source/test/addons/standard-id/package.json +++ b/addon-sdk/source/test/addons/standard-id/package.json @@ -8,7 +8,5 @@ "type": "integer", "title": "test13", "value": 26 - }], - - "preferences-branch": "invalid^branch*name" + }] } diff --git a/addon-sdk/source/test/fixtures/addon-sdk/data/border-style.css b/addon-sdk/source/test/fixtures/addon-sdk/data/border-style.css new file mode 100644 index 00000000000..e1e31d224a4 --- /dev/null +++ b/addon-sdk/source/test/fixtures/addon-sdk/data/border-style.css @@ -0,0 +1 @@ +div { border-style: dashed; } diff --git a/addon-sdk/source/test/fixtures/addon-sdk/data/test-contentScriptFile.js b/addon-sdk/source/test/fixtures/addon-sdk/data/test-contentScriptFile.js new file mode 100644 index 00000000000..7dc0e3f2425 --- /dev/null +++ b/addon-sdk/source/test/fixtures/addon-sdk/data/test-contentScriptFile.js @@ -0,0 +1,5 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +self.postMessage("msg from contentScriptFile"); diff --git a/addon-sdk/source/test/fixtures/addon-sdk/data/test.html b/addon-sdk/source/test/fixtures/addon-sdk/data/test.html new file mode 100644 index 00000000000..181e85f9b1d --- /dev/null +++ b/addon-sdk/source/test/fixtures/addon-sdk/data/test.html @@ -0,0 +1,13 @@ + + + + + + foo + + +

bar

+ + diff --git a/addon-sdk/source/test/jetpack-package.ini b/addon-sdk/source/test/jetpack-package.ini index 63ffe193d4f..72aab38681a 100644 --- a/addon-sdk/source/test/jetpack-package.ini +++ b/addon-sdk/source/test/jetpack-package.ini @@ -37,6 +37,7 @@ support-files = [test-content-script.js] [test-content-symbiont.js] [test-content-worker.js] +[test-content-worker-parent.js] [test-context-menu.js] [test-cortex.js] [test-cuddlefish.js] diff --git a/addon-sdk/source/test/pagemod-test-helpers.js b/addon-sdk/source/test/pagemod-test-helpers.js index 9215c75a5cc..b03df56679a 100644 --- a/addon-sdk/source/test/pagemod-test-helpers.js +++ b/addon-sdk/source/test/pagemod-test-helpers.js @@ -1,45 +1,31 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - "use strict"; -const {Cc,Ci} = require("chrome"); -const timer = require("sdk/timers"); -const xulApp = require("sdk/system/xul-app"); +const { Cc, Ci } = require("chrome"); +const { setTimeout } = require("sdk/timers"); const { Loader } = require("sdk/test/loader"); const { openTab, getBrowserForTab, closeTab } = require("sdk/tabs/utils"); -const self = require("sdk/self"); const { merge } = require("sdk/util/object"); +const httpd = require("./lib/httpd"); -/** - * A helper function that creates a PageMod, then opens the specified URL - * and checks the effect of the page mod on 'onload' event via testCallback. - */ +const PORT = 8099; +const PATH = '/test-contentScriptWhen.html'; + +// an evil function enables the creation of tests +// that depend on delicate event timing. do not use. exports.testPageMod = function testPageMod(assert, done, testURL, pageModOptions, testCallback, timeout) { - if (!xulApp.versionInRange(xulApp.platformVersion, "1.9.3a3", "*") && - !xulApp.versionInRange(xulApp.platformVersion, "1.9.2.7", "1.9.2.*")) { - assert.pass("Note: not testing PageMod, as it doesn't work on this platform version"); - return null; - } var wm = Cc['@mozilla.org/appshell/window-mediator;1'] .getService(Ci.nsIWindowMediator); var browserWindow = wm.getMostRecentWindow("navigator:browser"); - if (!browserWindow) { - assert.pass("page-mod tests: could not find the browser window, so " + - "will not run. Use -a firefox to run the pagemod tests.") - return null; - } - let loader = Loader(module, null, null, { - modules: { - "sdk/self": merge({}, self, { - data: merge({}, self.data, require("./fixtures")) - }) - } - }); + let options = merge({}, require('@loader/options'), + { prefixURI: require('./fixtures').url() }); + + let loader = Loader(module, null, options); let pageMod = loader.require("sdk/page-mod"); var pageMods = [new pageMod.PageMod(opts) for each(opts in pageModOptions)]; @@ -55,7 +41,7 @@ exports.testPageMod = function testPageMod(assert, done, testURL, pageModOptions // load event. So page-mod actions may not be already done. // If we delay even more contentScriptWhen:'end', we may want to modify // this code again. - timer.setTimeout(testCallback, 0, + setTimeout(testCallback, timeout, b.contentWindow.wrappedJSObject, function () { pageMods.forEach(function(mod) mod.destroy()); @@ -76,7 +62,8 @@ exports.testPageMod = function testPageMod(assert, done, testURL, pageModOptions * based on the value of document.readyState at the time contentScript is attached */ exports.handleReadyState = function(url, contentScriptWhen, callbacks) { - const { PageMod } = Loader(module).require('sdk/page-mod'); + const loader = Loader(module); + const { PageMod } = loader.require('sdk/page-mod'); let pagemod = PageMod({ include: url, @@ -86,13 +73,39 @@ exports.handleReadyState = function(url, contentScriptWhen, callbacks) { onAttach: worker => { let { tab } = worker; worker.on('message', readyState => { - pagemod.destroy(); // generate event name from `readyState`, e.g. `"loading"` becomes `onLoading`. let type = 'on' + readyState[0].toUpperCase() + readyState.substr(1); if (type in callbacks) callbacks[type](tab); + + pagemod.destroy(); + loader.unload(); }) } }); } + +// serves a slow page which takes 1.5 seconds to load, +// 0.5 seconds in each readyState: uninitialized, loading, interactive. +exports.contentScriptWhenServer = function() { + const URL = 'http://localhost:' + PORT + PATH; + + const HTML = `/* polyglot js + + delay both the "DOMContentLoaded" + + and "load" events */`; + + let srv = httpd.startServerAsync(PORT); + + srv.registerPathHandler(PATH, (_, response) => { + response.processAsync(); + response.setHeader('Content-Type', 'text/html', false); + setTimeout(_ => response.finish(), 500); + response.write(HTML); + }) + + srv.URL = URL; + return srv; +} diff --git a/addon-sdk/source/test/test-base64.js b/addon-sdk/source/test/test-base64.js index 6ca75002152..0b98b253f58 100644 --- a/addon-sdk/source/test/test-base64.js +++ b/addon-sdk/source/test/test-base64.js @@ -9,7 +9,8 @@ const base64 = require("sdk/base64"); const text = "Awesome!"; const b64text = "QXdlc29tZSE="; -const utf8text = "✓ à la mode"; +const utf8text = "\u2713 à la mode"; +const badutf8text = "\u0013 à la mode"; const b64utf8text = "4pyTIMOgIGxhIG1vZGU="; exports["test base64.encode"] = function (assert) { @@ -66,8 +67,8 @@ exports["test base64.decode with wrong charset"] = function (assert) { exports["test encode/decode Unicode without utf-8 as charset"] = function (assert) { - assert.notEqual(base64.decode(base64.encode(utf8text)), utf8text, - "Unicode strings needs 'utf-8' charset" + assert.equal(base64.decode(base64.encode(utf8text)), badutf8text, + "Unicode strings needs 'utf-8' charset or will be mangled" ); } diff --git a/addon-sdk/source/test/test-content-script.js b/addon-sdk/source/test/test-content-script.js index 715a3406e1b..cf2c454a6fc 100644 --- a/addon-sdk/source/test/test-content-script.js +++ b/addon-sdk/source/test/test-content-script.js @@ -557,7 +557,8 @@ exports["test Collections 2"] = createProxyTest(html, function (helper) { for(let i in body.childNodes) { count++; } - assert(count == 6, "body.childNodes is iterable"); + + assert(count >= 3, "body.childNodes is iterable"); done(); } ); diff --git a/addon-sdk/source/test/test-content-worker-parent.js b/addon-sdk/source/test/test-content-worker-parent.js new file mode 100644 index 00000000000..e003b97e0a3 --- /dev/null +++ b/addon-sdk/source/test/test-content-worker-parent.js @@ -0,0 +1,982 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +// Skipping due to window creation being unsupported in Fennec +module.metadata = { + engines: { + 'Firefox': '*' + } +}; + +const { Cc, Ci } = require("chrome"); +const { on } = require("sdk/event/core"); +const { setTimeout } = require("sdk/timers"); +const { LoaderWithHookedConsole } = require("sdk/test/loader"); +const { Worker } = require("sdk/content/worker-parent"); +const { close } = require("sdk/window/helpers"); +const { set: setPref } = require("sdk/preferences/service"); +const { isArray } = require("sdk/lang/type"); +const { URL } = require('sdk/url'); +const fixtures = require("./fixtures"); +const system = require("sdk/system/events"); + +const DEPRECATE_PREF = "devtools.errorconsole.deprecation_warnings"; + +const DEFAULT_CONTENT_URL = "data:text/html;charset=utf-8,foo"; + +const WINDOW_SCRIPT_URL = "data:text/html;charset=utf-8," + + ""; + +function makeWindow() { + let content = + "" + + "" + + "" + + ""; + var url = "data:application/vnd.mozilla.xul+xml;charset=utf-8," + + encodeURIComponent(content); + var features = ["chrome", "width=10", "height=10"]; + + return Cc["@mozilla.org/embedcomp/window-watcher;1"]. + getService(Ci.nsIWindowWatcher). + openWindow(null, url, null, features.join(","), null); +} + +// Listen for only first one occurence of DOM event +function listenOnce(node, eventName, callback) { + node.addEventListener(eventName, function onevent(event) { + node.removeEventListener(eventName, onevent, true); + callback(node); + }, true); +} + +// Load a given url in a given browser and fires the callback when it is loaded +function loadAndWait(browser, url, callback) { + listenOnce(browser, "load", callback); + // We have to wait before calling `loadURI` otherwise, if we call + // `loadAndWait` during browser load event, the history will be broken + setTimeout(function () { + browser.loadURI(url); + }, 0); +} + +// Returns a test function that will automatically open a new chrome window +// with a element loaded on a given content URL +// The callback receive 3 arguments: +// - test: reference to the jetpack test object +// - browser: a reference to the xul node +// - done: a callback to call when test is over +function WorkerTest(url, callback) { + return function testFunction(assert, done) { + let chromeWindow = makeWindow(); + chromeWindow.addEventListener("load", function onload() { + chromeWindow.removeEventListener("load", onload, true); + let browser = chromeWindow.document.createElement("browser"); + browser.setAttribute("type", "content"); + chromeWindow.document.documentElement.appendChild(browser); + // Wait for about:blank load event ... + listenOnce(browser, "load", function onAboutBlankLoad() { + // ... before loading the expected doc and waiting for its load event + loadAndWait(browser, url, function onDocumentLoaded() { + callback(assert, browser, function onTestDone() { + + close(chromeWindow).then(done); + }); + }); + }); + }, true); + }; +} + +exports["test:sample"] = WorkerTest( + DEFAULT_CONTENT_URL, + function(assert, browser, done) { + + assert.notEqual(browser.contentWindow.location.href, "about:blank", + "window is now on the right document"); + + let window = browser.contentWindow + let worker = Worker({ + window: window, + contentScript: "new " + function WorkerScope() { + // window is accessible + let myLocation = window.location.toString(); + self.on("message", function(data) { + if (data == "hi!") + self.postMessage("bye!"); + }); + }, + contentScriptWhen: "ready", + onMessage: function(msg) { + assert.equal("bye!", msg); + assert.equal(worker.url, window.location.href, + "worker.url still works"); + done(); + } + }); + + assert.equal(worker.url, window.location.href, + "worker.url works"); + assert.equal(worker.contentURL, window.location.href, + "worker.contentURL works"); + worker.postMessage("hi!"); + } +); + +exports["test:emit"] = WorkerTest( + DEFAULT_CONTENT_URL, + function(assert, browser, done) { + + let worker = Worker({ + window: browser.contentWindow, + contentScript: "new " + function WorkerScope() { + // Validate self.on and self.emit + self.port.on("addon-to-content", function (data) { + self.port.emit("content-to-addon", data); + }); + + // Check for global pollution + //if (typeof on != "undefined") + // self.postMessage("`on` is in globals"); + if (typeof once != "undefined") + self.postMessage("`once` is in globals"); + if (typeof emit != "undefined") + self.postMessage("`emit` is in globals"); + + }, + onMessage: function(msg) { + assert.fail("Got an unexpected message : "+msg); + } + }); + + // Validate worker.port + worker.port.on("content-to-addon", function (data) { + assert.equal(data, "event data"); + done(); + }); + worker.port.emit("addon-to-content", "event data"); + } +); + +exports["test:emit hack message"] = WorkerTest( + DEFAULT_CONTENT_URL, + function(assert, browser, done) { + let worker = Worker({ + window: browser.contentWindow, + contentScript: "new " + function WorkerScope() { + // Validate self.port + self.port.on("message", function (data) { + self.port.emit("message", data); + }); + // We should not receive message on self, but only on self.port + self.on("message", function (data) { + self.postMessage("message", data); + }); + }, + onError: function(e) { + assert.fail("Got exception: "+e); + } + }); + + worker.port.on("message", function (data) { + assert.equal(data, "event data"); + done(); + }); + worker.on("message", function (data) { + assert.fail("Got an unexpected message : "+msg); + }); + worker.port.emit("message", "event data"); + } +); + +exports["test:n-arguments emit"] = WorkerTest( + DEFAULT_CONTENT_URL, + function(assert, browser, done) { + let repeat = 0; + let worker = Worker({ + window: browser.contentWindow, + contentScript: "new " + function WorkerScope() { + // Validate self.on and self.emit + self.port.on("addon-to-content", function (a1, a2, a3) { + self.port.emit("content-to-addon", a1, a2, a3); + }); + } + }); + + // Validate worker.port + worker.port.on("content-to-addon", function (arg1, arg2, arg3) { + if (!repeat++) { + this.emit("addon-to-content", "first argument", "second", "third"); + } else { + assert.equal(arg1, "first argument"); + assert.equal(arg2, "second"); + assert.equal(arg3, "third"); + done(); + } + }); + worker.port.emit("addon-to-content", "first argument", "second", "third"); + } +); + +exports["test:post-json-values-only"] = WorkerTest( + DEFAULT_CONTENT_URL, + function(assert, browser, done) { + + let worker = Worker({ + window: browser.contentWindow, + contentScript: "new " + function WorkerScope() { + self.on("message", function (message) { + self.postMessage([ message.fun === undefined, + typeof message.w, + message.w && "port" in message.w, + message.w._url, + Array.isArray(message.array), + JSON.stringify(message.array)]); + }); + } + }); + + // Validate worker.onMessage + let array = [1, 2, 3]; + worker.on("message", function (message) { + assert.ok(message[0], "function becomes undefined"); + assert.equal(message[1], "object", "object stays object"); + assert.ok(message[2], "object's attributes are enumerable"); + assert.equal(message[3], DEFAULT_CONTENT_URL, + "jsonable attributes are accessible"); + // See bug 714891, Arrays may be broken over compartements: + assert.ok(message[4], "Array keeps being an array"); + assert.equal(message[5], JSON.stringify(array), + "Array is correctly serialized"); + done(); + }); + // Add a new url property sa the Class function used by + // Worker doesn't set enumerables to true for non-functions + worker._url = DEFAULT_CONTENT_URL; + + worker.postMessage({ fun: function () {}, w: worker, array: array }); + } +); + +exports["test:emit-json-values-only"] = WorkerTest( + DEFAULT_CONTENT_URL, + function(assert, browser, done) { + + let worker = Worker({ + window: browser.contentWindow, + contentScript: "new " + function WorkerScope() { + // Validate self.on and self.emit + self.port.on("addon-to-content", function (fun, w, obj, array) { + self.port.emit("content-to-addon", [ + fun === null, + typeof w, + "port" in w, + w._url, + "fun" in obj, + Object.keys(obj.dom).length, + Array.isArray(array), + JSON.stringify(array) + ]); + }); + } + }); + + // Validate worker.port + let array = [1, 2, 3]; + worker.port.on("content-to-addon", function (result) { + assert.ok(result[0], "functions become null"); + assert.equal(result[1], "object", "objects stay objects"); + assert.ok(result[2], "object's attributes are enumerable"); + assert.equal(result[3], DEFAULT_CONTENT_URL, + "json attribute is accessible"); + assert.ok(!result[4], "function as object attribute is removed"); + assert.equal(result[5], 0, "DOM nodes are converted into empty object"); + // See bug 714891, Arrays may be broken over compartments: + assert.ok(result[6], "Array keeps being an array"); + assert.equal(result[7], JSON.stringify(array), + "Array is correctly serialized"); + done(); + }); + + let obj = { + fun: function () {}, + dom: browser.contentWindow.document.createElement("div") + }; + // Add a new url property sa the Class function used by + // Worker doesn't set enumerables to true for non-functions + worker._url = DEFAULT_CONTENT_URL; + worker.port.emit("addon-to-content", function () {}, worker, obj, array); + } +); + +exports["test:content is wrapped"] = WorkerTest( + "data:text/html;charset=utf-8,", + function(assert, browser, done) { + + let worker = Worker({ + window: browser.contentWindow, + contentScript: "new " + function WorkerScope() { + self.postMessage(!window.documentValue); + }, + contentScriptWhen: "ready", + onMessage: function(msg) { + assert.ok(msg, + "content script has a wrapped access to content document"); + done(); + } + }); + } +); + +// ContentWorker is not for chrome +/* +exports["test:chrome is unwrapped"] = function(assert, done) { + let window = makeWindow(); + + listenOnce(window, "load", function onload() { + + let worker = Worker({ + window: window, + contentScript: "new " + function WorkerScope() { + self.postMessage(window.documentValue); + }, + contentScriptWhen: "ready", + onMessage: function(msg) { + assert.ok(msg, + "content script has an unwrapped access to chrome document"); + close(window).then(done); + } + }); + + }); +} +*/ + +exports["test:nothing is leaked to content script"] = WorkerTest( + DEFAULT_CONTENT_URL, + function(assert, browser, done) { + + let worker = Worker({ + window: browser.contentWindow, + contentScript: "new " + function WorkerScope() { + self.postMessage([ + "ContentWorker" in window, + "UNWRAP_ACCESS_KEY" in window, + "getProxyForObject" in window + ]); + }, + contentScriptWhen: "ready", + onMessage: function(list) { + assert.ok(!list[0], "worker API contrustor isn't leaked"); + assert.ok(!list[1], "Proxy API stuff isn't leaked 1/2"); + assert.ok(!list[2], "Proxy API stuff isn't leaked 2/2"); + done(); + } + }); + } +); + +exports["test:ensure console.xxx works in cs"] = WorkerTest( + DEFAULT_CONTENT_URL, + function(assert, browser, done) { + const EXPECTED = ["time", "log", "info", "warn", "error", "error", "timeEnd"]; + + let calls = []; + let levels = []; + + system.on('console-api-log-event', onMessage); + + function onMessage({ subject }) { + calls.push(subject.wrappedJSObject.arguments[0]); + levels.push(subject.wrappedJSObject.level); + } + + let worker = Worker({ + window: browser.contentWindow, + contentScript: "new " + function WorkerScope() { + console.time("time"); + console.log("log"); + console.info("info"); + console.warn("warn"); + console.error("error"); + console.debug("debug"); + console.exception("error"); + console.timeEnd("timeEnd"); + self.postMessage(); + }, + onMessage: function() { + system.off('console-api-log-event', onMessage); + + assert.equal(JSON.stringify(calls), + JSON.stringify(EXPECTED), + "console methods have been called successfully, in expected order"); + + assert.equal(JSON.stringify(levels), + JSON.stringify(EXPECTED), + "console messages have correct log levels, in expected order"); + + done(); + } + }); + } +); + +exports["test:setTimeout works with string argument"] = WorkerTest( + "data:text/html;charset=utf-8,", + function(assert, browser, done) { + let worker = Worker({ + window: browser.contentWindow, + contentScript: "new " + function ContentScriptScope() { + // must use "window.scVal" instead of "var csVal" + // since we are inside ContentScriptScope function. + // i'm NOT putting code-in-string inside code-in-string + window.csVal = 13; + setTimeout("self.postMessage([" + + "csVal, " + + "window.docVal, " + + "'ContentWorker' in window, " + + "'UNWRAP_ACCESS_KEY' in window, " + + "'getProxyForObject' in window, " + + "])", 1); + }, + contentScriptWhen: "ready", + onMessage: function([csVal, docVal, chrome1, chrome2, chrome3]) { + // test timer code is executed in the correct context + assert.equal(csVal, 13, "accessing content-script values"); + assert.notEqual(docVal, 5, "can't access document values (directly)"); + assert.ok(!chrome1 && !chrome2 && !chrome3, "nothing is leaked from chrome"); + done(); + } + }); + } +); + +exports["test:setInterval works with string argument"] = WorkerTest( + DEFAULT_CONTENT_URL, + function(assert, browser, done) { + let count = 0; + let worker = Worker({ + window: browser.contentWindow, + contentScript: "setInterval('self.postMessage(1)', 50)", + contentScriptWhen: "ready", + onMessage: function(one) { + count++; + assert.equal(one, 1, "got " + count + " message(s) from setInterval"); + if (count >= 3) done(); + } + }); + } +); + +exports["test:setInterval async Errors passed to .onError"] = WorkerTest( + DEFAULT_CONTENT_URL, + function(assert, browser, done) { + let count = 0; + let worker = Worker({ + window: browser.contentWindow, + contentScript: "setInterval(() => { throw Error('ubik') }, 50)", + contentScriptWhen: "ready", + onError: function(err) { + count++; + assert.equal(err.message, "ubik", + "error (corectly) propagated " + count + " time(s)"); + if (count >= 3) done(); + } + }); + } +); + +exports["test:setTimeout throws array, passed to .onError"] = WorkerTest( + DEFAULT_CONTENT_URL, + function(assert, browser, done) { + let worker = Worker({ + window: browser.contentWindow, + contentScript: "setTimeout(function() { throw ['array', 42] }, 1)", + contentScriptWhen: "ready", + onError: function(arr) { + assert.ok(isArray(arr), + "the type of thrown/propagated object is array"); + assert.ok(arr.length==2, + "the propagated thrown array is the right length"); + assert.equal(arr[1], 42, + "element inside the thrown array correctly propagated"); + done(); + } + }); + } +); + +exports["test:setTimeout string arg with SyntaxError to .onError"] = WorkerTest( + DEFAULT_CONTENT_URL, + function(assert, browser, done) { + let worker = Worker({ + window: browser.contentWindow, + contentScript: "setTimeout('syntax 123 error', 1)", + contentScriptWhen: "ready", + onError: function(err) { + assert.equal(err.name, "SyntaxError", + "received SyntaxError thrown from bad code in string argument to setTimeout"); + assert.ok('fileName' in err, + "propagated SyntaxError contains a fileName property"); + assert.ok('stack' in err, + "propagated SyntaxError contains a stack property"); + assert.equal(err.message, "missing ; before statement", + "propagated SyntaxError has the correct (helpful) message"); + assert.equal(err.lineNumber, 1, + "propagated SyntaxError was thrown on the right lineNumber"); + done(); + } + }); + } +); + +exports["test:setTimeout can't be cancelled by content"] = WorkerTest( + "data:text/html;charset=utf-8,", + function(assert, browser, done) { + + let worker = Worker({ + window: browser.contentWindow, + contentScript: "new " + function WorkerScope() { + let id = setTimeout(function () { + self.postMessage("timeout"); + }, 100); + unsafeWindow.eval("clearTimeout("+id+");"); + }, + contentScriptWhen: "ready", + onMessage: function(msg) { + assert.ok(msg, + "content didn't managed to cancel our setTimeout"); + done(); + } + }); + } +); + +exports["test:clearTimeout"] = WorkerTest( + "data:text/html;charset=utf-8,clear timeout", + function(assert, browser, done) { + let worker = Worker({ + window: browser.contentWindow, + contentScript: "new " + function WorkerScope() { + let id1 = setTimeout(function() { + self.postMessage("failed"); + }, 10); + let id2 = setTimeout(function() { + self.postMessage("done"); + }, 100); + clearTimeout(id1); + }, + contentScriptWhen: "ready", + onMessage: function(msg) { + if (msg === "failed") { + assert.fail("failed to cancel timer"); + } else { + assert.pass("timer cancelled"); + done(); + } + } + }); + } +); + +exports["test:clearInterval"] = WorkerTest( + "data:text/html;charset=utf-8,clear timeout", + function(assert, browser, done) { + let called = 0; + let worker = Worker({ + window: browser.contentWindow, + contentScript: "new " + function WorkerScope() { + let id = setInterval(function() { + self.postMessage("intreval") + clearInterval(id) + setTimeout(function() { + self.postMessage("done") + }, 100) + }, 10); + }, + contentScriptWhen: "ready", + onMessage: function(msg) { + if (msg === "intreval") { + called = called + 1; + if (called > 1) assert.fail("failed to cancel timer"); + } else { + assert.pass("interval cancelled"); + done(); + } + } + }); + } +) + +exports["test:setTimeout are unregistered on content unload"] = WorkerTest( + DEFAULT_CONTENT_URL, + function(assert, browser, done) { + + let originalWindow = browser.contentWindow; + let worker = Worker({ + window: browser.contentWindow, + contentScript: "new " + function WorkerScope() { + document.title = "ok"; + let i = 0; + setInterval(function () { + document.title = i++; + }, 10); + }, + contentScriptWhen: "ready" + }); + + // Change location so that content script is destroyed, + // and all setTimeout/setInterval should be unregistered. + // Wait some cycles in order to execute some intervals. + setTimeout(function () { + // Bug 689621: Wait for the new document load so that we are sure that + // previous document cancelled its intervals + let url2 = "data:text/html;charset=utf-8,final"; + loadAndWait(browser, url2, function onload() { + let titleAfterLoad = originalWindow.document.title; + // Wait additional cycles to verify that intervals are really cancelled + setTimeout(function () { + assert.equal(browser.contentDocument.title, "final", + "New document has not been modified"); + assert.equal(originalWindow.document.title, titleAfterLoad, + "Nor previous one"); + + done(); + }, 100); + }); + }, 100); + } +); + +exports['test:check window attribute in iframes'] = WorkerTest( + DEFAULT_CONTENT_URL, + function(assert, browser, done) { + + // Create a first iframe and wait for its loading + let contentWin = browser.contentWindow; + let contentDoc = contentWin.document; + let iframe = contentDoc.createElement("iframe"); + contentDoc.body.appendChild(iframe); + + listenOnce(iframe, "load", function onload() { + + // Create a second iframe inside the first one and wait for its loading + let iframeDoc = iframe.contentWindow.document; + let subIframe = iframeDoc.createElement("iframe"); + iframeDoc.body.appendChild(subIframe); + + listenOnce(subIframe, "load", function onload() { + subIframe.removeEventListener("load", onload, true); + + // And finally create a worker against this second iframe + let worker = Worker({ + window: subIframe.contentWindow, + contentScript: 'new ' + function WorkerScope() { + self.postMessage([ + window.top !== window, + frameElement, + window.parent !== window, + top.location.href, + parent.location.href, + ]); + }, + onMessage: function(msg) { + assert.ok(msg[0], "window.top != window"); + assert.ok(msg[1], "window.frameElement is defined"); + assert.ok(msg[2], "window.parent != window"); + assert.equal(msg[3], contentWin.location.href, + "top.location refers to the toplevel content doc"); + assert.equal(msg[4], iframe.contentWindow.location.href, + "parent.location refers to the first iframe doc"); + done(); + } + }); + + }); + subIframe.setAttribute("src", "data:text/html;charset=utf-8,bar"); + + }); + iframe.setAttribute("src", "data:text/html;charset=utf-8,foo"); + } +); + +exports['test:check window attribute in toplevel documents'] = WorkerTest( + DEFAULT_CONTENT_URL, + function(assert, browser, done) { + + let worker = Worker({ + window: browser.contentWindow, + contentScript: 'new ' + function WorkerScope() { + self.postMessage([ + window.top === window, + frameElement, + window.parent === window + ]); + }, + onMessage: function(msg) { + assert.ok(msg[0], "window.top == window"); + assert.ok(!msg[1], "window.frameElement is null"); + assert.ok(msg[2], "window.parent == window"); + done(); + } + }); + } +); + +exports["test:check worker API with page history"] = WorkerTest( + DEFAULT_CONTENT_URL, + function(assert, browser, done) { + let url2 = "data:text/html;charset=utf-8,bar"; + + loadAndWait(browser, url2, function () { + let worker = Worker({ + window: browser.contentWindow, + contentScript: "new " + function WorkerScope() { + // Just before the content script is disable, we register a timeout + // that will be disable until the page gets visible again + self.on("pagehide", function () { + setTimeout(function () { + self.postMessage("timeout restored"); + }, 0); + }); + }, + contentScriptWhen: "start" + }); + + // postMessage works correctly when the page is visible + worker.postMessage("ok"); + + // We have to wait before going back into history, + // otherwise `goBack` won't do anything. + setTimeout(function () { + browser.goBack(); + }, 0); + + // Wait for the document to be hidden + browser.addEventListener("pagehide", function onpagehide() { + browser.removeEventListener("pagehide", onpagehide, false); + // Now any event sent to this worker should throw + + setTimeout(_ => { + assert.throws( + function () { worker.postMessage("data"); }, + /The page is currently hidden and can no longer be used/, + "postMessage should throw when the page is hidden in history" + ); + + assert.throws( + function () { worker.port.emit("event"); }, + /The page is currently hidden and can no longer be used/, + "port.emit should throw when the page is hidden in history" + ); + }) + + // Display the page with attached content script back in order to resume + // its timeout and receive the expected message. + // We have to delay this in order to not break the history. + // We delay for a non-zero amount of time in order to ensure that we + // do not receive the message immediatly, so that the timeout is + // actually disabled + setTimeout(function () { + worker.on("message", function (data) { + assert.ok(data, "timeout restored"); + done(); + }); + browser.goForward(); + }, 500); + + }, false); + }); + + } +); + +exports['test:conentScriptFile as URL instance'] = WorkerTest( + DEFAULT_CONTENT_URL, + function(assert, browser, done) { + + let url = new URL(fixtures.url("test-contentScriptFile.js")); + let worker = Worker({ + window: browser.contentWindow, + contentScriptFile: url, + onMessage: function(msg) { + assert.equal(msg, "msg from contentScriptFile", + "received a wrong message from contentScriptFile"); + done(); + } + }); + } +); + +exports["test:worker events"] = WorkerTest( + DEFAULT_CONTENT_URL, + function (assert, browser, done) { + let window = browser.contentWindow; + let events = []; + let worker = Worker({ + window: window, + contentScript: 'new ' + function WorkerScope() { + self.postMessage('start'); + }, + onAttach: win => { + events.push('attach'); + assert.pass('attach event called when attached'); + assert.equal(window, win, 'attach event passes in attached window'); + }, + onError: err => { + assert.equal(err.message, 'Custom', + 'Error passed into error event'); + worker.detach(); + }, + onMessage: msg => { + assert.pass('`onMessage` handles postMessage') + throw new Error('Custom'); + }, + onDetach: _ => { + assert.pass('`onDetach` called when worker detached'); + done(); + } + }); + // `attach` event is called synchronously during instantiation, + // so we can't listen to that, TODO FIX? + // worker.on('attach', obj => console.log('attach', obj)); + } +); + +exports["test:onDetach in contentScript on destroy"] = WorkerTest( + "data:text/html;charset=utf-8,foo#detach", + function(assert, browser, done) { + let worker = Worker({ + window: browser.contentWindow, + contentScript: 'new ' + function WorkerScope() { + self.port.on('detach', function(reason) { + window.location.hash += '!' + reason; + }) + }, + }); + browser.contentWindow.addEventListener('hashchange', _ => { + assert.equal(browser.contentWindow.location.hash, '#detach!', + "location.href is as expected"); + done(); + }) + worker.destroy(); + } +); + +exports["test:onDetach in contentScript on unload"] = WorkerTest( + "data:text/html;charset=utf-8,foo#detach", + function(assert, browser, done) { + let { loader } = LoaderWithHookedConsole(module); + let worker = loader.require("sdk/content/worker-parent").Worker({ + window: browser.contentWindow, + contentScript: 'new ' + function WorkerScope() { + self.port.on('detach', function(reason) { + window.location.hash += '!' + reason; + }) + }, + }); + browser.contentWindow.addEventListener('hashchange', _ => { + assert.equal(browser.contentWindow.location.hash, '#detach!shutdown', + "location.href is as expected"); + done(); + }) + loader.unload('shutdown'); + } +); + +exports["test:console method log functions properly"] = WorkerTest( + DEFAULT_CONTENT_URL, + function(assert, browser, done) { + let logs = []; + + system.on('console-api-log-event', onMessage); + + function onMessage({ subject }) { + logs.push(clean(subject.wrappedJSObject.arguments[0])); + } + + let clean = message => + message.trim(). + replace(/[\r\n]/g, " "). + replace(/ +/g, " "); + + let worker = Worker({ + window: browser.contentWindow, + contentScript: "new " + function WorkerScope() { + console.log(Function); + console.log((foo) => foo * foo); + console.log(function foo(bar) { return bar + bar }); + + self.postMessage(); + }, + onMessage: () => { + system.off('console-api-log-event', onMessage); + + assert.deepEqual(logs, [ + "function Function() { [native code] }", + "(foo) => foo * foo", + "function foo(bar) { \"use strict\"; return bar + bar }" + ]); + + done(); + } + }); + } +); + +exports["test:global postMessage"] = WorkerTest( + WINDOW_SCRIPT_URL, + function(assert, browser, done) { + let contentScript = "window.addEventListener('message', function (e) {" + + " if (e.data === 'from -> window')" + + " self.port.emit('response', e.data, e.origin);" + + "});" + + "postMessage('from -> content-script', '*');"; + let { loader } = LoaderWithHookedConsole(module); + let worker = loader.require("sdk/content/worker-parent").Worker({ + window: browser.contentWindow, + contentScriptWhen: "ready", + contentScript: contentScript + }); + + worker.port.on("response", (data, origin) => { + assert.equal(data, "from -> window", "Communication from content-script to window completed"); + done(); + }); +}); + +exports["test:destroy unbinds listeners from port"] = WorkerTest( + "data:text/html;charset=utf-8,portdestroyer", + function(assert, browser, done) { + let destroyed = false; + let worker = Worker({ + window: browser.contentWindow, + contentScript: "new " + function WorkerScope() { + self.port.emit("destroy"); + setInterval(self.port.emit, 10, "ping"); + }, + onDestroy: done + }); + worker.port.on("ping", () => { + if (destroyed) { + assert.fail("Should not call events on port after destroy."); + } + }); + worker.port.on("destroy", () => { + destroyed = true; + worker.destroy(); + assert.pass("Worker destroyed, waiting for no future listeners handling events."); + setTimeout(done, 500); + }); + } +); + + +require("test").run(exports); diff --git a/addon-sdk/source/test/test-event-core.js b/addon-sdk/source/test/test-event-core.js index ecee12bd2a3..fef6e70167f 100644 --- a/addon-sdk/source/test/test-event-core.js +++ b/addon-sdk/source/test/test-event-core.js @@ -1,7 +1,6 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - 'use strict'; const { on, once, off, emit, count } = require('sdk/event/core'); @@ -199,7 +198,7 @@ exports['test unhandled errors'] = function(assert) { let exceptions = []; let { loader, messages } = LoaderWithHookedConsole(module); - let { emit, on } = loader.require('sdk/event/core'); + let { emit } = loader.require('sdk/event/core'); let target = {}; let boom = Error('Boom!'); @@ -210,6 +209,24 @@ exports['test unhandled errors'] = function(assert) { 'unhandled exception is logged'); }; +exports['test piped errors'] = function(assert) { + let exceptions = []; + let { loader, messages } = LoaderWithHookedConsole(module); + + let { emit } = loader.require('sdk/event/core'); + let { pipe } = loader.require('sdk/event/utils'); + let target = {}; + let second = {}; + + pipe(target, second); + emit(target, 'error', 'piped!'); + + assert.equal(messages.length, 1, 'error logged only once, ' + + 'considered "handled" on `target` by the catch-all pipe'); + assert.equal(messages[0].type, 'exception', 'The console message is exception'); + assert.ok(~String(messages[0].msg).indexOf('piped!'), + 'unhandled (piped) exception is logged on `second` target'); +}; exports['test count'] = function(assert) { let target = {}; @@ -242,4 +259,4 @@ exports['test listen to all events'] = function(assert) { 'wildcard listener called for unbound event name'); }; -require('test').run(exports); +require('sdk/test').run(exports); diff --git a/addon-sdk/source/test/test-event-target.js b/addon-sdk/source/test/test-event-target.js index 972906ea874..d51314aa510 100644 --- a/addon-sdk/source/test/test-event-target.js +++ b/addon-sdk/source/test/test-event-target.js @@ -1,7 +1,6 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - 'use strict'; const { emit } = require('sdk/event/core'); @@ -115,7 +114,6 @@ exports['test remove a listener'] = function(assert) { }) }); - target.off('message'); // must do nothing. emit(target, 'message'); assert.deepEqual([ 1 ], actual, 'first listener called'); emit(target, 'message'); @@ -124,6 +122,26 @@ exports['test remove a listener'] = function(assert) { assert.deepEqual([ 1, 1, 2, 2, 2 ], actual, 'first listener removed'); }; +exports['test .off() removes all listeners'] = function(assert) { + let target = EventTarget(); + let actual = []; + target.on('message', function listener() { + actual.push(1); + target.on('message', function() { + target.removeListener('message', listener); + actual.push(2); + }) + }); + + emit(target, 'message'); + assert.deepEqual([ 1 ], actual, 'first listener called'); + emit(target, 'message'); + assert.deepEqual([ 1, 1, 2 ], actual, 'second listener called'); + target.off(); + emit(target, 'message'); + assert.deepEqual([ 1, 1, 2 ], actual, 'target.off() removed all listeners'); +}; + exports['test error handling'] = function(assert) { let target = EventTarget(); let error = Error('boom!'); @@ -201,5 +219,4 @@ exports['test target is chainable'] = function (assert, done) { emit(emitter, 'data', 'message'); }; -require('test').run(exports); - +require('sdk/test').run(exports); diff --git a/addon-sdk/source/test/test-page-mod.js b/addon-sdk/source/test/test-page-mod.js index 36adfbc32f2..43d8726e4f8 100644 --- a/addon-sdk/source/test/test-page-mod.js +++ b/addon-sdk/source/test/test-page-mod.js @@ -4,17 +4,13 @@ "use strict"; const { PageMod } = require("sdk/page-mod"); -const { testPageMod, handleReadyState } = require("./pagemod-test-helpers"); +const { testPageMod, handleReadyState, contentScriptWhenServer } = require("./pagemod-test-helpers"); const { Loader } = require('sdk/test/loader'); const tabs = require("sdk/tabs"); const { setTimeout } = require("sdk/timers"); const { Cc, Ci, Cu } = require("chrome"); -const { - open, - getFrames, - getMostRecentBrowserWindow, - getInnerId -} = require('sdk/window/utils'); +const system = require("sdk/system/events"); +const { open, getFrames, getMostRecentBrowserWindow, getInnerId } = require('sdk/window/utils'); const { getTabContentWindow, getActiveTab, setTabURL, openTab, closeTab } = require('sdk/tabs/utils'); const xulApp = require("sdk/system/xul-app"); const { isPrivateBrowsingSupported } = require('sdk/self'); @@ -24,7 +20,6 @@ const { isTabPBSupported, isWindowPBSupported, isGlobalPBSupported } = require(' const promise = require("sdk/core/promise"); const { pb } = require('./private-browsing/helper'); const { URL } = require("sdk/url"); -const { LoaderWithHookedConsole } = require('sdk/test/loader'); const { waitUntil } = require("sdk/test/utils"); const data = require("./fixtures"); @@ -64,7 +59,8 @@ exports.testPageMod1 = function(assert, done) { "PageMod.onReady test" ); done(); - } + }, + 100 ); }; @@ -96,7 +92,9 @@ exports.testPageMod2 = function(assert, done) { assert.equal("AUQLUE" in win, false, "PageMod test #2: scripts get a wrapped window"); done(); - }); + }, + 100 + ); }; exports.testPageModIncludes = function(assert, done) { @@ -622,15 +620,14 @@ exports.testContentScriptWhenDefault = function(assert) { // test timing for all 3 contentScriptWhen options (start, ready, end) // for new pages, or tabs opened after PageMod is created exports.testContentScriptWhenForNewTabs = function(assert, done) { - const url = "data:text/html;charset=utf-8,testContentScriptWhenForNewTabs"; - + let srv = contentScriptWhenServer(); + let url = srv.URL + '?ForNewTabs'; let count = 0; handleReadyState(url, 'start', { onLoading: (tab) => { assert.pass("PageMod is attached while document is loading"); - if (++count === 3) - tab.close(done); + checkDone(++count, tab, srv, done); }, onInteractive: () => assert.fail("onInteractive should not be called with 'start'."), onComplete: () => assert.fail("onComplete should not be called with 'start'."), @@ -639,8 +636,7 @@ exports.testContentScriptWhenForNewTabs = function(assert, done) { handleReadyState(url, 'ready', { onInteractive: (tab) => { assert.pass("PageMod is attached while document is interactive"); - if (++count === 3) - tab.close(done); + checkDone(++count, tab, srv, done); }, onLoading: () => assert.fail("onLoading should not be called with 'ready'."), onComplete: () => assert.fail("onComplete should not be called with 'ready'."), @@ -649,8 +645,7 @@ exports.testContentScriptWhenForNewTabs = function(assert, done) { handleReadyState(url, 'end', { onComplete: (tab) => { assert.pass("PageMod is attached when document is complete"); - if (++count === 3) - tab.close(done); + checkDone(++count, tab, srv, done); }, onLoading: () => assert.fail("onLoading should not be called with 'end'."), onInteractive: () => assert.fail("onInteractive should not be called with 'end'."), @@ -662,18 +657,18 @@ exports.testContentScriptWhenForNewTabs = function(assert, done) { // test timing for all 3 contentScriptWhen options (start, ready, end) // for PageMods created right as the tab is created (in tab.onOpen) exports.testContentScriptWhenOnTabOpen = function(assert, done) { - const url = "data:text/html;charset=utf-8,testContentScriptWhenOnTabOpen"; + let srv = contentScriptWhenServer(); + let url = srv.URL + '?OnTabOpen'; + let count = 0; tabs.open({ url: url, onOpen: function(tab) { - let count = 0; handleReadyState(url, 'start', { onLoading: () => { assert.pass("PageMod is attached while document is loading"); - if (++count === 3) - tab.close(done); + checkDone(++count, tab, srv, done); }, onInteractive: () => assert.fail("onInteractive should not be called with 'start'."), onComplete: () => assert.fail("onComplete should not be called with 'start'."), @@ -682,8 +677,7 @@ exports.testContentScriptWhenOnTabOpen = function(assert, done) { handleReadyState(url, 'ready', { onInteractive: () => { assert.pass("PageMod is attached while document is interactive"); - if (++count === 3) - tab.close(done); + checkDone(++count, tab, srv, done); }, onLoading: () => assert.fail("onLoading should not be called with 'ready'."), onComplete: () => assert.fail("onComplete should not be called with 'ready'."), @@ -692,8 +686,7 @@ exports.testContentScriptWhenOnTabOpen = function(assert, done) { handleReadyState(url, 'end', { onComplete: () => { assert.pass("PageMod is attached when document is complete"); - if (++count === 3) - tab.close(done); + checkDone(++count, tab, srv, done); }, onLoading: () => assert.fail("onLoading should not be called with 'end'."), onInteractive: () => assert.fail("onInteractive should not be called with 'end'."), @@ -706,20 +699,18 @@ exports.testContentScriptWhenOnTabOpen = function(assert, done) { // test timing for all 3 contentScriptWhen options (start, ready, end) // for PageMods created while the tab is interactive (in tab.onReady) exports.testContentScriptWhenOnTabReady = function(assert, done) { - // need a bit bigger document to get the right timing of events with e10s - let iframeURL = 'data:text/html;charset=utf-8,testContentScriptWhenOnTabReady'; - let iframe = '