ScrollFinal.js 181 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279
  1. (function() {
  2. var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
  3. var __module = nodeEnv ? module : {exports:{}};
  4. var __filename = 'preview-scripts/assets/script/utils/ScrollFinal.js';
  5. var __require = nodeEnv ? function (request) {
  6. return cc.require(request);
  7. } : function (request) {
  8. return __quick_compile_project__.require(request, __filename);
  9. };
  10. function __define (exports, require, module) {
  11. if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
  12. cc._RF.push(module, '2f09cXFfgJER7l59b1/4lNF', 'ScrollFinal');
  13. // script/utils/ScrollFinal.ts
  14. "use strict";
  15. /**
  16. * @Author huangxin
  17. * @ctime 2020-06-10
  18. * @Version
  19. * ScrollFinal1.0 2020-06-10 beta升级,使用挂载预制体
  20. * ScrollFinal1.1 2020-08-11 新增对象池类大法
  21. * ScrollFinal1.2 2020-08-17 1.新增延迟刷新item,防止在某一帧生成过量item导致卡顿的问题
  22. * 2.初始的控件属性设置(init方法)改为由initScrollView触发(原本的onLoad触发在适配模式下会不准确)
  23. * ScrollFinal1.3 2021-05-26 现在的滚动节点不需要手动添加scrollView组件了
  24. * ScrollFinal1.4 2022-04-14 现在可以在初始化或refresh时,立刻滚动到某个位置了
  25. * ScrollFinal1.5 2023-06-22 新增 adapterItem , 可在index首次出现时设定它的高度(后续把动态修改补上)
  26. * @Tips
  27. * 复用滚动轴 用来减少drawcall
  28. * 与cc.ScrollView组件一同挂载在一个节点上
  29. * item挂载的脚本必须添加setData方法,用来传递数据
  30. * item锚点应该在中心
  31. * 目前Grid类型只支持从左上到右下模式(垂直滚动),其他奇葩模式自己搞定
  32. * 滚动轴的锚点必须放在滚动列表的起始位置(比如背包grid模式在左上角,成就列表在左上角)
  33. *
  34. * @adapterItem item如有不定高度时,编辑器中设定的item需要为最小高度,确保instance的个数最大值是正确的
  35. * 支持不规则高度item 谨用,有缺陷:
  36. * 1.同一个item再次设置不同高度时会出现问题(若要修改,需要做一个链表来关联前后item)
  37. * 2.仅支持垂直和水平模式,背包模式不支持(水平模式未测试)
  38. */
  39. var __extends = (this && this.__extends) || (function () {
  40. var extendStatics = function (d, b) {
  41. extendStatics = Object.setPrototypeOf ||
  42. ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
  43. function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
  44. return extendStatics(d, b);
  45. };
  46. return function (d, b) {
  47. extendStatics(d, b);
  48. function __() { this.constructor = d; }
  49. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  50. };
  51. })();
  52. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  53. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  54. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  55. else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
  56. return c > 3 && r && Object.defineProperty(target, key, r), r;
  57. };
  58. Object.defineProperty(exports, "__esModule", { value: true });
  59. var gameMethod_1 = require("../common/gameMethod");
  60. var TypeConst_1 = require("../data/const/TypeConst");
  61. var ScrollInner_1 = require("./ScrollInner");
  62. var ScrollOut_1 = require("./ScrollOut");
  63. // 对象池类型
  64. var PoolEnum = cc.Enum({
  65. /**通用道具 */
  66. ITEM_BASE: 0,
  67. /**背包道具 */
  68. ITEM_BAG: 1,
  69. });
  70. // 滚动类型
  71. var ScrollDirEnum = cc.Enum({
  72. /**垂直*/
  73. VERTICAL: 0,
  74. /**水平*/
  75. HORIZONTAL: 1,
  76. /**背包*/
  77. GRID: 2
  78. });
  79. // 滚动类型
  80. var ScrollOutInner = cc.Enum({
  81. /**外层scroll*/
  82. DEFAULT: 0,
  83. /**外层scroll*/
  84. OUT: 1,
  85. /**内层scroll*/
  86. INNER: 2,
  87. });
  88. var _a = cc._decorator, ccclass = _a.ccclass, property = _a.property, menu = _a.menu;
  89. var ScrollFinal = /** @class */ (function (_super) {
  90. __extends(ScrollFinal, _super);
  91. function ScrollFinal() {
  92. var _this = _super !== null && _super.apply(this, arguments) || this;
  93. // @property(cc.ScrollView)
  94. // scroll: cc.ScrollView | null = null
  95. _this.useNodePool = false;
  96. _this.poolType = PoolEnum.ITEM_BASE;
  97. _this.scrollDir = ScrollDirEnum.VERTICAL; // 滚动类型
  98. _this.outInner = ScrollOutInner.DEFAULT;
  99. _this.padingX = 10;
  100. _this.padingY = 10;
  101. _this.padingY2 = 0;
  102. _this.spacingX = 20;
  103. _this.spacingY = 20;
  104. _this.itemPrefab = null; // item资源加载地址
  105. _this.itemScript = ""; // item挂在的脚本名
  106. _this.itemScale = 1; // item缩放比例
  107. _this.inertia = true;
  108. _this.brake = 0.75;
  109. _this.elastic = true;
  110. _this.cancelInnerEvents = true;
  111. _this.adapterItem = false;
  112. _this.adapterList = {}; // 记录适配的坐标列表
  113. _this.adapterContentLength = 0; // 激活适配后的content高度
  114. // @property({
  115. // tooltip: "启动widget模式(注意激活后不可与原生cc.widget同时使用)"
  116. // })
  117. // useWidget: boolean = false
  118. // @property({ tooltip: "适配顶部", visible: function () { return this.useWidget == true } })
  119. // useAlignTop: boolean = false
  120. // @property({ tooltip: "距离父节点顶部", visible: function () { return this.useAlignTop == true } })
  121. // widgetTop: number = 0
  122. // @property({ tooltip: "适配底部", visible: function () { return this.useWidget == true } })
  123. // useAlignBottom: boolean = false
  124. // @property({ tooltip: "距离父节点底部", visible: function () { return this.useAlignBottom == true } })
  125. // widgetBottom: number = 0
  126. // @property({ tooltip: "适配左侧", visible: function () { return this.useWidget == true } })
  127. // useAlignLeft: boolean = false
  128. // @property({ tooltip: "距离父节点左侧", visible: function () { return this.useAlignLeft == true } })
  129. // widgetLeft: number = 0
  130. // @property({ tooltip: "适配右侧", visible: function () { return this.useWidget == true } })
  131. // useAlignRight: boolean = false
  132. // @property({ tooltip: "距离父节点右侧", visible: function () { return this.useAlignRight == true } })
  133. // widgetRight: number = 0
  134. _this.showAnim = 0;
  135. _this.animSpeed = 0.15;
  136. _this.ctime = 0;
  137. _this.cnumber = 1;
  138. _this.isScrollUp = false; // 当前往哪个方向滚动 左和上是true
  139. _this._itemDataList = []; // 当前显示阵营的所有数据
  140. _this.extraParams = []; // 额外数据
  141. _this.itemList = []; // 实例化的item列表
  142. _this.instantiateCount = 0; // item实例化数量
  143. _this.hangCount = 0; // 行个数
  144. _this.lieCount = 0; // 列个数
  145. _this.itemDistanceX = 0; // item中心点之间的距离
  146. _this.itemDistanceY = 0; // item中心点之间的距离
  147. _this.scrollMaxOffsetX = 0; // 最大可滚动区域X
  148. _this.scrollMaxOffsetY = 0; // 最大可滚动区域Y
  149. _this.scrollIndex = -1; // scroll参数
  150. _this.lastScrollPos = 0; //上一次的滚动位置
  151. _this.curScrollPos = 0; // 当前滚动位置
  152. _this.itemWidth = 10; // item宽度
  153. _this.itemHeight = 10; // item高度
  154. _this.tagLang = 0;
  155. _this.tagIndex = -999; // 999 表示清0状态,此时无【插入标签】,-1表示标签置顶,其他即当前标签的下方(右侧)显示
  156. _this.canCreateItem = false; // 可以生成item
  157. _this.createIndex = 0; // 生成item的数据标签
  158. _this.life = 0; // 生成item的时间
  159. _this.baseIndex = 0; // 基础标签位置
  160. _this.hasInit = false;
  161. return _this;
  162. }
  163. ScrollFinal.prototype.onLoad = function () {
  164. // if (this.node.getComponent(cc.ScrollView) != null) {
  165. // console.error("滚动节点无需挂载scrollView组件了")
  166. // return
  167. // }
  168. this.init();
  169. };
  170. ScrollFinal.prototype.resetSize = function () {
  171. if (this.mask) {
  172. this.mask.setContentSize(this.node.getContentSize());
  173. }
  174. if (this.content) {
  175. // this.content.setContentSize(this.node.getContentSize())
  176. this.setScrollContentSize();
  177. }
  178. this.setInstantCount();
  179. };
  180. ScrollFinal.prototype.init = function () {
  181. if (this.hasInit) {
  182. return;
  183. }
  184. /////////////// 构建滚动轴 ///////////////
  185. this.scrollView = this.outInner == ScrollOutInner.DEFAULT ? this.addComponent(cc.ScrollView) :
  186. this.outInner == ScrollOutInner.OUT ? this.addComponent(ScrollOut_1.default) : this.addComponent(ScrollInner_1.default);
  187. // this.scrollView = this.addComponent(cc.ScrollView)
  188. this.scrollView.horizontal = this.scrollDir == ScrollDirEnum.HORIZONTAL;
  189. this.scrollView.vertical = this.scrollDir != ScrollDirEnum.HORIZONTAL;
  190. this.scrollView.inertia = this.inertia;
  191. this.scrollView.brake = this.brake;
  192. this.scrollView.elastic = this.elastic;
  193. this.scrollView.cancelInnerEvents = this.cancelInnerEvents;
  194. /////////////// 检测是否需要重新适配 ///////////////
  195. if (this.node.getComponent(cc.Widget)) {
  196. this.node.getComponent(cc.Widget).updateAlignment();
  197. }
  198. /////////////// 构建滚动遮罩 ///////////////
  199. this.mask = new cc.Node();
  200. this.mask.parent = this.node;
  201. this.mask.name = "scrollMask";
  202. this.mask.setContentSize(this.node.getContentSize());
  203. this.mask.addComponent(cc.Widget);
  204. this.mask.getComponent(cc.Widget).isAlignTop = true;
  205. this.mask.getComponent(cc.Widget).isAlignBottom = true;
  206. this.mask.getComponent(cc.Widget).top = 0;
  207. this.mask.getComponent(cc.Widget).bottom = 0;
  208. this.mask.addComponent(cc.Mask);
  209. this.mask.getComponent(cc.Mask).type = cc.Mask.Type.RECT;
  210. this.mask.anchorX = this.node.anchorX;
  211. this.mask.anchorY = this.node.anchorY;
  212. this.mask.x = 0;
  213. this.mask.y = 0;
  214. // widget不需要加了
  215. // let maskWidget = mask.addComponent(cc.Widget)
  216. // maskWidget.isAlignTop = true
  217. // maskWidget.isAlignBottom = true
  218. // maskWidget.isAlignLeft = true
  219. // maskWidget.isAlignRight = true
  220. // maskWidget.top = 0
  221. // maskWidget.bottom = 0
  222. // maskWidget.left = 0
  223. // maskWidget.right = 0
  224. /////////////// 构建滚动内容器 ///////////////
  225. this.content = new cc.Node();
  226. this.content.parent = this.mask;
  227. this.content.name = "scrollContent";
  228. this.scrollView.content = this.content;
  229. this.content.setContentSize(this.node.getContentSize());
  230. this.content.anchorX = this.node.anchorX;
  231. this.content.anchorY = this.node.anchorY;
  232. this.content.x = 0;
  233. this.content.y = 0;
  234. this.hasInit = true;
  235. this.itemWidth = this.itemPrefab.data.getContentSize().width;
  236. this.itemHeight = this.itemPrefab.data.getContentSize().height;
  237. // SCROLL_BOUNCE_BOTTOM = 'bounce-bottom',//滚动视图滚动到顶部边界并且开始回弹时发出的事件
  238. // SCROLL_BOUNCE_LEFT = 'bounce-left',//滚动视图滚动到底部边界并且开始回弹时发出的事件
  239. // SCROLL_BOUNCE_RIGHT = 'bounce-right',//滚动视图滚动到左边界并且开始回弹时发出的事件
  240. // SCROLL_BOUNCE_TOP = 'bounce-top',//滚动视图滚动到右边界并且开始回弹时发出的事件
  241. this.scrollView.node.on(TypeConst_1.CC_NODE_EVENT.SCROLLING, this.onScroll, this);
  242. this.scrollView.node.on(TypeConst_1.CC_NODE_EVENT.SCROLL_BEGAN, this.onScrollBegan, this);
  243. this.scrollView.node.on(TypeConst_1.CC_NODE_EVENT.SCROLL_BOUNCE_TOP, this.onBounceTop, this);
  244. this.scrollView.node.on(TypeConst_1.CC_NODE_EVENT.SCROLL_BOUNCE_BOTTOM, function () { }, this);
  245. this.scrollView.node.on(TypeConst_1.CC_NODE_EVENT.SCROLL_BOUNCE_LEFT, function () { }, this);
  246. this.scrollView.node.on(TypeConst_1.CC_NODE_EVENT.SCROLL_BOUNCE_RIGHT, function () { }, this);
  247. this.scrollView.node.on(TypeConst_1.CC_NODE_EVENT.SCROLL_BOUNCE_TOP, function () { }, this);
  248. this.itemDistanceX = this.realItemWidth + this.spacingX;
  249. this.itemDistanceY = this.realItemHeight + this.spacingY;
  250. this.setInstantCount();
  251. // //看下有没有不应该有的组件
  252. // // Layout
  253. // if (this.scrollView.content.getComponent(cc.Layout)) {
  254. // console.error("scrollFinal 与 layout 冲突,清删除 content 中的 layout 组件")
  255. // }
  256. // // Widget
  257. // if (this.scrollView.node.getComponent(cc.Widget)) {
  258. // if (this.scrollView.node.getComponent(cc.Widget).isAlignTop &&
  259. // this.scrollView.node.getComponent(cc.Widget).isAlignBottom) {
  260. // console.error("不能用widget做长度适配(因为Widget的延迟),只可用作坐标适配")
  261. // }
  262. // }
  263. };
  264. ScrollFinal.prototype.setInstantCount = function () {
  265. if (this.scrollView == null) {
  266. return;
  267. }
  268. switch (this.scrollDir) {
  269. case ScrollDirEnum.VERTICAL:
  270. this.hangCount = 1;
  271. this.lieCount = Math.ceil(this.scrollView.node.height / (this.itemDistanceY)) + 1;
  272. this.instantiateCount = this.lieCount;
  273. break;
  274. case ScrollDirEnum.HORIZONTAL:
  275. this.hangCount = Math.ceil(this.scrollView.node.width / (this.itemDistanceX)) + 1;
  276. this.lieCount = 1;
  277. this.instantiateCount = this.hangCount;
  278. break;
  279. case ScrollDirEnum.GRID:
  280. this.hangCount = Math.floor(this.scrollView.node.width / (this.itemDistanceX));
  281. this.lieCount = Math.ceil(this.scrollView.node.height / (this.itemDistanceY)) + 1;
  282. this.instantiateCount = this.hangCount * this.lieCount;
  283. break;
  284. }
  285. };
  286. ScrollFinal.prototype.initScrollView = function (list) {
  287. if (list === void 0) { list = []; }
  288. var args = [];
  289. for (var _i = 1; _i < arguments.length; _i++) {
  290. args[_i - 1] = arguments[_i];
  291. }
  292. // this.scheduleOnce(() => {
  293. this.init();
  294. this.clear();
  295. this.clearTag();
  296. this.adapterList = {};
  297. this.itemDataList = list;
  298. this.extraParams = args;
  299. if (this.outInner == ScrollOutInner.OUT) {
  300. this.extraParams.push(this.scrollView);
  301. }
  302. this.scrollView.stopAutoScroll();
  303. this.showUI();
  304. // }, 0)
  305. };
  306. Object.defineProperty(ScrollFinal.prototype, "itemDataList", {
  307. get: function () {
  308. return this._itemDataList;
  309. },
  310. set: function (list) {
  311. this._itemDataList = list;
  312. if (!this.adapterItem) {
  313. return;
  314. }
  315. // 适配模式,需要去掉记录的信息
  316. var newAdapterList = {};
  317. for (var index = 0; index < list.length; index++) {
  318. if (this.adapterList[index]) {
  319. newAdapterList[index] = this.adapterList[index];
  320. }
  321. }
  322. this.adapterList = newAdapterList;
  323. switch (this.scrollDir) {
  324. case ScrollDirEnum.VERTICAL:
  325. this.adapterContentLength = 0;
  326. for (var idx in this.adapterList) {
  327. this.adapterContentLength = Math.max(Math.abs(this.adapterList[idx].y) + this.adapterList[idx].height / 2);
  328. }
  329. break;
  330. case ScrollDirEnum.HORIZONTAL:
  331. this.adapterContentLength = 0;
  332. for (var idx in this.adapterList) {
  333. this.adapterContentLength = Math.max(this.adapterList[idx].x + this.adapterList[idx].width / 2);
  334. }
  335. break;
  336. }
  337. },
  338. enumerable: false,
  339. configurable: true
  340. });
  341. ScrollFinal.prototype.getPositionInView = function (item) {
  342. if (this.scrollView == null) {
  343. return cc.v2(0, 0);
  344. }
  345. var worldPos = item.parent.convertToWorldSpaceAR(item.position);
  346. var viewPos = this.scrollView.node.convertToNodeSpaceAR(worldPos);
  347. return viewPos;
  348. };
  349. ScrollFinal.prototype.onBounceTop = function () {
  350. switch (this.scrollDir) {
  351. case ScrollDirEnum.HORIZONTAL:
  352. break;
  353. case ScrollDirEnum.VERTICAL:
  354. case ScrollDirEnum.GRID:
  355. this.checkScrollState();
  356. if (this.adapterItem) {
  357. // @TODO
  358. }
  359. break;
  360. }
  361. this.scrollIndex = -1;
  362. };
  363. ScrollFinal.prototype.onScroll = function () {
  364. var _this = this;
  365. this.curScrollPos = 0;
  366. if (this.scrollDir == ScrollDirEnum.HORIZONTAL) {
  367. this.curScrollPos = this.scrollView.getScrollOffset().x;
  368. this.isScrollUp = this.curScrollPos < this.lastScrollPos;
  369. }
  370. else {
  371. this.curScrollPos = this.scrollView.getScrollOffset().y;
  372. this.isScrollUp = this.curScrollPos > this.lastScrollPos;
  373. }
  374. this.lastScrollPos = this.curScrollPos;
  375. if (this.scrollView == null) {
  376. return;
  377. }
  378. this.itemList.forEach(function (ele) {
  379. _this.tryResetItem(ele);
  380. });
  381. };
  382. ScrollFinal.prototype.tryResetItem = function (ele) {
  383. switch (this.scrollDir) {
  384. case ScrollDirEnum.HORIZONTAL:
  385. if (this.curScrollPos >= 0 || this.curScrollPos <= this.scrollMaxOffsetX) {
  386. return;
  387. }
  388. break;
  389. case ScrollDirEnum.VERTICAL:
  390. case ScrollDirEnum.GRID:
  391. if (this.curScrollPos <= -this.realItemHeight / 2 || this.curScrollPos >= this.scrollMaxOffsetY + this.realItemHeight / 2) {
  392. return;
  393. }
  394. }
  395. var scrollWidth = this.scrollView.node.width;
  396. var scrollHeight = this.scrollView.node.height;
  397. var element = ele.node;
  398. switch (this.scrollDir) {
  399. case ScrollDirEnum.HORIZONTAL:
  400. if (this.isScrollUp && this.getPositionInView(element).x < -(scrollWidth * this.node.anchorX + ele.node.width / 2)) {
  401. // 超出左边界显示区域
  402. var idx = ele.index + this.instantiateCount;
  403. if (idx < this.itemDataList.length) {
  404. this.setItemData(element, this.itemDataList[idx], idx);
  405. // element.x = element.x + this.hangCount * ele.node.width
  406. ele.index = idx;
  407. this.setPosX(idx, element);
  408. }
  409. }
  410. else if (!this.isScrollUp && this.getPositionInView(element).x > scrollWidth * (1 - this.node.anchorX) + ele.node.width / 2) {
  411. // 超出右边界显示区域
  412. var idx = ele.index - this.instantiateCount;
  413. if (idx >= 0) {
  414. this.setItemData(element, this.itemDataList[idx], idx);
  415. // element.x = element.x - this.hangCount * ele.node.width
  416. ele.index = idx;
  417. this.setPosX(idx, element);
  418. }
  419. }
  420. break;
  421. case ScrollDirEnum.VERTICAL:
  422. case ScrollDirEnum.GRID:
  423. if (this.isScrollUp && this.getPositionInView(element).y > scrollHeight * (1 - this.node.anchorY) + ele.node.height / 2) {
  424. // 超出上边界显示区域
  425. var idx = ele.index + this.instantiateCount;
  426. if (idx < this.itemDataList.length && this.isScrollUp) {
  427. this.setItemData(element, this.itemDataList[idx], idx);
  428. ele.index = idx;
  429. this.setPosY(idx, element);
  430. }
  431. }
  432. else if (!this.isScrollUp && this.curScrollPos > -ele.node.height / 2 && this.getPositionInView(element).y < -(scrollHeight * this.node.anchorY + ele.node.height / 2)) {
  433. // 超出下边界显示区域
  434. var idx = ele.index - this.instantiateCount;
  435. if (idx >= 0 && this.isScrollUp == false) {
  436. this.setItemData(element, this.itemDataList[idx], idx);
  437. ele.index = idx;
  438. this.setPosY(idx, element);
  439. }
  440. }
  441. break;
  442. }
  443. };
  444. ScrollFinal.prototype.setPosX = function (index, node) {
  445. var x = 0;
  446. if (this.adapterItem) {
  447. if (this.adapterList[index] && this.adapterList[index].x != null) {
  448. if (node) {
  449. node.x = this.adapterList[index].x;
  450. }
  451. return this.adapterList[index].x;
  452. }
  453. else {
  454. var lastX = index == 0 ? 0 : this.adapterList[index - 1].x;
  455. var lastWidth = index == 0 ? 0 : this.adapterList[index - 1].width;
  456. // 上一个坐标 + 当前node偏移量
  457. switch (this.scrollDir) {
  458. case ScrollDirEnum.VERTICAL:
  459. x = this.scrollView.content.width / 2 + this.padingX; //this.realItemWidth / 2 + this.padingX
  460. break;
  461. case ScrollDirEnum.HORIZONTAL:
  462. x += node.width / 2 + this.padingX + lastX + lastWidth / 2 + this.spacingX;
  463. this.adapterContentLength = Math.max(x + node.width / 2);
  464. this.setScrollContentSize();
  465. break;
  466. case ScrollDirEnum.GRID:
  467. x = index % this.hangCount * this.itemDistanceX + this.realItemWidth / 2 + this.padingX;
  468. break;
  469. }
  470. if (this.adapterList[index] == null) {
  471. this.adapterList[index] = { x: null, y: null, width: null, height: null };
  472. }
  473. this.adapterList[index].x = x;
  474. this.adapterList[index].width = node.width;
  475. if (node) {
  476. node.x = x;
  477. }
  478. return x;
  479. }
  480. }
  481. else {
  482. switch (this.scrollDir) {
  483. case ScrollDirEnum.VERTICAL:
  484. x = this.scrollView.content.width / 2 + this.padingX; //this.realItemWidth / 2 + this.padingX
  485. break;
  486. case ScrollDirEnum.HORIZONTAL:
  487. x = index * this.itemDistanceX + this.realItemWidth / 2 + this.padingX;
  488. if (this.tagIndex >= -1 && index > this.tagIndex) {
  489. x += this.tagLang;
  490. }
  491. break;
  492. case ScrollDirEnum.GRID:
  493. x = index % this.hangCount * this.itemDistanceX + this.realItemWidth / 2 + this.padingX;
  494. break;
  495. }
  496. if (node) {
  497. node.x = x;
  498. }
  499. return x;
  500. }
  501. };
  502. ScrollFinal.prototype.setPosY = function (index, node) {
  503. var y = 0;
  504. if (this.adapterItem) {
  505. if (this.adapterList[index] && this.adapterList[index].y != null) {
  506. if (node) {
  507. node.y = this.adapterList[index].y;
  508. }
  509. return this.adapterList[index].y;
  510. }
  511. else {
  512. var lastY = index == 0 ? 0 : this.adapterList[index - 1].y;
  513. var lastHeight = index == 0 ? 0 : this.adapterList[index - 1].height;
  514. switch (this.scrollDir) {
  515. case ScrollDirEnum.VERTICAL:
  516. y = lastY - this.padingY - node.height / 2 - lastHeight / 2 - this.spacingY;
  517. this.adapterContentLength = Math.max(Math.abs(y) + node.height / 2);
  518. this.setScrollContentSize();
  519. // y = -index * this.itemDistanceY - this.realItemHeight / 2 - this.padingY
  520. // if (this.tagIndex >= -1 && index > this.tagIndex) {
  521. // y -= this.tagLang
  522. // }
  523. break;
  524. case ScrollDirEnum.HORIZONTAL:
  525. y = -this.scrollView.content.height / 2 + this.padingY; //-this.realItemHeight / 2 - this.padingY
  526. break;
  527. case ScrollDirEnum.GRID:
  528. y = -Math.floor((index) / this.hangCount) * this.itemDistanceY - this.realItemHeight / 2 - this.padingY;
  529. if (this.tagIndex >= -1 && (Math.floor(index / this.hangCount)) > this.tagIndex) {
  530. y -= this.tagLang;
  531. }
  532. break;
  533. }
  534. if (this.adapterList[index] == null) {
  535. this.adapterList[index] = { x: null, y: null, width: null, height: null };
  536. }
  537. this.adapterList[index].y = y;
  538. this.adapterList[index].height = node.height;
  539. if (node) {
  540. node.y = y;
  541. }
  542. return y;
  543. }
  544. }
  545. else {
  546. switch (this.scrollDir) {
  547. case ScrollDirEnum.VERTICAL:
  548. y = -index * this.itemDistanceY - this.realItemHeight / 2 - this.padingY;
  549. if (this.tagIndex >= -1 && index > this.tagIndex) {
  550. y -= this.tagLang;
  551. }
  552. break;
  553. case ScrollDirEnum.HORIZONTAL:
  554. y = -this.scrollView.content.height / 2 + this.padingY; //-this.realItemHeight / 2 - this.padingY
  555. break;
  556. case ScrollDirEnum.GRID:
  557. y = -Math.floor((index) / this.hangCount) * this.itemDistanceY - this.realItemHeight / 2 - this.padingY;
  558. if (this.tagIndex >= -1 && (Math.floor(index / this.hangCount)) > this.tagIndex) {
  559. y -= this.tagLang;
  560. }
  561. break;
  562. }
  563. if (node) {
  564. node.y = y;
  565. }
  566. return y;
  567. }
  568. };
  569. ScrollFinal.prototype.setItemData = function (itemNode, data, index) {
  570. try {
  571. itemNode.getComponent(this.itemScript).setData(data, index, this.extraParams);
  572. }
  573. catch (error) {
  574. console.error("脚本中缺少setData方法,或者方法报错", error);
  575. }
  576. };
  577. // refreshItems调用,在刷新时可能需要重置item的index标签
  578. ScrollFinal.prototype.resetIndex = function (index) {
  579. if (this.itemDataList[index] != null) {
  580. return index;
  581. }
  582. return this.resetIndex(index - this.instantiateCount);
  583. };
  584. // 刷新单独的item
  585. ScrollFinal.prototype.refreshItem = function (index, data) {
  586. if (this.itemDataList[index] == null) {
  587. return;
  588. }
  589. this.itemDataList[index] = data;
  590. if (this.getItem(index) == null) {
  591. return;
  592. }
  593. this.setItemData(this.getItem(index), this.itemDataList[index], index);
  594. };
  595. // refreshItem(index: number) {
  596. // this.setItemData(this.getItem(index), this.itemDataList[index], index)
  597. // }
  598. ScrollFinal.prototype.refreshItems = function (itemDataList) {
  599. var _this = this;
  600. var args = [];
  601. for (var _i = 1; _i < arguments.length; _i++) {
  602. args[_i - 1] = arguments[_i];
  603. }
  604. this.itemDataList = itemDataList;
  605. if (args.length > 0) {
  606. this.extraParams = args;
  607. }
  608. if (this.outInner == ScrollOutInner.OUT) {
  609. this.extraParams.push(this.scrollView);
  610. }
  611. this.fixItemNodes();
  612. // 最终构造完整的 itemList 列表,刷新数据
  613. this.itemList.forEach(function (element) {
  614. try {
  615. var newIndex = _this.resetIndex(element.index);
  616. element.index = newIndex;
  617. _this.setItemData(element.node, _this.itemDataList[element.index], element.index);
  618. _this.setPosX(element.index, element.node);
  619. _this.setPosY(element.index, element.node);
  620. // element.node.getComponent(this.itemScript).setData(this.itemDataList[element.index], element.index, this.extraParams)
  621. }
  622. catch (error) {
  623. console.warn("脚本中缺少refreshItem方法,或者方法报错", error);
  624. }
  625. });
  626. };
  627. // 数据新增或减少时,增加或减少item
  628. ScrollFinal.prototype.fixItemNodes = function () {
  629. // 判断是否需要删除 itemList 里的数据
  630. if (this.itemDataList.length < this.instantiateCount && this.itemList.length > this.itemDataList.length) {
  631. var needDeleteCount = this.itemList.length - this.itemDataList.length;
  632. for (var index = this.itemDataList.length; index < this.itemDataList.length + needDeleteCount; index++) {
  633. this.itemList[index].node.destroy();
  634. }
  635. this.itemList.splice(this.itemDataList.length, needDeleteCount);
  636. // 判断是否需要增加 itemList 里的数据
  637. }
  638. else if (this.itemList.length < this.instantiateCount && this.itemList.length < this.itemDataList.length) {
  639. var addCount = Math.min(this.instantiateCount - this.itemList.length, this.itemDataList.length - this.itemList.length);
  640. var startIndex_1 = 0;
  641. this.itemList.forEach(function (element) {
  642. startIndex_1 = Math.max(element.index + 1, startIndex_1);
  643. });
  644. for (var addIndex = startIndex_1; addIndex < (startIndex_1 + addCount); addIndex++) {
  645. this.addItemNode(addIndex, this.itemDataList[addIndex], true);
  646. }
  647. }
  648. if (this.content) {
  649. this.setScrollContentSize();
  650. }
  651. };
  652. Object.defineProperty(ScrollFinal.prototype, "realItemWidth", {
  653. get: function () {
  654. return this.itemWidth * this.itemScale;
  655. },
  656. enumerable: false,
  657. configurable: true
  658. });
  659. Object.defineProperty(ScrollFinal.prototype, "realItemHeight", {
  660. get: function () {
  661. return this.itemHeight * this.itemScale;
  662. },
  663. enumerable: false,
  664. configurable: true
  665. });
  666. ScrollFinal.prototype.initItemNode = function () {
  667. if (this.useNodePool) {
  668. // @TODO PoolManager
  669. return cc.instantiate(this.itemPrefab);
  670. // if (this.poolType == PoolEnum.ITEM_BAG) {
  671. // return PoolManager.getItemBag(this.itemPrefab)
  672. // } else if (this.poolType == PoolEnum.ITEM_BASE) {
  673. // return PoolManager.getItemBase(this.itemPrefab)
  674. // }
  675. }
  676. else {
  677. return cc.instantiate(this.itemPrefab);
  678. }
  679. };
  680. // back
  681. ScrollFinal.prototype.onScrollBegan = function () {
  682. this.scrollIndex = 0;
  683. };
  684. ScrollFinal.prototype.showUI = function () {
  685. if (this.itemPrefab == null) {
  686. console.error("item预制体加载失败");
  687. return;
  688. }
  689. if (this.scrollView == null) {
  690. console.error("没有绑定scroll");
  691. return;
  692. }
  693. this.setCreateItems(true);
  694. this.scrollIndex = -1;
  695. this.scrollView.content.setAnchorPoint(0, 1);
  696. this.scrollView.content.setPosition(-this.scrollView.node.width / 2, this.scrollView.node.height / 2);
  697. this.setScrollContentSize();
  698. switch (this.scrollDir) {
  699. case ScrollDirEnum.VERTICAL:
  700. this.scrollView.scrollToTop();
  701. break;
  702. case ScrollDirEnum.HORIZONTAL:
  703. this.scrollView.scrollToLeft();
  704. break;
  705. case ScrollDirEnum.GRID:
  706. this.scrollView.scrollToTop();
  707. break;
  708. }
  709. };
  710. ScrollFinal.prototype.setCreateItems = function (bool) {
  711. if (bool) {
  712. this.scrollView.enabled = false;
  713. this.canCreateItem = true;
  714. this.createIndex = 0;
  715. this.baseIndex = 0;
  716. this.life = 0;
  717. }
  718. else {
  719. this.scrollView.enabled = true;
  720. this.canCreateItem = false;
  721. this.createIndex = 0;
  722. this.baseIndex = 0;
  723. this.life = 0;
  724. }
  725. };
  726. ScrollFinal.prototype.update = function (dt) {
  727. if (this.scrollIndex >= 0) {
  728. this.scrollIndex += dt;
  729. }
  730. if (!this.canCreateItem) {
  731. return;
  732. }
  733. for (var index = 0; index < this.cnumber; index++) {
  734. this.updateForCreateItem(dt);
  735. }
  736. };
  737. ScrollFinal.prototype.updateForCreateItem = function (dt) {
  738. if (!this.canCreateItem) {
  739. return;
  740. }
  741. if (this.life == 0) {
  742. // 生
  743. var _itemData = this.itemDataList[this.baseIndex];
  744. if (this.createIndex >= this.instantiateCount || _itemData == null) {
  745. this.setCreateItems(false);
  746. return;
  747. }
  748. this.addItemNode(this.baseIndex, _itemData);
  749. this.createIndex += 1;
  750. this.baseIndex += 1;
  751. }
  752. this.life += dt;
  753. if (this.life >= this.ctime) {
  754. this.life = 0;
  755. }
  756. };
  757. ScrollFinal.prototype.setScrollContentSize = function () {
  758. if (this.adapterItem) {
  759. switch (this.scrollDir) {
  760. case ScrollDirEnum.VERTICAL:
  761. this.scrollView.content.setContentSize(this.scrollView.node.width, this.adapterContentLength);
  762. break;
  763. case ScrollDirEnum.HORIZONTAL:
  764. this.scrollView.content.setContentSize(this.adapterContentLength, this.scrollView.node.height);
  765. break;
  766. case ScrollDirEnum.GRID:
  767. this.scrollView.content.setContentSize(this.scrollView.node.width, this.itemDistanceY * Math.ceil(this.itemDataList.length / this.hangCount) + this.padingY + this.tagLang + this.padingY2);
  768. break;
  769. }
  770. }
  771. else {
  772. switch (this.scrollDir) {
  773. case ScrollDirEnum.VERTICAL:
  774. this.scrollView.content.setContentSize(this.scrollView.node.width, this.itemDistanceY * this.itemDataList.length + this.padingY + this.tagLang + this.padingY2 - this.spacingY);
  775. break;
  776. case ScrollDirEnum.HORIZONTAL:
  777. this.scrollView.content.setContentSize(this.itemDistanceX * this.itemDataList.length + this.padingX + this.tagLang - this.spacingX, this.scrollView.node.height);
  778. break;
  779. case ScrollDirEnum.GRID:
  780. this.scrollView.content.setContentSize(this.scrollView.node.width, this.itemDistanceY * Math.ceil(this.itemDataList.length / this.hangCount) + this.padingY + this.tagLang + this.padingY2 - this.spacingY);
  781. break;
  782. }
  783. }
  784. this.scrollMaxOffsetX = -this.scrollView.getMaxScrollOffset().x;
  785. this.scrollMaxOffsetY = this.scrollView.getMaxScrollOffset().y;
  786. // console.log("---重新设置了滚动区域", this.scrollView.content.height)
  787. };
  788. /**
  789. * 弹出详情标签,将会重设后续item的坐标。
  790. * @param index item标签
  791. * @param lang 坐标偏移量
  792. */
  793. ScrollFinal.prototype.setTag = function (index, lang) {
  794. var _this = this;
  795. this.tagLang = lang;
  796. switch (this.scrollDir) {
  797. case ScrollDirEnum.VERTICAL:
  798. case ScrollDirEnum.HORIZONTAL:
  799. this.tagIndex = index;
  800. break;
  801. case ScrollDirEnum.GRID:
  802. this.tagIndex = Math.floor(index / this.hangCount);
  803. break;
  804. }
  805. this.setScrollContentSize();
  806. this.itemList.forEach(function (element) {
  807. _this.setPosX(element.index, element.node);
  808. _this.setPosY(element.index, element.node);
  809. });
  810. };
  811. /**清除详情标签,恢复item默认坐标 */
  812. ScrollFinal.prototype.clearTag = function () {
  813. var _this = this;
  814. this.setTag(-999, 0);
  815. // 修正index和坐标
  816. var scrollHeight = this.scrollView.node.height;
  817. this.itemList.forEach(function (ele) {
  818. // 判断是否超出边界
  819. if (_this.getPositionInView(ele.node).y > scrollHeight * (1 - _this.node.anchorY) + _this.itemDistanceY / 2) {
  820. if (ele.index + _this.instantiateCount < _this.itemDataList.length) {
  821. ele.index += _this.instantiateCount;
  822. }
  823. _this.setPosY(ele.index, ele.node);
  824. _this.setItemData(ele.node, _this.itemDataList[ele.index], ele.index);
  825. }
  826. else if (_this.getPositionInView(ele.node).y < -(scrollHeight * _this.node.anchorY + _this.itemDistanceY / 2)) {
  827. if (ele.index - _this.instantiateCount >= 0) {
  828. ele.index -= _this.instantiateCount;
  829. }
  830. _this.setPosY(ele.index, ele.node);
  831. _this.setItemData(ele.node, _this.itemDataList[ele.index], ele.index);
  832. }
  833. });
  834. this.setScrollContentSize();
  835. };
  836. /**删除某个元素 */
  837. ScrollFinal.prototype.del = function (index) {
  838. var _this = this;
  839. if (this.itemDataList.length < index) {
  840. return;
  841. }
  842. this.itemDataList.splice(index, 1);
  843. // // 判断下是否需要删除节点
  844. if (this.itemList.length > this.itemDataList.length) {
  845. this.itemList.pop().node.destroy();
  846. }
  847. this.setScrollContentSize();
  848. for (var index_1 = 0; index_1 < this.itemList.length; index_1++) {
  849. var element = this.itemList[index_1];
  850. if (this.itemDataList[element.index] == null) {
  851. element.index -= this.instantiateCount;
  852. break;
  853. }
  854. }
  855. this.itemList.forEach(function (element) {
  856. _this.setPosX(element.index, element.node);
  857. _this.setPosY(element.index, element.node);
  858. _this.setItemData(element.node, _this.itemDataList[element.index], element.index);
  859. });
  860. };
  861. /**在末尾添加一个元素 */
  862. ScrollFinal.prototype.add = function (data) {
  863. this.itemDataList.push(data);
  864. // 判断是否需要增加item
  865. if (this.itemList.length >= this.instantiateCount) {
  866. // 不需要
  867. // 判断下是否需要把最前面的放到最后面:1
  868. var needUpdate = false;
  869. for (var index = 0; index < this.itemList.length; index++) {
  870. if (this.itemList[index].index == this.itemDataList.length - 2) {
  871. needUpdate = true;
  872. break;
  873. }
  874. }
  875. if (needUpdate) {
  876. var minIndex = 1000; //这个是最小值
  877. var minUpdateIndex = 0; // 这个是最小值的标签
  878. for (var i = 0; i < this.itemList.length; i++) {
  879. if (this.itemList[i].index < minIndex) {
  880. minIndex = this.itemList[i].index;
  881. minUpdateIndex = i;
  882. }
  883. }
  884. // 判断下是否需要把最前面的放到最后面:2
  885. var _nodePos = 0;
  886. var _offset = 0;
  887. var needUpdate2 = false;
  888. switch (this.scrollDir) {
  889. case ScrollDirEnum.HORIZONTAL:
  890. _nodePos = this.itemList[minUpdateIndex].node.x;
  891. _offset = this.scrollView.getScrollOffset().x;
  892. needUpdate2 = _nodePos + _offset > this.itemWidth / 2;
  893. break;
  894. case ScrollDirEnum.VERTICAL:
  895. case ScrollDirEnum.GRID:
  896. _nodePos = this.itemList[minUpdateIndex].node.y;
  897. _offset = this.scrollView.getScrollOffset().y;
  898. needUpdate2 = _nodePos + _offset > this.itemHeight / 2;
  899. break;
  900. }
  901. if (needUpdate2) {
  902. this.itemList[minUpdateIndex].index += this.instantiateCount;
  903. this.setItemData(this.itemList[minUpdateIndex].node, data, this.itemList[minUpdateIndex].index);
  904. this.setPosX(this.itemList[minUpdateIndex].index, this.itemList[minUpdateIndex].node);
  905. this.setPosY(this.itemList[minUpdateIndex].index, this.itemList[minUpdateIndex].node);
  906. }
  907. }
  908. }
  909. else {
  910. // 需要
  911. var index = this.itemDataList.length - 1;
  912. this.addItemNode(index, data);
  913. }
  914. this.setScrollContentSize();
  915. };
  916. ScrollFinal.prototype.addItemNode = function (index, data, isRefresh) {
  917. if (isRefresh === void 0) { isRefresh = false; }
  918. var _node = this.initItemNode();
  919. // add放在前面.先激活onLoad方法,再走setData
  920. this.scrollView.content.addChild(_node);
  921. this.setItemData(_node, data, index);
  922. this.itemList.push({ index: index, node: _node });
  923. this.setPosX(index, _node);
  924. this.setPosY(index, _node);
  925. if (isRefresh || this.showAnim == 0) {
  926. _node.scale = this.itemScale;
  927. }
  928. else if (this.showAnim == 1) {
  929. _node.scale = 0;
  930. cc.tween(_node).
  931. to(this.animSpeed, { scale: this.itemScale + 0.1 }).
  932. to(this.animSpeed, { scale: this.itemScale }).
  933. start();
  934. }
  935. else if (this.showAnim == 2) {
  936. _node.scale = this.itemScale;
  937. var delayTime = index % this.hangCount / 20 + 0.1;
  938. _node.x -= _node.width / 2;
  939. _node.scaleX = 0;
  940. cc.tween(_node).delay(delayTime).to(this.animSpeed, { x: _node.x + _node.width / 2, scaleX: this.itemScale }).start();
  941. }
  942. else if (this.showAnim == 3) {
  943. //@TODO
  944. _node.scale = this.itemScale;
  945. var delayTime = index % this.hangCount / 20 + 0.1;
  946. _node.y += _node.height / 2;
  947. _node.scaleY = 0;
  948. cc.tween(_node).delay(delayTime).to(this.animSpeed, { y: _node.y - _node.height / 2, scaleY: this.itemScale }).start();
  949. }
  950. else if (this.showAnim == 4) {
  951. _node.scale = 0;
  952. cc.tween(_node).
  953. to(this.animSpeed, { scale: this.itemScale }).
  954. start();
  955. }
  956. else {
  957. _node.scale = this.itemScale;
  958. }
  959. };
  960. /**
  961. * @param val 立刻滚动到目标标签,目标标签将在顶部|左侧出现
  962. * @param type 滚到哪里的类型(1.居中 2.顶部|左侧 3.底部|右侧)
  963. */
  964. ScrollFinal.prototype.scrollToIndexNow = function (val, type) {
  965. if (type === void 0) { type = 1; }
  966. var args = [];
  967. for (var _i = 2; _i < arguments.length; _i++) {
  968. args[_i - 2] = arguments[_i];
  969. }
  970. if (this.adapterItem && this.adapterList[val] == null) {
  971. console.warn("未展示过,无法移动");
  972. return;
  973. }
  974. if (val >= this.itemDataList.length) {
  975. val = this.itemDataList.length - 1;
  976. }
  977. if (val < 0) {
  978. this.refreshItems(this.itemDataList);
  979. return;
  980. }
  981. this.scrollView.stopAutoScroll();
  982. this.baseIndex = val;
  983. var scrollPosIndex = this.baseIndex;
  984. if (this.itemDataList.length - this.baseIndex < this.instantiateCount) {
  985. this.baseIndex -= this.instantiateCount - (this.itemDataList.length - this.baseIndex);
  986. }
  987. else {
  988. if (type == 1) {
  989. this.baseIndex -= Math.ceil(this.instantiateCount / 2);
  990. }
  991. else if (type == 3) {
  992. this.baseIndex -= (this.lieCount - 1) * this.hangCount;
  993. }
  994. }
  995. if (this.scrollDir == ScrollDirEnum.GRID) {
  996. this.baseIndex -= this.baseIndex % this.hangCount;
  997. }
  998. this.baseIndex = Math.max(this.baseIndex, 0);
  999. var _itemWidth = this.adapterItem ? this.adapterList[val].width : this.itemWidth;
  1000. var _itemHeight = this.adapterItem ? this.adapterList[val].height : this.itemHeight;
  1001. // 从第几个标签开始显示
  1002. switch (this.scrollDir) {
  1003. case ScrollDirEnum.HORIZONTAL:
  1004. var _x = -(this.setPosX(scrollPosIndex) - (_itemWidth * this.itemScale + this.spacingX) / 2);
  1005. // 判断是否超过边界
  1006. if (_x < this.scrollMaxOffsetX) {
  1007. scrollPosIndex = this.itemDataList.length - this.instantiateCount;
  1008. this.scrollView.content.x = this.scrollMaxOffsetX;
  1009. }
  1010. else {
  1011. if (type == 1) {
  1012. this.scrollView.content.x = Math.min(-(this.setPosX(scrollPosIndex) - this.scrollView.node.width / 2), 0);
  1013. if (-(this.setPosX(scrollPosIndex) - this.scrollView.node.width / 2) >= 0) {
  1014. this.baseIndex = 0;
  1015. }
  1016. }
  1017. else if (type == 2) {
  1018. this.scrollView.content.x = -(this.setPosX(scrollPosIndex) - (_itemWidth * this.itemScale + this.spacingX) / 2);
  1019. }
  1020. else {
  1021. scrollPosIndex++;
  1022. this.scrollView.content.x = Math.min(-(this.setPosX(scrollPosIndex) - this.scrollView.node.width - _itemWidth / 2 - this.spacingY), 0);
  1023. if (-(this.setPosX(scrollPosIndex) - this.scrollView.node.width - _itemWidth / 2 - this.spacingY) >= 0) {
  1024. this.baseIndex = 0;
  1025. }
  1026. }
  1027. }
  1028. break;
  1029. case ScrollDirEnum.VERTICAL:
  1030. case ScrollDirEnum.GRID:
  1031. var _y = (Math.abs(this.setPosY(scrollPosIndex)) - (_itemHeight * this.itemScale + this.spacingY) / 2);
  1032. if (_y > this.scrollMaxOffsetY) {
  1033. scrollPosIndex = this.itemDataList.length - this.instantiateCount;
  1034. this.scrollView.content.y = this.scrollMaxOffsetY;
  1035. }
  1036. else {
  1037. if (type == 1) {
  1038. this.scrollView.content.y = Math.max(Math.abs(this.setPosY(scrollPosIndex)) - this.scrollView.node.height / 2, 0);
  1039. if (Math.abs(this.setPosY(scrollPosIndex)) - this.scrollView.node.height / 2 <= 0) {
  1040. this.baseIndex = 0;
  1041. }
  1042. }
  1043. else if (type == 2) {
  1044. this.scrollView.content.y = Math.abs(this.setPosY(scrollPosIndex)) - (_itemHeight * this.itemScale + this.spacingY) / 2;
  1045. }
  1046. else {
  1047. scrollPosIndex = this.scrollDir == ScrollDirEnum.VERTICAL ? (scrollPosIndex + 1) : scrollPosIndex + this.hangCount;
  1048. this.scrollView.content.y = Math.max(Math.abs(this.setPosY(scrollPosIndex)) - this.scrollView.node.height - _itemHeight / 2 - this.spacingY, 0);
  1049. if (Math.abs(this.setPosY(scrollPosIndex)) - this.scrollView.node.height - _itemHeight / 2 - this.spacingY <= 0) {
  1050. this.baseIndex = 0;
  1051. }
  1052. }
  1053. }
  1054. break;
  1055. }
  1056. if (args.length > 0) {
  1057. this.extraParams = args;
  1058. }
  1059. this.fixItemNodes();
  1060. // 如果content有子项目,则重制目标点位置
  1061. if (this.itemList.length > 0) {
  1062. for (var index = 0; index < this.itemList.length; index++) {
  1063. // let i = this.baseIndex + index
  1064. var elemnet = this.itemList[index];
  1065. elemnet.index = this.baseIndex + index;
  1066. this.setPosX(elemnet.index, elemnet.node);
  1067. this.setPosY(elemnet.index, elemnet.node);
  1068. if (gameMethod_1.gameMethod.isEmpty(this.itemDataList[elemnet.index])) {
  1069. continue;
  1070. }
  1071. this.setItemData(elemnet.node, this.itemDataList[elemnet.index], elemnet.index);
  1072. }
  1073. }
  1074. };
  1075. /**
  1076. * 尝试滚动到滚动视图中心
  1077. * @param index 标签
  1078. * @param type 滚到哪里的类型(1.居中 2.顶部|左侧 3.底部|右侧)
  1079. * @param time
  1080. */
  1081. ScrollFinal.prototype.scrollToIndex = function (index, type, time, offsetY) {
  1082. if (type === void 0) { type = 1; }
  1083. if (time === void 0) { time = 1; }
  1084. if (offsetY === void 0) { offsetY = 0; }
  1085. if (this.itemDataList[index] == null) {
  1086. console.error("不存在此标签");
  1087. return;
  1088. }
  1089. switch (this.scrollDir) {
  1090. case ScrollDirEnum.HORIZONTAL:
  1091. if (type == 1) {
  1092. this.scrollView.scrollToOffset(cc.v2(this.setPosX(index) - this.scrollView.node.width / 2, this.scrollView.getScrollOffset().y), time);
  1093. }
  1094. else if (type == 2) {
  1095. this.scrollView.scrollToOffset(cc.v2(this.setPosX(index) - this.itemDistanceX / 2, this.scrollView.getScrollOffset().y), time);
  1096. }
  1097. else {
  1098. index++;
  1099. this.scrollView.scrollToOffset(cc.v2(this.setPosX(index) - this.scrollView.node.width, this.scrollView.getScrollOffset().y - this.itemWidth / 2 - this.spacingX), time);
  1100. }
  1101. break;
  1102. case ScrollDirEnum.VERTICAL:
  1103. case ScrollDirEnum.GRID:
  1104. if (type == 1) {
  1105. this.scrollView.scrollToOffset(cc.v2(this.scrollView.getScrollOffset().x, Math.abs(this.setPosY(index)) - this.scrollView.node.height / 2 - offsetY), time);
  1106. }
  1107. else if (type == 2) {
  1108. this.scrollView.scrollToOffset(cc.v2(this.scrollView.getScrollOffset().x, Math.abs(this.setPosY(index)) - this.itemDistanceY / 2 - offsetY), time);
  1109. }
  1110. else {
  1111. index = this.scrollDir == ScrollDirEnum.VERTICAL ? (index + 1) : index + this.hangCount;
  1112. this.scrollView.scrollToOffset(cc.v2(this.scrollView.getScrollOffset().x, Math.abs(this.setPosY(index)) - this.scrollView.node.height - this.itemHeight / 2 - this.spacingY - offsetY), time);
  1113. }
  1114. break;
  1115. }
  1116. // this.scheduleOnce(() => {
  1117. // this.refreshItem(index)
  1118. // }, time)
  1119. };
  1120. ScrollFinal.prototype.getItem = function (index) {
  1121. for (var key in this.itemList) {
  1122. if (this.itemList[key].index == index) {
  1123. return this.itemList[key].node;
  1124. }
  1125. }
  1126. return;
  1127. };
  1128. ScrollFinal.prototype.checkScrollState = function () {
  1129. if (this.scrollIndex > this.itemDataList.length) {
  1130. this.scrollView.stopAutoScroll();
  1131. this.scrollView.scrollToOffset(cc.v2(0, this.scrollMaxOffsetY / 2));
  1132. }
  1133. };
  1134. // 使用对象池时,在切换界面时必须使用这个方法,将所有对象放到池中
  1135. ScrollFinal.prototype.clear = function () {
  1136. // @TODO PoolManager
  1137. if (this.scrollView && this.scrollView.content) {
  1138. this.scrollView.content.removeAllChildren();
  1139. }
  1140. // if (this.useNodePool) {
  1141. // this.itemList.forEach(element => {
  1142. // if (this.poolType == PoolEnum.ITEM_BAG) {
  1143. // PoolManager.putItemBag(element.node)
  1144. // } else if (this.poolType == PoolEnum.ITEM_BASE) {
  1145. // PoolManager.putItemBase(element.node)
  1146. // }
  1147. // });
  1148. // } else {
  1149. // if (this.scrollView && this.scrollView.content) {
  1150. // this.scrollView.content.removeAllChildren()
  1151. // }
  1152. // }
  1153. this.itemDataList = [];
  1154. this.itemList = [];
  1155. };
  1156. __decorate([
  1157. property({
  1158. tooltip: "使用对象池"
  1159. })
  1160. ], ScrollFinal.prototype, "useNodePool", void 0);
  1161. __decorate([
  1162. property({
  1163. type: PoolEnum,
  1164. visible: function () { return this.useNodePool; },
  1165. tooltip: "对象池类型"
  1166. })
  1167. ], ScrollFinal.prototype, "poolType", void 0);
  1168. __decorate([
  1169. property({
  1170. type: ScrollDirEnum,
  1171. visible: function () {
  1172. return true;
  1173. },
  1174. tooltip: "滚动类型"
  1175. })
  1176. ], ScrollFinal.prototype, "scrollDir", void 0);
  1177. __decorate([
  1178. property({
  1179. type: ScrollOutInner,
  1180. tooltip: "0=>常规scroll\n1=>外层scroll\n2=>内层scroll"
  1181. })
  1182. ], ScrollFinal.prototype, "outInner", void 0);
  1183. __decorate([
  1184. property({ tooltip: "与滚动层的边界-左" })
  1185. ], ScrollFinal.prototype, "padingX", void 0);
  1186. __decorate([
  1187. property({ tooltip: "与滚动层的边界-上" })
  1188. ], ScrollFinal.prototype, "padingY", void 0);
  1189. __decorate([
  1190. property({ tooltip: "与滚动层的边界-下" })
  1191. ], ScrollFinal.prototype, "padingY2", void 0);
  1192. __decorate([
  1193. property({
  1194. visible: function () { return this.scrollDir != ScrollDirEnum.VERTICAL; }, tooltip: "item行间距"
  1195. })
  1196. ], ScrollFinal.prototype, "spacingX", void 0);
  1197. __decorate([
  1198. property({
  1199. visible: function () { return this.scrollDir != ScrollDirEnum.HORIZONTAL; }, tooltip: "item列间距"
  1200. })
  1201. ], ScrollFinal.prototype, "spacingY", void 0);
  1202. __decorate([
  1203. property(cc.Prefab)
  1204. ], ScrollFinal.prototype, "itemPrefab", void 0);
  1205. __decorate([
  1206. property
  1207. ], ScrollFinal.prototype, "itemScript", void 0);
  1208. __decorate([
  1209. property
  1210. ], ScrollFinal.prototype, "itemScale", void 0);
  1211. __decorate([
  1212. property({
  1213. tooltip: "是否开启滚动惯性"
  1214. })
  1215. ], ScrollFinal.prototype, "inertia", void 0);
  1216. __decorate([
  1217. property({
  1218. tooltip: "开启惯性后,在用户停止触摸后滚动多块停止,0表示永不停止,1表示立即停止",
  1219. visible: function () { return this.inertia == true; },
  1220. })
  1221. ], ScrollFinal.prototype, "brake", void 0);
  1222. __decorate([
  1223. property({
  1224. tooltip: "是否允许滚动内容超过边界,并在停止触摸后回弹"
  1225. })
  1226. ], ScrollFinal.prototype, "elastic", void 0);
  1227. __decorate([
  1228. property({
  1229. tooltip: "滚动行为是否会取消子节点上注册的触摸事件",
  1230. })
  1231. ], ScrollFinal.prototype, "cancelInnerEvents", void 0);
  1232. __decorate([
  1233. property({
  1234. tooltip: "不支持背包,默认不激活",
  1235. displayName: "不固定item尺寸"
  1236. })
  1237. ], ScrollFinal.prototype, "adapterItem", void 0);
  1238. __decorate([
  1239. property({
  1240. tooltip: "展示生产动画\n0->不展示\n1->缩放动画\n2->x方向压扁拉伸\n3->y方向压扁拉伸\n4->慢缩放"
  1241. })
  1242. ], ScrollFinal.prototype, "showAnim", void 0);
  1243. __decorate([
  1244. property({
  1245. tooltip: "单个动画播放速度\n最佳播放速度参考:\n缩放动画->0.1\nx方向压扁拉伸->0.1\ny方向压扁拉伸->0.25\n慢缩放->0.3"
  1246. })
  1247. ], ScrollFinal.prototype, "animSpeed", void 0);
  1248. __decorate([
  1249. property({
  1250. tooltip: "创建item的延迟时间,设为0则为每帧生成。\n注意:在所有item刷新完之前,scroll组件的滚动功能将被关闭"
  1251. })
  1252. ], ScrollFinal.prototype, "ctime", void 0);
  1253. __decorate([
  1254. property({
  1255. tooltip: "每帧生成item的个数"
  1256. })
  1257. ], ScrollFinal.prototype, "cnumber", void 0);
  1258. ScrollFinal = __decorate([
  1259. ccclass,
  1260. menu('Scroll/ScrollFinal')
  1261. ], ScrollFinal);
  1262. return ScrollFinal;
  1263. }(cc.Component));
  1264. exports.default = ScrollFinal;
  1265. cc._RF.pop();
  1266. }
  1267. if (nodeEnv) {
  1268. __define(__module.exports, __require, __module);
  1269. }
  1270. else {
  1271. __quick_compile_project__.registerModuleFunc(__filename, function () {
  1272. __define(__module.exports, __require, __module);
  1273. });
  1274. }
  1275. })();
  1276. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvdXRpbHMvU2Nyb2xsRmluYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsbURBQWtEO0FBQ2xELHFEQUF3RDtBQUN4RCw2Q0FBd0M7QUFDeEMseUNBQW9DO0FBRXBDLFFBQVE7QUFDUixJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ25CLFVBQVU7SUFDVixTQUFTLEVBQUUsQ0FBQztJQUNaLFVBQVU7SUFDVixRQUFRLEVBQUUsQ0FBQztDQUdkLENBQUMsQ0FBQTtBQUVGLE9BQU87QUFDUCxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ3hCLE9BQU87SUFDUCxRQUFRLEVBQUUsQ0FBQztJQUNYLE9BQU87SUFDUCxVQUFVLEVBQUUsQ0FBQztJQUNiLE9BQU87SUFDUCxJQUFJLEVBQUUsQ0FBQztDQUNWLENBQUMsQ0FBQTtBQUVGLE9BQU87QUFDUCxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ3pCLGFBQWE7SUFDYixPQUFPLEVBQUUsQ0FBQztJQUNWLGFBQWE7SUFDYixHQUFHLEVBQUUsQ0FBQztJQUNOLGFBQWE7SUFDYixLQUFLLEVBQUUsQ0FBQztDQUNYLENBQUMsQ0FBQTtBQVdJLElBQUEsS0FBOEIsRUFBRSxDQUFDLFVBQVUsRUFBekMsT0FBTyxhQUFBLEVBQUUsUUFBUSxjQUFBLEVBQUUsSUFBSSxVQUFrQixDQUFDO0FBR2xEO0lBQXlDLCtCQUFZO0lBQXJEO1FBQUEscUVBNmtDQztRQTVrQ0csMkJBQTJCO1FBQzNCLHNDQUFzQztRQUl0QyxpQkFBVyxHQUFZLEtBQUssQ0FBQTtRQU1wQixjQUFRLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQTtRQVM3QixlQUFTLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQSxDQUFFLE9BQU87UUFNM0MsY0FBUSxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUE7UUFHekMsYUFBTyxHQUFXLEVBQUUsQ0FBQTtRQUVwQixhQUFPLEdBQVcsRUFBRSxDQUFBO1FBRXBCLGNBQVEsR0FBVyxDQUFDLENBQUE7UUFJcEIsY0FBUSxHQUFXLEVBQUUsQ0FBQTtRQUlyQixjQUFRLEdBQVcsRUFBRSxDQUFBO1FBR3JCLGdCQUFVLEdBQWMsSUFBSSxDQUFBLENBQUksYUFBYTtRQUU3QyxnQkFBVSxHQUFXLEVBQUUsQ0FBQSxDQUFDLGFBQWE7UUFFckMsZUFBUyxHQUFXLENBQUMsQ0FBQSxDQUFJLFdBQVc7UUFLcEMsYUFBTyxHQUFZLElBQUksQ0FBQTtRQUt2QixXQUFLLEdBQVcsSUFBSSxDQUFBO1FBSXBCLGFBQU8sR0FBWSxJQUFJLENBQUE7UUFJdkIsdUJBQWlCLEdBQVksSUFBSSxDQUFBO1FBTWpDLGlCQUFXLEdBQVksS0FBSyxDQUFBO1FBQzVCLGlCQUFXLEdBQW1DLEVBQUUsQ0FBQSxDQUFDLFlBQVk7UUFDN0QsMEJBQW9CLEdBQVcsQ0FBQyxDQUFBLENBQUMsa0JBQWtCO1FBS25ELGNBQWM7UUFDZCxxREFBcUQ7UUFDckQsS0FBSztRQUNMLDZCQUE2QjtRQUU3Qix5RkFBeUY7UUFDekYsK0JBQStCO1FBQy9CLDhGQUE4RjtRQUM5Rix3QkFBd0I7UUFDeEIseUZBQXlGO1FBQ3pGLGtDQUFrQztRQUNsQyxpR0FBaUc7UUFDakcsMkJBQTJCO1FBQzNCLHlGQUF5RjtRQUN6RixnQ0FBZ0M7UUFDaEMsK0ZBQStGO1FBQy9GLHlCQUF5QjtRQUN6Qix5RkFBeUY7UUFDekYsaUNBQWlDO1FBQ2pDLGdHQUFnRztRQUNoRywwQkFBMEI7UUFLMUIsY0FBUSxHQUFXLENBQUMsQ0FBQTtRQUlwQixlQUFTLEdBQVcsSUFBSSxDQUFBO1FBSXhCLFdBQUssR0FBVyxDQUFDLENBQUE7UUFJakIsYUFBTyxHQUFXLENBQUMsQ0FBQTtRQU1uQixnQkFBVSxHQUFZLEtBQUssQ0FBQSxDQUFPLHVCQUF1QjtRQUNqRCxtQkFBYSxHQUFVLEVBQUUsQ0FBQSxDQUFHLGNBQWM7UUFDMUMsaUJBQVcsR0FBVSxFQUFFLENBQUEsQ0FBSyxPQUFPO1FBQ25DLGNBQVEsR0FBZSxFQUFFLENBQUEsQ0FBRyxhQUFhO1FBRXpDLHNCQUFnQixHQUFXLENBQUMsQ0FBQSxDQUFJLFlBQVk7UUFDNUMsZUFBUyxHQUFXLENBQUMsQ0FBQSxDQUFXLE1BQU07UUFDdEMsY0FBUSxHQUFXLENBQUMsQ0FBQSxDQUFZLE1BQU07UUFDdEMsbUJBQWEsR0FBVyxDQUFDLENBQUEsQ0FBTyxlQUFlO1FBQy9DLG1CQUFhLEdBQVcsQ0FBQyxDQUFBLENBQU8sZUFBZTtRQUMvQyxzQkFBZ0IsR0FBVyxDQUFDLENBQUEsQ0FBSSxXQUFXO1FBQzNDLHNCQUFnQixHQUFXLENBQUMsQ0FBQSxDQUFJLFdBQVc7UUFDM0MsaUJBQVcsR0FBVyxDQUFDLENBQUMsQ0FBQSxDQUFTLFdBQVc7UUFFNUMsbUJBQWEsR0FBVyxDQUFDLENBQUEsQ0FBTyxVQUFVO1FBQzFDLGtCQUFZLEdBQVcsQ0FBQyxDQUFBLENBQVEsU0FBUztRQUV6QyxlQUFTLEdBQVcsRUFBRSxDQUFBLENBQUUsU0FBUztRQUNqQyxnQkFBVSxHQUFXLEVBQUUsQ0FBQSxDQUFDLFNBQVM7UUFFakMsYUFBTyxHQUFXLENBQUMsQ0FBQTtRQUNuQixjQUFRLEdBQVcsQ0FBQyxHQUFHLENBQUEsQ0FBQyxrREFBa0Q7UUFFMUUsbUJBQWEsR0FBWSxLQUFLLENBQUEsQ0FBRSxXQUFXO1FBQzNDLGlCQUFXLEdBQVcsQ0FBQyxDQUFBLENBQUMsY0FBYztRQUN0QyxVQUFJLEdBQVcsQ0FBQyxDQUFBLENBQUMsWUFBWTtRQUM3QixlQUFTLEdBQVcsQ0FBQyxDQUFBLENBQUMsU0FBUztRQUUvQixhQUFPLEdBQVksS0FBSyxDQUFBOztJQXM3QnBDLENBQUM7SUFwN0JHLDRCQUFNLEdBQU47UUFDSSx1REFBdUQ7UUFDdkQsNkNBQTZDO1FBQzdDLGFBQWE7UUFDYixJQUFJO1FBQ0osSUFBSSxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ2YsQ0FBQztJQUVELCtCQUFTLEdBQVQ7UUFDSSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUE7U0FDdkQ7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDZCwwREFBMEQ7WUFDMUQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUE7U0FDOUI7UUFDRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7SUFDMUIsQ0FBQztJQUVPLDBCQUFJLEdBQVo7UUFDSSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFBRSxPQUFNO1NBQUU7UUFDNUIscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzFGLElBQUksQ0FBQyxRQUFRLElBQUksY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQVcsQ0FBQyxDQUFBO1FBQ3ZHLHFEQUFxRDtRQUNyRCxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLGFBQWEsQ0FBQyxVQUFVLENBQUE7UUFDdkUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxhQUFhLENBQUMsVUFBVSxDQUFBO1FBQ3JFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUE7UUFDdEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQTtRQUNsQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFBO1FBQ3RDLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFBO1FBQzFELDBDQUEwQztRQUMxQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUE7U0FDdEQ7UUFFRCxzQ0FBc0M7UUFDdEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFBO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQTtRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUE7UUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFBO1FBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFBO1FBQ3RELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFBO1FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBO1FBRTVDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQTtRQUN4RCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtRQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtRQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDZixjQUFjO1FBQ2QsZ0RBQWdEO1FBQ2hELCtCQUErQjtRQUMvQixrQ0FBa0M7UUFDbEMsZ0NBQWdDO1FBQ2hDLGlDQUFpQztRQUNqQyxxQkFBcUI7UUFDckIsd0JBQXdCO1FBQ3hCLHNCQUFzQjtRQUN0Qix1QkFBdUI7UUFDdkIsdUNBQXVDO1FBQ3ZDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQTtRQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxlQUFlLENBQUE7UUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQTtRQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUE7UUFDdkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7UUFDeEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7UUFDeEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUVsQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQTtRQUduQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLEtBQUssQ0FBQTtRQUM1RCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLE1BQU0sQ0FBQTtRQUc5RCxtRUFBbUU7UUFDbkUsK0RBQStEO1FBQy9ELGdFQUFnRTtRQUNoRSw0REFBNEQ7UUFFNUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLHlCQUFhLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDckUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLHlCQUFhLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDN0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLHlCQUFhLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUNoRixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMseUJBQWEsQ0FBQyxvQkFBb0IsRUFBRSxjQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUM1RSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMseUJBQWEsQ0FBQyxrQkFBa0IsRUFBRSxjQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUMxRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMseUJBQWEsQ0FBQyxtQkFBbUIsRUFBRSxjQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUMzRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMseUJBQWEsQ0FBQyxpQkFBaUIsRUFBRSxjQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUN6RSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQTtRQUN2RCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQTtRQUV4RCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7UUFFdEIsaUJBQWlCO1FBQ2pCLFlBQVk7UUFDWix5REFBeUQ7UUFDekQsd0VBQXdFO1FBQ3hFLElBQUk7UUFDSixZQUFZO1FBQ1osc0RBQXNEO1FBQ3RELHFFQUFxRTtRQUNyRSx3RUFBd0U7UUFDeEUsZ0VBQWdFO1FBQ2hFLFFBQVE7UUFDUixJQUFJO0lBQ1IsQ0FBQztJQUNPLHFDQUFlLEdBQXZCO1FBQ0ksSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksRUFBRTtZQUN6QixPQUFNO1NBQ1Q7UUFDRCxRQUFRLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDcEIsS0FBSyxhQUFhLENBQUMsUUFBUTtnQkFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUE7Z0JBQ2xCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ2pGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFBO2dCQUNyQyxNQUFLO1lBQ1QsS0FBSyxhQUFhLENBQUMsVUFBVTtnQkFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDakYsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUE7Z0JBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFBO2dCQUN0QyxNQUFLO1lBQ1QsS0FBSyxhQUFhLENBQUMsSUFBSTtnQkFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFBO2dCQUM5RSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUNqRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFBO2dCQUN0RCxNQUFLO1NBQ1o7SUFDTCxDQUFDO0lBRUQsb0NBQWMsR0FBZCxVQUFlLElBQWdCO1FBQWhCLHFCQUFBLEVBQUEsU0FBZ0I7UUFBRSxjQUFjO2FBQWQsVUFBYyxFQUFkLHFCQUFjLEVBQWQsSUFBYztZQUFkLDZCQUFjOztRQUMzQyw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ1gsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ1osSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFBO1FBQ2YsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUE7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUE7UUFDeEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUE7UUFDdkIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLGNBQWMsQ0FBQyxHQUFHLEVBQUU7WUFDckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1NBQ3pDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUNoQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUE7UUFDYixRQUFRO0lBQ1osQ0FBQztJQUVELHNCQUFJLHFDQUFZO2FBNEJoQjtZQUNJLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQTtRQUM3QixDQUFDO2FBOUJELFVBQWlCLElBQVc7WUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUE7WUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ25CLE9BQU07YUFDVDtZQUNELGlCQUFpQjtZQUNqQixJQUFJLGNBQWMsR0FBbUMsRUFBRSxDQUFBO1lBQ3ZELEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUM5QyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3pCLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFBO2lCQUNsRDthQUNKO1lBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUE7WUFDakMsUUFBUSxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNwQixLQUFLLGFBQWEsQ0FBQyxRQUFRO29CQUN2QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFBO29CQUM3QixLQUFLLElBQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7d0JBQ2hDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtxQkFDN0c7b0JBQ0QsTUFBSztnQkFDVCxLQUFLLGFBQWEsQ0FBQyxVQUFVO29CQUN6QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFBO29CQUM3QixLQUFLLElBQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7d0JBQ2hDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFBO3FCQUNsRztvQkFDRCxNQUFLO2FBQ1o7UUFDTCxDQUFDOzs7T0FBQTtJQUtPLHVDQUFpQixHQUF6QixVQUEwQixJQUFhO1FBQ25DLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1NBQUU7UUFDbkQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEUsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEUsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUNPLGlDQUFXLEdBQW5CO1FBQ0ksUUFBUSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3BCLEtBQUssYUFBYSxDQUFDLFVBQVU7Z0JBQ3pCLE1BQUs7WUFDVCxLQUFLLGFBQWEsQ0FBQyxRQUFRLENBQUM7WUFDNUIsS0FBSyxhQUFhLENBQUMsSUFBSTtnQkFDbkIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUE7Z0JBQ3ZCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtvQkFDbEIsUUFBUTtpQkFDWDtnQkFDRCxNQUFLO1NBQ1o7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQ3pCLENBQUM7SUFDTyw4QkFBUSxHQUFoQjtRQUFBLGlCQWdCQztRQWZHLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFBO1FBQ3JCLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxhQUFhLENBQUMsVUFBVSxFQUFFO1lBQzVDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUE7WUFDdkQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUE7U0FDM0Q7YUFBTTtZQUNILElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUE7WUFDdkQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUE7U0FDM0Q7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUE7UUFFdEMsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksRUFBRTtZQUFFLE9BQU07U0FBRTtRQUV2QyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFBLEdBQUc7WUFDckIsS0FBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMxQixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFFTyxrQ0FBWSxHQUFwQixVQUFxQixHQUFhO1FBQzlCLFFBQVEsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNwQixLQUFLLGFBQWEsQ0FBQyxVQUFVO2dCQUN6QixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO29CQUN0RSxPQUFNO2lCQUNUO2dCQUNELE1BQUs7WUFDVCxLQUFLLGFBQWEsQ0FBQyxRQUFRLENBQUM7WUFDNUIsS0FBSyxhQUFhLENBQUMsSUFBSTtnQkFDbkIsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEVBQUU7b0JBQ3ZILE9BQU07aUJBQ1Q7U0FDUjtRQUNELElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQTtRQUM1QyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUE7UUFDOUMsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQTtRQUN0QixRQUFRLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDcEIsS0FBSyxhQUFhLENBQUMsVUFBVTtnQkFDekIsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRTtvQkFDaEgsWUFBWTtvQkFDWixJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQTtvQkFDM0MsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUU7d0JBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUE7d0JBQ3RELDBEQUEwRDt3QkFDMUQsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUE7d0JBQ2YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUE7cUJBQzdCO2lCQUNKO3FCQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFO29CQUMzSCxZQUFZO29CQUNaLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFBO29CQUMzQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUU7d0JBQ1YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTt3QkFDdEQsMERBQTBEO3dCQUMxRCxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQTt3QkFDZixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQTtxQkFDN0I7aUJBQ0o7Z0JBQ0QsTUFBSztZQUNULEtBQUssYUFBYSxDQUFDLFFBQVEsQ0FBQztZQUM1QixLQUFLLGFBQWEsQ0FBQyxJQUFJO2dCQUNuQixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3JILFlBQVk7b0JBQ1osSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUE7b0JBQzNDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7d0JBQ25ELElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUE7d0JBQ3RELEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFBO3dCQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFBO3FCQUM3QjtpQkFDSjtxQkFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRTtvQkFDdEssWUFBWTtvQkFDWixJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQTtvQkFDM0MsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksS0FBSyxFQUFFO3dCQUN0QyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFBO3dCQUN0RCxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQTt3QkFDZixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQTtxQkFDN0I7aUJBQ0o7Z0JBQ0QsTUFBSztTQUNaO0lBQ0wsQ0FBQztJQUdPLDZCQUFPLEdBQWYsVUFBZ0IsS0FBYSxFQUFFLElBQWM7UUFDekMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ1QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2xCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQzlELElBQUksSUFBSSxFQUFFO29CQUNOLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7aUJBQ3JDO2dCQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7YUFDbkM7aUJBQU07Z0JBQ0gsSUFBSSxLQUFLLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQzFELElBQUksU0FBUyxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFBO2dCQUNsRSxvQkFBb0I7Z0JBQ3BCLFFBQVEsSUFBSSxDQUFDLFNBQVMsRUFBRTtvQkFDcEIsS0FBSyxhQUFhLENBQUMsUUFBUTt3QkFDdkIsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQSxDQUFBLHVDQUF1Qzt3QkFDM0YsTUFBSztvQkFDVCxLQUFLLGFBQWEsQ0FBQyxVQUFVO3dCQUN6QixDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLEdBQUcsU0FBUyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFBO3dCQUMxRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQTt3QkFDeEQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUE7d0JBQzNCLE1BQUs7b0JBQ1QsS0FBSyxhQUFhLENBQUMsSUFBSTt3QkFDbkIsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQTt3QkFDdkYsTUFBSztpQkFDWjtnQkFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFO29CQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUE7aUJBQUU7Z0JBQ2xILElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQTtnQkFDMUMsSUFBSSxJQUFJLEVBQUU7b0JBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7aUJBQUU7Z0JBQ3hCLE9BQU8sQ0FBQyxDQUFBO2FBQ1g7U0FDSjthQUFNO1lBQ0gsUUFBUSxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNwQixLQUFLLGFBQWEsQ0FBQyxRQUFRO29CQUN2QixDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFBLENBQUEsdUNBQXVDO29CQUMzRixNQUFLO2dCQUNULEtBQUssYUFBYSxDQUFDLFVBQVU7b0JBQ3pCLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFBO29CQUN0RSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUU7d0JBQzlDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFBO3FCQUNwQjtvQkFDRCxNQUFLO2dCQUNULEtBQUssYUFBYSxDQUFDLElBQUk7b0JBQ25CLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUE7b0JBQ3ZGLE1BQUs7YUFDWjtZQUNELElBQUksSUFBSSxFQUFFO2dCQUNOLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2FBQ2I7WUFDRCxPQUFPLENBQUMsQ0FBQTtTQUNYO0lBQ0wsQ0FBQztJQUNPLDZCQUFPLEdBQWYsVUFBZ0IsS0FBYSxFQUFFLElBQWM7UUFDekMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ1QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2xCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQzlELElBQUksSUFBSSxFQUFFO29CQUNOLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7aUJBQ3JDO2dCQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7YUFDbkM7aUJBQU07Z0JBQ0gsSUFBSSxLQUFLLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQzFELElBQUksVUFBVSxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFBO2dCQUNwRSxRQUFRLElBQUksQ0FBQyxTQUFTLEVBQUU7b0JBQ3BCLEtBQUssYUFBYSxDQUFDLFFBQVE7d0JBQ3ZCLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUE7d0JBQzNFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTt3QkFDbkUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUE7d0JBQzNCLDJFQUEyRTt3QkFDM0Usc0RBQXNEO3dCQUN0RCx3QkFBd0I7d0JBQ3hCLElBQUk7d0JBQ0osTUFBSztvQkFDVCxLQUFLLGFBQWEsQ0FBQyxVQUFVO3dCQUN6QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUEsQ0FBQSx5Q0FBeUM7d0JBQy9GLE1BQUs7b0JBQ1QsS0FBSyxhQUFhLENBQUMsSUFBSTt3QkFDbkIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUE7d0JBQ3ZHLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUU7NEJBQzdFLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFBO3lCQUNwQjt3QkFDRCxNQUFLO2lCQUNaO2dCQUNELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUU7b0JBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQTtpQkFBRTtnQkFDbEgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFBO2dCQUM1QyxJQUFJLElBQUksRUFBRTtvQkFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtpQkFBRTtnQkFDeEIsT0FBTyxDQUFDLENBQUE7YUFDWDtTQUNKO2FBQU07WUFDSCxRQUFRLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ3BCLEtBQUssYUFBYSxDQUFDLFFBQVE7b0JBQ3ZCLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUE7b0JBQ3hFLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRTt3QkFDOUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUE7cUJBQ3BCO29CQUNELE1BQUs7Z0JBQ1QsS0FBSyxhQUFhLENBQUMsVUFBVTtvQkFDekIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFBLENBQUEseUNBQXlDO29CQUMvRixNQUFLO2dCQUNULEtBQUssYUFBYSxDQUFDLElBQUk7b0JBQ25CLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFBO29CQUN2RyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFO3dCQUM3RSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQTtxQkFDcEI7b0JBQ0QsTUFBSzthQUNaO1lBQ0QsSUFBSSxJQUFJLEVBQUU7Z0JBQ04sSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7YUFDYjtZQUNELE9BQU8sQ0FBQyxDQUFBO1NBQ1g7SUFDTCxDQUFDO0lBRU8saUNBQVcsR0FBbkIsVUFBb0IsUUFBaUIsRUFBRSxJQUFTLEVBQUUsS0FBYTtRQUMzRCxJQUFJO1lBQ0EsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1NBQ2hGO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDWixPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxDQUFBO1NBQ2hEO0lBQ0wsQ0FBQztJQUVELHdDQUF3QztJQUNoQyxnQ0FBVSxHQUFsQixVQUFtQixLQUFhO1FBQzVCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUU7WUFDbEMsT0FBTyxLQUFLLENBQUE7U0FDZjtRQUNELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUE7SUFDekQsQ0FBQztJQUVELFlBQVk7SUFDWixpQ0FBVyxHQUFYLFVBQVksS0FBYSxFQUFFLElBQUk7UUFDM0IsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksRUFBRTtZQUNsQyxPQUFNO1NBQ1Q7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQTtRQUMvQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFO1lBQzdCLE9BQU07U0FDVDtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQzFFLENBQUM7SUFDRCwrQkFBK0I7SUFDL0IsNkVBQTZFO0lBQzdFLElBQUk7SUFDSixrQ0FBWSxHQUFaLFVBQWEsWUFBbUI7UUFBaEMsaUJBc0JDO1FBdEJpQyxjQUFjO2FBQWQsVUFBYyxFQUFkLHFCQUFjLEVBQWQsSUFBYztZQUFkLDZCQUFjOztRQUM1QyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUNoQyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO1NBQzFCO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLGNBQWMsQ0FBQyxHQUFHLEVBQUU7WUFDckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1NBQ3pDO1FBQ0QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQ25CLDJCQUEyQjtRQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFBLE9BQU87WUFDekIsSUFBSTtnQkFDQSxJQUFJLFFBQVEsR0FBRyxLQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFDN0MsT0FBTyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUE7Z0JBQ3hCLEtBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQy9FLEtBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ3pDLEtBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ3pDLHdIQUF3SDthQUMzSDtZQUFDLE9BQU8sS0FBSyxFQUFFO2dCQUNaLE9BQU8sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsS0FBSyxDQUFDLENBQUE7YUFDbkQ7UUFDTCxDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFFRCxxQkFBcUI7SUFDckIsa0NBQVksR0FBWjtRQUNJLHlCQUF5QjtRQUN6QixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtZQUNyRyxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQTtZQUNyRSxLQUFLLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxlQUFlLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3BHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO2FBQ3RDO1lBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLENBQUE7WUFDL0QseUJBQXlCO1NBQzVCO2FBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUU7WUFDeEcsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUN0SCxJQUFJLFlBQVUsR0FBRyxDQUFDLENBQUE7WUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBQSxPQUFPO2dCQUN6QixZQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxZQUFVLENBQUMsQ0FBQTtZQUN4RCxDQUFDLENBQUMsQ0FBQztZQUNILEtBQUssSUFBSSxRQUFRLEdBQUcsWUFBVSxFQUFFLFFBQVEsR0FBRyxDQUFDLFlBQVUsR0FBRyxRQUFRLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRTtnQkFDNUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTthQUNoRTtTQUNKO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2QsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUE7U0FDOUI7SUFDTCxDQUFDO0lBRUQsc0JBQVksc0NBQWE7YUFBekI7WUFDSSxPQUFPLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQTtRQUMxQyxDQUFDOzs7T0FBQTtJQUVELHNCQUFZLHVDQUFjO2FBQTFCO1lBQ0ksT0FBTyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUE7UUFDM0MsQ0FBQzs7O09BQUE7SUFFTyxrQ0FBWSxHQUFwQjtRQUNJLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNsQixvQkFBb0I7WUFDcEIsT0FBTyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUN0Qyw0Q0FBNEM7WUFDNUMscURBQXFEO1lBQ3JELG9EQUFvRDtZQUNwRCxzREFBc0Q7WUFDdEQsSUFBSTtTQUNQO2FBQU07WUFDSCxPQUFPLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1NBQ3pDO0lBQ0wsQ0FBQztJQUNELFFBQVE7SUFDQSxtQ0FBYSxHQUFyQjtRQUNJLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFBO0lBQ3hCLENBQUM7SUFDTyw0QkFBTSxHQUFkO1FBQ0ksSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksRUFBRTtZQUN6QixPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1lBQzVCLE9BQU07U0FDVDtRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLEVBQUU7WUFDekIsT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUMzQixPQUFNO1NBQ1Q7UUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUM1QyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUVyRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQTtRQUMzQixRQUFRLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDcEIsS0FBSyxhQUFhLENBQUMsUUFBUTtnQkFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtnQkFDN0IsTUFBSztZQUNULEtBQUssYUFBYSxDQUFDLFVBQVU7Z0JBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUE7Z0JBQzlCLE1BQUs7WUFDVCxLQUFLLGFBQWEsQ0FBQyxJQUFJO2dCQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFBO2dCQUM3QixNQUFLO1NBQ1o7SUFDTCxDQUFDO0lBRU8sb0NBQWMsR0FBdEIsVUFBdUIsSUFBYTtRQUNoQyxJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQTtZQUMvQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQTtZQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQTtZQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQTtZQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQTtTQUNoQjthQUFNO1lBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBO1lBQzlCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFBO1lBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFBO1lBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFBO1lBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFBO1NBQ2hCO0lBQ0wsQ0FBQztJQUVELDRCQUFNLEdBQU4sVUFBTyxFQUFVO1FBQ2IsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsRUFBRTtZQUFFLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFBO1NBQUU7UUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDckIsT0FBTTtTQUNUO1FBQ0QsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDL0MsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFBO1NBQy9CO0lBQ0wsQ0FBQztJQUNPLHlDQUFtQixHQUEzQixVQUE0QixFQUFVO1FBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3JCLE9BQU07U0FDVDtRQUNELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUU7WUFDaEIsSUFBSTtZQUNKLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQ2pELElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtnQkFDaEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFDMUIsT0FBTTthQUNUO1lBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1lBQzNDLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFBO1lBQ3JCLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFBO1NBQ3RCO1FBQ0QsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUE7UUFDZixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUN6QixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQTtTQUNoQjtJQUNMLENBQUM7SUFDRCwwQ0FBb0IsR0FBcEI7UUFDSSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsUUFBUSxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNwQixLQUFLLGFBQWEsQ0FBQyxRQUFRO29CQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO29CQUM3RixNQUFLO2dCQUNULEtBQUssYUFBYSxDQUFDLFVBQVU7b0JBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7b0JBQzlGLE1BQUs7Z0JBQ1QsS0FBSyxhQUFhLENBQUMsSUFBSTtvQkFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7b0JBQzNMLE1BQUs7YUFDWjtTQUNKO2FBQU07WUFDSCxRQUFRLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ3BCLEtBQUssYUFBYSxDQUFDLFFBQVE7b0JBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7b0JBQy9LLE1BQUs7Z0JBQ1QsS0FBSyxhQUFhLENBQUMsVUFBVTtvQkFDekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7b0JBQ2hLLE1BQUs7Z0JBQ1QsS0FBSyxhQUFhLENBQUMsSUFBSTtvQkFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtvQkFDM00sTUFBSzthQUNaO1NBQ0o7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQy9ELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFBO1FBRTlELDhEQUE4RDtJQUNsRSxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNILDRCQUFNLEdBQU4sVUFBTyxLQUFhLEVBQUUsSUFBWTtRQUFsQyxpQkFnQkM7UUFmRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQTtRQUNuQixRQUFRLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDcEIsS0FBSyxhQUFhLENBQUMsUUFBUSxDQUFDO1lBQzVCLEtBQUssYUFBYSxDQUFDLFVBQVU7Z0JBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFBO2dCQUNyQixNQUFLO1lBQ1QsS0FBSyxhQUFhLENBQUMsSUFBSTtnQkFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7Z0JBQ2xELE1BQUs7U0FDWjtRQUNELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFBO1FBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQUMsT0FBTztZQUMxQixLQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ3pDLEtBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDN0MsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBQ0QsdUJBQXVCO0lBQ3ZCLDhCQUFRLEdBQVI7UUFBQSxpQkFxQkM7UUFwQkcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUNwQixhQUFhO1FBQ2IsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFBO1FBQzlDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQUEsR0FBRztZQUNyQixXQUFXO1lBQ1gsSUFBSSxLQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsRUFBRTtnQkFDdEcsSUFBSSxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtvQkFDOUQsR0FBRyxDQUFDLEtBQUssSUFBSSxLQUFJLENBQUMsZ0JBQWdCLENBQUE7aUJBQ3JDO2dCQUNELEtBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ2pDLEtBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7YUFDdEU7aUJBQU0sSUFBSSxLQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxHQUFHLEtBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQzFHLElBQUksR0FBRyxDQUFDLEtBQUssR0FBRyxLQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxFQUFFO29CQUN4QyxHQUFHLENBQUMsS0FBSyxJQUFJLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQTtpQkFDckM7Z0JBQ0QsS0FBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDakMsS0FBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTthQUN0RTtRQUNMLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUE7SUFDL0IsQ0FBQztJQUNELFlBQVk7SUFDWix5QkFBRyxHQUFILFVBQUksS0FBYTtRQUFqQixpQkFvQkM7UUFuQkcsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxLQUFLLEVBQUU7WUFBRSxPQUFNO1NBQUU7UUFDaEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ2xDLGlCQUFpQjtRQUNqQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFO1lBQ2pELElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1NBQ3JDO1FBQ0QsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUE7UUFDM0IsS0FBSyxJQUFJLE9BQUssR0FBRyxDQUFDLEVBQUUsT0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE9BQUssRUFBRSxFQUFFO1lBQ3ZELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBSyxDQUFDLENBQUE7WUFDbEMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQzFDLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFBO2dCQUN0QyxNQUFLO2FBQ1I7U0FDSjtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQUMsT0FBTztZQUMxQixLQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ3pDLEtBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDekMsS0FBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNuRixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFDRCxlQUFlO0lBQ2YseUJBQUcsR0FBSCxVQUFJLElBQVM7UUFDVCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM1QixlQUFlO1FBQ2YsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDL0MsTUFBTTtZQUNOLHNCQUFzQjtZQUN0QixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUE7WUFDdEIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUN2RCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDNUQsVUFBVSxHQUFHLElBQUksQ0FBQTtvQkFDakIsTUFBSztpQkFDUjthQUNKO1lBQ0QsSUFBSSxVQUFVLEVBQUU7Z0JBQ1osSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFBLENBQUMsUUFBUTtnQkFDNUIsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFBLENBQUEsWUFBWTtnQkFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUMzQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLFFBQVEsRUFBRTt3QkFDbkMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFBO3dCQUNqQyxjQUFjLEdBQUcsQ0FBQyxDQUFBO3FCQUNyQjtpQkFDSjtnQkFDRCxzQkFBc0I7Z0JBQ3RCLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQTtnQkFDaEIsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFBO2dCQUNmLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQTtnQkFDdkIsUUFBUSxJQUFJLENBQUMsU0FBUyxFQUFFO29CQUNwQixLQUFLLGFBQWEsQ0FBQyxVQUFVO3dCQUN6QixRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO3dCQUMvQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUE7d0JBQzdDLFdBQVcsR0FBRyxRQUFRLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFBO3dCQUNyRCxNQUFLO29CQUNULEtBQUssYUFBYSxDQUFDLFFBQVEsQ0FBQztvQkFDNUIsS0FBSyxhQUFhLENBQUMsSUFBSTt3QkFDbkIsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTt3QkFDL0MsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFBO3dCQUM3QyxXQUFXLEdBQUcsUUFBUSxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQTt3QkFDdEQsTUFBSztpQkFDWjtnQkFDRCxJQUFJLFdBQVcsRUFBRTtvQkFDYixJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUE7b0JBQzVELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUE7b0JBQy9GLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFDckYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBO2lCQUN4RjthQUNKO1NBQ0o7YUFBTTtZQUNILEtBQUs7WUFDTCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUE7WUFDeEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUE7U0FDaEM7UUFDRCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQTtJQUMvQixDQUFDO0lBRUQsaUNBQVcsR0FBWCxVQUFZLEtBQWEsRUFBRSxJQUFTLEVBQUUsU0FBMEI7UUFBMUIsMEJBQUEsRUFBQSxpQkFBMEI7UUFDNUQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQy9CLGdDQUFnQztRQUNoQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUNqRCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUUxQixJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsRUFBRTtZQUNqQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUE7U0FDL0I7YUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxFQUFFO1lBQzNCLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFBO1lBQ2YsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7Z0JBQ1gsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLEVBQUUsQ0FBQztnQkFDbkQsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUM3QyxLQUFLLEVBQUUsQ0FBQTtTQUNkO2FBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsRUFBRTtZQUMzQixLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUE7WUFDNUIsSUFBSSxTQUFTLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQTtZQUNqRCxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFBO1lBQzFCLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBO1lBQ2hCLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBO1NBQ3hIO2FBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsRUFBRTtZQUMzQixPQUFPO1lBQ1AsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFBO1lBQzVCLElBQUksU0FBUyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUE7WUFDakQsS0FBSyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtZQUMzQixLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtZQUNoQixFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtTQUN6SDthQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLEVBQUU7WUFDM0IsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUE7WUFDZixFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztnQkFDWCxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzdDLEtBQUssRUFBRSxDQUFBO1NBQ2Q7YUFBTTtZQUNILEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQTtTQUMvQjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxzQ0FBZ0IsR0FBaEIsVUFBaUIsR0FBVyxFQUFFLElBQWdCO1FBQWhCLHFCQUFBLEVBQUEsUUFBZ0I7UUFBRSxjQUFjO2FBQWQsVUFBYyxFQUFkLHFCQUFjLEVBQWQsSUFBYztZQUFkLDZCQUFjOztRQUMxRCxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUU7WUFDbkQsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUN6QixPQUFNO1NBQ1Q7UUFDRCxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtZQUNqQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBO1NBQ3JDO1FBQ0QsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFO1lBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7WUFDcEMsT0FBTTtTQUNUO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQTtRQUVwQixJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFBO1FBQ25DLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDbkUsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7U0FDeEY7YUFBTTtZQUNILElBQUksSUFBSSxJQUFJLENBQUMsRUFBRTtnQkFDWCxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxDQUFBO2FBQ3pEO2lCQUFNLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQTthQUN6RDtTQUNKO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUU7WUFDdEMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUE7U0FDcEQ7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUU1QyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQTtRQUNoRixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQTtRQUNuRixhQUFhO1FBQ2IsUUFBUSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3BCLEtBQUssYUFBYSxDQUFDLFVBQVU7Z0JBQ3pCLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO2dCQUM1RixXQUFXO2dCQUNYLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtvQkFDNUIsY0FBYyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQTtvQkFDakUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQTtpQkFDcEQ7cUJBQU07b0JBQ0gsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFO3dCQUNYLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTt3QkFDekcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFOzRCQUN2RSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQTt5QkFDckI7cUJBQ0o7eUJBQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFO3dCQUNsQixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7cUJBQ2xIO3lCQUFNO3dCQUNILGNBQWMsRUFBRSxDQUFBO3dCQUNoQixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7d0JBQ3RJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDcEcsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUE7eUJBQ3JCO3FCQUNKO2lCQUNKO2dCQUNELE1BQUs7WUFDVCxLQUFLLGFBQWEsQ0FBQyxRQUFRLENBQUM7WUFDNUIsS0FBSyxhQUFhLENBQUMsSUFBSTtnQkFDbkIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtnQkFDdEcsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFO29CQUM1QixjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFBO29CQUNqRSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFBO2lCQUNwRDtxQkFBTTtvQkFDSCxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUU7d0JBQ1gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTt3QkFDakgsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDL0UsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUE7eUJBQ3JCO3FCQUNKO3lCQUFNLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRTt3QkFDbEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtxQkFDMUg7eUJBQU07d0JBQ0gsY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFBO3dCQUNsSCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsV0FBVyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFBO3dCQUMvSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxXQUFXLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxFQUFFOzRCQUM3RyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQTt5QkFDckI7cUJBQ0o7aUJBQ0o7Z0JBQ0QsTUFBSztTQUNaO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNqQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQTtTQUMxQjtRQUNELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUNuQix5QkFBeUI7UUFDekIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDMUIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUN2RCxpQ0FBaUM7Z0JBQ2pDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQ2xDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUE7Z0JBQ3RDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ3pDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ3pDLElBQUksdUJBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDdEQsU0FBUTtpQkFDWDtnQkFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO2FBQ2xGO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxtQ0FBYSxHQUFiLFVBQWMsS0FBYSxFQUFFLElBQWdCLEVBQUUsSUFBZ0IsRUFBRSxPQUFtQjtRQUF2RCxxQkFBQSxFQUFBLFFBQWdCO1FBQUUscUJBQUEsRUFBQSxRQUFnQjtRQUFFLHdCQUFBLEVBQUEsV0FBbUI7UUFDaEYsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksRUFBRTtZQUNsQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ3ZCLE9BQU07U0FDVDtRQUNELFFBQVEsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNwQixLQUFLLGFBQWEsQ0FBQyxVQUFVO2dCQUN6QixJQUFJLElBQUksSUFBSSxDQUFDLEVBQUU7b0JBQ1gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtpQkFDekk7cUJBQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFO29CQUNsQixJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtpQkFDakk7cUJBQU07b0JBQ0gsS0FBSyxFQUFFLENBQUE7b0JBQ1AsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7aUJBQzFLO2dCQUNELE1BQUs7WUFDVCxLQUFLLGFBQWEsQ0FBQyxRQUFRLENBQUM7WUFDNUIsS0FBSyxhQUFhLENBQUMsSUFBSTtnQkFDbkIsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFO29CQUNYLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtpQkFDOUo7cUJBQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFO29CQUNsQixJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO2lCQUNySjtxQkFBTTtvQkFDSCxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUE7b0JBQ3ZGLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7aUJBQ2hNO2dCQUNELE1BQUs7U0FDWjtRQUNELDRCQUE0QjtRQUM1Qiw4QkFBOEI7UUFDOUIsV0FBVztJQUNmLENBQUM7SUFFRCw2QkFBTyxHQUFQLFVBQVEsS0FBYTtRQUNqQixLQUFLLElBQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDN0IsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxLQUFLLEVBQUU7Z0JBQ25DLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUE7YUFDakM7U0FDSjtRQUNELE9BQU07SUFDVixDQUFDO0lBQ0Qsc0NBQWdCLEdBQWhCO1FBQ0ksSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFO1lBQzdDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLENBQUE7WUFDaEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7U0FDdEU7SUFDTCxDQUFDO0lBRUQsa0NBQWtDO0lBQ2xDLDJCQUFLLEdBQUw7UUFDSSxvQkFBb0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFO1lBQzVDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUE7U0FDOUM7UUFDRCwwQkFBMEI7UUFDMUIseUNBQXlDO1FBQ3pDLG9EQUFvRDtRQUNwRCxtREFBbUQ7UUFDbkQsNERBQTREO1FBQzVELG9EQUFvRDtRQUNwRCxZQUFZO1FBQ1osVUFBVTtRQUNWLFdBQVc7UUFDWCx3REFBd0Q7UUFDeEQsc0RBQXNEO1FBQ3RELFFBQVE7UUFDUixJQUFJO1FBQ0osSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUE7UUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUE7SUFDdEIsQ0FBQztJQXRrQ0Q7UUFIQyxRQUFRLENBQUM7WUFDTixPQUFPLEVBQUUsT0FBTztTQUNuQixDQUFDO29EQUMwQjtJQU01QjtRQUxDLFFBQVEsQ0FBQztZQUNOLElBQUksRUFBRSxRQUFRO1lBQ2QsT0FBTyxFQUFFLGNBQWMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFBLENBQUMsQ0FBQztZQUNoRCxPQUFPLEVBQUUsT0FBTztTQUNuQixDQUFDO2lEQUNtQztJQVNyQztRQVBDLFFBQVEsQ0FBQztZQUNOLElBQUksRUFBRSxhQUFhO1lBQ25CLE9BQU8sRUFBRTtnQkFDTCxPQUFPLElBQUksQ0FBQTtZQUNmLENBQUM7WUFDRCxPQUFPLEVBQUUsTUFBTTtTQUNsQixDQUFDO2tEQUN3QztJQU0xQztRQUpDLFFBQVEsQ0FBQztZQUNOLElBQUksRUFBRSxjQUFjO1lBQ3BCLE9BQU8sRUFBRSx1Q0FBdUM7U0FDbkQsQ0FBQztpREFDdUM7SUFHekM7UUFEQyxRQUFRLENBQUMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUM7Z0RBQ2Y7SUFFcEI7UUFEQyxRQUFRLENBQUMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUM7Z0RBQ2Y7SUFFcEI7UUFEQyxRQUFRLENBQUMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUM7aURBQ2Y7SUFJcEI7UUFIQyxRQUFRLENBQUM7WUFDTixPQUFPLEVBQUUsY0FBYyxPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUztTQUMvRixDQUFDO2lEQUNtQjtJQUlyQjtRQUhDLFFBQVEsQ0FBQztZQUNOLE9BQU8sRUFBRSxjQUFjLE9BQU8sSUFBSSxDQUFDLFNBQVMsSUFBSSxhQUFhLENBQUMsVUFBVSxDQUFBLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxTQUFTO1NBQ2pHLENBQUM7aURBQ21CO0lBR3JCO1FBREMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUM7bURBQ1E7SUFFNUI7UUFEQyxRQUFRO21EQUNjO0lBRXZCO1FBREMsUUFBUTtrREFDWTtJQUtyQjtRQUhDLFFBQVEsQ0FBQztZQUNOLE9BQU8sRUFBRSxVQUFVO1NBQ3RCLENBQUM7Z0RBQ3FCO0lBS3ZCO1FBSkMsUUFBUSxDQUFDO1lBQ04sT0FBTyxFQUFFLHNDQUFzQztZQUMvQyxPQUFPLEVBQUUsY0FBYyxPQUFPLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFBLENBQUMsQ0FBQztTQUN2RCxDQUFDOzhDQUNrQjtJQUlwQjtRQUhDLFFBQVEsQ0FBQztZQUNOLE9BQU8sRUFBRSx3QkFBd0I7U0FDcEMsQ0FBQztnREFDcUI7SUFJdkI7UUFIQyxRQUFRLENBQUM7WUFDTixPQUFPLEVBQUUsc0JBQXNCO1NBQ2xDLENBQUM7MERBQytCO0lBTWpDO1FBSkMsUUFBUSxDQUFDO1lBQ04sT0FBTyxFQUFFLGFBQWE7WUFDdEIsV0FBVyxFQUFFLFdBQVc7U0FDM0IsQ0FBQztvREFDMEI7SUFnQzVCO1FBSEMsUUFBUSxDQUFDO1lBQ04sT0FBTyxFQUFFLHlEQUF5RDtTQUNyRSxDQUFDO2lEQUNrQjtJQUlwQjtRQUhDLFFBQVEsQ0FBQztZQUNOLE9BQU8sRUFBRSx1RUFBdUU7U0FDbkYsQ0FBQztrREFDc0I7SUFJeEI7UUFIQyxRQUFRLENBQUM7WUFDTixPQUFPLEVBQUUsMkRBQTJEO1NBQ3ZFLENBQUM7OENBQ2U7SUFJakI7UUFIQyxRQUFRLENBQUM7WUFDTixPQUFPLEVBQUUsYUFBYTtTQUN6QixDQUFDO2dEQUNpQjtJQXJIRixXQUFXO1FBRi9CLE9BQU87UUFDUCxJQUFJLENBQUMsb0JBQW9CLENBQUM7T0FDTixXQUFXLENBNmtDL0I7SUFBRCxrQkFBQztDQTdrQ0QsQUE2a0NDLENBN2tDd0MsRUFBRSxDQUFDLFNBQVMsR0E2a0NwRDtrQkE3a0NvQixXQUFXIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFxuICogQEF1dGhvciAgaHVhbmd4aW4gXG4gKiBAY3RpbWUgICAyMDIwLTA2LTEwXG4gKiBAVmVyc2lvbiBcbiAqICAgICAgU2Nyb2xsRmluYWwxLjAgICAyMDIwLTA2LTEwIGJldGHljYfnuqfvvIzkvb/nlKjmjILovb3pooTliLbkvZNcbiAqICAgICAgU2Nyb2xsRmluYWwxLjEgICAyMDIwLTA4LTExIOaWsOWinuWvueixoeaxoOexu+Wkp+azlVxuICogICAgICBTY3JvbGxGaW5hbDEuMiAgIDIwMjAtMDgtMTcgMS7mlrDlop7lu7bov5/liLfmlrBpdGVt77yM6Ziy5q2i5Zyo5p+Q5LiA5bin55Sf5oiQ6L+H6YePaXRlbeWvvOiHtOWNoemhv+eahOmXrumimFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi7liJ3lp4vnmoTmjqfku7blsZ7mgKforr7nva4oaW5pdOaWueazlSnmlLnkuLrnlLFpbml0U2Nyb2xsVmlld+inpuWPkSjljp/mnKznmoRvbkxvYWTop6blj5HlnKjpgILphY3mqKHlvI/kuIvkvJrkuI3lh4bnoa4pXG4gKiAgICAgIFNjcm9sbEZpbmFsMS4zICAgMjAyMS0wNS0yNiDnjrDlnKjnmoTmu5rliqjoioLngrnkuI3pnIDopoHmiYvliqjmt7vliqBzY3JvbGxWaWV357uE5Lu25LqGXG4gKiAgICAgIFNjcm9sbEZpbmFsMS40ICAgMjAyMi0wNC0xNCDnjrDlnKjlj6/ku6XlnKjliJ3lp4vljJbmiJZyZWZyZXNo5pe2LOeri+WIu+a7muWKqOWIsOafkOS4quS9jee9ruS6hlxuICogICAgICBTY3JvbGxGaW5hbDEuNSAgIDIwMjMtMDYtMjIg5paw5aKeIGFkYXB0ZXJJdGVtICwg5Y+v5ZyoaW5kZXjpppbmrKHlh7rnjrDml7borr7lrprlroPnmoTpq5jluqYo5ZCO57ut5oqK5Yqo5oCB5L+u5pS56KGl5LiKKVxuICogQFRpcHNcbiAqICAgICAg5aSN55So5rua5Yqo6L20IOeUqOadpeWHj+WwkWRyYXdjYWxsXG4gKiAgICAgIOS4jmNjLlNjcm9sbFZpZXfnu4Tku7bkuIDlkIzmjILovb3lnKjkuIDkuKroioLngrnkuIpcbiAqICAgICAgaXRlbeaMgui9veeahOiEmuacrOW/hemhu+a3u+WKoHNldERhdGHmlrnms5XvvIznlKjmnaXkvKDpgJLmlbDmja5cbiAqICAgICAgaXRlbemUmueCueW6lOivpeWcqOS4reW/g1xuICogICAgICDnm67liY1Hcmlk57G75Z6L5Y+q5pSv5oyB5LuO5bem5LiK5Yiw5Y+z5LiL5qih5byPKOWeguebtOa7muWKqCnvvIzlhbbku5blpYfokanmqKHlvI/oh6rlt7HmkJ7lrppcbiAqICAgICAg5rua5Yqo6L2055qE6ZSa54K55b+F6aG75pS+5Zyo5rua5Yqo5YiX6KGo55qE6LW35aeL5L2N572uKOavlOWmguiDjOWMhWdyaWTmqKHlvI/lnKjlt6bkuIrop5LvvIzmiJDlsLHliJfooajlnKjlt6bkuIrop5IpXG4gKiBcbiAqIEBhZGFwdGVySXRlbSAgaXRlbeWmguacieS4jeWumumrmOW6puaXtiznvJbovpHlmajkuK3orr7lrprnmoRpdGVt6ZyA6KaB5Li65pyA5bCP6auY5bqmLOehruS/nWluc3RhbmNl55qE5Liq5pWw5pyA5aSn5YC85piv5q2j56Gu55qEXG4gKiAgICAgIOaUr+aMgeS4jeinhOWImemrmOW6pml0ZW0g6LCo55SoLOaciee8uumZtzpcbiAqICAgICAgMS7lkIzkuIDkuKppdGVt5YaN5qyh6K6+572u5LiN5ZCM6auY5bqm5pe25Lya5Ye6546w6Zeu6aKYKOiLpeimgeS/ruaUuSzpnIDopoHlgZrkuIDkuKrpk77ooajmnaXlhbPogZTliY3lkI5pdGVtKVxuICogICAgICAyLuS7heaUr+aMgeWeguebtOWSjOawtOW5s+aooeW8jyzog4zljIXmqKHlvI/kuI3mlK/mjIEo5rC05bmz5qih5byP5pyq5rWL6K+VKVxuICovXG5cbmltcG9ydCB7IGdhbWVNZXRob2QgfSBmcm9tIFwiLi4vY29tbW9uL2dhbWVNZXRob2RcIjtcbmltcG9ydCB7IENDX05PREVfRVZFTlQgfSBmcm9tIFwiLi4vZGF0YS9jb25zdC9UeXBlQ29uc3RcIjtcbmltcG9ydCBTY3JvbGxJbm5lciBmcm9tIFwiLi9TY3JvbGxJbm5lclwiO1xuaW1wb3J0IFNjcm9sbE91dCBmcm9tIFwiLi9TY3JvbGxPdXRcIjtcblxuLy8g5a+56LGh5rGg57G75Z6LXG5sZXQgUG9vbEVudW0gPSBjYy5FbnVtKHtcbiAgICAvKirpgJrnlKjpgZPlhbcgKi9cbiAgICBJVEVNX0JBU0U6IDAsXG4gICAgLyoq6IOM5YyF6YGT5YW3ICovXG4gICAgSVRFTV9CQUc6IDEsXG4gICAgLy8gLyoq5ZCI5oiQ6YGT5YW3ICovXG4gICAgLy8gSVRFTV9DT01QT1NFOiAyLFxufSlcblxuLy8g5rua5Yqo57G75Z6LXG5sZXQgU2Nyb2xsRGlyRW51bSA9IGNjLkVudW0oe1xuICAgIC8qKuWeguebtCovXG4gICAgVkVSVElDQUw6IDAsXG4gICAgLyoq5rC05bmzKi9cbiAgICBIT1JJWk9OVEFMOiAxLFxuICAgIC8qKuiDjOWMhSovXG4gICAgR1JJRDogMlxufSlcblxuLy8g5rua5Yqo57G75Z6LXG5sZXQgU2Nyb2xsT3V0SW5uZXIgPSBjYy5FbnVtKHtcbiAgICAvKirlpJblsYJzY3JvbGwqL1xuICAgIERFRkFVTFQ6IDAsXG4gICAgLyoq5aSW5bGCc2Nyb2xsKi9cbiAgICBPVVQ6IDEsXG4gICAgLyoq5YaF5bGCc2Nyb2xsKi9cbiAgICBJTk5FUjogMixcbn0pXG5cbmludGVyZmFjZSBBZGFwdGVyTGlzdCB7XG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyXG59XG5cbnR5cGUgSXRlbUxpc3QgPSB7IGluZGV4OiBudW1iZXIsIG5vZGU6IGNjLk5vZGUgfVxuXG5jb25zdCB7IGNjY2xhc3MsIHByb3BlcnR5LCBtZW51IH0gPSBjYy5fZGVjb3JhdG9yO1xuQGNjY2xhc3NcbkBtZW51KCdTY3JvbGwvU2Nyb2xsRmluYWwnKVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2Nyb2xsRmluYWwgZXh0ZW5kcyBjYy5Db21wb25lbnQge1xuICAgIC8vIEBwcm9wZXJ0eShjYy5TY3JvbGxWaWV3KVxuICAgIC8vIHNjcm9sbDogY2MuU2Nyb2xsVmlldyB8IG51bGwgPSBudWxsXG4gICAgQHByb3BlcnR5KHtcbiAgICAgICAgdG9vbHRpcDogXCLkvb/nlKjlr7nosaHmsaBcIlxuICAgIH0pXG4gICAgdXNlTm9kZVBvb2w6IGJvb2xlYW4gPSBmYWxzZVxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICAgIHR5cGU6IFBvb2xFbnVtLFxuICAgICAgICB2aXNpYmxlOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnVzZU5vZGVQb29sIH0sXG4gICAgICAgIHRvb2x0aXA6IFwi5a+56LGh5rGg57G75Z6LXCJcbiAgICB9KVxuICAgIHByaXZhdGUgcG9vbFR5cGUgPSBQb29sRW51bS5JVEVNX0JBU0VcblxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICAgIHR5cGU6IFNjcm9sbERpckVudW0sXG4gICAgICAgIHZpc2libGU6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHRvb2x0aXA6IFwi5rua5Yqo57G75Z6LXCJcbiAgICB9KVxuICAgIHByaXZhdGUgc2Nyb2xsRGlyID0gU2Nyb2xsRGlyRW51bS5WRVJUSUNBTCAgLy8g5rua5Yqo57G75Z6LXG5cbiAgICBAcHJvcGVydHkoe1xuICAgICAgICB0eXBlOiBTY3JvbGxPdXRJbm5lcixcbiAgICAgICAgdG9vbHRpcDogXCIwPT7luLjop4RzY3JvbGxcXG4xPT7lpJblsYJzY3JvbGxcXG4yPT7lhoXlsYJzY3JvbGxcIlxuICAgIH0pXG4gICAgcHJpdmF0ZSBvdXRJbm5lciA9IFNjcm9sbE91dElubmVyLkRFRkFVTFRcblxuICAgIEBwcm9wZXJ0eSh7IHRvb2x0aXA6IFwi5LiO5rua5Yqo5bGC55qE6L6555WMLeW3plwiIH0pXG4gICAgcGFkaW5nWDogbnVtYmVyID0gMTBcbiAgICBAcHJvcGVydHkoeyB0b29sdGlwOiBcIuS4jua7muWKqOWxgueahOi+ueeVjC3kuIpcIiB9KVxuICAgIHBhZGluZ1k6IG51bWJlciA9IDEwXG4gICAgQHByb3BlcnR5KHsgdG9vbHRpcDogXCLkuI7mu5rliqjlsYLnmoTovrnnlYwt5LiLXCIgfSlcbiAgICBwYWRpbmdZMjogbnVtYmVyID0gMFxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICAgIHZpc2libGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuc2Nyb2xsRGlyICE9IFNjcm9sbERpckVudW0uVkVSVElDQUwgfSwgdG9vbHRpcDogXCJpdGVt6KGM6Ze06LedXCJcbiAgICB9KVxuICAgIHNwYWNpbmdYOiBudW1iZXIgPSAyMFxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICAgIHZpc2libGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuc2Nyb2xsRGlyICE9IFNjcm9sbERpckVudW0uSE9SSVpPTlRBTCB9LCB0b29sdGlwOiBcIml0ZW3liJfpl7Tot51cIlxuICAgIH0pXG4gICAgc3BhY2luZ1k6IG51bWJlciA9IDIwXG5cbiAgICBAcHJvcGVydHkoY2MuUHJlZmFiKVxuICAgIGl0ZW1QcmVmYWI6IGNjLlByZWZhYiA9IG51bGwgICAgLy8gaXRlbei1hOa6kOWKoOi9veWcsOWdgFxuICAgIEBwcm9wZXJ0eVxuICAgIGl0ZW1TY3JpcHQ6IHN0cmluZyA9IFwiXCIgLy8gaXRlbeaMguWcqOeahOiEmuacrOWQjVxuICAgIEBwcm9wZXJ0eVxuICAgIGl0ZW1TY2FsZTogbnVtYmVyID0gMSAgICAvLyBpdGVt57yp5pS+5q+U5L6LXG5cbiAgICBAcHJvcGVydHkoe1xuICAgICAgICB0b29sdGlwOiBcIuaYr+WQpuW8gOWQr+a7muWKqOaDr+aAp1wiXG4gICAgfSlcbiAgICBpbmVydGlhOiBib29sZWFuID0gdHJ1ZVxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICAgIHRvb2x0aXA6IFwi5byA5ZCv5oOv5oCn5ZCOLOWcqOeUqOaIt+WBnOatouinpuaRuOWQjua7muWKqOWkmuWdl+WBnOatoiww6KGo56S65rC45LiN5YGc5q2iLDHooajnpLrnq4vljbPlgZzmraJcIixcbiAgICAgICAgdmlzaWJsZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5pbmVydGlhID09IHRydWUgfSxcbiAgICB9KVxuICAgIGJyYWtlOiBudW1iZXIgPSAwLjc1XG4gICAgQHByb3BlcnR5KHtcbiAgICAgICAgdG9vbHRpcDogXCLmmK/lkKblhYHorrjmu5rliqjlhoXlrrnotoXov4fovrnnlYws5bm25Zyo5YGc5q2i6Kem5pG45ZCO5Zue5by5XCJcbiAgICB9KVxuICAgIGVsYXN0aWM6IGJvb2xlYW4gPSB0cnVlXG4gICAgQHByb3BlcnR5KHtcbiAgICAgICAgdG9vbHRpcDogXCLmu5rliqjooYzkuLrmmK/lkKbkvJrlj5bmtojlrZDoioLngrnkuIrms6jlhoznmoTop6bmkbjkuovku7ZcIixcbiAgICB9KVxuICAgIGNhbmNlbElubmVyRXZlbnRzOiBib29sZWFuID0gdHJ1ZVxuXG4gICAgQHByb3BlcnR5KHtcbiAgICAgICAgdG9vbHRpcDogXCLkuI3mlK/mjIHog4zljIUs6buY6K6k5LiN5r+A5rS7XCIsIC8vIOa/gOa0u+WQjizml6Dms5XlnKjliJ3lp4vljJbml7bnm7TmjqXmu5rliqjliLDmnKrlsZXnpLrov4fnmoRpbmRleOagh+etvuS9jee9rizljbMgc2Nyb2xsVG9JbmRleE5vd+S8muWPl+WIsOmZkOWItlxuICAgICAgICBkaXNwbGF5TmFtZTogXCLkuI3lm7rlrpppdGVt5bC65a+4XCJcbiAgICB9KVxuICAgIGFkYXB0ZXJJdGVtOiBib29sZWFuID0gZmFsc2VcbiAgICBhZGFwdGVyTGlzdDogeyBbaWR4OiBzdHJpbmddOiBBZGFwdGVyTGlzdCB9ID0ge30gLy8g6K6w5b2V6YCC6YWN55qE5Z2Q5qCH5YiX6KGoXG4gICAgYWRhcHRlckNvbnRlbnRMZW5ndGg6IG51bWJlciA9IDAgLy8g5r+A5rS76YCC6YWN5ZCO55qEY29udGVudOmrmOW6plxuXG5cblxuXG4gICAgLy8gQHByb3BlcnR5KHtcbiAgICAvLyAgICAgdG9vbHRpcDogXCLlkK/liqh3aWRnZXTmqKHlvI8o5rOo5oSP5r+A5rS75ZCO5LiN5Y+v5LiO5Y6f55SfY2Mud2lkZ2V05ZCM5pe25L2/55SoKVwiXG4gICAgLy8gfSlcbiAgICAvLyB1c2VXaWRnZXQ6IGJvb2xlYW4gPSBmYWxzZVxuXG4gICAgLy8gQHByb3BlcnR5KHsgdG9vbHRpcDogXCLpgILphY3pobbpg6hcIiwgdmlzaWJsZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy51c2VXaWRnZXQgPT0gdHJ1ZSB9IH0pXG4gICAgLy8gdXNlQWxpZ25Ub3A6IGJvb2xlYW4gPSBmYWxzZVxuICAgIC8vIEBwcm9wZXJ0eSh7IHRvb2x0aXA6IFwi6Led56a754i26IqC54K56aG26YOoXCIsIHZpc2libGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudXNlQWxpZ25Ub3AgPT0gdHJ1ZSB9IH0pXG4gICAgLy8gd2lkZ2V0VG9wOiBudW1iZXIgPSAwXG4gICAgLy8gQHByb3BlcnR5KHsgdG9vbHRpcDogXCLpgILphY3lupXpg6hcIiwgdmlzaWJsZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy51c2VXaWRnZXQgPT0gdHJ1ZSB9IH0pXG4gICAgLy8gdXNlQWxpZ25Cb3R0b206IGJvb2xlYW4gPSBmYWxzZVxuICAgIC8vIEBwcm9wZXJ0eSh7IHRvb2x0aXA6IFwi6Led56a754i26IqC54K55bqV6YOoXCIsIHZpc2libGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudXNlQWxpZ25Cb3R0b20gPT0gdHJ1ZSB9IH0pXG4gICAgLy8gd2lkZ2V0Qm90dG9tOiBudW1iZXIgPSAwXG4gICAgLy8gQHByb3BlcnR5KHsgdG9vbHRpcDogXCLpgILphY3lt6bkvqdcIiwgdmlzaWJsZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy51c2VXaWRnZXQgPT0gdHJ1ZSB9IH0pXG4gICAgLy8gdXNlQWxpZ25MZWZ0OiBib29sZWFuID0gZmFsc2VcbiAgICAvLyBAcHJvcGVydHkoeyB0b29sdGlwOiBcIui3neemu+eItuiKgueCueW3puS+p1wiLCB2aXNpYmxlOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnVzZUFsaWduTGVmdCA9PSB0cnVlIH0gfSlcbiAgICAvLyB3aWRnZXRMZWZ0OiBudW1iZXIgPSAwXG4gICAgLy8gQHByb3BlcnR5KHsgdG9vbHRpcDogXCLpgILphY3lj7PkvqdcIiwgdmlzaWJsZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy51c2VXaWRnZXQgPT0gdHJ1ZSB9IH0pXG4gICAgLy8gdXNlQWxpZ25SaWdodDogYm9vbGVhbiA9IGZhbHNlXG4gICAgLy8gQHByb3BlcnR5KHsgdG9vbHRpcDogXCLot53nprvniLboioLngrnlj7PkvqdcIiwgdmlzaWJsZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy51c2VBbGlnblJpZ2h0ID09IHRydWUgfSB9KVxuICAgIC8vIHdpZGdldFJpZ2h0OiBudW1iZXIgPSAwXG5cbiAgICBAcHJvcGVydHkoe1xuICAgICAgICB0b29sdGlwOiBcIuWxleekuueUn+S6p+WKqOeUu1xcbjAtPuS4jeWxleekulxcbjEtPue8qeaUvuWKqOeUu1xcbjItPnjmlrnlkJHljovmiYHmi4nkvLhcXG4zLT555pa55ZCR5Y6L5omB5ouJ5Ly4XFxuNC0+5oWi57yp5pS+XCJcbiAgICB9KVxuICAgIHNob3dBbmltOiBudW1iZXIgPSAwXG4gICAgQHByb3BlcnR5KHtcbiAgICAgICAgdG9vbHRpcDogXCLljZXkuKrliqjnlLvmkq3mlL7pgJ/luqZcXG7mnIDkvbPmkq3mlL7pgJ/luqblj4LogIPvvJpcXG7nvKnmlL7liqjnlLstPjAuMVxcbnjmlrnlkJHljovmiYHmi4nkvLgtPjAuMVxcbnnmlrnlkJHljovmiYHmi4nkvLgtPjAuMjVcXG7mhaLnvKnmlL4tPjAuM1wiXG4gICAgfSlcbiAgICBhbmltU3BlZWQ6IG51bWJlciA9IDAuMTVcbiAgICBAcHJvcGVydHkoe1xuICAgICAgICB0b29sdGlwOiBcIuWIm+W7uml0ZW3nmoTlu7bov5/ml7bpl7Qs6K6+5Li6MOWImeS4uuavj+W4p+eUn+aIkOOAglxcbuazqOaEjzrlnKjmiYDmnIlpdGVt5Yi35paw5a6M5LmL5YmNLHNjcm9sbOe7hOS7tueahOa7muWKqOWKn+iDveWwhuiiq+WFs+mXrVwiXG4gICAgfSlcbiAgICBjdGltZTogbnVtYmVyID0gMFxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICAgIHRvb2x0aXA6IFwi5q+P5bin55Sf5oiQaXRlbeeahOS4quaVsFwiXG4gICAgfSlcbiAgICBjbnVtYmVyOiBudW1iZXIgPSAxXG5cbiAgICBzY3JvbGxWaWV3OiBjYy5TY3JvbGxWaWV3IHwgU2Nyb2xsT3V0IHwgU2Nyb2xsSW5uZXJcbiAgICBtYXNrOiBjYy5Ob2RlXG4gICAgY29udGVudDogY2MuTm9kZVxuXG4gICAgaXNTY3JvbGxVcDogYm9vbGVhbiA9IGZhbHNlICAgICAgIC8vIOW9k+WJjeW+gOWTquS4quaWueWQkea7muWKqCAgIOW3puWSjOS4iuaYr3RydWVcbiAgICBwcml2YXRlIF9pdGVtRGF0YUxpc3Q6IGFueVtdID0gW10gICAvLyDlvZPliY3mmL7npLrpmLXokKXnmoTmiYDmnInmlbDmja5cbiAgICBwcml2YXRlIGV4dHJhUGFyYW1zOiBhbnlbXSA9IFtdICAgICAvLyDpop3lpJbmlbDmja5cbiAgICBwcml2YXRlIGl0ZW1MaXN0OiBJdGVtTGlzdFtdID0gW10gICAvLyDlrp7kvovljJbnmoRpdGVt5YiX6KGoXG5cbiAgICBwcml2YXRlIGluc3RhbnRpYXRlQ291bnQ6IG51bWJlciA9IDAgICAgLy8gaXRlbeWunuS+i+WMluaVsOmHj1xuICAgIHByaXZhdGUgaGFuZ0NvdW50OiBudW1iZXIgPSAwICAgICAgICAgICAvLyDooYzkuKrmlbBcbiAgICBwcml2YXRlIGxpZUNvdW50OiBudW1iZXIgPSAwICAgICAgICAgICAgLy8g5YiX5Liq5pWwXG4gICAgcHJpdmF0ZSBpdGVtRGlzdGFuY2VYOiBudW1iZXIgPSAwICAgICAgIC8vIGl0ZW3kuK3lv4PngrnkuYvpl7TnmoTot53nprtcbiAgICBwcml2YXRlIGl0ZW1EaXN0YW5jZVk6IG51bWJlciA9IDAgICAgICAgLy8gaXRlbeS4reW/g+eCueS5i+mXtOeahOi3neemu1xuICAgIHByaXZhdGUgc2Nyb2xsTWF4T2Zmc2V0WDogbnVtYmVyID0gMCAgICAvLyDmnIDlpKflj6/mu5rliqjljLrln59YXG4gICAgcHJpdmF0ZSBzY3JvbGxNYXhPZmZzZXRZOiBudW1iZXIgPSAwICAgIC8vIOacgOWkp+WPr+a7muWKqOWMuuWfn1lcbiAgICBwcml2YXRlIHNjcm9sbEluZGV4OiBudW1iZXIgPSAtMSAgICAgICAgIC8vIHNjcm9sbOWPguaVsFxuXG4gICAgcHJpdmF0ZSBsYXN0U2Nyb2xsUG9zOiBudW1iZXIgPSAwICAgICAgIC8v5LiK5LiA5qyh55qE5rua5Yqo5L2N572uXG4gICAgcHJpdmF0ZSBjdXJTY3JvbGxQb3M6IG51bWJlciA9IDAgICAgICAgIC8vIOW9k+WJjea7muWKqOS9jee9rlxuXG4gICAgcHJpdmF0ZSBpdGVtV2lkdGg6IG51bWJlciA9IDEwICAvLyBpdGVt5a695bqmXG4gICAgcHJpdmF0ZSBpdGVtSGVpZ2h0OiBudW1iZXIgPSAxMCAvLyBpdGVt6auY5bqmXG5cbiAgICBwcml2YXRlIHRhZ0xhbmc6IG51bWJlciA9IDBcbiAgICBwcml2YXRlIHRhZ0luZGV4OiBudW1iZXIgPSAtOTk5IC8vIDk5OSDooajnpLrmuIUw54q25oCB77yM5q2k5pe25peg44CQ5o+S5YWl5qCH562+44CRLFxiLTHooajnpLrmoIfnrb7nva7pobbvvIzlhbbku5bljbPlvZPliY3moIfnrb7nmoTkuIvmlrko5Y+z5L6nKeaYvuekulxuXG4gICAgcHJpdmF0ZSBjYW5DcmVhdGVJdGVtOiBib29sZWFuID0gZmFsc2UgIC8vIOWPr+S7peeUn+aIkGl0ZW1cbiAgICBwcml2YXRlIGNyZWF0ZUluZGV4OiBudW1iZXIgPSAwIC8vIOeUn+aIkGl0ZW3nmoTmlbDmja7moIfnrb5cbiAgICBwcml2YXRlIGxpZmU6IG51bWJlciA9IDAgLy8g55Sf5oiQaXRlbeeahOaXtumXtFxuICAgIHByaXZhdGUgYmFzZUluZGV4OiBudW1iZXIgPSAwIC8vIOWfuuehgOagh+etvuS9jee9rlxuXG4gICAgcHJpdmF0ZSBoYXNJbml0OiBib29sZWFuID0gZmFsc2VcblxuICAgIG9uTG9hZCgpIHtcbiAgICAgICAgLy8gaWYgKHRoaXMubm9kZS5nZXRDb21wb25lbnQoY2MuU2Nyb2xsVmlldykgIT0gbnVsbCkge1xuICAgICAgICAvLyAgICAgY29uc29sZS5lcnJvcihcIua7muWKqOiKgueCueaXoOmcgOaMgui9vXNjcm9sbFZpZXfnu4Tku7bkuoZcIilcbiAgICAgICAgLy8gICAgIHJldHVyblxuICAgICAgICAvLyB9XG4gICAgICAgIHRoaXMuaW5pdCgpXG4gICAgfVxuXG4gICAgcmVzZXRTaXplKCkge1xuICAgICAgICBpZiAodGhpcy5tYXNrKSB7XG4gICAgICAgICAgICB0aGlzLm1hc2suc2V0Q29udGVudFNpemUodGhpcy5ub2RlLmdldENvbnRlbnRTaXplKCkpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgICAgICAgLy8gdGhpcy5jb250ZW50LnNldENvbnRlbnRTaXplKHRoaXMubm9kZS5nZXRDb250ZW50U2l6ZSgpKVxuICAgICAgICAgICAgdGhpcy5zZXRTY3JvbGxDb250ZW50U2l6ZSgpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRJbnN0YW50Q291bnQoKVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzSW5pdCkgeyByZXR1cm4gfVxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8g5p6E5bu65rua5Yqo6L20IC8vLy8vLy8vLy8vLy8vL1xuICAgICAgICB0aGlzLnNjcm9sbFZpZXcgPSB0aGlzLm91dElubmVyID09IFNjcm9sbE91dElubmVyLkRFRkFVTFQgPyB0aGlzLmFkZENvbXBvbmVudChjYy5TY3JvbGxWaWV3KSA6XG4gICAgICAgICAgICB0aGlzLm91dElubmVyID09IFNjcm9sbE91dElubmVyLk9VVCA/IHRoaXMuYWRkQ29tcG9uZW50KFNjcm9sbE91dCkgOiB0aGlzLmFkZENvbXBvbmVudChTY3JvbGxJbm5lcilcbiAgICAgICAgLy8gdGhpcy5zY3JvbGxWaWV3ID0gdGhpcy5hZGRDb21wb25lbnQoY2MuU2Nyb2xsVmlldylcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3Lmhvcml6b250YWwgPSB0aGlzLnNjcm9sbERpciA9PSBTY3JvbGxEaXJFbnVtLkhPUklaT05UQUxcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3LnZlcnRpY2FsID0gdGhpcy5zY3JvbGxEaXIgIT0gU2Nyb2xsRGlyRW51bS5IT1JJWk9OVEFMXG4gICAgICAgIHRoaXMuc2Nyb2xsVmlldy5pbmVydGlhID0gdGhpcy5pbmVydGlhXG4gICAgICAgIHRoaXMuc2Nyb2xsVmlldy5icmFrZSA9IHRoaXMuYnJha2VcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmVsYXN0aWMgPSB0aGlzLmVsYXN0aWNcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmNhbmNlbElubmVyRXZlbnRzID0gdGhpcy5jYW5jZWxJbm5lckV2ZW50c1xuICAgICAgICAvLy8vLy8vLy8vLy8vLy8g5qOA5rWL5piv5ZCm6ZyA6KaB6YeN5paw6YCC6YWNIC8vLy8vLy8vLy8vLy8vL1xuICAgICAgICBpZiAodGhpcy5ub2RlLmdldENvbXBvbmVudChjYy5XaWRnZXQpKSB7XG4gICAgICAgICAgICB0aGlzLm5vZGUuZ2V0Q29tcG9uZW50KGNjLldpZGdldCkudXBkYXRlQWxpZ25tZW50KClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLyDmnoTlu7rmu5rliqjpga7nvakgLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgIHRoaXMubWFzayA9IG5ldyBjYy5Ob2RlKClcbiAgICAgICAgdGhpcy5tYXNrLnBhcmVudCA9IHRoaXMubm9kZVxuICAgICAgICB0aGlzLm1hc2submFtZSA9IFwic2Nyb2xsTWFza1wiXG4gICAgICAgIHRoaXMubWFzay5zZXRDb250ZW50U2l6ZSh0aGlzLm5vZGUuZ2V0Q29udGVudFNpemUoKSlcbiAgICAgICAgdGhpcy5tYXNrLmFkZENvbXBvbmVudChjYy5XaWRnZXQpXG4gICAgICAgIHRoaXMubWFzay5nZXRDb21wb25lbnQoY2MuV2lkZ2V0KS5pc0FsaWduVG9wID0gdHJ1ZVxuICAgICAgICB0aGlzLm1hc2suZ2V0Q29tcG9uZW50KGNjLldpZGdldCkuaXNBbGlnbkJvdHRvbSA9IHRydWVcbiAgICAgICAgdGhpcy5tYXNrLmdldENvbXBvbmVudChjYy5XaWRnZXQpLnRvcCA9IDBcbiAgICAgICAgdGhpcy5tYXNrLmdldENvbXBvbmVudChjYy5XaWRnZXQpLmJvdHRvbSA9IDBcblxuICAgICAgICB0aGlzLm1hc2suYWRkQ29tcG9uZW50KGNjLk1hc2spXG4gICAgICAgIHRoaXMubWFzay5nZXRDb21wb25lbnQoY2MuTWFzaykudHlwZSA9IGNjLk1hc2suVHlwZS5SRUNUXG4gICAgICAgIHRoaXMubWFzay5hbmNob3JYID0gdGhpcy5ub2RlLmFuY2hvclhcbiAgICAgICAgdGhpcy5tYXNrLmFuY2hvclkgPSB0aGlzLm5vZGUuYW5jaG9yWVxuICAgICAgICB0aGlzLm1hc2sueCA9IDBcbiAgICAgICAgdGhpcy5tYXNrLnkgPSAwXG4gICAgICAgIC8vIHdpZGdldOS4jemcgOimgeWKoOS6hlxuICAgICAgICAvLyBsZXQgbWFza1dpZGdldCA9IG1hc2suYWRkQ29tcG9uZW50KGNjLldpZGdldClcbiAgICAgICAgLy8gbWFza1dpZGdldC5pc0FsaWduVG9wID0gdHJ1ZVxuICAgICAgICAvLyBtYXNrV2lkZ2V0LmlzQWxpZ25Cb3R0b20gPSB0cnVlXG4gICAgICAgIC8vIG1hc2tXaWRnZXQuaXNBbGlnbkxlZnQgPSB0cnVlXG4gICAgICAgIC8vIG1hc2tXaWRnZXQuaXNBbGlnblJpZ2h0ID0gdHJ1ZVxuICAgICAgICAvLyBtYXNrV2lkZ2V0LnRvcCA9IDBcbiAgICAgICAgLy8gbWFza1dpZGdldC5ib3R0b20gPSAwXG4gICAgICAgIC8vIG1hc2tXaWRnZXQubGVmdCA9IDBcbiAgICAgICAgLy8gbWFza1dpZGdldC5yaWdodCA9IDBcbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vIOaehOW7uua7muWKqOWGheWuueWZqCAvLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgdGhpcy5jb250ZW50ID0gbmV3IGNjLk5vZGUoKVxuICAgICAgICB0aGlzLmNvbnRlbnQucGFyZW50ID0gdGhpcy5tYXNrXG4gICAgICAgIHRoaXMuY29udGVudC5uYW1lID0gXCJzY3JvbGxDb250ZW50XCJcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQgPSB0aGlzLmNvbnRlbnRcbiAgICAgICAgdGhpcy5jb250ZW50LnNldENvbnRlbnRTaXplKHRoaXMubm9kZS5nZXRDb250ZW50U2l6ZSgpKVxuICAgICAgICB0aGlzLmNvbnRlbnQuYW5jaG9yWCA9IHRoaXMubm9kZS5hbmNob3JYXG4gICAgICAgIHRoaXMuY29udGVudC5hbmNob3JZID0gdGhpcy5ub2RlLmFuY2hvcllcbiAgICAgICAgdGhpcy5jb250ZW50LnggPSAwXG4gICAgICAgIHRoaXMuY29udGVudC55ID0gMFxuXG4gICAgICAgIHRoaXMuaGFzSW5pdCA9IHRydWVcblxuXG4gICAgICAgIHRoaXMuaXRlbVdpZHRoID0gdGhpcy5pdGVtUHJlZmFiLmRhdGEuZ2V0Q29udGVudFNpemUoKS53aWR0aFxuICAgICAgICB0aGlzLml0ZW1IZWlnaHQgPSB0aGlzLml0ZW1QcmVmYWIuZGF0YS5nZXRDb250ZW50U2l6ZSgpLmhlaWdodFxuXG5cbiAgICAgICAgLy8gU0NST0xMX0JPVU5DRV9CT1RUT00gPSAnYm91bmNlLWJvdHRvbScsLy/mu5rliqjop4blm77mu5rliqjliLDpobbpg6jovrnnlYzlubbkuJTlvIDlp4vlm57lvLnml7blj5Hlh7rnmoTkuovku7ZcbiAgICAgICAgLy8gU0NST0xMX0JPVU5DRV9MRUZUID0gJ2JvdW5jZS1sZWZ0JywvL+a7muWKqOinhuWbvua7muWKqOWIsOW6lemDqOi+ueeVjOW5tuS4lOW8gOWni+WbnuW8ueaXtuWPkeWHuueahOS6i+S7tlxuICAgICAgICAvLyBTQ1JPTExfQk9VTkNFX1JJR0hUID0gJ2JvdW5jZS1yaWdodCcsLy/mu5rliqjop4blm77mu5rliqjliLDlt6bovrnnlYzlubbkuJTlvIDlp4vlm57lvLnml7blj5Hlh7rnmoTkuovku7ZcbiAgICAgICAgLy8gU0NST0xMX0JPVU5DRV9UT1AgPSAnYm91bmNlLXRvcCcsLy/mu5rliqjop4blm77mu5rliqjliLDlj7PovrnnlYzlubbkuJTlvIDlp4vlm57lvLnml7blj5Hlh7rnmoTkuovku7ZcblxuICAgICAgICB0aGlzLnNjcm9sbFZpZXcubm9kZS5vbihDQ19OT0RFX0VWRU5ULlNDUk9MTElORywgdGhpcy5vblNjcm9sbCwgdGhpcylcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3Lm5vZGUub24oQ0NfTk9ERV9FVkVOVC5TQ1JPTExfQkVHQU4sIHRoaXMub25TY3JvbGxCZWdhbiwgdGhpcylcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3Lm5vZGUub24oQ0NfTk9ERV9FVkVOVC5TQ1JPTExfQk9VTkNFX1RPUCwgdGhpcy5vbkJvdW5jZVRvcCwgdGhpcylcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3Lm5vZGUub24oQ0NfTk9ERV9FVkVOVC5TQ1JPTExfQk9VTkNFX0JPVFRPTSwgKCkgPT4geyB9LCB0aGlzKVxuICAgICAgICB0aGlzLnNjcm9sbFZpZXcubm9kZS5vbihDQ19OT0RFX0VWRU5ULlNDUk9MTF9CT1VOQ0VfTEVGVCwgKCkgPT4geyB9LCB0aGlzKVxuICAgICAgICB0aGlzLnNjcm9sbFZpZXcubm9kZS5vbihDQ19OT0RFX0VWRU5ULlNDUk9MTF9CT1VOQ0VfUklHSFQsICgpID0+IHsgfSwgdGhpcylcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3Lm5vZGUub24oQ0NfTk9ERV9FVkVOVC5TQ1JPTExfQk9VTkNFX1RPUCwgKCkgPT4geyB9LCB0aGlzKVxuICAgICAgICB0aGlzLml0ZW1EaXN0YW5jZVggPSB0aGlzLnJlYWxJdGVtV2lkdGggKyB0aGlzLnNwYWNpbmdYXG4gICAgICAgIHRoaXMuaXRlbURpc3RhbmNlWSA9IHRoaXMucmVhbEl0ZW1IZWlnaHQgKyB0aGlzLnNwYWNpbmdZXG5cbiAgICAgICAgdGhpcy5zZXRJbnN0YW50Q291bnQoKVxuXG4gICAgICAgIC8vIC8v55yL5LiL5pyJ5rKh5pyJ5LiN5bqU6K+l5pyJ55qE57uE5Lu2XG4gICAgICAgIC8vIC8vIExheW91dFxuICAgICAgICAvLyBpZiAodGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQuZ2V0Q29tcG9uZW50KGNjLkxheW91dCkpIHtcbiAgICAgICAgLy8gICAgIGNvbnNvbGUuZXJyb3IoXCJzY3JvbGxGaW5hbCDkuI4gbGF5b3V0IOWGsueqgSzmuIXliKDpmaQgY29udGVudCDkuK3nmoQgbGF5b3V0IOe7hOS7tlwiKVxuICAgICAgICAvLyB9XG4gICAgICAgIC8vIC8vIFdpZGdldFxuICAgICAgICAvLyBpZiAodGhpcy5zY3JvbGxWaWV3Lm5vZGUuZ2V0Q29tcG9uZW50KGNjLldpZGdldCkpIHtcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLnNjcm9sbFZpZXcubm9kZS5nZXRDb21wb25lbnQoY2MuV2lkZ2V0KS5pc0FsaWduVG9wICYmXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5zY3JvbGxWaWV3Lm5vZGUuZ2V0Q29tcG9uZW50KGNjLldpZGdldCkuaXNBbGlnbkJvdHRvbSkge1xuICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCLkuI3og73nlKh3aWRnZXTlgZrplb/luqbpgILphY0o5Zug5Li6V2lkZ2V055qE5bu26L+fKSzlj6rlj6/nlKjkvZzlnZDmoIfpgILphY1cIilcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgIH1cbiAgICBwcml2YXRlIHNldEluc3RhbnRDb3VudCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsVmlldyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHRoaXMuc2Nyb2xsRGlyKSB7XG4gICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uVkVSVElDQUw6XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5nQ291bnQgPSAxXG4gICAgICAgICAgICAgICAgdGhpcy5saWVDb3VudCA9IE1hdGguY2VpbCh0aGlzLnNjcm9sbFZpZXcubm9kZS5oZWlnaHQgLyAodGhpcy5pdGVtRGlzdGFuY2VZKSkgKyAxXG4gICAgICAgICAgICAgICAgdGhpcy5pbnN0YW50aWF0ZUNvdW50ID0gdGhpcy5saWVDb3VudFxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uSE9SSVpPTlRBTDpcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmdDb3VudCA9IE1hdGguY2VpbCh0aGlzLnNjcm9sbFZpZXcubm9kZS53aWR0aCAvICh0aGlzLml0ZW1EaXN0YW5jZVgpKSArIDFcbiAgICAgICAgICAgICAgICB0aGlzLmxpZUNvdW50ID0gMVxuICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFudGlhdGVDb3VudCA9IHRoaXMuaGFuZ0NvdW50XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5HUklEOlxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZ0NvdW50ID0gTWF0aC5mbG9vcih0aGlzLnNjcm9sbFZpZXcubm9kZS53aWR0aCAvICh0aGlzLml0ZW1EaXN0YW5jZVgpKVxuICAgICAgICAgICAgICAgIHRoaXMubGllQ291bnQgPSBNYXRoLmNlaWwodGhpcy5zY3JvbGxWaWV3Lm5vZGUuaGVpZ2h0IC8gKHRoaXMuaXRlbURpc3RhbmNlWSkpICsgMVxuICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFudGlhdGVDb3VudCA9IHRoaXMuaGFuZ0NvdW50ICogdGhpcy5saWVDb3VudFxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0U2Nyb2xsVmlldyhsaXN0OiBhbnlbXSA9IFtdLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAvLyB0aGlzLnNjaGVkdWxlT25jZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuaW5pdCgpXG4gICAgICAgIHRoaXMuY2xlYXIoKVxuICAgICAgICB0aGlzLmNsZWFyVGFnKClcbiAgICAgICAgdGhpcy5hZGFwdGVyTGlzdCA9IHt9XG4gICAgICAgIHRoaXMuaXRlbURhdGFMaXN0ID0gbGlzdFxuICAgICAgICB0aGlzLmV4dHJhUGFyYW1zID0gYXJnc1xuICAgICAgICBpZiAodGhpcy5vdXRJbm5lciA9PSBTY3JvbGxPdXRJbm5lci5PVVQpIHtcbiAgICAgICAgICAgIHRoaXMuZXh0cmFQYXJhbXMucHVzaCh0aGlzLnNjcm9sbFZpZXcpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3LnN0b3BBdXRvU2Nyb2xsKClcbiAgICAgICAgdGhpcy5zaG93VUkoKVxuICAgICAgICAvLyB9LCAwKVxuICAgIH1cblxuICAgIHNldCBpdGVtRGF0YUxpc3QobGlzdDogYW55W10pIHtcbiAgICAgICAgdGhpcy5faXRlbURhdGFMaXN0ID0gbGlzdFxuICAgICAgICBpZiAoIXRoaXMuYWRhcHRlckl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIC8vIOmAgumFjeaooeW8jyzpnIDopoHljrvmjonorrDlvZXnmoTkv6Hmga9cbiAgICAgICAgbGV0IG5ld0FkYXB0ZXJMaXN0OiB7IFtpZHg6IHN0cmluZ106IEFkYXB0ZXJMaXN0IH0gPSB7fVxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XSkge1xuICAgICAgICAgICAgICAgIG5ld0FkYXB0ZXJMaXN0W2luZGV4XSA9IHRoaXMuYWRhcHRlckxpc3RbaW5kZXhdXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGFwdGVyTGlzdCA9IG5ld0FkYXB0ZXJMaXN0XG4gICAgICAgIHN3aXRjaCAodGhpcy5zY3JvbGxEaXIpIHtcbiAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5WRVJUSUNBTDpcbiAgICAgICAgICAgICAgICB0aGlzLmFkYXB0ZXJDb250ZW50TGVuZ3RoID0gMFxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaWR4IGluIHRoaXMuYWRhcHRlckxpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGFwdGVyQ29udGVudExlbmd0aCA9IE1hdGgubWF4KE1hdGguYWJzKHRoaXMuYWRhcHRlckxpc3RbaWR4XS55KSArIHRoaXMuYWRhcHRlckxpc3RbaWR4XS5oZWlnaHQgLyAyKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLkhPUklaT05UQUw6XG4gICAgICAgICAgICAgICAgdGhpcy5hZGFwdGVyQ29udGVudExlbmd0aCA9IDBcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkeCBpbiB0aGlzLmFkYXB0ZXJMaXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRhcHRlckNvbnRlbnRMZW5ndGggPSBNYXRoLm1heCh0aGlzLmFkYXB0ZXJMaXN0W2lkeF0ueCArIHRoaXMuYWRhcHRlckxpc3RbaWR4XS53aWR0aCAvIDIpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGl0ZW1EYXRhTGlzdCgpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtRGF0YUxpc3RcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFBvc2l0aW9uSW5WaWV3KGl0ZW06IGNjLk5vZGUpOiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0ge1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxWaWV3ID09IG51bGwpIHsgcmV0dXJuIGNjLnYyKDAsIDApIH1cbiAgICAgICAgbGV0IHdvcmxkUG9zID0gaXRlbS5wYXJlbnQuY29udmVydFRvV29ybGRTcGFjZUFSKGl0ZW0ucG9zaXRpb24pO1xuICAgICAgICBsZXQgdmlld1BvcyA9IHRoaXMuc2Nyb2xsVmlldy5ub2RlLmNvbnZlcnRUb05vZGVTcGFjZUFSKHdvcmxkUG9zKTtcbiAgICAgICAgcmV0dXJuIHZpZXdQb3M7XG4gICAgfVxuICAgIHByaXZhdGUgb25Cb3VuY2VUb3AoKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5zY3JvbGxEaXIpIHtcbiAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5IT1JJWk9OVEFMOlxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uVkVSVElDQUw6XG4gICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uR1JJRDpcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrU2Nyb2xsU3RhdGUoKVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFkYXB0ZXJJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEBUT0RPXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY3JvbGxJbmRleCA9IC0xXG4gICAgfVxuICAgIHByaXZhdGUgb25TY3JvbGwoKSB7XG4gICAgICAgIHRoaXMuY3VyU2Nyb2xsUG9zID0gMFxuICAgICAgICBpZiAodGhpcy5zY3JvbGxEaXIgPT0gU2Nyb2xsRGlyRW51bS5IT1JJWk9OVEFMKSB7XG4gICAgICAgICAgICB0aGlzLmN1clNjcm9sbFBvcyA9IHRoaXMuc2Nyb2xsVmlldy5nZXRTY3JvbGxPZmZzZXQoKS54XG4gICAgICAgICAgICB0aGlzLmlzU2Nyb2xsVXAgPSB0aGlzLmN1clNjcm9sbFBvcyA8IHRoaXMubGFzdFNjcm9sbFBvc1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdXJTY3JvbGxQb3MgPSB0aGlzLnNjcm9sbFZpZXcuZ2V0U2Nyb2xsT2Zmc2V0KCkueVxuICAgICAgICAgICAgdGhpcy5pc1Njcm9sbFVwID0gdGhpcy5jdXJTY3JvbGxQb3MgPiB0aGlzLmxhc3RTY3JvbGxQb3NcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhc3RTY3JvbGxQb3MgPSB0aGlzLmN1clNjcm9sbFBvc1xuXG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFZpZXcgPT0gbnVsbCkgeyByZXR1cm4gfVxuXG4gICAgICAgIHRoaXMuaXRlbUxpc3QuZm9yRWFjaChlbGUgPT4ge1xuICAgICAgICAgICAgdGhpcy50cnlSZXNldEl0ZW0oZWxlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByaXZhdGUgdHJ5UmVzZXRJdGVtKGVsZTogSXRlbUxpc3QpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnNjcm9sbERpcikge1xuICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLkhPUklaT05UQUw6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VyU2Nyb2xsUG9zID49IDAgfHwgdGhpcy5jdXJTY3JvbGxQb3MgPD0gdGhpcy5zY3JvbGxNYXhPZmZzZXRYKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLlZFUlRJQ0FMOlxuICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLkdSSUQ6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VyU2Nyb2xsUG9zIDw9IC10aGlzLnJlYWxJdGVtSGVpZ2h0IC8gMiB8fCB0aGlzLmN1clNjcm9sbFBvcyA+PSB0aGlzLnNjcm9sbE1heE9mZnNldFkgKyB0aGlzLnJlYWxJdGVtSGVpZ2h0IC8gMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNjcm9sbFdpZHRoID0gdGhpcy5zY3JvbGxWaWV3Lm5vZGUud2lkdGhcbiAgICAgICAgbGV0IHNjcm9sbEhlaWdodCA9IHRoaXMuc2Nyb2xsVmlldy5ub2RlLmhlaWdodFxuICAgICAgICBsZXQgZWxlbWVudCA9IGVsZS5ub2RlXG4gICAgICAgIHN3aXRjaCAodGhpcy5zY3JvbGxEaXIpIHtcbiAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5IT1JJWk9OVEFMOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU2Nyb2xsVXAgJiYgdGhpcy5nZXRQb3NpdGlvbkluVmlldyhlbGVtZW50KS54IDwgLShzY3JvbGxXaWR0aCAqIHRoaXMubm9kZS5hbmNob3JYICsgZWxlLm5vZGUud2lkdGggLyAyKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyDotoXlh7rlt6bovrnnlYzmmL7npLrljLrln59cbiAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IGVsZS5pbmRleCArIHRoaXMuaW5zdGFudGlhdGVDb3VudFxuICAgICAgICAgICAgICAgICAgICBpZiAoaWR4IDwgdGhpcy5pdGVtRGF0YUxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEl0ZW1EYXRhKGVsZW1lbnQsIHRoaXMuaXRlbURhdGFMaXN0W2lkeF0sIGlkeClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQueCA9IGVsZW1lbnQueCArIHRoaXMuaGFuZ0NvdW50ICogZWxlLm5vZGUud2lkdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZS5pbmRleCA9IGlkeFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRQb3NYKGlkeCwgZWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNTY3JvbGxVcCAmJiB0aGlzLmdldFBvc2l0aW9uSW5WaWV3KGVsZW1lbnQpLnggPiBzY3JvbGxXaWR0aCAqICgxIC0gdGhpcy5ub2RlLmFuY2hvclgpICsgZWxlLm5vZGUud2lkdGggLyAyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOi2heWHuuWPs+i+ueeVjOaYvuekuuWMuuWfn1xuICAgICAgICAgICAgICAgICAgICBsZXQgaWR4ID0gZWxlLmluZGV4IC0gdGhpcy5pbnN0YW50aWF0ZUNvdW50XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRJdGVtRGF0YShlbGVtZW50LCB0aGlzLml0ZW1EYXRhTGlzdFtpZHhdLCBpZHgpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50LnggPSBlbGVtZW50LnggLSB0aGlzLmhhbmdDb3VudCAqIGVsZS5ub2RlLndpZHRoXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGUuaW5kZXggPSBpZHhcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UG9zWChpZHgsIGVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5WRVJUSUNBTDpcbiAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5HUklEOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU2Nyb2xsVXAgJiYgdGhpcy5nZXRQb3NpdGlvbkluVmlldyhlbGVtZW50KS55ID4gc2Nyb2xsSGVpZ2h0ICogKDEgLSB0aGlzLm5vZGUuYW5jaG9yWSkgKyBlbGUubm9kZS5oZWlnaHQgLyAyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOi2heWHuuS4iui+ueeVjOaYvuekuuWMuuWfn1xuICAgICAgICAgICAgICAgICAgICBsZXQgaWR4ID0gZWxlLmluZGV4ICsgdGhpcy5pbnN0YW50aWF0ZUNvdW50XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZHggPCB0aGlzLml0ZW1EYXRhTGlzdC5sZW5ndGggJiYgdGhpcy5pc1Njcm9sbFVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEl0ZW1EYXRhKGVsZW1lbnQsIHRoaXMuaXRlbURhdGFMaXN0W2lkeF0sIGlkeClcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZS5pbmRleCA9IGlkeFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRQb3NZKGlkeCwgZWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNTY3JvbGxVcCAmJiB0aGlzLmN1clNjcm9sbFBvcyA+IC1lbGUubm9kZS5oZWlnaHQgLyAyICYmIHRoaXMuZ2V0UG9zaXRpb25JblZpZXcoZWxlbWVudCkueSA8IC0oc2Nyb2xsSGVpZ2h0ICogdGhpcy5ub2RlLmFuY2hvclkgKyBlbGUubm9kZS5oZWlnaHQgLyAyKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyDotoXlh7rkuIvovrnnlYzmmL7npLrljLrln59cbiAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IGVsZS5pbmRleCAtIHRoaXMuaW5zdGFudGlhdGVDb3VudFxuICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID49IDAgJiYgdGhpcy5pc1Njcm9sbFVwID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEl0ZW1EYXRhKGVsZW1lbnQsIHRoaXMuaXRlbURhdGFMaXN0W2lkeF0sIGlkeClcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZS5pbmRleCA9IGlkeFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRQb3NZKGlkeCwgZWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIHNldFBvc1goaW5kZXg6IG51bWJlciwgbm9kZT86IGNjLk5vZGUpOiBudW1iZXIge1xuICAgICAgICBsZXQgeCA9IDBcbiAgICAgICAgaWYgKHRoaXMuYWRhcHRlckl0ZW0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XSAmJiB0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XS54ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLnggPSB0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XS54XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XS54XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBsYXN0WCA9IGluZGV4ID09IDAgPyAwIDogdGhpcy5hZGFwdGVyTGlzdFtpbmRleCAtIDFdLnhcbiAgICAgICAgICAgICAgICBsZXQgbGFzdFdpZHRoID0gaW5kZXggPT0gMCA/IDAgOiB0aGlzLmFkYXB0ZXJMaXN0W2luZGV4IC0gMV0ud2lkdGhcbiAgICAgICAgICAgICAgICAvLyDkuIrkuIDkuKrlnZDmoIcgKyDlvZPliY1ub2Rl5YGP56e76YePXG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNjcm9sbERpcikge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uVkVSVElDQUw6XG4gICAgICAgICAgICAgICAgICAgICAgICB4ID0gdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQud2lkdGggLyAyICsgdGhpcy5wYWRpbmdYLy90aGlzLnJlYWxJdGVtV2lkdGggLyAyICsgdGhpcy5wYWRpbmdYXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uSE9SSVpPTlRBTDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHggKz0gbm9kZS53aWR0aCAvIDIgKyB0aGlzLnBhZGluZ1ggKyBsYXN0WCArIGxhc3RXaWR0aCAvIDIgKyB0aGlzLnNwYWNpbmdYXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkYXB0ZXJDb250ZW50TGVuZ3RoID0gTWF0aC5tYXgoeCArIG5vZGUud2lkdGggLyAyKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTY3JvbGxDb250ZW50U2l6ZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uR1JJRDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBpbmRleCAlIHRoaXMuaGFuZ0NvdW50ICogdGhpcy5pdGVtRGlzdGFuY2VYICsgdGhpcy5yZWFsSXRlbVdpZHRoIC8gMiArIHRoaXMucGFkaW5nWFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWRhcHRlckxpc3RbaW5kZXhdID09IG51bGwpIHsgdGhpcy5hZGFwdGVyTGlzdFtpbmRleF0gPSB7IHg6IG51bGwsIHk6IG51bGwsIHdpZHRoOiBudWxsLCBoZWlnaHQ6IG51bGwgfSB9XG4gICAgICAgICAgICAgICAgdGhpcy5hZGFwdGVyTGlzdFtpbmRleF0ueCA9IHhcbiAgICAgICAgICAgICAgICB0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XS53aWR0aCA9IG5vZGUud2lkdGhcbiAgICAgICAgICAgICAgICBpZiAobm9kZSkgeyBub2RlLnggPSB4IH1cbiAgICAgICAgICAgICAgICByZXR1cm4geFxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNjcm9sbERpcikge1xuICAgICAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5WRVJUSUNBTDpcbiAgICAgICAgICAgICAgICAgICAgeCA9IHRoaXMuc2Nyb2xsVmlldy5jb250ZW50LndpZHRoIC8gMiArIHRoaXMucGFkaW5nWC8vdGhpcy5yZWFsSXRlbVdpZHRoIC8gMiArIHRoaXMucGFkaW5nWFxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5IT1JJWk9OVEFMOlxuICAgICAgICAgICAgICAgICAgICB4ID0gaW5kZXggKiB0aGlzLml0ZW1EaXN0YW5jZVggKyB0aGlzLnJlYWxJdGVtV2lkdGggLyAyICsgdGhpcy5wYWRpbmdYXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRhZ0luZGV4ID49IC0xICYmIGluZGV4ID4gdGhpcy50YWdJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgeCArPSB0aGlzLnRhZ0xhbmdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5HUklEOlxuICAgICAgICAgICAgICAgICAgICB4ID0gaW5kZXggJSB0aGlzLmhhbmdDb3VudCAqIHRoaXMuaXRlbURpc3RhbmNlWCArIHRoaXMucmVhbEl0ZW1XaWR0aCAvIDIgKyB0aGlzLnBhZGluZ1hcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICAgICAgbm9kZS54ID0geFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHhcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIHNldFBvc1koaW5kZXg6IG51bWJlciwgbm9kZT86IGNjLk5vZGUpOiBudW1iZXIge1xuICAgICAgICBsZXQgeSA9IDBcbiAgICAgICAgaWYgKHRoaXMuYWRhcHRlckl0ZW0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XSAmJiB0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XS55ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLnkgPSB0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XS55XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XS55XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBsYXN0WSA9IGluZGV4ID09IDAgPyAwIDogdGhpcy5hZGFwdGVyTGlzdFtpbmRleCAtIDFdLnlcbiAgICAgICAgICAgICAgICBsZXQgbGFzdEhlaWdodCA9IGluZGV4ID09IDAgPyAwIDogdGhpcy5hZGFwdGVyTGlzdFtpbmRleCAtIDFdLmhlaWdodFxuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zY3JvbGxEaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLlZFUlRJQ0FMOlxuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGxhc3RZIC0gdGhpcy5wYWRpbmdZIC0gbm9kZS5oZWlnaHQgLyAyIC0gbGFzdEhlaWdodCAvIDIgLSB0aGlzLnNwYWNpbmdZXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkYXB0ZXJDb250ZW50TGVuZ3RoID0gTWF0aC5tYXgoTWF0aC5hYnMoeSkgKyBub2RlLmhlaWdodCAvIDIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNjcm9sbENvbnRlbnRTaXplKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHkgPSAtaW5kZXggKiB0aGlzLml0ZW1EaXN0YW5jZVkgLSB0aGlzLnJlYWxJdGVtSGVpZ2h0IC8gMiAtIHRoaXMucGFkaW5nWVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHRoaXMudGFnSW5kZXggPj0gLTEgJiYgaW5kZXggPiB0aGlzLnRhZ0luZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgeSAtPSB0aGlzLnRhZ0xhbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5IT1JJWk9OVEFMOlxuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IC10aGlzLnNjcm9sbFZpZXcuY29udGVudC5oZWlnaHQgLyAyICsgdGhpcy5wYWRpbmdZLy8tdGhpcy5yZWFsSXRlbUhlaWdodCAvIDIgLSB0aGlzLnBhZGluZ1lcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5HUklEOlxuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IC1NYXRoLmZsb29yKChpbmRleCkgLyB0aGlzLmhhbmdDb3VudCkgKiB0aGlzLml0ZW1EaXN0YW5jZVkgLSB0aGlzLnJlYWxJdGVtSGVpZ2h0IC8gMiAtIHRoaXMucGFkaW5nWVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGFnSW5kZXggPj0gLTEgJiYgKE1hdGguZmxvb3IoaW5kZXggLyB0aGlzLmhhbmdDb3VudCkpID4gdGhpcy50YWdJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgLT0gdGhpcy50YWdMYW5nXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hZGFwdGVyTGlzdFtpbmRleF0gPT0gbnVsbCkgeyB0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XSA9IHsgeDogbnVsbCwgeTogbnVsbCwgd2lkdGg6IG51bGwsIGhlaWdodDogbnVsbCB9IH1cbiAgICAgICAgICAgICAgICB0aGlzLmFkYXB0ZXJMaXN0W2luZGV4XS55ID0geVxuICAgICAgICAgICAgICAgIHRoaXMuYWRhcHRlckxpc3RbaW5kZXhdLmhlaWdodCA9IG5vZGUuaGVpZ2h0XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUpIHsgbm9kZS55ID0geSB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zY3JvbGxEaXIpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uVkVSVElDQUw6XG4gICAgICAgICAgICAgICAgICAgIHkgPSAtaW5kZXggKiB0aGlzLml0ZW1EaXN0YW5jZVkgLSB0aGlzLnJlYWxJdGVtSGVpZ2h0IC8gMiAtIHRoaXMucGFkaW5nWVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50YWdJbmRleCA+PSAtMSAmJiBpbmRleCA+IHRoaXMudGFnSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgLT0gdGhpcy50YWdMYW5nXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uSE9SSVpPTlRBTDpcbiAgICAgICAgICAgICAgICAgICAgeSA9IC10aGlzLnNjcm9sbFZpZXcuY29udGVudC5oZWlnaHQgLyAyICsgdGhpcy5wYWRpbmdZLy8tdGhpcy5yZWFsSXRlbUhlaWdodCAvIDIgLSB0aGlzLnBhZGluZ1lcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uR1JJRDpcbiAgICAgICAgICAgICAgICAgICAgeSA9IC1NYXRoLmZsb29yKChpbmRleCkgLyB0aGlzLmhhbmdDb3VudCkgKiB0aGlzLml0ZW1EaXN0YW5jZVkgLSB0aGlzLnJlYWxJdGVtSGVpZ2h0IC8gMiAtIHRoaXMucGFkaW5nWVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50YWdJbmRleCA+PSAtMSAmJiAoTWF0aC5mbG9vcihpbmRleCAvIHRoaXMuaGFuZ0NvdW50KSkgPiB0aGlzLnRhZ0luZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB5IC09IHRoaXMudGFnTGFuZ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgIG5vZGUueSA9IHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB5XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEl0ZW1EYXRhKGl0ZW1Ob2RlOiBjYy5Ob2RlLCBkYXRhOiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGl0ZW1Ob2RlLmdldENvbXBvbmVudCh0aGlzLml0ZW1TY3JpcHQpLnNldERhdGEoZGF0YSwgaW5kZXgsIHRoaXMuZXh0cmFQYXJhbXMpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwi6ISa5pys5Lit57y65bCRc2V0RGF0YeaWueazle+8jOaIluiAheaWueazleaKpemUmVwiLCBlcnJvcilcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJlZnJlc2hJdGVtc+iwg+eUqO+8jOWcqOWIt+aWsOaXtuWPr+iDvemcgOimgemHjee9rml0ZW3nmoRpbmRleOagh+etvlxuICAgIHByaXZhdGUgcmVzZXRJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuaXRlbURhdGFMaXN0W2luZGV4XSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5kZXhcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZXNldEluZGV4KGluZGV4IC0gdGhpcy5pbnN0YW50aWF0ZUNvdW50KVxuICAgIH1cblxuICAgIC8vIOWIt+aWsOWNleeLrOeahGl0ZW1cbiAgICByZWZyZXNoSXRlbShpbmRleDogbnVtYmVyLCBkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLml0ZW1EYXRhTGlzdFtpbmRleF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pdGVtRGF0YUxpc3RbaW5kZXhdID0gZGF0YVxuICAgICAgICBpZiAodGhpcy5nZXRJdGVtKGluZGV4KSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEl0ZW1EYXRhKHRoaXMuZ2V0SXRlbShpbmRleCksIHRoaXMuaXRlbURhdGFMaXN0W2luZGV4XSwgaW5kZXgpXG4gICAgfVxuICAgIC8vIHJlZnJlc2hJdGVtKGluZGV4OiBudW1iZXIpIHtcbiAgICAvLyAgICAgdGhpcy5zZXRJdGVtRGF0YSh0aGlzLmdldEl0ZW0oaW5kZXgpLCB0aGlzLml0ZW1EYXRhTGlzdFtpbmRleF0sIGluZGV4KVxuICAgIC8vIH1cbiAgICByZWZyZXNoSXRlbXMoaXRlbURhdGFMaXN0OiBhbnlbXSwgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgdGhpcy5pdGVtRGF0YUxpc3QgPSBpdGVtRGF0YUxpc3RcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5leHRyYVBhcmFtcyA9IGFyZ3NcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vdXRJbm5lciA9PSBTY3JvbGxPdXRJbm5lci5PVVQpIHtcbiAgICAgICAgICAgIHRoaXMuZXh0cmFQYXJhbXMucHVzaCh0aGlzLnNjcm9sbFZpZXcpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maXhJdGVtTm9kZXMoKVxuICAgICAgICAvLyDmnIDnu4jmnoTpgKDlrozmlbTnmoQgaXRlbUxpc3Qg5YiX6KGoLOWIt+aWsOaVsOaNrlxuICAgICAgICB0aGlzLml0ZW1MaXN0LmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBuZXdJbmRleCA9IHRoaXMucmVzZXRJbmRleChlbGVtZW50LmluZGV4KVxuICAgICAgICAgICAgICAgIGVsZW1lbnQuaW5kZXggPSBuZXdJbmRleFxuICAgICAgICAgICAgICAgIHRoaXMuc2V0SXRlbURhdGEoZWxlbWVudC5ub2RlLCB0aGlzLml0ZW1EYXRhTGlzdFtlbGVtZW50LmluZGV4XSwgZWxlbWVudC5pbmRleClcbiAgICAgICAgICAgICAgICB0aGlzLnNldFBvc1goZWxlbWVudC5pbmRleCwgZWxlbWVudC5ub2RlKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UG9zWShlbGVtZW50LmluZGV4LCBlbGVtZW50Lm5vZGUpXG4gICAgICAgICAgICAgICAgLy8gZWxlbWVudC5ub2RlLmdldENvbXBvbmVudCh0aGlzLml0ZW1TY3JpcHQpLnNldERhdGEodGhpcy5pdGVtRGF0YUxpc3RbZWxlbWVudC5pbmRleF0sIGVsZW1lbnQuaW5kZXgsIHRoaXMuZXh0cmFQYXJhbXMpXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIuiEmuacrOS4ree8uuWwkXJlZnJlc2hJdGVt5pa55rOV77yM5oiW6ICF5pa55rOV5oql6ZSZXCIsIGVycm9yKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8vIOaVsOaNruaWsOWinuaIluWHj+WwkeaXtizlop7liqDmiJblh4/lsJFpdGVtXG4gICAgZml4SXRlbU5vZGVzKCkge1xuICAgICAgICAvLyDliKTmlq3mmK/lkKbpnIDopoHliKDpmaQgaXRlbUxpc3Qg6YeM55qE5pWw5o2uXG4gICAgICAgIGlmICh0aGlzLml0ZW1EYXRhTGlzdC5sZW5ndGggPCB0aGlzLmluc3RhbnRpYXRlQ291bnQgJiYgdGhpcy5pdGVtTGlzdC5sZW5ndGggPiB0aGlzLml0ZW1EYXRhTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBuZWVkRGVsZXRlQ291bnQgPSB0aGlzLml0ZW1MaXN0Lmxlbmd0aCAtIHRoaXMuaXRlbURhdGFMaXN0Lmxlbmd0aFxuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSB0aGlzLml0ZW1EYXRhTGlzdC5sZW5ndGg7IGluZGV4IDwgdGhpcy5pdGVtRGF0YUxpc3QubGVuZ3RoICsgbmVlZERlbGV0ZUNvdW50OyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtTGlzdFtpbmRleF0ubm9kZS5kZXN0cm95KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaXRlbUxpc3Quc3BsaWNlKHRoaXMuaXRlbURhdGFMaXN0Lmxlbmd0aCwgbmVlZERlbGV0ZUNvdW50KVxuICAgICAgICAgICAgLy8g5Yik5pat5piv5ZCm6ZyA6KaB5aKe5YqgIGl0ZW1MaXN0IOmHjOeahOaVsOaNrlxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXRlbUxpc3QubGVuZ3RoIDwgdGhpcy5pbnN0YW50aWF0ZUNvdW50ICYmIHRoaXMuaXRlbUxpc3QubGVuZ3RoIDwgdGhpcy5pdGVtRGF0YUxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgYWRkQ291bnQgPSBNYXRoLm1pbih0aGlzLmluc3RhbnRpYXRlQ291bnQgLSB0aGlzLml0ZW1MaXN0Lmxlbmd0aCwgdGhpcy5pdGVtRGF0YUxpc3QubGVuZ3RoIC0gdGhpcy5pdGVtTGlzdC5sZW5ndGgpXG4gICAgICAgICAgICBsZXQgc3RhcnRJbmRleCA9IDBcbiAgICAgICAgICAgIHRoaXMuaXRlbUxpc3QuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gTWF0aC5tYXgoZWxlbWVudC5pbmRleCArIDEsIHN0YXJ0SW5kZXgpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZvciAobGV0IGFkZEluZGV4ID0gc3RhcnRJbmRleDsgYWRkSW5kZXggPCAoc3RhcnRJbmRleCArIGFkZENvdW50KTsgYWRkSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkSXRlbU5vZGUoYWRkSW5kZXgsIHRoaXMuaXRlbURhdGFMaXN0W2FkZEluZGV4XSwgdHJ1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNldFNjcm9sbENvbnRlbnRTaXplKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IHJlYWxJdGVtV2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbVdpZHRoICogdGhpcy5pdGVtU2NhbGVcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCByZWFsSXRlbUhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtSGVpZ2h0ICogdGhpcy5pdGVtU2NhbGVcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRJdGVtTm9kZSgpOiBjYy5Ob2RlIHtcbiAgICAgICAgaWYgKHRoaXMudXNlTm9kZVBvb2wpIHtcbiAgICAgICAgICAgIC8vIEBUT0RPIFBvb2xNYW5hZ2VyXG4gICAgICAgICAgICByZXR1cm4gY2MuaW5zdGFudGlhdGUodGhpcy5pdGVtUHJlZmFiKVxuICAgICAgICAgICAgLy8gaWYgKHRoaXMucG9vbFR5cGUgPT0gUG9vbEVudW0uSVRFTV9CQUcpIHtcbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gUG9vbE1hbmFnZXIuZ2V0SXRlbUJhZyh0aGlzLml0ZW1QcmVmYWIpXG4gICAgICAgICAgICAvLyB9IGVsc2UgaWYgKHRoaXMucG9vbFR5cGUgPT0gUG9vbEVudW0uSVRFTV9CQVNFKSB7XG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuIFBvb2xNYW5hZ2VyLmdldEl0ZW1CYXNlKHRoaXMuaXRlbVByZWZhYilcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjYy5pbnN0YW50aWF0ZSh0aGlzLml0ZW1QcmVmYWIpXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYmFjayBcbiAgICBwcml2YXRlIG9uU2Nyb2xsQmVnYW4oKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsSW5kZXggPSAwXG4gICAgfVxuICAgIHByaXZhdGUgc2hvd1VJKCkge1xuICAgICAgICBpZiAodGhpcy5pdGVtUHJlZmFiID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJpdGVt6aKE5Yi25L2T5Yqg6L295aSx6LSlXCIpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zY3JvbGxWaWV3ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCLmsqHmnInnu5HlrppzY3JvbGxcIilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRDcmVhdGVJdGVtcyh0cnVlKVxuICAgICAgICB0aGlzLnNjcm9sbEluZGV4ID0gLTFcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQuc2V0QW5jaG9yUG9pbnQoMCwgMSlcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQuc2V0UG9zaXRpb24oLXRoaXMuc2Nyb2xsVmlldy5ub2RlLndpZHRoIC8gMiwgdGhpcy5zY3JvbGxWaWV3Lm5vZGUuaGVpZ2h0IC8gMilcblxuICAgICAgICB0aGlzLnNldFNjcm9sbENvbnRlbnRTaXplKClcbiAgICAgICAgc3dpdGNoICh0aGlzLnNjcm9sbERpcikge1xuICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLlZFUlRJQ0FMOlxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5zY3JvbGxUb1RvcCgpXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5IT1JJWk9OVEFMOlxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5zY3JvbGxUb0xlZnQoKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uR1JJRDpcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFZpZXcuc2Nyb2xsVG9Ub3AoKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldENyZWF0ZUl0ZW1zKGJvb2w6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKGJvb2wpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5lbmFibGVkID0gZmFsc2VcbiAgICAgICAgICAgIHRoaXMuY2FuQ3JlYXRlSXRlbSA9IHRydWVcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlSW5kZXggPSAwXG4gICAgICAgICAgICB0aGlzLmJhc2VJbmRleCA9IDBcbiAgICAgICAgICAgIHRoaXMubGlmZSA9IDBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5lbmFibGVkID0gdHJ1ZVxuICAgICAgICAgICAgdGhpcy5jYW5DcmVhdGVJdGVtID0gZmFsc2VcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlSW5kZXggPSAwXG4gICAgICAgICAgICB0aGlzLmJhc2VJbmRleCA9IDBcbiAgICAgICAgICAgIHRoaXMubGlmZSA9IDBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZShkdDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbEluZGV4ID49IDApIHsgdGhpcy5zY3JvbGxJbmRleCArPSBkdCB9XG4gICAgICAgIGlmICghdGhpcy5jYW5DcmVhdGVJdGVtKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5jbnVtYmVyOyBpbmRleCsrKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZvckNyZWF0ZUl0ZW0oZHQpXG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSB1cGRhdGVGb3JDcmVhdGVJdGVtKGR0OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbkNyZWF0ZUl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxpZmUgPT0gMCkge1xuICAgICAgICAgICAgLy8g55SfXG4gICAgICAgICAgICBsZXQgX2l0ZW1EYXRhID0gdGhpcy5pdGVtRGF0YUxpc3RbdGhpcy5iYXNlSW5kZXhdXG4gICAgICAgICAgICBpZiAodGhpcy5jcmVhdGVJbmRleCA+PSB0aGlzLmluc3RhbnRpYXRlQ291bnQgfHwgX2l0ZW1EYXRhID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldENyZWF0ZUl0ZW1zKGZhbHNlKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hZGRJdGVtTm9kZSh0aGlzLmJhc2VJbmRleCwgX2l0ZW1EYXRhKVxuICAgICAgICAgICAgdGhpcy5jcmVhdGVJbmRleCArPSAxXG4gICAgICAgICAgICB0aGlzLmJhc2VJbmRleCArPSAxXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5saWZlICs9IGR0XG4gICAgICAgIGlmICh0aGlzLmxpZmUgPj0gdGhpcy5jdGltZSkge1xuICAgICAgICAgICAgdGhpcy5saWZlID0gMFxuICAgICAgICB9XG4gICAgfVxuICAgIHNldFNjcm9sbENvbnRlbnRTaXplKCkge1xuICAgICAgICBpZiAodGhpcy5hZGFwdGVySXRlbSkge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNjcm9sbERpcikge1xuICAgICAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5WRVJUSUNBTDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQuc2V0Q29udGVudFNpemUodGhpcy5zY3JvbGxWaWV3Lm5vZGUud2lkdGgsIHRoaXMuYWRhcHRlckNvbnRlbnRMZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLkhPUklaT05UQUw6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5jb250ZW50LnNldENvbnRlbnRTaXplKHRoaXMuYWRhcHRlckNvbnRlbnRMZW5ndGgsIHRoaXMuc2Nyb2xsVmlldy5ub2RlLmhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uR1JJRDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQuc2V0Q29udGVudFNpemUodGhpcy5zY3JvbGxWaWV3Lm5vZGUud2lkdGgsIHRoaXMuaXRlbURpc3RhbmNlWSAqIE1hdGguY2VpbCh0aGlzLml0ZW1EYXRhTGlzdC5sZW5ndGggLyB0aGlzLmhhbmdDb3VudCkgKyB0aGlzLnBhZGluZ1kgKyB0aGlzLnRhZ0xhbmcgKyB0aGlzLnBhZGluZ1kyKVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNjcm9sbERpcikge1xuICAgICAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5WRVJUSUNBTDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQuc2V0Q29udGVudFNpemUodGhpcy5zY3JvbGxWaWV3Lm5vZGUud2lkdGgsIHRoaXMuaXRlbURpc3RhbmNlWSAqIHRoaXMuaXRlbURhdGFMaXN0Lmxlbmd0aCArIHRoaXMucGFkaW5nWSArIHRoaXMudGFnTGFuZyArIHRoaXMucGFkaW5nWTIgLSB0aGlzLnNwYWNpbmdZKVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5IT1JJWk9OVEFMOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFZpZXcuY29udGVudC5zZXRDb250ZW50U2l6ZSh0aGlzLml0ZW1EaXN0YW5jZVggKiB0aGlzLml0ZW1EYXRhTGlzdC5sZW5ndGggKyB0aGlzLnBhZGluZ1ggKyB0aGlzLnRhZ0xhbmcgLSB0aGlzLnNwYWNpbmdYLCB0aGlzLnNjcm9sbFZpZXcubm9kZS5oZWlnaHQpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLkdSSUQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5jb250ZW50LnNldENvbnRlbnRTaXplKHRoaXMuc2Nyb2xsVmlldy5ub2RlLndpZHRoLCB0aGlzLml0ZW1EaXN0YW5jZVkgKiBNYXRoLmNlaWwodGhpcy5pdGVtRGF0YUxpc3QubGVuZ3RoIC8gdGhpcy5oYW5nQ291bnQpICsgdGhpcy5wYWRpbmdZICsgdGhpcy50YWdMYW5nICsgdGhpcy5wYWRpbmdZMiAtIHRoaXMuc3BhY2luZ1kpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY3JvbGxNYXhPZmZzZXRYID0gLXRoaXMuc2Nyb2xsVmlldy5nZXRNYXhTY3JvbGxPZmZzZXQoKS54XG4gICAgICAgIHRoaXMuc2Nyb2xsTWF4T2Zmc2V0WSA9IHRoaXMuc2Nyb2xsVmlldy5nZXRNYXhTY3JvbGxPZmZzZXQoKS55XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCItLS3ph43mlrDorr7nva7kuobmu5rliqjljLrln59cIiwgdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQuaGVpZ2h0KVxuICAgIH1cbiAgICAvKipcbiAgICAgKiDlvLnlh7ror6bmg4XmoIfnrb7vvIzlsIbkvJrph43orr7lkI7nu61pdGVt55qE5Z2Q5qCH44CCXG4gICAgICogQHBhcmFtIGluZGV4IGl0ZW3moIfnrb5cbiAgICAgKiBAcGFyYW0gbGFuZyDlnZDmoIflgY/np7vph49cbiAgICAgKi9cbiAgICBzZXRUYWcoaW5kZXg6IG51bWJlciwgbGFuZzogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMudGFnTGFuZyA9IGxhbmdcbiAgICAgICAgc3dpdGNoICh0aGlzLnNjcm9sbERpcikge1xuICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLlZFUlRJQ0FMOlxuICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLkhPUklaT05UQUw6XG4gICAgICAgICAgICAgICAgdGhpcy50YWdJbmRleCA9IGluZGV4XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5HUklEOlxuICAgICAgICAgICAgICAgIHRoaXMudGFnSW5kZXggPSBNYXRoLmZsb29yKGluZGV4IC8gdGhpcy5oYW5nQ291bnQpXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFNjcm9sbENvbnRlbnRTaXplKClcbiAgICAgICAgdGhpcy5pdGVtTGlzdC5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFBvc1goZWxlbWVudC5pbmRleCwgZWxlbWVudC5ub2RlKVxuICAgICAgICAgICAgdGhpcy5zZXRQb3NZKGVsZW1lbnQuaW5kZXgsIGVsZW1lbnQubm9kZSlcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKua4hemZpOivpuaDheagh+etvu+8jOaBouWkjWl0ZW3pu5jorqTlnZDmoIcgKi9cbiAgICBjbGVhclRhZygpIHtcbiAgICAgICAgdGhpcy5zZXRUYWcoLTk5OSwgMClcbiAgICAgICAgLy8g5L+u5q2jaW5kZXjlkozlnZDmoIdcbiAgICAgICAgbGV0IHNjcm9sbEhlaWdodCA9IHRoaXMuc2Nyb2xsVmlldy5ub2RlLmhlaWdodFxuICAgICAgICB0aGlzLml0ZW1MaXN0LmZvckVhY2goZWxlID0+IHtcbiAgICAgICAgICAgIC8vIOWIpOaWreaYr+WQpui2heWHuui+ueeVjFxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0UG9zaXRpb25JblZpZXcoZWxlLm5vZGUpLnkgPiBzY3JvbGxIZWlnaHQgKiAoMSAtIHRoaXMubm9kZS5hbmNob3JZKSArIHRoaXMuaXRlbURpc3RhbmNlWSAvIDIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlLmluZGV4ICsgdGhpcy5pbnN0YW50aWF0ZUNvdW50IDwgdGhpcy5pdGVtRGF0YUxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZS5pbmRleCArPSB0aGlzLmluc3RhbnRpYXRlQ291bnRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQb3NZKGVsZS5pbmRleCwgZWxlLm5vZGUpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJdGVtRGF0YShlbGUubm9kZSwgdGhpcy5pdGVtRGF0YUxpc3RbZWxlLmluZGV4XSwgZWxlLmluZGV4KVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldFBvc2l0aW9uSW5WaWV3KGVsZS5ub2RlKS55IDwgLShzY3JvbGxIZWlnaHQgKiB0aGlzLm5vZGUuYW5jaG9yWSArIHRoaXMuaXRlbURpc3RhbmNlWSAvIDIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZS5pbmRleCAtIHRoaXMuaW5zdGFudGlhdGVDb3VudCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZS5pbmRleCAtPSB0aGlzLmluc3RhbnRpYXRlQ291bnRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQb3NZKGVsZS5pbmRleCwgZWxlLm5vZGUpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJdGVtRGF0YShlbGUubm9kZSwgdGhpcy5pdGVtRGF0YUxpc3RbZWxlLmluZGV4XSwgZWxlLmluZGV4KVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnNldFNjcm9sbENvbnRlbnRTaXplKClcbiAgICB9XG4gICAgLyoq5Yig6Zmk5p+Q5Liq5YWD57SgICovXG4gICAgZGVsKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuaXRlbURhdGFMaXN0Lmxlbmd0aCA8IGluZGV4KSB7IHJldHVybiB9XG4gICAgICAgIHRoaXMuaXRlbURhdGFMaXN0LnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgLy8gLy8g5Yik5pat5LiL5piv5ZCm6ZyA6KaB5Yig6Zmk6IqC54K5XG4gICAgICAgIGlmICh0aGlzLml0ZW1MaXN0Lmxlbmd0aCA+IHRoaXMuaXRlbURhdGFMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5pdGVtTGlzdC5wb3AoKS5ub2RlLmRlc3Ryb3koKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U2Nyb2xsQ29udGVudFNpemUoKVxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5pdGVtTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5pdGVtTGlzdFtpbmRleF1cbiAgICAgICAgICAgIGlmICh0aGlzLml0ZW1EYXRhTGlzdFtlbGVtZW50LmluZGV4XSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5pbmRleCAtPSB0aGlzLmluc3RhbnRpYXRlQ291bnRcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXRlbUxpc3QuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRQb3NYKGVsZW1lbnQuaW5kZXgsIGVsZW1lbnQubm9kZSlcbiAgICAgICAgICAgIHRoaXMuc2V0UG9zWShlbGVtZW50LmluZGV4LCBlbGVtZW50Lm5vZGUpXG4gICAgICAgICAgICB0aGlzLnNldEl0ZW1EYXRhKGVsZW1lbnQubm9kZSwgdGhpcy5pdGVtRGF0YUxpc3RbZWxlbWVudC5pbmRleF0sIGVsZW1lbnQuaW5kZXgpXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKirlnKjmnKvlsL7mt7vliqDkuIDkuKrlhYPntKAgKi9cbiAgICBhZGQoZGF0YTogYW55KSB7XG4gICAgICAgIHRoaXMuaXRlbURhdGFMaXN0LnB1c2goZGF0YSlcbiAgICAgICAgLy8g5Yik5pat5piv5ZCm6ZyA6KaB5aKe5YqgaXRlbVxuICAgICAgICBpZiAodGhpcy5pdGVtTGlzdC5sZW5ndGggPj0gdGhpcy5pbnN0YW50aWF0ZUNvdW50KSB7XG4gICAgICAgICAgICAvLyDkuI3pnIDopoFcbiAgICAgICAgICAgIC8vIOWIpOaWreS4i+aYr+WQpumcgOimgeaKiuacgOWJjemdoueahOaUvuWIsOacgOWQjumdojoxXG4gICAgICAgICAgICBsZXQgbmVlZFVwZGF0ZSA9IGZhbHNlXG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5pdGVtTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pdGVtTGlzdFtpbmRleF0uaW5kZXggPT0gdGhpcy5pdGVtRGF0YUxpc3QubGVuZ3RoIC0gMikge1xuICAgICAgICAgICAgICAgICAgICBuZWVkVXBkYXRlID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZWVkVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1pbkluZGV4ID0gMTAwMCAvL+i/meS4quaYr+acgOWwj+WAvFxuICAgICAgICAgICAgICAgIGxldCBtaW5VcGRhdGVJbmRleCA9IDAvLyDov5nkuKrmmK/mnIDlsI/lgLznmoTmoIfnrb5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaXRlbUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlbUxpc3RbaV0uaW5kZXggPCBtaW5JbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWluSW5kZXggPSB0aGlzLml0ZW1MaXN0W2ldLmluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5VcGRhdGVJbmRleCA9IGlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyDliKTmlq3kuIvmmK/lkKbpnIDopoHmiormnIDliY3pnaLnmoTmlL7liLDmnIDlkI7pnaI6MlxuICAgICAgICAgICAgICAgIGxldCBfbm9kZVBvcyA9IDBcbiAgICAgICAgICAgICAgICBsZXQgX29mZnNldCA9IDBcbiAgICAgICAgICAgICAgICBsZXQgbmVlZFVwZGF0ZTIgPSBmYWxzZVxuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zY3JvbGxEaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLkhPUklaT05UQUw6XG4gICAgICAgICAgICAgICAgICAgICAgICBfbm9kZVBvcyA9IHRoaXMuaXRlbUxpc3RbbWluVXBkYXRlSW5kZXhdLm5vZGUueFxuICAgICAgICAgICAgICAgICAgICAgICAgX29mZnNldCA9IHRoaXMuc2Nyb2xsVmlldy5nZXRTY3JvbGxPZmZzZXQoKS54XG4gICAgICAgICAgICAgICAgICAgICAgICBuZWVkVXBkYXRlMiA9IF9ub2RlUG9zICsgX29mZnNldCA+IHRoaXMuaXRlbVdpZHRoIC8gMlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBTY3JvbGxEaXJFbnVtLlZFUlRJQ0FMOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uR1JJRDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9ub2RlUG9zID0gdGhpcy5pdGVtTGlzdFttaW5VcGRhdGVJbmRleF0ubm9kZS55XG4gICAgICAgICAgICAgICAgICAgICAgICBfb2Zmc2V0ID0gdGhpcy5zY3JvbGxWaWV3LmdldFNjcm9sbE9mZnNldCgpLnlcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRVcGRhdGUyID0gX25vZGVQb3MgKyBfb2Zmc2V0ID4gdGhpcy5pdGVtSGVpZ2h0IC8gMlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRVcGRhdGUyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbUxpc3RbbWluVXBkYXRlSW5kZXhdLmluZGV4ICs9IHRoaXMuaW5zdGFudGlhdGVDb3VudFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEl0ZW1EYXRhKHRoaXMuaXRlbUxpc3RbbWluVXBkYXRlSW5kZXhdLm5vZGUsIGRhdGEsIHRoaXMuaXRlbUxpc3RbbWluVXBkYXRlSW5kZXhdLmluZGV4KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFBvc1godGhpcy5pdGVtTGlzdFttaW5VcGRhdGVJbmRleF0uaW5kZXgsIHRoaXMuaXRlbUxpc3RbbWluVXBkYXRlSW5kZXhdLm5vZGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UG9zWSh0aGlzLml0ZW1MaXN0W21pblVwZGF0ZUluZGV4XS5pbmRleCwgdGhpcy5pdGVtTGlzdFttaW5VcGRhdGVJbmRleF0ubm9kZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDpnIDopoFcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuaXRlbURhdGFMaXN0Lmxlbmd0aCAtIDFcbiAgICAgICAgICAgIHRoaXMuYWRkSXRlbU5vZGUoaW5kZXgsIGRhdGEpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRTY3JvbGxDb250ZW50U2l6ZSgpXG4gICAgfVxuXG4gICAgYWRkSXRlbU5vZGUoaW5kZXg6IG51bWJlciwgZGF0YTogYW55LCBpc1JlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBsZXQgX25vZGUgPSB0aGlzLmluaXRJdGVtTm9kZSgpXG4gICAgICAgIC8vIGFkZOaUvuWcqOWJjemdoi7lhYjmv4DmtLtvbkxvYWTmlrnms5Us5YaN6LWwc2V0RGF0YVxuICAgICAgICB0aGlzLnNjcm9sbFZpZXcuY29udGVudC5hZGRDaGlsZChfbm9kZSlcbiAgICAgICAgdGhpcy5zZXRJdGVtRGF0YShfbm9kZSwgZGF0YSwgaW5kZXgpXG4gICAgICAgIHRoaXMuaXRlbUxpc3QucHVzaCh7IGluZGV4OiBpbmRleCwgbm9kZTogX25vZGUgfSlcbiAgICAgICAgdGhpcy5zZXRQb3NYKGluZGV4LCBfbm9kZSlcbiAgICAgICAgdGhpcy5zZXRQb3NZKGluZGV4LCBfbm9kZSlcblxuICAgICAgICBpZiAoaXNSZWZyZXNoIHx8IHRoaXMuc2hvd0FuaW0gPT0gMCkge1xuICAgICAgICAgICAgX25vZGUuc2NhbGUgPSB0aGlzLml0ZW1TY2FsZVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hvd0FuaW0gPT0gMSkge1xuICAgICAgICAgICAgX25vZGUuc2NhbGUgPSAwXG4gICAgICAgICAgICBjYy50d2Vlbihfbm9kZSkuXG4gICAgICAgICAgICAgICAgdG8odGhpcy5hbmltU3BlZWQsIHsgc2NhbGU6IHRoaXMuaXRlbVNjYWxlICsgMC4xIH0pLlxuICAgICAgICAgICAgICAgIHRvKHRoaXMuYW5pbVNwZWVkLCB7IHNjYWxlOiB0aGlzLml0ZW1TY2FsZSB9KS5cbiAgICAgICAgICAgICAgICBzdGFydCgpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaG93QW5pbSA9PSAyKSB7XG4gICAgICAgICAgICBfbm9kZS5zY2FsZSA9IHRoaXMuaXRlbVNjYWxlXG4gICAgICAgICAgICBsZXQgZGVsYXlUaW1lID0gaW5kZXggJSB0aGlzLmhhbmdDb3VudCAvIDIwICsgMC4xXG4gICAgICAgICAgICBfbm9kZS54IC09IF9ub2RlLndpZHRoIC8gMlxuICAgICAgICAgICAgX25vZGUuc2NhbGVYID0gMFxuICAgICAgICAgICAgY2MudHdlZW4oX25vZGUpLmRlbGF5KGRlbGF5VGltZSkudG8odGhpcy5hbmltU3BlZWQsIHsgeDogX25vZGUueCArIF9ub2RlLndpZHRoIC8gMiwgc2NhbGVYOiB0aGlzLml0ZW1TY2FsZSB9KS5zdGFydCgpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaG93QW5pbSA9PSAzKSB7XG4gICAgICAgICAgICAvL0BUT0RPXG4gICAgICAgICAgICBfbm9kZS5zY2FsZSA9IHRoaXMuaXRlbVNjYWxlXG4gICAgICAgICAgICBsZXQgZGVsYXlUaW1lID0gaW5kZXggJSB0aGlzLmhhbmdDb3VudCAvIDIwICsgMC4xXG4gICAgICAgICAgICBfbm9kZS55ICs9IF9ub2RlLmhlaWdodCAvIDJcbiAgICAgICAgICAgIF9ub2RlLnNjYWxlWSA9IDBcbiAgICAgICAgICAgIGNjLnR3ZWVuKF9ub2RlKS5kZWxheShkZWxheVRpbWUpLnRvKHRoaXMuYW5pbVNwZWVkLCB7IHk6IF9ub2RlLnkgLSBfbm9kZS5oZWlnaHQgLyAyLCBzY2FsZVk6IHRoaXMuaXRlbVNjYWxlIH0pLnN0YXJ0KClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNob3dBbmltID09IDQpIHtcbiAgICAgICAgICAgIF9ub2RlLnNjYWxlID0gMFxuICAgICAgICAgICAgY2MudHdlZW4oX25vZGUpLlxuICAgICAgICAgICAgICAgIHRvKHRoaXMuYW5pbVNwZWVkLCB7IHNjYWxlOiB0aGlzLml0ZW1TY2FsZSB9KS5cbiAgICAgICAgICAgICAgICBzdGFydCgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfbm9kZS5zY2FsZSA9IHRoaXMuaXRlbVNjYWxlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdmFsIOeri+WIu+a7muWKqOWIsOebruagh+agh+etviznm67moIfmoIfnrb7lsIblnKjpobbpg6h85bem5L6n5Ye6546wXG4gICAgICogQHBhcmFtIHR5cGUgIOa7muWIsOWTqumHjOeahOexu+WeiygxLuWxheS4rSAyLumhtumDqHzlt6bkvqcgMy7lupXpg6jvvZzlj7PkvqcpXG4gICAgICovXG4gICAgc2Nyb2xsVG9JbmRleE5vdyh2YWw6IG51bWJlciwgdHlwZTogbnVtYmVyID0gMSwgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgaWYgKHRoaXMuYWRhcHRlckl0ZW0gJiYgdGhpcy5hZGFwdGVyTGlzdFt2YWxdID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIuacquWxleekuui/hyzml6Dms5Xnp7vliqhcIilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWwgPj0gdGhpcy5pdGVtRGF0YUxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YWwgPSB0aGlzLml0ZW1EYXRhTGlzdC5sZW5ndGggLSAxXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbCA8IDApIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaEl0ZW1zKHRoaXMuaXRlbURhdGFMaXN0KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3LnN0b3BBdXRvU2Nyb2xsKClcbiAgICAgICAgdGhpcy5iYXNlSW5kZXggPSB2YWxcblxuICAgICAgICBsZXQgc2Nyb2xsUG9zSW5kZXggPSB0aGlzLmJhc2VJbmRleFxuICAgICAgICBpZiAodGhpcy5pdGVtRGF0YUxpc3QubGVuZ3RoIC0gdGhpcy5iYXNlSW5kZXggPCB0aGlzLmluc3RhbnRpYXRlQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMuYmFzZUluZGV4IC09IHRoaXMuaW5zdGFudGlhdGVDb3VudCAtICh0aGlzLml0ZW1EYXRhTGlzdC5sZW5ndGggLSB0aGlzLmJhc2VJbmRleClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0eXBlID09IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJhc2VJbmRleCAtPSBNYXRoLmNlaWwodGhpcy5pbnN0YW50aWF0ZUNvdW50IC8gMilcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlSW5kZXggLT0gKHRoaXMubGllQ291bnQgLSAxKSAqIHRoaXMuaGFuZ0NvdW50XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsRGlyID09IFNjcm9sbERpckVudW0uR1JJRCkge1xuICAgICAgICAgICAgdGhpcy5iYXNlSW5kZXggLT0gdGhpcy5iYXNlSW5kZXggJSB0aGlzLmhhbmdDb3VudFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmFzZUluZGV4ID0gTWF0aC5tYXgodGhpcy5iYXNlSW5kZXgsIDApXG5cbiAgICAgICAgbGV0IF9pdGVtV2lkdGggPSB0aGlzLmFkYXB0ZXJJdGVtID8gdGhpcy5hZGFwdGVyTGlzdFt2YWxdLndpZHRoIDogdGhpcy5pdGVtV2lkdGhcbiAgICAgICAgbGV0IF9pdGVtSGVpZ2h0ID0gdGhpcy5hZGFwdGVySXRlbSA/IHRoaXMuYWRhcHRlckxpc3RbdmFsXS5oZWlnaHQgOiB0aGlzLml0ZW1IZWlnaHRcbiAgICAgICAgLy8g5LuO56ys5Yeg5Liq5qCH562+5byA5aeL5pi+56S6XG4gICAgICAgIHN3aXRjaCAodGhpcy5zY3JvbGxEaXIpIHtcbiAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5IT1JJWk9OVEFMOlxuICAgICAgICAgICAgICAgIGxldCBfeCA9IC0odGhpcy5zZXRQb3NYKHNjcm9sbFBvc0luZGV4KSAtIChfaXRlbVdpZHRoICogdGhpcy5pdGVtU2NhbGUgKyB0aGlzLnNwYWNpbmdYKSAvIDIpXG4gICAgICAgICAgICAgICAgLy8g5Yik5pat5piv5ZCm6LaF6L+H6L6555WMXG4gICAgICAgICAgICAgICAgaWYgKF94IDwgdGhpcy5zY3JvbGxNYXhPZmZzZXRYKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFBvc0luZGV4ID0gdGhpcy5pdGVtRGF0YUxpc3QubGVuZ3RoIC0gdGhpcy5pbnN0YW50aWF0ZUNvdW50XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5jb250ZW50LnggPSB0aGlzLnNjcm9sbE1heE9mZnNldFhcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFZpZXcuY29udGVudC54ID0gTWF0aC5taW4oLSh0aGlzLnNldFBvc1goc2Nyb2xsUG9zSW5kZXgpIC0gdGhpcy5zY3JvbGxWaWV3Lm5vZGUud2lkdGggLyAyKSwgMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtKHRoaXMuc2V0UG9zWChzY3JvbGxQb3NJbmRleCkgLSB0aGlzLnNjcm9sbFZpZXcubm9kZS53aWR0aCAvIDIpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2VJbmRleCA9IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5jb250ZW50LnggPSAtKHRoaXMuc2V0UG9zWChzY3JvbGxQb3NJbmRleCkgLSAoX2l0ZW1XaWR0aCAqIHRoaXMuaXRlbVNjYWxlICsgdGhpcy5zcGFjaW5nWCkgLyAyKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsUG9zSW5kZXgrK1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQueCA9IE1hdGgubWluKC0odGhpcy5zZXRQb3NYKHNjcm9sbFBvc0luZGV4KSAtIHRoaXMuc2Nyb2xsVmlldy5ub2RlLndpZHRoIC0gX2l0ZW1XaWR0aCAvIDIgLSB0aGlzLnNwYWNpbmdZKSwgMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtKHRoaXMuc2V0UG9zWChzY3JvbGxQb3NJbmRleCkgLSB0aGlzLnNjcm9sbFZpZXcubm9kZS53aWR0aCAtIF9pdGVtV2lkdGggLyAyIC0gdGhpcy5zcGFjaW5nWSkgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZUluZGV4ID0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uVkVSVElDQUw6XG4gICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uR1JJRDpcbiAgICAgICAgICAgICAgICBsZXQgX3kgPSAoTWF0aC5hYnModGhpcy5zZXRQb3NZKHNjcm9sbFBvc0luZGV4KSkgLSAoX2l0ZW1IZWlnaHQgKiB0aGlzLml0ZW1TY2FsZSArIHRoaXMuc3BhY2luZ1kpIC8gMilcbiAgICAgICAgICAgICAgICBpZiAoX3kgPiB0aGlzLnNjcm9sbE1heE9mZnNldFkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsUG9zSW5kZXggPSB0aGlzLml0ZW1EYXRhTGlzdC5sZW5ndGggLSB0aGlzLmluc3RhbnRpYXRlQ291bnRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQueSA9IHRoaXMuc2Nyb2xsTWF4T2Zmc2V0WVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5jb250ZW50LnkgPSBNYXRoLm1heChNYXRoLmFicyh0aGlzLnNldFBvc1koc2Nyb2xsUG9zSW5kZXgpKSAtIHRoaXMuc2Nyb2xsVmlldy5ub2RlLmhlaWdodCAvIDIsIDApXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnModGhpcy5zZXRQb3NZKHNjcm9sbFBvc0luZGV4KSkgLSB0aGlzLnNjcm9sbFZpZXcubm9kZS5oZWlnaHQgLyAyIDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2VJbmRleCA9IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5jb250ZW50LnkgPSBNYXRoLmFicyh0aGlzLnNldFBvc1koc2Nyb2xsUG9zSW5kZXgpKSAtIChfaXRlbUhlaWdodCAqIHRoaXMuaXRlbVNjYWxlICsgdGhpcy5zcGFjaW5nWSkgLyAyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxQb3NJbmRleCA9IHRoaXMuc2Nyb2xsRGlyID09IFNjcm9sbERpckVudW0uVkVSVElDQUwgPyAoc2Nyb2xsUG9zSW5kZXggKyAxKSA6IHNjcm9sbFBvc0luZGV4ICsgdGhpcy5oYW5nQ291bnRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5jb250ZW50LnkgPSBNYXRoLm1heChNYXRoLmFicyh0aGlzLnNldFBvc1koc2Nyb2xsUG9zSW5kZXgpKSAtIHRoaXMuc2Nyb2xsVmlldy5ub2RlLmhlaWdodCAtIF9pdGVtSGVpZ2h0IC8gMiAtIHRoaXMuc3BhY2luZ1ksIDApXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnModGhpcy5zZXRQb3NZKHNjcm9sbFBvc0luZGV4KSkgLSB0aGlzLnNjcm9sbFZpZXcubm9kZS5oZWlnaHQgLSBfaXRlbUhlaWdodCAvIDIgLSB0aGlzLnNwYWNpbmdZIDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2VJbmRleCA9IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZXh0cmFQYXJhbXMgPSBhcmdzXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maXhJdGVtTm9kZXMoKVxuICAgICAgICAvLyDlpoLmnpxjb250ZW505pyJ5a2Q6aG555uuLOWImemHjeWItuebruagh+eCueS9jee9rlxuICAgICAgICBpZiAodGhpcy5pdGVtTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5pdGVtTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAvLyBsZXQgaSA9IHRoaXMuYmFzZUluZGV4ICsgaW5kZXhcbiAgICAgICAgICAgICAgICBsZXQgZWxlbW5ldCA9IHRoaXMuaXRlbUxpc3RbaW5kZXhdXG4gICAgICAgICAgICAgICAgZWxlbW5ldC5pbmRleCA9IHRoaXMuYmFzZUluZGV4ICsgaW5kZXhcbiAgICAgICAgICAgICAgICB0aGlzLnNldFBvc1goZWxlbW5ldC5pbmRleCwgZWxlbW5ldC5ub2RlKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UG9zWShlbGVtbmV0LmluZGV4LCBlbGVtbmV0Lm5vZGUpXG4gICAgICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eSh0aGlzLml0ZW1EYXRhTGlzdFtlbGVtbmV0LmluZGV4XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJdGVtRGF0YShlbGVtbmV0Lm5vZGUsIHRoaXMuaXRlbURhdGFMaXN0W2VsZW1uZXQuaW5kZXhdLCBlbGVtbmV0LmluZGV4KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5bCd6K+V5rua5Yqo5Yiw5rua5Yqo6KeG5Zu+5Lit5b+DXG4gICAgICogQHBhcmFtIGluZGV4IOagh+etvlxuICAgICAqIEBwYXJhbSB0eXBlICDmu5rliLDlk6rph4znmoTnsbvlnosoMS7lsYXkuK0gMi7pobbpg6h85bem5L6nIDMu5bqV6YOo772c5Y+z5L6nKVxuICAgICAqIEBwYXJhbSB0aW1lIFxuICAgICAqL1xuICAgIHNjcm9sbFRvSW5kZXgoaW5kZXg6IG51bWJlciwgdHlwZTogbnVtYmVyID0gMSwgdGltZTogbnVtYmVyID0gMSwgb2Zmc2V0WTogbnVtYmVyID0gMCkge1xuICAgICAgICBpZiAodGhpcy5pdGVtRGF0YUxpc3RbaW5kZXhdID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCLkuI3lrZjlnKjmraTmoIfnrb5cIilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodGhpcy5zY3JvbGxEaXIpIHtcbiAgICAgICAgICAgIGNhc2UgU2Nyb2xsRGlyRW51bS5IT1JJWk9OVEFMOlxuICAgICAgICAgICAgICAgIGlmICh0eXBlID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxWaWV3LnNjcm9sbFRvT2Zmc2V0KGNjLnYyKHRoaXMuc2V0UG9zWChpbmRleCkgLSB0aGlzLnNjcm9sbFZpZXcubm9kZS53aWR0aCAvIDIsIHRoaXMuc2Nyb2xsVmlldy5nZXRTY3JvbGxPZmZzZXQoKS55KSwgdGltZSlcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gMikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFZpZXcuc2Nyb2xsVG9PZmZzZXQoY2MudjIodGhpcy5zZXRQb3NYKGluZGV4KSAtIHRoaXMuaXRlbURpc3RhbmNlWCAvIDIsIHRoaXMuc2Nyb2xsVmlldy5nZXRTY3JvbGxPZmZzZXQoKS55KSwgdGltZSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbmRleCsrXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5zY3JvbGxUb09mZnNldChjYy52Mih0aGlzLnNldFBvc1goaW5kZXgpIC0gdGhpcy5zY3JvbGxWaWV3Lm5vZGUud2lkdGgsIHRoaXMuc2Nyb2xsVmlldy5nZXRTY3JvbGxPZmZzZXQoKS55IC0gdGhpcy5pdGVtV2lkdGggLyAyIC0gdGhpcy5zcGFjaW5nWCksIHRpbWUpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uVkVSVElDQUw6XG4gICAgICAgICAgICBjYXNlIFNjcm9sbERpckVudW0uR1JJRDpcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5zY3JvbGxUb09mZnNldChjYy52Mih0aGlzLnNjcm9sbFZpZXcuZ2V0U2Nyb2xsT2Zmc2V0KCkueCwgTWF0aC5hYnModGhpcy5zZXRQb3NZKGluZGV4KSkgLSB0aGlzLnNjcm9sbFZpZXcubm9kZS5oZWlnaHQgLyAyIC0gb2Zmc2V0WSksIHRpbWUpXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxWaWV3LnNjcm9sbFRvT2Zmc2V0KGNjLnYyKHRoaXMuc2Nyb2xsVmlldy5nZXRTY3JvbGxPZmZzZXQoKS54LCBNYXRoLmFicyh0aGlzLnNldFBvc1koaW5kZXgpKSAtIHRoaXMuaXRlbURpc3RhbmNlWSAvIDIgLSBvZmZzZXRZKSwgdGltZSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHRoaXMuc2Nyb2xsRGlyID09IFNjcm9sbERpckVudW0uVkVSVElDQUwgPyAoaW5kZXggKyAxKSA6IGluZGV4ICsgdGhpcy5oYW5nQ291bnRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxWaWV3LnNjcm9sbFRvT2Zmc2V0KGNjLnYyKHRoaXMuc2Nyb2xsVmlldy5nZXRTY3JvbGxPZmZzZXQoKS54LCBNYXRoLmFicyh0aGlzLnNldFBvc1koaW5kZXgpKSAtIHRoaXMuc2Nyb2xsVmlldy5ub2RlLmhlaWdodCAtIHRoaXMuaXRlbUhlaWdodCAvIDIgLSB0aGlzLnNwYWNpbmdZIC0gb2Zmc2V0WSksIHRpbWUpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcy5zY2hlZHVsZU9uY2UoKCkgPT4ge1xuICAgICAgICAvLyAgICAgdGhpcy5yZWZyZXNoSXRlbShpbmRleClcbiAgICAgICAgLy8gfSwgdGltZSlcbiAgICB9XG5cbiAgICBnZXRJdGVtKGluZGV4OiBudW1iZXIpOiBjYy5Ob2RlIHwgbnVsbCB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuaXRlbUxpc3QpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLml0ZW1MaXN0W2tleV0uaW5kZXggPT0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtTGlzdFtrZXldLm5vZGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY2hlY2tTY3JvbGxTdGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsSW5kZXggPiB0aGlzLml0ZW1EYXRhTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5zdG9wQXV0b1Njcm9sbCgpXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFZpZXcuc2Nyb2xsVG9PZmZzZXQoY2MudjIoMCwgdGhpcy5zY3JvbGxNYXhPZmZzZXRZIC8gMikpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDkvb/nlKjlr7nosaHmsaDml7bvvIzlnKjliIfmjaLnlYzpnaLml7blv4Xpobvkvb/nlKjov5nkuKrmlrnms5XvvIzlsIbmiYDmnInlr7nosaHmlL7liLDmsaDkuK1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgLy8gQFRPRE8gUG9vbE1hbmFnZXJcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsVmlldyAmJiB0aGlzLnNjcm9sbFZpZXcuY29udGVudCkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQucmVtb3ZlQWxsQ2hpbGRyZW4oKVxuICAgICAgICB9XG4gICAgICAgIC8vIGlmICh0aGlzLnVzZU5vZGVQb29sKSB7XG4gICAgICAgIC8vICAgICB0aGlzLml0ZW1MaXN0LmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIC8vICAgICAgICAgaWYgKHRoaXMucG9vbFR5cGUgPT0gUG9vbEVudW0uSVRFTV9CQUcpIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgUG9vbE1hbmFnZXIucHV0SXRlbUJhZyhlbGVtZW50Lm5vZGUpXG4gICAgICAgIC8vICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBvb2xUeXBlID09IFBvb2xFbnVtLklURU1fQkFTRSkge1xuICAgICAgICAvLyAgICAgICAgICAgICBQb29sTWFuYWdlci5wdXRJdGVtQmFzZShlbGVtZW50Lm5vZGUpXG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgfSk7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBpZiAodGhpcy5zY3JvbGxWaWV3ICYmIHRoaXMuc2Nyb2xsVmlldy5jb250ZW50KSB7XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5zY3JvbGxWaWV3LmNvbnRlbnQucmVtb3ZlQWxsQ2hpbGRyZW4oKVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgICAgIHRoaXMuaXRlbURhdGFMaXN0ID0gW11cbiAgICAgICAgdGhpcy5pdGVtTGlzdCA9IFtdXG4gICAgfVxufVxuIl19