@sbb-esta/lyne-elements-experimental-dev 4.7.0-dev.1773333596 → 4.7.0-dev.1773388997

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.js +65 -76
  2. package/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +72 -52
  3. package/autocomplete-grid/autocomplete-grid-button.js +3 -6
  4. package/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.js +2 -17
  5. package/autocomplete-grid/autocomplete-grid-cell.js +4 -7
  6. package/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.component.js +20 -21
  7. package/autocomplete-grid/autocomplete-grid-optgroup.js +3 -6
  8. package/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.js +2 -33
  9. package/autocomplete-grid/autocomplete-grid-option.js +4 -9
  10. package/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.js +2 -22
  11. package/autocomplete-grid/autocomplete-grid-row.js +4 -7
  12. package/autocomplete-grid/autocomplete-grid.js +3 -6
  13. package/autocomplete-grid-cell.component-Dak9wlBr.js +24 -0
  14. package/autocomplete-grid-option.component-DNRFHOwc.js +37 -0
  15. package/autocomplete-grid-row.component-DBHZQ0GQ.js +27 -0
  16. package/autocomplete-grid.js +9 -21
  17. package/autocomplete-grid.pure.js +7 -15
  18. package/core/datetime/date-helper.js +2 -191
  19. package/core/datetime.js +2 -5
  20. package/core/timetable/access-leg-helper.js +76 -71
  21. package/core/timetable/timetable-helper.js +9 -11
  22. package/core/timetable/timetable-properties.js +0 -1
  23. package/core/timetable.js +3 -7
  24. package/date-helper-CGproP5d.js +185 -0
  25. package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.js +114 -122
  26. package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +92 -70
  27. package/development/autocomplete-grid/autocomplete-grid-button.js +6 -4
  28. package/development/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.js +2 -29
  29. package/development/autocomplete-grid/autocomplete-grid-cell.js +7 -5
  30. package/development/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.component.js +27 -22
  31. package/development/autocomplete-grid/autocomplete-grid-optgroup.js +6 -4
  32. package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.js +2 -109
  33. package/development/autocomplete-grid/autocomplete-grid-option.js +7 -7
  34. package/development/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.js +2 -91
  35. package/development/autocomplete-grid/autocomplete-grid-row.js +7 -5
  36. package/development/autocomplete-grid/autocomplete-grid.js +6 -4
  37. package/development/autocomplete-grid-cell.component-BBvM4o2H.js +42 -0
  38. package/development/autocomplete-grid-option.component-QzfM5eIE.js +123 -0
  39. package/development/autocomplete-grid-row.component-H8sCTCkT.js +104 -0
  40. package/development/autocomplete-grid.js +10 -14
  41. package/development/autocomplete-grid.pure.js +4 -13
  42. package/development/core/datetime/date-helper.js +2 -285
  43. package/development/core/datetime.js +2 -6
  44. package/development/core/timetable/access-leg-helper.js +104 -82
  45. package/development/core/timetable/timetable-helper.js +16 -17
  46. package/development/core/timetable/timetable-properties.js +0 -2
  47. package/development/core/timetable.js +3 -8
  48. package/development/date-helper-8_Y-PuHh.js +520 -0
  49. package/development/differenceInMinutes-DN_1Rk3O.js +110 -0
  50. package/development/format-Bbrn2bgo.js +1848 -0
  51. package/development/isValid-C-HzKv4v.js +178 -0
  52. package/development/journey-summary/journey-summary.component.js +2 -288
  53. package/development/journey-summary.component-uGhZvA4p.js +385 -0
  54. package/development/journey-summary.js +8 -5
  55. package/development/journey-summary.pure.js +2 -5
  56. package/development/pearl-chain/pearl-chain.component.js +2 -634
  57. package/development/pearl-chain-time/pearl-chain-time.component.js +2 -306
  58. package/development/pearl-chain-time.component-B8mayTWD.js +415 -0
  59. package/development/pearl-chain-time.js +8 -5
  60. package/development/pearl-chain-time.pure.js +2 -5
  61. package/development/pearl-chain-vertical/pearl-chain-vertical.component.js +2 -28
  62. package/development/pearl-chain-vertical-item/pearl-chain-vertical-item.component.js +2 -393
  63. package/development/pearl-chain-vertical-item.component-BDzbcIaf.js +435 -0
  64. package/development/pearl-chain-vertical-item.js +8 -5
  65. package/development/pearl-chain-vertical-item.pure.js +2 -5
  66. package/development/pearl-chain-vertical.component-CswE7b3M.js +39 -0
  67. package/development/pearl-chain-vertical.js +8 -5
  68. package/development/pearl-chain-vertical.pure.js +2 -5
  69. package/development/pearl-chain.component-wpsTvoSe.js +704 -0
  70. package/development/pearl-chain.js +8 -5
  71. package/development/pearl-chain.pure.js +2 -5
  72. package/development/seat-reservation/common/mapper/icon-mapper.js +168 -71
  73. package/development/seat-reservation/common/mapper/mapper.js +153 -122
  74. package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-bus.js +570 -559
  75. package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-decks.js +992 -972
  76. package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-giruno.js +20334 -20367
  77. package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-others.js +1731 -1738
  78. package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-train.js +9741 -9782
  79. package/development/seat-reservation/common/mapper.js +1 -8
  80. package/development/seat-reservation/common/svgs.js +2 -46
  81. package/development/seat-reservation/common/translations/i18n.js +1118 -900
  82. package/development/seat-reservation/common/translations.js +1 -4
  83. package/development/seat-reservation/common/types.js +0 -2
  84. package/development/seat-reservation/common.js +7 -11
  85. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.js +1305 -1230
  86. package/development/seat-reservation/seat-reservation/seat-reservation.component.js +2 -859
  87. package/development/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +2 -106
  88. package/development/seat-reservation/seat-reservation-area.js +7 -5
  89. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +35 -34
  90. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +2 -162
  91. package/development/seat-reservation/seat-reservation-graphic.js +7 -5
  92. package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +2 -713
  93. package/development/seat-reservation/seat-reservation-navigation-coach.js +7 -5
  94. package/development/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.js +2 -131
  95. package/development/seat-reservation/seat-reservation-navigation-services.js +7 -5
  96. package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +2 -601
  97. package/development/seat-reservation/seat-reservation-place-control.js +7 -5
  98. package/development/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js +2 -22
  99. package/development/seat-reservation/seat-reservation-scoped.js +7 -5
  100. package/development/seat-reservation/seat-reservation.js +7 -6
  101. package/development/seat-reservation-area.component-BK92ZtFo.js +138 -0
  102. package/development/seat-reservation-graphic.component-cUnsHh5x.js +193 -0
  103. package/development/seat-reservation-navigation-coach.component-D6Bglus8.js +828 -0
  104. package/development/seat-reservation-navigation-services.component-DYJ6Ddkg.js +179 -0
  105. package/development/seat-reservation-place-control.component-Bg9evKBW.js +726 -0
  106. package/development/seat-reservation-scoped.component-DRQ_I702.js +31 -0
  107. package/development/seat-reservation.component-Cq_aJKR0.js +818 -0
  108. package/development/seat-reservation.js +15 -28
  109. package/development/seat-reservation.pure.js +10 -28
  110. package/development/svgs-C3JMWR26.js +28 -0
  111. package/development/timetable-duration/timetable-duration.component.js +2 -108
  112. package/development/timetable-duration.component-DI0lET17.js +125 -0
  113. package/development/timetable-duration.js +8 -5
  114. package/development/timetable-duration.pure.js +2 -5
  115. package/development/timetable-row/timetable-row.component.js +2 -781
  116. package/development/timetable-row.component-CAED6Zwc.js +932 -0
  117. package/development/timetable-row.js +8 -13
  118. package/development/timetable-row.pure.js +2 -12
  119. package/development/toDate-Biiv3kyf.js +150 -0
  120. package/differenceInMinutes-Dr9gRqtu.js +27 -0
  121. package/format-CM5exOsN.js +1103 -0
  122. package/isValid-B9oVW3lA.js +36 -0
  123. package/journey-summary/journey-summary.component.js +2 -194
  124. package/journey-summary.component-Cq_4kaOp.js +264 -0
  125. package/journey-summary.js +5 -4
  126. package/journey-summary.pure.js +2 -4
  127. package/package.json +2 -2
  128. package/pearl-chain/pearl-chain.component.js +2 -165
  129. package/pearl-chain-time/pearl-chain-time.component.js +2 -157
  130. package/pearl-chain-time.component-DGDW5S1c.js +239 -0
  131. package/pearl-chain-time.js +5 -4
  132. package/pearl-chain-time.pure.js +2 -4
  133. package/pearl-chain-vertical/pearl-chain-vertical.component.js +2 -17
  134. package/pearl-chain-vertical-item/pearl-chain-vertical-item.component.js +2 -77
  135. package/pearl-chain-vertical-item.component-G22bWhLU.js +108 -0
  136. package/pearl-chain-vertical-item.js +5 -4
  137. package/pearl-chain-vertical-item.pure.js +2 -4
  138. package/pearl-chain-vertical.component-CXIDT5RD.js +21 -0
  139. package/pearl-chain-vertical.js +5 -4
  140. package/pearl-chain-vertical.pure.js +2 -4
  141. package/pearl-chain.component-DmjkVIva.js +194 -0
  142. package/pearl-chain.js +5 -4
  143. package/pearl-chain.pure.js +2 -4
  144. package/seat-reservation/common/mapper/icon-mapper.js +71 -71
  145. package/seat-reservation/common/mapper/mapper.js +95 -89
  146. package/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-bus.js +568 -558
  147. package/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-decks.js +989 -970
  148. package/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-giruno.js +20332 -20366
  149. package/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-others.js +1729 -1737
  150. package/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-train.js +9739 -9781
  151. package/seat-reservation/common/mapper.js +3 -9
  152. package/seat-reservation/common/svgs.js +2 -243
  153. package/seat-reservation/common/translations/i18n.js +1084 -891
  154. package/seat-reservation/common/translations.js +2 -4
  155. package/seat-reservation/common/types.js +0 -1
  156. package/seat-reservation/common.js +9 -15
  157. package/seat-reservation/seat-reservation/seat-reservation-base-element.js +832 -810
  158. package/seat-reservation/seat-reservation/seat-reservation.component.js +2 -420
  159. package/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +2 -51
  160. package/seat-reservation/seat-reservation-area.js +4 -7
  161. package/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +68 -71
  162. package/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +2 -75
  163. package/seat-reservation/seat-reservation-graphic.js +4 -7
  164. package/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +2 -234
  165. package/seat-reservation/seat-reservation-navigation-coach.js +4 -7
  166. package/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.js +2 -85
  167. package/seat-reservation/seat-reservation-navigation-services.js +4 -7
  168. package/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +2 -203
  169. package/seat-reservation/seat-reservation-place-control.js +4 -7
  170. package/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js +2 -13
  171. package/seat-reservation/seat-reservation-scoped.js +4 -7
  172. package/seat-reservation/seat-reservation.js +5 -9
  173. package/seat-reservation-area.component-n-9rGn_y.js +75 -0
  174. package/seat-reservation-graphic.component-YTXRmKt0.js +102 -0
  175. package/seat-reservation-navigation-coach.component-YJ0vaYmO.js +333 -0
  176. package/seat-reservation-navigation-services.component-C3xnLJg2.js +127 -0
  177. package/seat-reservation-place-control.component-DmBAfM6K.js +322 -0
  178. package/seat-reservation-scoped.component-DPkz6u17.js +17 -0
  179. package/seat-reservation.component-C_anMkgw.js +364 -0
  180. package/seat-reservation.js +17 -39
  181. package/seat-reservation.pure.js +15 -32
  182. package/svgs-D9arBcqr.js +26 -0
  183. package/timetable-duration/timetable-duration.component.js +2 -57
  184. package/timetable-duration.component-DCu8Phts.js +65 -0
  185. package/timetable-duration.js +5 -4
  186. package/timetable-duration.pure.js +2 -4
  187. package/timetable-row/timetable-row.component.js +2 -427
  188. package/timetable-row.component-BVRCB3xK.js +559 -0
  189. package/timetable-row.js +6 -13
  190. package/timetable-row.pure.js +2 -11
  191. package/toDate-p-Tpkb7t.js +16 -0
  192. package/development/differenceInMinutes-B0dawX-5.js +0 -26
  193. package/development/format-BMkeaqaF.js +0 -1433
  194. package/development/isValid-BYRch7pV.js +0 -53
  195. package/development/toDate-BWb6Z1JD.js +0 -24
  196. package/differenceInMinutes-COvvdYsJ.js +0 -23
  197. package/format-CmKROkbc.js +0 -1186
  198. package/isValid-m3_OsPaB.js +0 -45
  199. package/toDate-Bw2KTWeq.js +0 -15
@@ -0,0 +1,1848 @@
1
+ import { n as constructFrom, o as millisecondsInWeek, t as toDate } from "./toDate-Biiv3kyf.js";
2
+ import { n as differenceInCalendarDays, t as isValid } from "./isValid-C-HzKv4v.js";
3
+ //#region node_modules/date-fns/_lib/defaultOptions.js
4
+ var defaultOptions = {};
5
+ function getDefaultOptions() {
6
+ return defaultOptions;
7
+ }
8
+ //#endregion
9
+ //#region node_modules/date-fns/startOfWeek.js
10
+ /**
11
+ * The {@link startOfWeek} function options.
12
+ */
13
+ /**
14
+ * @name startOfWeek
15
+ * @category Week Helpers
16
+ * @summary Return the start of a week for the given date.
17
+ *
18
+ * @description
19
+ * Return the start of a week for the given date.
20
+ * The result will be in the local timezone.
21
+ *
22
+ * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
23
+ * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.
24
+ *
25
+ * @param date - The original date
26
+ * @param options - An object with options
27
+ *
28
+ * @returns The start of a week
29
+ *
30
+ * @example
31
+ * // The start of a week for 2 September 2014 11:55:00:
32
+ * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0))
33
+ * //=> Sun Aug 31 2014 00:00:00
34
+ *
35
+ * @example
36
+ * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00:
37
+ * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })
38
+ * //=> Mon Sep 01 2014 00:00:00
39
+ */
40
+ function startOfWeek(date, options) {
41
+ const defaultOptions = getDefaultOptions();
42
+ const weekStartsOn = options?.weekStartsOn ?? options?.locale?.options?.weekStartsOn ?? defaultOptions.weekStartsOn ?? defaultOptions.locale?.options?.weekStartsOn ?? 0;
43
+ const _date = toDate(date, options?.in);
44
+ const day = _date.getDay();
45
+ const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;
46
+ _date.setDate(_date.getDate() - diff);
47
+ _date.setHours(0, 0, 0, 0);
48
+ return _date;
49
+ }
50
+ //#endregion
51
+ //#region node_modules/date-fns/startOfISOWeek.js
52
+ /**
53
+ * The {@link startOfISOWeek} function options.
54
+ */
55
+ /**
56
+ * @name startOfISOWeek
57
+ * @category ISO Week Helpers
58
+ * @summary Return the start of an ISO week for the given date.
59
+ *
60
+ * @description
61
+ * Return the start of an ISO week for the given date.
62
+ * The result will be in the local timezone.
63
+ *
64
+ * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date
65
+ *
66
+ * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
67
+ * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.
68
+ *
69
+ * @param date - The original date
70
+ * @param options - An object with options
71
+ *
72
+ * @returns The start of an ISO week
73
+ *
74
+ * @example
75
+ * // The start of an ISO week for 2 September 2014 11:55:00:
76
+ * const result = startOfISOWeek(new Date(2014, 8, 2, 11, 55, 0))
77
+ * //=> Mon Sep 01 2014 00:00:00
78
+ */
79
+ function startOfISOWeek(date, options) {
80
+ return startOfWeek(date, {
81
+ ...options,
82
+ weekStartsOn: 1
83
+ });
84
+ }
85
+ //#endregion
86
+ //#region node_modules/date-fns/getISOWeekYear.js
87
+ /**
88
+ * The {@link getISOWeekYear} function options.
89
+ */
90
+ /**
91
+ * @name getISOWeekYear
92
+ * @category ISO Week-Numbering Year Helpers
93
+ * @summary Get the ISO week-numbering year of the given date.
94
+ *
95
+ * @description
96
+ * Get the ISO week-numbering year of the given date,
97
+ * which always starts 3 days before the year's first Thursday.
98
+ *
99
+ * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date
100
+ *
101
+ * @param date - The given date
102
+ *
103
+ * @returns The ISO week-numbering year
104
+ *
105
+ * @example
106
+ * // Which ISO-week numbering year is 2 January 2005?
107
+ * const result = getISOWeekYear(new Date(2005, 0, 2))
108
+ * //=> 2004
109
+ */
110
+ function getISOWeekYear(date, options) {
111
+ const _date = toDate(date, options?.in);
112
+ const year = _date.getFullYear();
113
+ const fourthOfJanuaryOfNextYear = constructFrom(_date, 0);
114
+ fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);
115
+ fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);
116
+ const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);
117
+ const fourthOfJanuaryOfThisYear = constructFrom(_date, 0);
118
+ fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);
119
+ fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);
120
+ const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);
121
+ if (_date.getTime() >= startOfNextYear.getTime()) return year + 1;
122
+ else if (_date.getTime() >= startOfThisYear.getTime()) return year;
123
+ else return year - 1;
124
+ }
125
+ //#endregion
126
+ //#region node_modules/date-fns/startOfISOWeekYear.js
127
+ /**
128
+ * The {@link startOfISOWeekYear} function options.
129
+ */
130
+ /**
131
+ * @name startOfISOWeekYear
132
+ * @category ISO Week-Numbering Year Helpers
133
+ * @summary Return the start of an ISO week-numbering year for the given date.
134
+ *
135
+ * @description
136
+ * Return the start of an ISO week-numbering year,
137
+ * which always starts 3 days before the year's first Thursday.
138
+ * The result will be in the local timezone.
139
+ *
140
+ * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date
141
+ *
142
+ * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
143
+ * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.
144
+ *
145
+ * @param date - The original date
146
+ * @param options - An object with options
147
+ *
148
+ * @returns The start of an ISO week-numbering year
149
+ *
150
+ * @example
151
+ * // The start of an ISO week-numbering year for 2 July 2005:
152
+ * const result = startOfISOWeekYear(new Date(2005, 6, 2))
153
+ * //=> Mon Jan 03 2005 00:00:00
154
+ */
155
+ function startOfISOWeekYear(date, options) {
156
+ const year = getISOWeekYear(date, options);
157
+ const fourthOfJanuary = constructFrom(options?.in || date, 0);
158
+ fourthOfJanuary.setFullYear(year, 0, 4);
159
+ fourthOfJanuary.setHours(0, 0, 0, 0);
160
+ return startOfISOWeek(fourthOfJanuary);
161
+ }
162
+ //#endregion
163
+ //#region node_modules/date-fns/startOfYear.js
164
+ /**
165
+ * The {@link startOfYear} function options.
166
+ */
167
+ /**
168
+ * @name startOfYear
169
+ * @category Year Helpers
170
+ * @summary Return the start of a year for the given date.
171
+ *
172
+ * @description
173
+ * Return the start of a year for the given date.
174
+ * The result will be in the local timezone.
175
+ *
176
+ * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
177
+ * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.
178
+ *
179
+ * @param date - The original date
180
+ * @param options - The options
181
+ *
182
+ * @returns The start of a year
183
+ *
184
+ * @example
185
+ * // The start of a year for 2 September 2014 11:55:00:
186
+ * const result = startOfYear(new Date(2014, 8, 2, 11, 55, 00))
187
+ * //=> Wed Jan 01 2014 00:00:00
188
+ */
189
+ function startOfYear(date, options) {
190
+ const date_ = toDate(date, options?.in);
191
+ date_.setFullYear(date_.getFullYear(), 0, 1);
192
+ date_.setHours(0, 0, 0, 0);
193
+ return date_;
194
+ }
195
+ //#endregion
196
+ //#region node_modules/date-fns/locale/en-US/_lib/formatDistance.js
197
+ var formatDistanceLocale = {
198
+ lessThanXSeconds: {
199
+ one: "less than a second",
200
+ other: "less than {{count}} seconds"
201
+ },
202
+ xSeconds: {
203
+ one: "1 second",
204
+ other: "{{count}} seconds"
205
+ },
206
+ halfAMinute: "half a minute",
207
+ lessThanXMinutes: {
208
+ one: "less than a minute",
209
+ other: "less than {{count}} minutes"
210
+ },
211
+ xMinutes: {
212
+ one: "1 minute",
213
+ other: "{{count}} minutes"
214
+ },
215
+ aboutXHours: {
216
+ one: "about 1 hour",
217
+ other: "about {{count}} hours"
218
+ },
219
+ xHours: {
220
+ one: "1 hour",
221
+ other: "{{count}} hours"
222
+ },
223
+ xDays: {
224
+ one: "1 day",
225
+ other: "{{count}} days"
226
+ },
227
+ aboutXWeeks: {
228
+ one: "about 1 week",
229
+ other: "about {{count}} weeks"
230
+ },
231
+ xWeeks: {
232
+ one: "1 week",
233
+ other: "{{count}} weeks"
234
+ },
235
+ aboutXMonths: {
236
+ one: "about 1 month",
237
+ other: "about {{count}} months"
238
+ },
239
+ xMonths: {
240
+ one: "1 month",
241
+ other: "{{count}} months"
242
+ },
243
+ aboutXYears: {
244
+ one: "about 1 year",
245
+ other: "about {{count}} years"
246
+ },
247
+ xYears: {
248
+ one: "1 year",
249
+ other: "{{count}} years"
250
+ },
251
+ overXYears: {
252
+ one: "over 1 year",
253
+ other: "over {{count}} years"
254
+ },
255
+ almostXYears: {
256
+ one: "almost 1 year",
257
+ other: "almost {{count}} years"
258
+ }
259
+ };
260
+ var formatDistance = (token, count, options) => {
261
+ let result;
262
+ const tokenValue = formatDistanceLocale[token];
263
+ if (typeof tokenValue === "string") result = tokenValue;
264
+ else if (count === 1) result = tokenValue.one;
265
+ else result = tokenValue.other.replace("{{count}}", count.toString());
266
+ if (options?.addSuffix) if (options.comparison && options.comparison > 0) return "in " + result;
267
+ else return result + " ago";
268
+ return result;
269
+ };
270
+ //#endregion
271
+ //#region node_modules/date-fns/locale/_lib/buildFormatLongFn.js
272
+ function buildFormatLongFn(args) {
273
+ return (options = {}) => {
274
+ const width = options.width ? String(options.width) : args.defaultWidth;
275
+ return args.formats[width] || args.formats[args.defaultWidth];
276
+ };
277
+ }
278
+ var formatLong = {
279
+ date: buildFormatLongFn({
280
+ formats: {
281
+ full: "EEEE, MMMM do, y",
282
+ long: "MMMM do, y",
283
+ medium: "MMM d, y",
284
+ short: "MM/dd/yyyy"
285
+ },
286
+ defaultWidth: "full"
287
+ }),
288
+ time: buildFormatLongFn({
289
+ formats: {
290
+ full: "h:mm:ss a zzzz",
291
+ long: "h:mm:ss a z",
292
+ medium: "h:mm:ss a",
293
+ short: "h:mm a"
294
+ },
295
+ defaultWidth: "full"
296
+ }),
297
+ dateTime: buildFormatLongFn({
298
+ formats: {
299
+ full: "{{date}} 'at' {{time}}",
300
+ long: "{{date}} 'at' {{time}}",
301
+ medium: "{{date}}, {{time}}",
302
+ short: "{{date}}, {{time}}"
303
+ },
304
+ defaultWidth: "full"
305
+ })
306
+ };
307
+ //#endregion
308
+ //#region node_modules/date-fns/locale/en-US/_lib/formatRelative.js
309
+ var formatRelativeLocale = {
310
+ lastWeek: "'last' eeee 'at' p",
311
+ yesterday: "'yesterday at' p",
312
+ today: "'today at' p",
313
+ tomorrow: "'tomorrow at' p",
314
+ nextWeek: "eeee 'at' p",
315
+ other: "P"
316
+ };
317
+ var formatRelative = (token, _date, _baseDate, _options) => formatRelativeLocale[token];
318
+ //#endregion
319
+ //#region node_modules/date-fns/locale/_lib/buildLocalizeFn.js
320
+ /**
321
+ * The localize function argument callback which allows to convert raw value to
322
+ * the actual type.
323
+ *
324
+ * @param value - The value to convert
325
+ *
326
+ * @returns The converted value
327
+ */
328
+ /**
329
+ * The map of localized values for each width.
330
+ */
331
+ /**
332
+ * The index type of the locale unit value. It types conversion of units of
333
+ * values that don't start at 0 (i.e. quarters).
334
+ */
335
+ /**
336
+ * Converts the unit value to the tuple of values.
337
+ */
338
+ /**
339
+ * The tuple of localized era values. The first element represents BC,
340
+ * the second element represents AD.
341
+ */
342
+ /**
343
+ * The tuple of localized quarter values. The first element represents Q1.
344
+ */
345
+ /**
346
+ * The tuple of localized day values. The first element represents Sunday.
347
+ */
348
+ /**
349
+ * The tuple of localized month values. The first element represents January.
350
+ */
351
+ function buildLocalizeFn(args) {
352
+ return (value, options) => {
353
+ const context = options?.context ? String(options.context) : "standalone";
354
+ let valuesArray;
355
+ if (context === "formatting" && args.formattingValues) {
356
+ const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;
357
+ const width = options?.width ? String(options.width) : defaultWidth;
358
+ valuesArray = args.formattingValues[width] || args.formattingValues[defaultWidth];
359
+ } else {
360
+ const defaultWidth = args.defaultWidth;
361
+ const width = options?.width ? String(options.width) : args.defaultWidth;
362
+ valuesArray = args.values[width] || args.values[defaultWidth];
363
+ }
364
+ const index = args.argumentCallback ? args.argumentCallback(value) : value;
365
+ return valuesArray[index];
366
+ };
367
+ }
368
+ //#endregion
369
+ //#region node_modules/date-fns/locale/en-US/_lib/localize.js
370
+ var eraValues = {
371
+ narrow: ["B", "A"],
372
+ abbreviated: ["BC", "AD"],
373
+ wide: ["Before Christ", "Anno Domini"]
374
+ };
375
+ var quarterValues = {
376
+ narrow: [
377
+ "1",
378
+ "2",
379
+ "3",
380
+ "4"
381
+ ],
382
+ abbreviated: [
383
+ "Q1",
384
+ "Q2",
385
+ "Q3",
386
+ "Q4"
387
+ ],
388
+ wide: [
389
+ "1st quarter",
390
+ "2nd quarter",
391
+ "3rd quarter",
392
+ "4th quarter"
393
+ ]
394
+ };
395
+ var monthValues = {
396
+ narrow: [
397
+ "J",
398
+ "F",
399
+ "M",
400
+ "A",
401
+ "M",
402
+ "J",
403
+ "J",
404
+ "A",
405
+ "S",
406
+ "O",
407
+ "N",
408
+ "D"
409
+ ],
410
+ abbreviated: [
411
+ "Jan",
412
+ "Feb",
413
+ "Mar",
414
+ "Apr",
415
+ "May",
416
+ "Jun",
417
+ "Jul",
418
+ "Aug",
419
+ "Sep",
420
+ "Oct",
421
+ "Nov",
422
+ "Dec"
423
+ ],
424
+ wide: [
425
+ "January",
426
+ "February",
427
+ "March",
428
+ "April",
429
+ "May",
430
+ "June",
431
+ "July",
432
+ "August",
433
+ "September",
434
+ "October",
435
+ "November",
436
+ "December"
437
+ ]
438
+ };
439
+ var dayValues = {
440
+ narrow: [
441
+ "S",
442
+ "M",
443
+ "T",
444
+ "W",
445
+ "T",
446
+ "F",
447
+ "S"
448
+ ],
449
+ short: [
450
+ "Su",
451
+ "Mo",
452
+ "Tu",
453
+ "We",
454
+ "Th",
455
+ "Fr",
456
+ "Sa"
457
+ ],
458
+ abbreviated: [
459
+ "Sun",
460
+ "Mon",
461
+ "Tue",
462
+ "Wed",
463
+ "Thu",
464
+ "Fri",
465
+ "Sat"
466
+ ],
467
+ wide: [
468
+ "Sunday",
469
+ "Monday",
470
+ "Tuesday",
471
+ "Wednesday",
472
+ "Thursday",
473
+ "Friday",
474
+ "Saturday"
475
+ ]
476
+ };
477
+ var dayPeriodValues = {
478
+ narrow: {
479
+ am: "a",
480
+ pm: "p",
481
+ midnight: "mi",
482
+ noon: "n",
483
+ morning: "morning",
484
+ afternoon: "afternoon",
485
+ evening: "evening",
486
+ night: "night"
487
+ },
488
+ abbreviated: {
489
+ am: "AM",
490
+ pm: "PM",
491
+ midnight: "midnight",
492
+ noon: "noon",
493
+ morning: "morning",
494
+ afternoon: "afternoon",
495
+ evening: "evening",
496
+ night: "night"
497
+ },
498
+ wide: {
499
+ am: "a.m.",
500
+ pm: "p.m.",
501
+ midnight: "midnight",
502
+ noon: "noon",
503
+ morning: "morning",
504
+ afternoon: "afternoon",
505
+ evening: "evening",
506
+ night: "night"
507
+ }
508
+ };
509
+ var formattingDayPeriodValues = {
510
+ narrow: {
511
+ am: "a",
512
+ pm: "p",
513
+ midnight: "mi",
514
+ noon: "n",
515
+ morning: "in the morning",
516
+ afternoon: "in the afternoon",
517
+ evening: "in the evening",
518
+ night: "at night"
519
+ },
520
+ abbreviated: {
521
+ am: "AM",
522
+ pm: "PM",
523
+ midnight: "midnight",
524
+ noon: "noon",
525
+ morning: "in the morning",
526
+ afternoon: "in the afternoon",
527
+ evening: "in the evening",
528
+ night: "at night"
529
+ },
530
+ wide: {
531
+ am: "a.m.",
532
+ pm: "p.m.",
533
+ midnight: "midnight",
534
+ noon: "noon",
535
+ morning: "in the morning",
536
+ afternoon: "in the afternoon",
537
+ evening: "in the evening",
538
+ night: "at night"
539
+ }
540
+ };
541
+ var ordinalNumber = (dirtyNumber, _options) => {
542
+ const number = Number(dirtyNumber);
543
+ const rem100 = number % 100;
544
+ if (rem100 > 20 || rem100 < 10) switch (rem100 % 10) {
545
+ case 1: return number + "st";
546
+ case 2: return number + "nd";
547
+ case 3: return number + "rd";
548
+ }
549
+ return number + "th";
550
+ };
551
+ var localize = {
552
+ ordinalNumber,
553
+ era: buildLocalizeFn({
554
+ values: eraValues,
555
+ defaultWidth: "wide"
556
+ }),
557
+ quarter: buildLocalizeFn({
558
+ values: quarterValues,
559
+ defaultWidth: "wide",
560
+ argumentCallback: (quarter) => quarter - 1
561
+ }),
562
+ month: buildLocalizeFn({
563
+ values: monthValues,
564
+ defaultWidth: "wide"
565
+ }),
566
+ day: buildLocalizeFn({
567
+ values: dayValues,
568
+ defaultWidth: "wide"
569
+ }),
570
+ dayPeriod: buildLocalizeFn({
571
+ values: dayPeriodValues,
572
+ defaultWidth: "wide",
573
+ formattingValues: formattingDayPeriodValues,
574
+ defaultFormattingWidth: "wide"
575
+ })
576
+ };
577
+ //#endregion
578
+ //#region node_modules/date-fns/locale/_lib/buildMatchFn.js
579
+ function buildMatchFn(args) {
580
+ return (string, options = {}) => {
581
+ const width = options.width;
582
+ const matchPattern = width && args.matchPatterns[width] || args.matchPatterns[args.defaultMatchWidth];
583
+ const matchResult = string.match(matchPattern);
584
+ if (!matchResult) return null;
585
+ const matchedString = matchResult[0];
586
+ const parsePatterns = width && args.parsePatterns[width] || args.parsePatterns[args.defaultParseWidth];
587
+ const key = Array.isArray(parsePatterns) ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString)) : findKey(parsePatterns, (pattern) => pattern.test(matchedString));
588
+ let value;
589
+ value = args.valueCallback ? args.valueCallback(key) : key;
590
+ value = options.valueCallback ? options.valueCallback(value) : value;
591
+ const rest = string.slice(matchedString.length);
592
+ return {
593
+ value,
594
+ rest
595
+ };
596
+ };
597
+ }
598
+ function findKey(object, predicate) {
599
+ for (const key in object) if (Object.prototype.hasOwnProperty.call(object, key) && predicate(object[key])) return key;
600
+ }
601
+ function findIndex(array, predicate) {
602
+ for (let key = 0; key < array.length; key++) if (predicate(array[key])) return key;
603
+ }
604
+ //#endregion
605
+ //#region node_modules/date-fns/locale/_lib/buildMatchPatternFn.js
606
+ function buildMatchPatternFn(args) {
607
+ return (string, options = {}) => {
608
+ const matchResult = string.match(args.matchPattern);
609
+ if (!matchResult) return null;
610
+ const matchedString = matchResult[0];
611
+ const parseResult = string.match(args.parsePattern);
612
+ if (!parseResult) return null;
613
+ let value = args.valueCallback ? args.valueCallback(parseResult[0]) : parseResult[0];
614
+ value = options.valueCallback ? options.valueCallback(value) : value;
615
+ const rest = string.slice(matchedString.length);
616
+ return {
617
+ value,
618
+ rest
619
+ };
620
+ };
621
+ }
622
+ //#endregion
623
+ //#region node_modules/date-fns/locale/en-US.js
624
+ /**
625
+ * @category Locales
626
+ * @summary English locale (United States).
627
+ * @language English
628
+ * @iso-639-2 eng
629
+ * @author Sasha Koss [@kossnocorp](https://github.com/kossnocorp)
630
+ * @author Lesha Koss [@leshakoss](https://github.com/leshakoss)
631
+ */
632
+ var enUS = {
633
+ code: "en-US",
634
+ formatDistance,
635
+ formatLong,
636
+ formatRelative,
637
+ localize,
638
+ match: {
639
+ ordinalNumber: buildMatchPatternFn({
640
+ matchPattern: /^(\d+)(th|st|nd|rd)?/i,
641
+ parsePattern: /\d+/i,
642
+ valueCallback: (value) => parseInt(value, 10)
643
+ }),
644
+ era: buildMatchFn({
645
+ matchPatterns: {
646
+ narrow: /^(b|a)/i,
647
+ abbreviated: /^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,
648
+ wide: /^(before christ|before common era|anno domini|common era)/i
649
+ },
650
+ defaultMatchWidth: "wide",
651
+ parsePatterns: { any: [/^b/i, /^(a|c)/i] },
652
+ defaultParseWidth: "any"
653
+ }),
654
+ quarter: buildMatchFn({
655
+ matchPatterns: {
656
+ narrow: /^[1234]/i,
657
+ abbreviated: /^q[1234]/i,
658
+ wide: /^[1234](th|st|nd|rd)? quarter/i
659
+ },
660
+ defaultMatchWidth: "wide",
661
+ parsePatterns: { any: [
662
+ /1/i,
663
+ /2/i,
664
+ /3/i,
665
+ /4/i
666
+ ] },
667
+ defaultParseWidth: "any",
668
+ valueCallback: (index) => index + 1
669
+ }),
670
+ month: buildMatchFn({
671
+ matchPatterns: {
672
+ narrow: /^[jfmasond]/i,
673
+ abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,
674
+ wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i
675
+ },
676
+ defaultMatchWidth: "wide",
677
+ parsePatterns: {
678
+ narrow: [
679
+ /^j/i,
680
+ /^f/i,
681
+ /^m/i,
682
+ /^a/i,
683
+ /^m/i,
684
+ /^j/i,
685
+ /^j/i,
686
+ /^a/i,
687
+ /^s/i,
688
+ /^o/i,
689
+ /^n/i,
690
+ /^d/i
691
+ ],
692
+ any: [
693
+ /^ja/i,
694
+ /^f/i,
695
+ /^mar/i,
696
+ /^ap/i,
697
+ /^may/i,
698
+ /^jun/i,
699
+ /^jul/i,
700
+ /^au/i,
701
+ /^s/i,
702
+ /^o/i,
703
+ /^n/i,
704
+ /^d/i
705
+ ]
706
+ },
707
+ defaultParseWidth: "any"
708
+ }),
709
+ day: buildMatchFn({
710
+ matchPatterns: {
711
+ narrow: /^[smtwf]/i,
712
+ short: /^(su|mo|tu|we|th|fr|sa)/i,
713
+ abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,
714
+ wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i
715
+ },
716
+ defaultMatchWidth: "wide",
717
+ parsePatterns: {
718
+ narrow: [
719
+ /^s/i,
720
+ /^m/i,
721
+ /^t/i,
722
+ /^w/i,
723
+ /^t/i,
724
+ /^f/i,
725
+ /^s/i
726
+ ],
727
+ any: [
728
+ /^su/i,
729
+ /^m/i,
730
+ /^tu/i,
731
+ /^w/i,
732
+ /^th/i,
733
+ /^f/i,
734
+ /^sa/i
735
+ ]
736
+ },
737
+ defaultParseWidth: "any"
738
+ }),
739
+ dayPeriod: buildMatchFn({
740
+ matchPatterns: {
741
+ narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,
742
+ any: /^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i
743
+ },
744
+ defaultMatchWidth: "any",
745
+ parsePatterns: { any: {
746
+ am: /^a/i,
747
+ pm: /^p/i,
748
+ midnight: /^mi/i,
749
+ noon: /^no/i,
750
+ morning: /morning/i,
751
+ afternoon: /afternoon/i,
752
+ evening: /evening/i,
753
+ night: /night/i
754
+ } },
755
+ defaultParseWidth: "any"
756
+ })
757
+ },
758
+ options: {
759
+ weekStartsOn: 0,
760
+ firstWeekContainsDate: 1
761
+ }
762
+ };
763
+ //#endregion
764
+ //#region node_modules/date-fns/getDayOfYear.js
765
+ /**
766
+ * The {@link getDayOfYear} function options.
767
+ */
768
+ /**
769
+ * @name getDayOfYear
770
+ * @category Day Helpers
771
+ * @summary Get the day of the year of the given date.
772
+ *
773
+ * @description
774
+ * Get the day of the year of the given date.
775
+ *
776
+ * @param date - The given date
777
+ * @param options - The options
778
+ *
779
+ * @returns The day of year
780
+ *
781
+ * @example
782
+ * // Which day of the year is 2 July 2014?
783
+ * const result = getDayOfYear(new Date(2014, 6, 2))
784
+ * //=> 183
785
+ */
786
+ function getDayOfYear(date, options) {
787
+ const _date = toDate(date, options?.in);
788
+ return differenceInCalendarDays(_date, startOfYear(_date)) + 1;
789
+ }
790
+ //#endregion
791
+ //#region node_modules/date-fns/getISOWeek.js
792
+ /**
793
+ * The {@link getISOWeek} function options.
794
+ */
795
+ /**
796
+ * @name getISOWeek
797
+ * @category ISO Week Helpers
798
+ * @summary Get the ISO week of the given date.
799
+ *
800
+ * @description
801
+ * Get the ISO week of the given date.
802
+ *
803
+ * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date
804
+ *
805
+ * @param date - The given date
806
+ * @param options - The options
807
+ *
808
+ * @returns The ISO week
809
+ *
810
+ * @example
811
+ * // Which week of the ISO-week numbering year is 2 January 2005?
812
+ * const result = getISOWeek(new Date(2005, 0, 2))
813
+ * //=> 53
814
+ */
815
+ function getISOWeek(date, options) {
816
+ const _date = toDate(date, options?.in);
817
+ const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date);
818
+ return Math.round(diff / millisecondsInWeek) + 1;
819
+ }
820
+ //#endregion
821
+ //#region node_modules/date-fns/getWeekYear.js
822
+ /**
823
+ * The {@link getWeekYear} function options.
824
+ */
825
+ /**
826
+ * @name getWeekYear
827
+ * @category Week-Numbering Year Helpers
828
+ * @summary Get the local week-numbering year of the given date.
829
+ *
830
+ * @description
831
+ * Get the local week-numbering year of the given date.
832
+ * The exact calculation depends on the values of
833
+ * `options.weekStartsOn` (which is the index of the first day of the week)
834
+ * and `options.firstWeekContainsDate` (which is the day of January, which is always in
835
+ * the first week of the week-numbering year)
836
+ *
837
+ * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system
838
+ *
839
+ * @param date - The given date
840
+ * @param options - An object with options.
841
+ *
842
+ * @returns The local week-numbering year
843
+ *
844
+ * @example
845
+ * // Which week numbering year is 26 December 2004 with the default settings?
846
+ * const result = getWeekYear(new Date(2004, 11, 26))
847
+ * //=> 2005
848
+ *
849
+ * @example
850
+ * // Which week numbering year is 26 December 2004 if week starts on Saturday?
851
+ * const result = getWeekYear(new Date(2004, 11, 26), { weekStartsOn: 6 })
852
+ * //=> 2004
853
+ *
854
+ * @example
855
+ * // Which week numbering year is 26 December 2004 if the first week contains 4 January?
856
+ * const result = getWeekYear(new Date(2004, 11, 26), { firstWeekContainsDate: 4 })
857
+ * //=> 2004
858
+ */
859
+ function getWeekYear(date, options) {
860
+ const _date = toDate(date, options?.in);
861
+ const year = _date.getFullYear();
862
+ const defaultOptions = getDefaultOptions();
863
+ const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions.firstWeekContainsDate ?? defaultOptions.locale?.options?.firstWeekContainsDate ?? 1;
864
+ const firstWeekOfNextYear = constructFrom(options?.in || date, 0);
865
+ firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);
866
+ firstWeekOfNextYear.setHours(0, 0, 0, 0);
867
+ const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);
868
+ const firstWeekOfThisYear = constructFrom(options?.in || date, 0);
869
+ firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);
870
+ firstWeekOfThisYear.setHours(0, 0, 0, 0);
871
+ const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);
872
+ if (+_date >= +startOfNextYear) return year + 1;
873
+ else if (+_date >= +startOfThisYear) return year;
874
+ else return year - 1;
875
+ }
876
+ //#endregion
877
+ //#region node_modules/date-fns/startOfWeekYear.js
878
+ /**
879
+ * The {@link startOfWeekYear} function options.
880
+ */
881
+ /**
882
+ * @name startOfWeekYear
883
+ * @category Week-Numbering Year Helpers
884
+ * @summary Return the start of a local week-numbering year for the given date.
885
+ *
886
+ * @description
887
+ * Return the start of a local week-numbering year.
888
+ * The exact calculation depends on the values of
889
+ * `options.weekStartsOn` (which is the index of the first day of the week)
890
+ * and `options.firstWeekContainsDate` (which is the day of January, which is always in
891
+ * the first week of the week-numbering year)
892
+ *
893
+ * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system
894
+ *
895
+ * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
896
+ * @typeParam ResultDate - The result `Date` type.
897
+ *
898
+ * @param date - The original date
899
+ * @param options - An object with options
900
+ *
901
+ * @returns The start of a week-numbering year
902
+ *
903
+ * @example
904
+ * // The start of an a week-numbering year for 2 July 2005 with default settings:
905
+ * const result = startOfWeekYear(new Date(2005, 6, 2))
906
+ * //=> Sun Dec 26 2004 00:00:00
907
+ *
908
+ * @example
909
+ * // The start of a week-numbering year for 2 July 2005
910
+ * // if Monday is the first day of week
911
+ * // and 4 January is always in the first week of the year:
912
+ * const result = startOfWeekYear(new Date(2005, 6, 2), {
913
+ * weekStartsOn: 1,
914
+ * firstWeekContainsDate: 4
915
+ * })
916
+ * //=> Mon Jan 03 2005 00:00:00
917
+ */
918
+ function startOfWeekYear(date, options) {
919
+ const defaultOptions = getDefaultOptions();
920
+ const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions.firstWeekContainsDate ?? defaultOptions.locale?.options?.firstWeekContainsDate ?? 1;
921
+ const year = getWeekYear(date, options);
922
+ const firstWeek = constructFrom(options?.in || date, 0);
923
+ firstWeek.setFullYear(year, 0, firstWeekContainsDate);
924
+ firstWeek.setHours(0, 0, 0, 0);
925
+ return startOfWeek(firstWeek, options);
926
+ }
927
+ //#endregion
928
+ //#region node_modules/date-fns/getWeek.js
929
+ /**
930
+ * The {@link getWeek} function options.
931
+ */
932
+ /**
933
+ * @name getWeek
934
+ * @category Week Helpers
935
+ * @summary Get the local week index of the given date.
936
+ *
937
+ * @description
938
+ * Get the local week index of the given date.
939
+ * The exact calculation depends on the values of
940
+ * `options.weekStartsOn` (which is the index of the first day of the week)
941
+ * and `options.firstWeekContainsDate` (which is the day of January, which is always in
942
+ * the first week of the week-numbering year)
943
+ *
944
+ * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system
945
+ *
946
+ * @param date - The given date
947
+ * @param options - An object with options
948
+ *
949
+ * @returns The week
950
+ *
951
+ * @example
952
+ * // Which week of the local week numbering year is 2 January 2005 with default options?
953
+ * const result = getWeek(new Date(2005, 0, 2))
954
+ * //=> 2
955
+ *
956
+ * @example
957
+ * // Which week of the local week numbering year is 2 January 2005,
958
+ * // if Monday is the first day of the week,
959
+ * // and the first week of the year always contains 4 January?
960
+ * const result = getWeek(new Date(2005, 0, 2), {
961
+ * weekStartsOn: 1,
962
+ * firstWeekContainsDate: 4
963
+ * })
964
+ * //=> 53
965
+ */
966
+ function getWeek(date, options) {
967
+ const _date = toDate(date, options?.in);
968
+ const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);
969
+ return Math.round(diff / millisecondsInWeek) + 1;
970
+ }
971
+ //#endregion
972
+ //#region node_modules/date-fns/_lib/addLeadingZeros.js
973
+ function addLeadingZeros(number, targetLength) {
974
+ return (number < 0 ? "-" : "") + Math.abs(number).toString().padStart(targetLength, "0");
975
+ }
976
+ //#endregion
977
+ //#region node_modules/date-fns/_lib/format/lightFormatters.js
978
+ var lightFormatters = {
979
+ y(date, token) {
980
+ const signedYear = date.getFullYear();
981
+ const year = signedYear > 0 ? signedYear : 1 - signedYear;
982
+ return addLeadingZeros(token === "yy" ? year % 100 : year, token.length);
983
+ },
984
+ M(date, token) {
985
+ const month = date.getMonth();
986
+ return token === "M" ? String(month + 1) : addLeadingZeros(month + 1, 2);
987
+ },
988
+ d(date, token) {
989
+ return addLeadingZeros(date.getDate(), token.length);
990
+ },
991
+ a(date, token) {
992
+ const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? "pm" : "am";
993
+ switch (token) {
994
+ case "a":
995
+ case "aa": return dayPeriodEnumValue.toUpperCase();
996
+ case "aaa": return dayPeriodEnumValue;
997
+ case "aaaaa": return dayPeriodEnumValue[0];
998
+ default: return dayPeriodEnumValue === "am" ? "a.m." : "p.m.";
999
+ }
1000
+ },
1001
+ h(date, token) {
1002
+ return addLeadingZeros(date.getHours() % 12 || 12, token.length);
1003
+ },
1004
+ H(date, token) {
1005
+ return addLeadingZeros(date.getHours(), token.length);
1006
+ },
1007
+ m(date, token) {
1008
+ return addLeadingZeros(date.getMinutes(), token.length);
1009
+ },
1010
+ s(date, token) {
1011
+ return addLeadingZeros(date.getSeconds(), token.length);
1012
+ },
1013
+ S(date, token) {
1014
+ const numberOfDigits = token.length;
1015
+ const milliseconds = date.getMilliseconds();
1016
+ return addLeadingZeros(Math.trunc(milliseconds * Math.pow(10, numberOfDigits - 3)), token.length);
1017
+ }
1018
+ };
1019
+ //#endregion
1020
+ //#region node_modules/date-fns/_lib/format/formatters.js
1021
+ var dayPeriodEnum = {
1022
+ am: "am",
1023
+ pm: "pm",
1024
+ midnight: "midnight",
1025
+ noon: "noon",
1026
+ morning: "morning",
1027
+ afternoon: "afternoon",
1028
+ evening: "evening",
1029
+ night: "night"
1030
+ };
1031
+ var formatters = {
1032
+ G: function(date, token, localize) {
1033
+ const era = date.getFullYear() > 0 ? 1 : 0;
1034
+ switch (token) {
1035
+ case "G":
1036
+ case "GG":
1037
+ case "GGG": return localize.era(era, { width: "abbreviated" });
1038
+ case "GGGGG": return localize.era(era, { width: "narrow" });
1039
+ default: return localize.era(era, { width: "wide" });
1040
+ }
1041
+ },
1042
+ y: function(date, token, localize) {
1043
+ if (token === "yo") {
1044
+ const signedYear = date.getFullYear();
1045
+ const year = signedYear > 0 ? signedYear : 1 - signedYear;
1046
+ return localize.ordinalNumber(year, { unit: "year" });
1047
+ }
1048
+ return lightFormatters.y(date, token);
1049
+ },
1050
+ Y: function(date, token, localize, options) {
1051
+ const signedWeekYear = getWeekYear(date, options);
1052
+ const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;
1053
+ if (token === "YY") return addLeadingZeros(weekYear % 100, 2);
1054
+ if (token === "Yo") return localize.ordinalNumber(weekYear, { unit: "year" });
1055
+ return addLeadingZeros(weekYear, token.length);
1056
+ },
1057
+ R: function(date, token) {
1058
+ return addLeadingZeros(getISOWeekYear(date), token.length);
1059
+ },
1060
+ u: function(date, token) {
1061
+ return addLeadingZeros(date.getFullYear(), token.length);
1062
+ },
1063
+ Q: function(date, token, localize) {
1064
+ const quarter = Math.ceil((date.getMonth() + 1) / 3);
1065
+ switch (token) {
1066
+ case "Q": return String(quarter);
1067
+ case "QQ": return addLeadingZeros(quarter, 2);
1068
+ case "Qo": return localize.ordinalNumber(quarter, { unit: "quarter" });
1069
+ case "QQQ": return localize.quarter(quarter, {
1070
+ width: "abbreviated",
1071
+ context: "formatting"
1072
+ });
1073
+ case "QQQQQ": return localize.quarter(quarter, {
1074
+ width: "narrow",
1075
+ context: "formatting"
1076
+ });
1077
+ default: return localize.quarter(quarter, {
1078
+ width: "wide",
1079
+ context: "formatting"
1080
+ });
1081
+ }
1082
+ },
1083
+ q: function(date, token, localize) {
1084
+ const quarter = Math.ceil((date.getMonth() + 1) / 3);
1085
+ switch (token) {
1086
+ case "q": return String(quarter);
1087
+ case "qq": return addLeadingZeros(quarter, 2);
1088
+ case "qo": return localize.ordinalNumber(quarter, { unit: "quarter" });
1089
+ case "qqq": return localize.quarter(quarter, {
1090
+ width: "abbreviated",
1091
+ context: "standalone"
1092
+ });
1093
+ case "qqqqq": return localize.quarter(quarter, {
1094
+ width: "narrow",
1095
+ context: "standalone"
1096
+ });
1097
+ default: return localize.quarter(quarter, {
1098
+ width: "wide",
1099
+ context: "standalone"
1100
+ });
1101
+ }
1102
+ },
1103
+ M: function(date, token, localize) {
1104
+ const month = date.getMonth();
1105
+ switch (token) {
1106
+ case "M":
1107
+ case "MM": return lightFormatters.M(date, token);
1108
+ case "Mo": return localize.ordinalNumber(month + 1, { unit: "month" });
1109
+ case "MMM": return localize.month(month, {
1110
+ width: "abbreviated",
1111
+ context: "formatting"
1112
+ });
1113
+ case "MMMMM": return localize.month(month, {
1114
+ width: "narrow",
1115
+ context: "formatting"
1116
+ });
1117
+ default: return localize.month(month, {
1118
+ width: "wide",
1119
+ context: "formatting"
1120
+ });
1121
+ }
1122
+ },
1123
+ L: function(date, token, localize) {
1124
+ const month = date.getMonth();
1125
+ switch (token) {
1126
+ case "L": return String(month + 1);
1127
+ case "LL": return addLeadingZeros(month + 1, 2);
1128
+ case "Lo": return localize.ordinalNumber(month + 1, { unit: "month" });
1129
+ case "LLL": return localize.month(month, {
1130
+ width: "abbreviated",
1131
+ context: "standalone"
1132
+ });
1133
+ case "LLLLL": return localize.month(month, {
1134
+ width: "narrow",
1135
+ context: "standalone"
1136
+ });
1137
+ default: return localize.month(month, {
1138
+ width: "wide",
1139
+ context: "standalone"
1140
+ });
1141
+ }
1142
+ },
1143
+ w: function(date, token, localize, options) {
1144
+ const week = getWeek(date, options);
1145
+ if (token === "wo") return localize.ordinalNumber(week, { unit: "week" });
1146
+ return addLeadingZeros(week, token.length);
1147
+ },
1148
+ I: function(date, token, localize) {
1149
+ const isoWeek = getISOWeek(date);
1150
+ if (token === "Io") return localize.ordinalNumber(isoWeek, { unit: "week" });
1151
+ return addLeadingZeros(isoWeek, token.length);
1152
+ },
1153
+ d: function(date, token, localize) {
1154
+ if (token === "do") return localize.ordinalNumber(date.getDate(), { unit: "date" });
1155
+ return lightFormatters.d(date, token);
1156
+ },
1157
+ D: function(date, token, localize) {
1158
+ const dayOfYear = getDayOfYear(date);
1159
+ if (token === "Do") return localize.ordinalNumber(dayOfYear, { unit: "dayOfYear" });
1160
+ return addLeadingZeros(dayOfYear, token.length);
1161
+ },
1162
+ E: function(date, token, localize) {
1163
+ const dayOfWeek = date.getDay();
1164
+ switch (token) {
1165
+ case "E":
1166
+ case "EE":
1167
+ case "EEE": return localize.day(dayOfWeek, {
1168
+ width: "abbreviated",
1169
+ context: "formatting"
1170
+ });
1171
+ case "EEEEE": return localize.day(dayOfWeek, {
1172
+ width: "narrow",
1173
+ context: "formatting"
1174
+ });
1175
+ case "EEEEEE": return localize.day(dayOfWeek, {
1176
+ width: "short",
1177
+ context: "formatting"
1178
+ });
1179
+ default: return localize.day(dayOfWeek, {
1180
+ width: "wide",
1181
+ context: "formatting"
1182
+ });
1183
+ }
1184
+ },
1185
+ e: function(date, token, localize, options) {
1186
+ const dayOfWeek = date.getDay();
1187
+ const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;
1188
+ switch (token) {
1189
+ case "e": return String(localDayOfWeek);
1190
+ case "ee": return addLeadingZeros(localDayOfWeek, 2);
1191
+ case "eo": return localize.ordinalNumber(localDayOfWeek, { unit: "day" });
1192
+ case "eee": return localize.day(dayOfWeek, {
1193
+ width: "abbreviated",
1194
+ context: "formatting"
1195
+ });
1196
+ case "eeeee": return localize.day(dayOfWeek, {
1197
+ width: "narrow",
1198
+ context: "formatting"
1199
+ });
1200
+ case "eeeeee": return localize.day(dayOfWeek, {
1201
+ width: "short",
1202
+ context: "formatting"
1203
+ });
1204
+ default: return localize.day(dayOfWeek, {
1205
+ width: "wide",
1206
+ context: "formatting"
1207
+ });
1208
+ }
1209
+ },
1210
+ c: function(date, token, localize, options) {
1211
+ const dayOfWeek = date.getDay();
1212
+ const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;
1213
+ switch (token) {
1214
+ case "c": return String(localDayOfWeek);
1215
+ case "cc": return addLeadingZeros(localDayOfWeek, token.length);
1216
+ case "co": return localize.ordinalNumber(localDayOfWeek, { unit: "day" });
1217
+ case "ccc": return localize.day(dayOfWeek, {
1218
+ width: "abbreviated",
1219
+ context: "standalone"
1220
+ });
1221
+ case "ccccc": return localize.day(dayOfWeek, {
1222
+ width: "narrow",
1223
+ context: "standalone"
1224
+ });
1225
+ case "cccccc": return localize.day(dayOfWeek, {
1226
+ width: "short",
1227
+ context: "standalone"
1228
+ });
1229
+ default: return localize.day(dayOfWeek, {
1230
+ width: "wide",
1231
+ context: "standalone"
1232
+ });
1233
+ }
1234
+ },
1235
+ i: function(date, token, localize) {
1236
+ const dayOfWeek = date.getDay();
1237
+ const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;
1238
+ switch (token) {
1239
+ case "i": return String(isoDayOfWeek);
1240
+ case "ii": return addLeadingZeros(isoDayOfWeek, token.length);
1241
+ case "io": return localize.ordinalNumber(isoDayOfWeek, { unit: "day" });
1242
+ case "iii": return localize.day(dayOfWeek, {
1243
+ width: "abbreviated",
1244
+ context: "formatting"
1245
+ });
1246
+ case "iiiii": return localize.day(dayOfWeek, {
1247
+ width: "narrow",
1248
+ context: "formatting"
1249
+ });
1250
+ case "iiiiii": return localize.day(dayOfWeek, {
1251
+ width: "short",
1252
+ context: "formatting"
1253
+ });
1254
+ default: return localize.day(dayOfWeek, {
1255
+ width: "wide",
1256
+ context: "formatting"
1257
+ });
1258
+ }
1259
+ },
1260
+ a: function(date, token, localize) {
1261
+ const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? "pm" : "am";
1262
+ switch (token) {
1263
+ case "a":
1264
+ case "aa": return localize.dayPeriod(dayPeriodEnumValue, {
1265
+ width: "abbreviated",
1266
+ context: "formatting"
1267
+ });
1268
+ case "aaa": return localize.dayPeriod(dayPeriodEnumValue, {
1269
+ width: "abbreviated",
1270
+ context: "formatting"
1271
+ }).toLowerCase();
1272
+ case "aaaaa": return localize.dayPeriod(dayPeriodEnumValue, {
1273
+ width: "narrow",
1274
+ context: "formatting"
1275
+ });
1276
+ default: return localize.dayPeriod(dayPeriodEnumValue, {
1277
+ width: "wide",
1278
+ context: "formatting"
1279
+ });
1280
+ }
1281
+ },
1282
+ b: function(date, token, localize) {
1283
+ const hours = date.getHours();
1284
+ let dayPeriodEnumValue;
1285
+ if (hours === 12) dayPeriodEnumValue = dayPeriodEnum.noon;
1286
+ else if (hours === 0) dayPeriodEnumValue = dayPeriodEnum.midnight;
1287
+ else dayPeriodEnumValue = hours / 12 >= 1 ? "pm" : "am";
1288
+ switch (token) {
1289
+ case "b":
1290
+ case "bb": return localize.dayPeriod(dayPeriodEnumValue, {
1291
+ width: "abbreviated",
1292
+ context: "formatting"
1293
+ });
1294
+ case "bbb": return localize.dayPeriod(dayPeriodEnumValue, {
1295
+ width: "abbreviated",
1296
+ context: "formatting"
1297
+ }).toLowerCase();
1298
+ case "bbbbb": return localize.dayPeriod(dayPeriodEnumValue, {
1299
+ width: "narrow",
1300
+ context: "formatting"
1301
+ });
1302
+ default: return localize.dayPeriod(dayPeriodEnumValue, {
1303
+ width: "wide",
1304
+ context: "formatting"
1305
+ });
1306
+ }
1307
+ },
1308
+ B: function(date, token, localize) {
1309
+ const hours = date.getHours();
1310
+ let dayPeriodEnumValue;
1311
+ if (hours >= 17) dayPeriodEnumValue = dayPeriodEnum.evening;
1312
+ else if (hours >= 12) dayPeriodEnumValue = dayPeriodEnum.afternoon;
1313
+ else if (hours >= 4) dayPeriodEnumValue = dayPeriodEnum.morning;
1314
+ else dayPeriodEnumValue = dayPeriodEnum.night;
1315
+ switch (token) {
1316
+ case "B":
1317
+ case "BB":
1318
+ case "BBB": return localize.dayPeriod(dayPeriodEnumValue, {
1319
+ width: "abbreviated",
1320
+ context: "formatting"
1321
+ });
1322
+ case "BBBBB": return localize.dayPeriod(dayPeriodEnumValue, {
1323
+ width: "narrow",
1324
+ context: "formatting"
1325
+ });
1326
+ default: return localize.dayPeriod(dayPeriodEnumValue, {
1327
+ width: "wide",
1328
+ context: "formatting"
1329
+ });
1330
+ }
1331
+ },
1332
+ h: function(date, token, localize) {
1333
+ if (token === "ho") {
1334
+ let hours = date.getHours() % 12;
1335
+ if (hours === 0) hours = 12;
1336
+ return localize.ordinalNumber(hours, { unit: "hour" });
1337
+ }
1338
+ return lightFormatters.h(date, token);
1339
+ },
1340
+ H: function(date, token, localize) {
1341
+ if (token === "Ho") return localize.ordinalNumber(date.getHours(), { unit: "hour" });
1342
+ return lightFormatters.H(date, token);
1343
+ },
1344
+ K: function(date, token, localize) {
1345
+ const hours = date.getHours() % 12;
1346
+ if (token === "Ko") return localize.ordinalNumber(hours, { unit: "hour" });
1347
+ return addLeadingZeros(hours, token.length);
1348
+ },
1349
+ k: function(date, token, localize) {
1350
+ let hours = date.getHours();
1351
+ if (hours === 0) hours = 24;
1352
+ if (token === "ko") return localize.ordinalNumber(hours, { unit: "hour" });
1353
+ return addLeadingZeros(hours, token.length);
1354
+ },
1355
+ m: function(date, token, localize) {
1356
+ if (token === "mo") return localize.ordinalNumber(date.getMinutes(), { unit: "minute" });
1357
+ return lightFormatters.m(date, token);
1358
+ },
1359
+ s: function(date, token, localize) {
1360
+ if (token === "so") return localize.ordinalNumber(date.getSeconds(), { unit: "second" });
1361
+ return lightFormatters.s(date, token);
1362
+ },
1363
+ S: function(date, token) {
1364
+ return lightFormatters.S(date, token);
1365
+ },
1366
+ X: function(date, token, _localize) {
1367
+ const timezoneOffset = date.getTimezoneOffset();
1368
+ if (timezoneOffset === 0) return "Z";
1369
+ switch (token) {
1370
+ case "X": return formatTimezoneWithOptionalMinutes(timezoneOffset);
1371
+ case "XXXX":
1372
+ case "XX": return formatTimezone(timezoneOffset);
1373
+ default: return formatTimezone(timezoneOffset, ":");
1374
+ }
1375
+ },
1376
+ x: function(date, token, _localize) {
1377
+ const timezoneOffset = date.getTimezoneOffset();
1378
+ switch (token) {
1379
+ case "x": return formatTimezoneWithOptionalMinutes(timezoneOffset);
1380
+ case "xxxx":
1381
+ case "xx": return formatTimezone(timezoneOffset);
1382
+ default: return formatTimezone(timezoneOffset, ":");
1383
+ }
1384
+ },
1385
+ O: function(date, token, _localize) {
1386
+ const timezoneOffset = date.getTimezoneOffset();
1387
+ switch (token) {
1388
+ case "O":
1389
+ case "OO":
1390
+ case "OOO": return "GMT" + formatTimezoneShort(timezoneOffset, ":");
1391
+ default: return "GMT" + formatTimezone(timezoneOffset, ":");
1392
+ }
1393
+ },
1394
+ z: function(date, token, _localize) {
1395
+ const timezoneOffset = date.getTimezoneOffset();
1396
+ switch (token) {
1397
+ case "z":
1398
+ case "zz":
1399
+ case "zzz": return "GMT" + formatTimezoneShort(timezoneOffset, ":");
1400
+ default: return "GMT" + formatTimezone(timezoneOffset, ":");
1401
+ }
1402
+ },
1403
+ t: function(date, token, _localize) {
1404
+ return addLeadingZeros(Math.trunc(+date / 1e3), token.length);
1405
+ },
1406
+ T: function(date, token, _localize) {
1407
+ return addLeadingZeros(+date, token.length);
1408
+ }
1409
+ };
1410
+ function formatTimezoneShort(offset, delimiter = "") {
1411
+ const sign = offset > 0 ? "-" : "+";
1412
+ const absOffset = Math.abs(offset);
1413
+ const hours = Math.trunc(absOffset / 60);
1414
+ const minutes = absOffset % 60;
1415
+ if (minutes === 0) return sign + String(hours);
1416
+ return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);
1417
+ }
1418
+ function formatTimezoneWithOptionalMinutes(offset, delimiter) {
1419
+ if (offset % 60 === 0) return (offset > 0 ? "-" : "+") + addLeadingZeros(Math.abs(offset) / 60, 2);
1420
+ return formatTimezone(offset, delimiter);
1421
+ }
1422
+ function formatTimezone(offset, delimiter = "") {
1423
+ const sign = offset > 0 ? "-" : "+";
1424
+ const absOffset = Math.abs(offset);
1425
+ const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2);
1426
+ const minutes = addLeadingZeros(absOffset % 60, 2);
1427
+ return sign + hours + delimiter + minutes;
1428
+ }
1429
+ //#endregion
1430
+ //#region node_modules/date-fns/_lib/format/longFormatters.js
1431
+ var dateLongFormatter = (pattern, formatLong) => {
1432
+ switch (pattern) {
1433
+ case "P": return formatLong.date({ width: "short" });
1434
+ case "PP": return formatLong.date({ width: "medium" });
1435
+ case "PPP": return formatLong.date({ width: "long" });
1436
+ default: return formatLong.date({ width: "full" });
1437
+ }
1438
+ };
1439
+ var timeLongFormatter = (pattern, formatLong) => {
1440
+ switch (pattern) {
1441
+ case "p": return formatLong.time({ width: "short" });
1442
+ case "pp": return formatLong.time({ width: "medium" });
1443
+ case "ppp": return formatLong.time({ width: "long" });
1444
+ default: return formatLong.time({ width: "full" });
1445
+ }
1446
+ };
1447
+ var dateTimeLongFormatter = (pattern, formatLong) => {
1448
+ const matchResult = pattern.match(/(P+)(p+)?/) || [];
1449
+ const datePattern = matchResult[1];
1450
+ const timePattern = matchResult[2];
1451
+ if (!timePattern) return dateLongFormatter(pattern, formatLong);
1452
+ let dateTimeFormat;
1453
+ switch (datePattern) {
1454
+ case "P":
1455
+ dateTimeFormat = formatLong.dateTime({ width: "short" });
1456
+ break;
1457
+ case "PP":
1458
+ dateTimeFormat = formatLong.dateTime({ width: "medium" });
1459
+ break;
1460
+ case "PPP":
1461
+ dateTimeFormat = formatLong.dateTime({ width: "long" });
1462
+ break;
1463
+ default:
1464
+ dateTimeFormat = formatLong.dateTime({ width: "full" });
1465
+ break;
1466
+ }
1467
+ return dateTimeFormat.replace("{{date}}", dateLongFormatter(datePattern, formatLong)).replace("{{time}}", timeLongFormatter(timePattern, formatLong));
1468
+ };
1469
+ var longFormatters = {
1470
+ p: timeLongFormatter,
1471
+ P: dateTimeLongFormatter
1472
+ };
1473
+ //#endregion
1474
+ //#region node_modules/date-fns/_lib/protectedTokens.js
1475
+ var dayOfYearTokenRE = /^D+$/;
1476
+ var weekYearTokenRE = /^Y+$/;
1477
+ var throwTokens = [
1478
+ "D",
1479
+ "DD",
1480
+ "YY",
1481
+ "YYYY"
1482
+ ];
1483
+ function isProtectedDayOfYearToken(token) {
1484
+ return dayOfYearTokenRE.test(token);
1485
+ }
1486
+ function isProtectedWeekYearToken(token) {
1487
+ return weekYearTokenRE.test(token);
1488
+ }
1489
+ function warnOrThrowProtectedError(token, format, input) {
1490
+ const _message = message(token, format, input);
1491
+ console.warn(_message);
1492
+ if (throwTokens.includes(token)) throw new RangeError(_message);
1493
+ }
1494
+ function message(token, format, input) {
1495
+ const subject = token[0] === "Y" ? "years" : "days of the month";
1496
+ return `Use \`${token.toLowerCase()}\` instead of \`${token}\` (in \`${format}\`) for formatting ${subject} to the input \`${input}\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`;
1497
+ }
1498
+ //#endregion
1499
+ //#region node_modules/date-fns/format.js
1500
+ var formattingTokensRegExp = /[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g;
1501
+ var longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;
1502
+ var escapedStringRegExp = /^'([^]*?)'?$/;
1503
+ var doubleQuoteRegExp = /''/g;
1504
+ var unescapedLatinCharacterRegExp = /[a-zA-Z]/;
1505
+ /**
1506
+ * The {@link format} function options.
1507
+ */
1508
+ /**
1509
+ * @name format
1510
+ * @alias formatDate
1511
+ * @category Common Helpers
1512
+ * @summary Format the date.
1513
+ *
1514
+ * @description
1515
+ * Return the formatted date string in the given format. The result may vary by locale.
1516
+ *
1517
+ * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.
1518
+ * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md
1519
+ *
1520
+ * The characters wrapped between two single quotes characters (') are escaped.
1521
+ * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.
1522
+ * (see the last example)
1523
+ *
1524
+ * Format of the string is based on Unicode Technical Standard #35:
1525
+ * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
1526
+ * with a few additions (see note 7 below the table).
1527
+ *
1528
+ * Accepted patterns:
1529
+ * | Unit | Pattern | Result examples | Notes |
1530
+ * |---------------------------------|---------|-----------------------------------|-------|
1531
+ * | Era | G..GGG | AD, BC | |
1532
+ * | | GGGG | Anno Domini, Before Christ | 2 |
1533
+ * | | GGGGG | A, B | |
1534
+ * | Calendar year | y | 44, 1, 1900, 2017 | 5 |
1535
+ * | | yo | 44th, 1st, 0th, 17th | 5,7 |
1536
+ * | | yy | 44, 01, 00, 17 | 5 |
1537
+ * | | yyy | 044, 001, 1900, 2017 | 5 |
1538
+ * | | yyyy | 0044, 0001, 1900, 2017 | 5 |
1539
+ * | | yyyyy | ... | 3,5 |
1540
+ * | Local week-numbering year | Y | 44, 1, 1900, 2017 | 5 |
1541
+ * | | Yo | 44th, 1st, 1900th, 2017th | 5,7 |
1542
+ * | | YY | 44, 01, 00, 17 | 5,8 |
1543
+ * | | YYY | 044, 001, 1900, 2017 | 5 |
1544
+ * | | YYYY | 0044, 0001, 1900, 2017 | 5,8 |
1545
+ * | | YYYYY | ... | 3,5 |
1546
+ * | ISO week-numbering year | R | -43, 0, 1, 1900, 2017 | 5,7 |
1547
+ * | | RR | -43, 00, 01, 1900, 2017 | 5,7 |
1548
+ * | | RRR | -043, 000, 001, 1900, 2017 | 5,7 |
1549
+ * | | RRRR | -0043, 0000, 0001, 1900, 2017 | 5,7 |
1550
+ * | | RRRRR | ... | 3,5,7 |
1551
+ * | Extended year | u | -43, 0, 1, 1900, 2017 | 5 |
1552
+ * | | uu | -43, 01, 1900, 2017 | 5 |
1553
+ * | | uuu | -043, 001, 1900, 2017 | 5 |
1554
+ * | | uuuu | -0043, 0001, 1900, 2017 | 5 |
1555
+ * | | uuuuu | ... | 3,5 |
1556
+ * | Quarter (formatting) | Q | 1, 2, 3, 4 | |
1557
+ * | | Qo | 1st, 2nd, 3rd, 4th | 7 |
1558
+ * | | QQ | 01, 02, 03, 04 | |
1559
+ * | | QQQ | Q1, Q2, Q3, Q4 | |
1560
+ * | | QQQQ | 1st quarter, 2nd quarter, ... | 2 |
1561
+ * | | QQQQQ | 1, 2, 3, 4 | 4 |
1562
+ * | Quarter (stand-alone) | q | 1, 2, 3, 4 | |
1563
+ * | | qo | 1st, 2nd, 3rd, 4th | 7 |
1564
+ * | | qq | 01, 02, 03, 04 | |
1565
+ * | | qqq | Q1, Q2, Q3, Q4 | |
1566
+ * | | qqqq | 1st quarter, 2nd quarter, ... | 2 |
1567
+ * | | qqqqq | 1, 2, 3, 4 | 4 |
1568
+ * | Month (formatting) | M | 1, 2, ..., 12 | |
1569
+ * | | Mo | 1st, 2nd, ..., 12th | 7 |
1570
+ * | | MM | 01, 02, ..., 12 | |
1571
+ * | | MMM | Jan, Feb, ..., Dec | |
1572
+ * | | MMMM | January, February, ..., December | 2 |
1573
+ * | | MMMMM | J, F, ..., D | |
1574
+ * | Month (stand-alone) | L | 1, 2, ..., 12 | |
1575
+ * | | Lo | 1st, 2nd, ..., 12th | 7 |
1576
+ * | | LL | 01, 02, ..., 12 | |
1577
+ * | | LLL | Jan, Feb, ..., Dec | |
1578
+ * | | LLLL | January, February, ..., December | 2 |
1579
+ * | | LLLLL | J, F, ..., D | |
1580
+ * | Local week of year | w | 1, 2, ..., 53 | |
1581
+ * | | wo | 1st, 2nd, ..., 53th | 7 |
1582
+ * | | ww | 01, 02, ..., 53 | |
1583
+ * | ISO week of year | I | 1, 2, ..., 53 | 7 |
1584
+ * | | Io | 1st, 2nd, ..., 53th | 7 |
1585
+ * | | II | 01, 02, ..., 53 | 7 |
1586
+ * | Day of month | d | 1, 2, ..., 31 | |
1587
+ * | | do | 1st, 2nd, ..., 31st | 7 |
1588
+ * | | dd | 01, 02, ..., 31 | |
1589
+ * | Day of year | D | 1, 2, ..., 365, 366 | 9 |
1590
+ * | | Do | 1st, 2nd, ..., 365th, 366th | 7 |
1591
+ * | | DD | 01, 02, ..., 365, 366 | 9 |
1592
+ * | | DDD | 001, 002, ..., 365, 366 | |
1593
+ * | | DDDD | ... | 3 |
1594
+ * | Day of week (formatting) | E..EEE | Mon, Tue, Wed, ..., Sun | |
1595
+ * | | EEEE | Monday, Tuesday, ..., Sunday | 2 |
1596
+ * | | EEEEE | M, T, W, T, F, S, S | |
1597
+ * | | EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | |
1598
+ * | ISO day of week (formatting) | i | 1, 2, 3, ..., 7 | 7 |
1599
+ * | | io | 1st, 2nd, ..., 7th | 7 |
1600
+ * | | ii | 01, 02, ..., 07 | 7 |
1601
+ * | | iii | Mon, Tue, Wed, ..., Sun | 7 |
1602
+ * | | iiii | Monday, Tuesday, ..., Sunday | 2,7 |
1603
+ * | | iiiii | M, T, W, T, F, S, S | 7 |
1604
+ * | | iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 7 |
1605
+ * | Local day of week (formatting) | e | 2, 3, 4, ..., 1 | |
1606
+ * | | eo | 2nd, 3rd, ..., 1st | 7 |
1607
+ * | | ee | 02, 03, ..., 01 | |
1608
+ * | | eee | Mon, Tue, Wed, ..., Sun | |
1609
+ * | | eeee | Monday, Tuesday, ..., Sunday | 2 |
1610
+ * | | eeeee | M, T, W, T, F, S, S | |
1611
+ * | | eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | |
1612
+ * | Local day of week (stand-alone) | c | 2, 3, 4, ..., 1 | |
1613
+ * | | co | 2nd, 3rd, ..., 1st | 7 |
1614
+ * | | cc | 02, 03, ..., 01 | |
1615
+ * | | ccc | Mon, Tue, Wed, ..., Sun | |
1616
+ * | | cccc | Monday, Tuesday, ..., Sunday | 2 |
1617
+ * | | ccccc | M, T, W, T, F, S, S | |
1618
+ * | | cccccc | Mo, Tu, We, Th, Fr, Sa, Su | |
1619
+ * | AM, PM | a..aa | AM, PM | |
1620
+ * | | aaa | am, pm | |
1621
+ * | | aaaa | a.m., p.m. | 2 |
1622
+ * | | aaaaa | a, p | |
1623
+ * | AM, PM, noon, midnight | b..bb | AM, PM, noon, midnight | |
1624
+ * | | bbb | am, pm, noon, midnight | |
1625
+ * | | bbbb | a.m., p.m., noon, midnight | 2 |
1626
+ * | | bbbbb | a, p, n, mi | |
1627
+ * | Flexible day period | B..BBB | at night, in the morning, ... | |
1628
+ * | | BBBB | at night, in the morning, ... | 2 |
1629
+ * | | BBBBB | at night, in the morning, ... | |
1630
+ * | Hour [1-12] | h | 1, 2, ..., 11, 12 | |
1631
+ * | | ho | 1st, 2nd, ..., 11th, 12th | 7 |
1632
+ * | | hh | 01, 02, ..., 11, 12 | |
1633
+ * | Hour [0-23] | H | 0, 1, 2, ..., 23 | |
1634
+ * | | Ho | 0th, 1st, 2nd, ..., 23rd | 7 |
1635
+ * | | HH | 00, 01, 02, ..., 23 | |
1636
+ * | Hour [0-11] | K | 1, 2, ..., 11, 0 | |
1637
+ * | | Ko | 1st, 2nd, ..., 11th, 0th | 7 |
1638
+ * | | KK | 01, 02, ..., 11, 00 | |
1639
+ * | Hour [1-24] | k | 24, 1, 2, ..., 23 | |
1640
+ * | | ko | 24th, 1st, 2nd, ..., 23rd | 7 |
1641
+ * | | kk | 24, 01, 02, ..., 23 | |
1642
+ * | Minute | m | 0, 1, ..., 59 | |
1643
+ * | | mo | 0th, 1st, ..., 59th | 7 |
1644
+ * | | mm | 00, 01, ..., 59 | |
1645
+ * | Second | s | 0, 1, ..., 59 | |
1646
+ * | | so | 0th, 1st, ..., 59th | 7 |
1647
+ * | | ss | 00, 01, ..., 59 | |
1648
+ * | Fraction of second | S | 0, 1, ..., 9 | |
1649
+ * | | SS | 00, 01, ..., 99 | |
1650
+ * | | SSS | 000, 001, ..., 999 | |
1651
+ * | | SSSS | ... | 3 |
1652
+ * | Timezone (ISO-8601 w/ Z) | X | -08, +0530, Z | |
1653
+ * | | XX | -0800, +0530, Z | |
1654
+ * | | XXX | -08:00, +05:30, Z | |
1655
+ * | | XXXX | -0800, +0530, Z, +123456 | 2 |
1656
+ * | | XXXXX | -08:00, +05:30, Z, +12:34:56 | |
1657
+ * | Timezone (ISO-8601 w/o Z) | x | -08, +0530, +00 | |
1658
+ * | | xx | -0800, +0530, +0000 | |
1659
+ * | | xxx | -08:00, +05:30, +00:00 | 2 |
1660
+ * | | xxxx | -0800, +0530, +0000, +123456 | |
1661
+ * | | xxxxx | -08:00, +05:30, +00:00, +12:34:56 | |
1662
+ * | Timezone (GMT) | O...OOO | GMT-8, GMT+5:30, GMT+0 | |
1663
+ * | | OOOO | GMT-08:00, GMT+05:30, GMT+00:00 | 2 |
1664
+ * | Timezone (specific non-locat.) | z...zzz | GMT-8, GMT+5:30, GMT+0 | 6 |
1665
+ * | | zzzz | GMT-08:00, GMT+05:30, GMT+00:00 | 2,6 |
1666
+ * | Seconds timestamp | t | 512969520 | 7 |
1667
+ * | | tt | ... | 3,7 |
1668
+ * | Milliseconds timestamp | T | 512969520900 | 7 |
1669
+ * | | TT | ... | 3,7 |
1670
+ * | Long localized date | P | 04/29/1453 | 7 |
1671
+ * | | PP | Apr 29, 1453 | 7 |
1672
+ * | | PPP | April 29th, 1453 | 7 |
1673
+ * | | PPPP | Friday, April 29th, 1453 | 2,7 |
1674
+ * | Long localized time | p | 12:00 AM | 7 |
1675
+ * | | pp | 12:00:00 AM | 7 |
1676
+ * | | ppp | 12:00:00 AM GMT+2 | 7 |
1677
+ * | | pppp | 12:00:00 AM GMT+02:00 | 2,7 |
1678
+ * | Combination of date and time | Pp | 04/29/1453, 12:00 AM | 7 |
1679
+ * | | PPpp | Apr 29, 1453, 12:00:00 AM | 7 |
1680
+ * | | PPPppp | April 29th, 1453 at ... | 7 |
1681
+ * | | PPPPpppp| Friday, April 29th, 1453 at ... | 2,7 |
1682
+ * Notes:
1683
+ * 1. "Formatting" units (e.g. formatting quarter) in the default en-US locale
1684
+ * are the same as "stand-alone" units, but are different in some languages.
1685
+ * "Formatting" units are declined according to the rules of the language
1686
+ * in the context of a date. "Stand-alone" units are always nominative singular:
1687
+ *
1688
+ * `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`
1689
+ *
1690
+ * `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`
1691
+ *
1692
+ * 2. Any sequence of the identical letters is a pattern, unless it is escaped by
1693
+ * the single quote characters (see below).
1694
+ * If the sequence is longer than listed in table (e.g. `EEEEEEEEEEE`)
1695
+ * the output will be the same as default pattern for this unit, usually
1696
+ * the longest one (in case of ISO weekdays, `EEEE`). Default patterns for units
1697
+ * are marked with "2" in the last column of the table.
1698
+ *
1699
+ * `format(new Date(2017, 10, 6), 'MMM') //=> 'Nov'`
1700
+ *
1701
+ * `format(new Date(2017, 10, 6), 'MMMM') //=> 'November'`
1702
+ *
1703
+ * `format(new Date(2017, 10, 6), 'MMMMM') //=> 'N'`
1704
+ *
1705
+ * `format(new Date(2017, 10, 6), 'MMMMMM') //=> 'November'`
1706
+ *
1707
+ * `format(new Date(2017, 10, 6), 'MMMMMMM') //=> 'November'`
1708
+ *
1709
+ * 3. Some patterns could be unlimited length (such as `yyyyyyyy`).
1710
+ * The output will be padded with zeros to match the length of the pattern.
1711
+ *
1712
+ * `format(new Date(2017, 10, 6), 'yyyyyyyy') //=> '00002017'`
1713
+ *
1714
+ * 4. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.
1715
+ * These tokens represent the shortest form of the quarter.
1716
+ *
1717
+ * 5. The main difference between `y` and `u` patterns are B.C. years:
1718
+ *
1719
+ * | Year | `y` | `u` |
1720
+ * |------|-----|-----|
1721
+ * | AC 1 | 1 | 1 |
1722
+ * | BC 1 | 1 | 0 |
1723
+ * | BC 2 | 2 | -1 |
1724
+ *
1725
+ * Also `yy` always returns the last two digits of a year,
1726
+ * while `uu` pads single digit years to 2 characters and returns other years unchanged:
1727
+ *
1728
+ * | Year | `yy` | `uu` |
1729
+ * |------|------|------|
1730
+ * | 1 | 01 | 01 |
1731
+ * | 14 | 14 | 14 |
1732
+ * | 376 | 76 | 376 |
1733
+ * | 1453 | 53 | 1453 |
1734
+ *
1735
+ * The same difference is true for local and ISO week-numbering years (`Y` and `R`),
1736
+ * except local week-numbering years are dependent on `options.weekStartsOn`
1737
+ * and `options.firstWeekContainsDate` (compare [getISOWeekYear](https://date-fns.org/docs/getISOWeekYear)
1738
+ * and [getWeekYear](https://date-fns.org/docs/getWeekYear)).
1739
+ *
1740
+ * 6. Specific non-location timezones are currently unavailable in `date-fns`,
1741
+ * so right now these tokens fall back to GMT timezones.
1742
+ *
1743
+ * 7. These patterns are not in the Unicode Technical Standard #35:
1744
+ * - `i`: ISO day of week
1745
+ * - `I`: ISO week of year
1746
+ * - `R`: ISO week-numbering year
1747
+ * - `t`: seconds timestamp
1748
+ * - `T`: milliseconds timestamp
1749
+ * - `o`: ordinal number modifier
1750
+ * - `P`: long localized date
1751
+ * - `p`: long localized time
1752
+ *
1753
+ * 8. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.
1754
+ * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md
1755
+ *
1756
+ * 9. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.
1757
+ * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md
1758
+ *
1759
+ * @param date - The original date
1760
+ * @param format - The string of tokens
1761
+ * @param options - An object with options
1762
+ *
1763
+ * @returns The formatted date string
1764
+ *
1765
+ * @throws `date` must not be Invalid Date
1766
+ * @throws `options.locale` must contain `localize` property
1767
+ * @throws `options.locale` must contain `formatLong` property
1768
+ * @throws use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md
1769
+ * @throws use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md
1770
+ * @throws use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md
1771
+ * @throws use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md
1772
+ * @throws format string contains an unescaped latin alphabet character
1773
+ *
1774
+ * @example
1775
+ * // Represent 11 February 2014 in middle-endian format:
1776
+ * const result = format(new Date(2014, 1, 11), 'MM/dd/yyyy')
1777
+ * //=> '02/11/2014'
1778
+ *
1779
+ * @example
1780
+ * // Represent 2 July 2014 in Esperanto:
1781
+ * import { eoLocale } from 'date-fns/locale/eo'
1782
+ * const result = format(new Date(2014, 6, 2), "do 'de' MMMM yyyy", {
1783
+ * locale: eoLocale
1784
+ * })
1785
+ * //=> '2-a de julio 2014'
1786
+ *
1787
+ * @example
1788
+ * // Escape string by single quote characters:
1789
+ * const result = format(new Date(2014, 6, 2, 15), "h 'o''clock'")
1790
+ * //=> "3 o'clock"
1791
+ */
1792
+ function format(date, formatStr, options) {
1793
+ const defaultOptions = getDefaultOptions();
1794
+ const locale = options?.locale ?? defaultOptions.locale ?? enUS;
1795
+ const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions.firstWeekContainsDate ?? defaultOptions.locale?.options?.firstWeekContainsDate ?? 1;
1796
+ const weekStartsOn = options?.weekStartsOn ?? options?.locale?.options?.weekStartsOn ?? defaultOptions.weekStartsOn ?? defaultOptions.locale?.options?.weekStartsOn ?? 0;
1797
+ const originalDate = toDate(date, options?.in);
1798
+ if (!isValid(originalDate)) throw new RangeError("Invalid time value");
1799
+ let parts = formatStr.match(longFormattingTokensRegExp).map((substring) => {
1800
+ const firstCharacter = substring[0];
1801
+ if (firstCharacter === "p" || firstCharacter === "P") {
1802
+ const longFormatter = longFormatters[firstCharacter];
1803
+ return longFormatter(substring, locale.formatLong);
1804
+ }
1805
+ return substring;
1806
+ }).join("").match(formattingTokensRegExp).map((substring) => {
1807
+ if (substring === "''") return {
1808
+ isToken: false,
1809
+ value: "'"
1810
+ };
1811
+ const firstCharacter = substring[0];
1812
+ if (firstCharacter === "'") return {
1813
+ isToken: false,
1814
+ value: cleanEscapedString(substring)
1815
+ };
1816
+ if (formatters[firstCharacter]) return {
1817
+ isToken: true,
1818
+ value: substring
1819
+ };
1820
+ if (firstCharacter.match(unescapedLatinCharacterRegExp)) throw new RangeError("Format string contains an unescaped latin alphabet character `" + firstCharacter + "`");
1821
+ return {
1822
+ isToken: false,
1823
+ value: substring
1824
+ };
1825
+ });
1826
+ if (locale.localize.preprocessor) parts = locale.localize.preprocessor(originalDate, parts);
1827
+ const formatterOptions = {
1828
+ firstWeekContainsDate,
1829
+ weekStartsOn,
1830
+ locale
1831
+ };
1832
+ return parts.map((part) => {
1833
+ if (!part.isToken) return part.value;
1834
+ const token = part.value;
1835
+ if (!options?.useAdditionalWeekYearTokens && isProtectedWeekYearToken(token) || !options?.useAdditionalDayOfYearTokens && isProtectedDayOfYearToken(token)) warnOrThrowProtectedError(token, formatStr, String(date));
1836
+ const formatter = formatters[token[0]];
1837
+ return formatter(originalDate, token, locale.localize, formatterOptions);
1838
+ }).join("");
1839
+ }
1840
+ function cleanEscapedString(input) {
1841
+ const matched = input.match(escapedStringRegExp);
1842
+ if (!matched) return input;
1843
+ return matched[1].replace(doubleQuoteRegExp, "'");
1844
+ }
1845
+ //#endregion
1846
+ export { format as t };
1847
+
1848
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LUJicm4yYmdvLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2RlZmF1bHRPcHRpb25zLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZXZWVrLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZJU09XZWVrLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldElTT1dlZWtZZWFyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZJU09XZWVrWWVhci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mWWVhci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9mb3JtYXREaXN0YW5jZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvX2xpYi9idWlsZEZvcm1hdExvbmdGbi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9mb3JtYXRMb25nLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdFJlbGF0aXZlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9fbGliL2J1aWxkTG9jYWxpemVGbi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9sb2NhbGl6ZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvX2xpYi9idWlsZE1hdGNoRm4uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL19saWIvYnVpbGRNYXRjaFBhdHRlcm5Gbi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9tYXRjaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGF5T2ZZZWFyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldElTT1dlZWsuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0V2Vla1llYXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZldlZWtZZWFyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFdlZWsuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9hZGRMZWFkaW5nWmVyb3MuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9mb3JtYXQvbGlnaHRGb3JtYXR0ZXJzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZm9ybWF0L2Zvcm1hdHRlcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9mb3JtYXQvbG9uZ0Zvcm1hdHRlcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9wcm90ZWN0ZWRUb2tlbnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImxldCBkZWZhdWx0T3B0aW9ucyA9IHt9O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdE9wdGlvbnMoKSB7XG4gIHJldHVybiBkZWZhdWx0T3B0aW9ucztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRPcHRpb25zKG5ld09wdGlvbnMpIHtcbiAgZGVmYXVsdE9wdGlvbnMgPSBuZXdPcHRpb25zO1xufVxuIiwiaW1wb3J0IHsgZ2V0RGVmYXVsdE9wdGlvbnMgfSBmcm9tIFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN0YXJ0T2ZXZWVrfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgc3RhcnRPZldlZWtcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKiBAdHlwZVBhcmFtIFJlc3VsdERhdGUgLSBUaGUgcmVzdWx0IGBEYXRlYCB0eXBlLCBpdCBpcyB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBjb250ZXh0IGZ1bmN0aW9uIGlmIGl0IGlzIHBhc3NlZCwgb3IgaW5mZXJyZWQgZnJvbSB0aGUgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgd2VlayBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IFN1biBBdWcgMzEgMjAxNCAwMDowMDowMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJZiB0aGUgd2VlayBzdGFydHMgb24gTW9uZGF5LCB0aGUgc3RhcnQgb2YgdGhlIHdlZWsgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mV2VlayhuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApLCB7IHdlZWtTdGFydHNPbjogMSB9KVxuICogLy89PiBNb24gU2VwIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZXZWVrKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0aW9ucygpO1xuICBjb25zdCB3ZWVrU3RhcnRzT24gPVxuICAgIG9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICAwO1xuXG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgZGF5ID0gX2RhdGUuZ2V0RGF5KCk7XG4gIGNvbnN0IGRpZmYgPSAoZGF5IDwgd2Vla1N0YXJ0c09uID8gNyA6IDApICsgZGF5IC0gd2Vla1N0YXJ0c09uO1xuXG4gIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpIC0gZGlmZik7XG4gIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gX2RhdGU7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgc3RhcnRPZldlZWs7XG4iLCJpbXBvcnQgeyBzdGFydE9mV2VlayB9IGZyb20gXCIuL3N0YXJ0T2ZXZWVrLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBzdGFydE9mSVNPV2Vla30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZJU09XZWVrXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhbiBJU08gd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYW4gSVNPIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZklTT1dlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydE9mSVNPV2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIHJldHVybiBzdGFydE9mV2VlayhkYXRlLCB7IC4uLm9wdGlvbnMsIHdlZWtTdGFydHNPbjogMSB9KTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBzdGFydE9mSVNPV2VlaztcbiIsImltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tIFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCI7XG5pbXBvcnQgeyBzdGFydE9mSVNPV2VlayB9IGZyb20gXCIuL3N0YXJ0T2ZJU09XZWVrLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGdldElTT1dlZWtZZWFyfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgZ2V0SVNPV2Vla1llYXJcbiAqIEBjYXRlZ29yeSBJU08gV2Vlay1OdW1iZXJpbmcgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBJU08gd2Vlay1udW1iZXJpbmcgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZSxcbiAqIHdoaWNoIGFsd2F5cyBzdGFydHMgMyBkYXlzIGJlZm9yZSB0aGUgeWVhcidzIGZpcnN0IFRodXJzZGF5LlxuICpcbiAqIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIElTTy13ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDIgSmFudWFyeSAyMDA1P1xuICogY29uc3QgcmVzdWx0ID0gZ2V0SVNPV2Vla1llYXIobmV3IERhdGUoMjAwNSwgMCwgMikpXG4gKiAvLz0+IDIwMDRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldElTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTtcblxuICBjb25zdCBmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyID0gY29uc3RydWN0RnJvbShfZGF0ZSwgMCk7XG4gIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIDQpO1xuICBmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBzdGFydE9mTmV4dFllYXIgPSBzdGFydE9mSVNPV2Vlayhmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyKTtcblxuICBjb25zdCBmb3VydGhPZkphbnVhcnlPZlRoaXNZZWFyID0gY29uc3RydWN0RnJvbShfZGF0ZSwgMCk7XG4gIGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIuc2V0RnVsbFllYXIoeWVhciwgMCwgNCk7XG4gIGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IHN0YXJ0T2ZUaGlzWWVhciA9IHN0YXJ0T2ZJU09XZWVrKGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIpO1xuXG4gIGlmIChfZGF0ZS5nZXRUaW1lKCkgPj0gc3RhcnRPZk5leHRZZWFyLmdldFRpbWUoKSkge1xuICAgIHJldHVybiB5ZWFyICsgMTtcbiAgfSBlbHNlIGlmIChfZGF0ZS5nZXRUaW1lKCkgPj0gc3RhcnRPZlRoaXNZZWFyLmdldFRpbWUoKSkge1xuICAgIHJldHVybiB5ZWFyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB5ZWFyIC0gMTtcbiAgfVxufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGdldElTT1dlZWtZZWFyO1xuIiwiaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuL2NvbnN0cnVjdEZyb20uanNcIjtcbmltcG9ydCB7IGdldElTT1dlZWtZZWFyIH0gZnJvbSBcIi4vZ2V0SVNPV2Vla1llYXIuanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZJU09XZWVrIH0gZnJvbSBcIi4vc3RhcnRPZklTT1dlZWsuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN0YXJ0T2ZJU09XZWVrWWVhcn0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZJU09XZWVrWWVhclxuICogQGNhdGVnb3J5IElTTyBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYW4gSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhbiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcixcbiAqIHdoaWNoIGFsd2F5cyBzdGFydHMgMyBkYXlzIGJlZm9yZSB0aGUgeWVhcidzIGZpcnN0IFRodXJzZGF5LlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcjogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKiBAdHlwZVBhcmFtIFJlc3VsdERhdGUgLSBUaGUgcmVzdWx0IGBEYXRlYCB0eXBlLCBpdCBpcyB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBjb250ZXh0IGZ1bmN0aW9uIGlmIGl0IGlzIHBhc3NlZCwgb3IgaW5mZXJyZWQgZnJvbSB0aGUgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhbiBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYW4gSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIDIgSnVseSAyMDA1OlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZklTT1dlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDYsIDIpKVxuICogLy89PiBNb24gSmFuIDAzIDIwMDUgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZJU09XZWVrWWVhcihkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IHllYXIgPSBnZXRJU09XZWVrWWVhcihkYXRlLCBvcHRpb25zKTtcbiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5ID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTtcbiAgZm91cnRoT2ZKYW51YXJ5LnNldEZ1bGxZZWFyKHllYXIsIDAsIDQpO1xuICBmb3VydGhPZkphbnVhcnkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBzdGFydE9mSVNPV2Vlayhmb3VydGhPZkphbnVhcnkpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0T2ZJU09XZWVrWWVhcjtcbiIsImltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgc3RhcnRPZlllYXJ9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mWWVhclxuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0RGF0ZSAtIFRoZSByZXN1bHQgYERhdGVgIHR5cGUsIGl0IGlzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIGNvbnRleHQgZnVuY3Rpb24gaWYgaXQgaXMgcGFzc2VkLCBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgeWVhciBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZZZWFyKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMDApKVxuICogLy89PiBXZWQgSmFuIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZZZWFyKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBkYXRlXy5zZXRGdWxsWWVhcihkYXRlXy5nZXRGdWxsWWVhcigpLCAwLCAxKTtcbiAgZGF0ZV8uc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBkYXRlXztcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBzdGFydE9mWWVhcjtcbiIsImNvbnN0IGZvcm1hdERpc3RhbmNlTG9jYWxlID0ge1xuICBsZXNzVGhhblhTZWNvbmRzOiB7XG4gICAgb25lOiBcImxlc3MgdGhhbiBhIHNlY29uZFwiLFxuICAgIG90aGVyOiBcImxlc3MgdGhhbiB7e2NvdW50fX0gc2Vjb25kc1wiLFxuICB9LFxuXG4gIHhTZWNvbmRzOiB7XG4gICAgb25lOiBcIjEgc2Vjb25kXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IHNlY29uZHNcIixcbiAgfSxcblxuICBoYWxmQU1pbnV0ZTogXCJoYWxmIGEgbWludXRlXCIsXG5cbiAgbGVzc1RoYW5YTWludXRlczoge1xuICAgIG9uZTogXCJsZXNzIHRoYW4gYSBtaW51dGVcIixcbiAgICBvdGhlcjogXCJsZXNzIHRoYW4ge3tjb3VudH19IG1pbnV0ZXNcIixcbiAgfSxcblxuICB4TWludXRlczoge1xuICAgIG9uZTogXCIxIG1pbnV0ZVwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSBtaW51dGVzXCIsXG4gIH0sXG5cbiAgYWJvdXRYSG91cnM6IHtcbiAgICBvbmU6IFwiYWJvdXQgMSBob3VyXCIsXG4gICAgb3RoZXI6IFwiYWJvdXQge3tjb3VudH19IGhvdXJzXCIsXG4gIH0sXG5cbiAgeEhvdXJzOiB7XG4gICAgb25lOiBcIjEgaG91clwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSBob3Vyc1wiLFxuICB9LFxuXG4gIHhEYXlzOiB7XG4gICAgb25lOiBcIjEgZGF5XCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IGRheXNcIixcbiAgfSxcblxuICBhYm91dFhXZWVrczoge1xuICAgIG9uZTogXCJhYm91dCAxIHdlZWtcIixcbiAgICBvdGhlcjogXCJhYm91dCB7e2NvdW50fX0gd2Vla3NcIixcbiAgfSxcblxuICB4V2Vla3M6IHtcbiAgICBvbmU6IFwiMSB3ZWVrXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IHdlZWtzXCIsXG4gIH0sXG5cbiAgYWJvdXRYTW9udGhzOiB7XG4gICAgb25lOiBcImFib3V0IDEgbW9udGhcIixcbiAgICBvdGhlcjogXCJhYm91dCB7e2NvdW50fX0gbW9udGhzXCIsXG4gIH0sXG5cbiAgeE1vbnRoczoge1xuICAgIG9uZTogXCIxIG1vbnRoXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IG1vbnRoc1wiLFxuICB9LFxuXG4gIGFib3V0WFllYXJzOiB7XG4gICAgb25lOiBcImFib3V0IDEgeWVhclwiLFxuICAgIG90aGVyOiBcImFib3V0IHt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxuXG4gIHhZZWFyczoge1xuICAgIG9uZTogXCIxIHllYXJcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0geWVhcnNcIixcbiAgfSxcblxuICBvdmVyWFllYXJzOiB7XG4gICAgb25lOiBcIm92ZXIgMSB5ZWFyXCIsXG4gICAgb3RoZXI6IFwib3ZlciB7e2NvdW50fX0geWVhcnNcIixcbiAgfSxcblxuICBhbG1vc3RYWWVhcnM6IHtcbiAgICBvbmU6IFwiYWxtb3N0IDEgeWVhclwiLFxuICAgIG90aGVyOiBcImFsbW9zdCB7e2NvdW50fX0geWVhcnNcIixcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXREaXN0YW5jZSA9ICh0b2tlbiwgY291bnQsIG9wdGlvbnMpID0+IHtcbiAgbGV0IHJlc3VsdDtcblxuICBjb25zdCB0b2tlblZhbHVlID0gZm9ybWF0RGlzdGFuY2VMb2NhbGVbdG9rZW5dO1xuICBpZiAodHlwZW9mIHRva2VuVmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlO1xuICB9IGVsc2UgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgcmVzdWx0ID0gdG9rZW5WYWx1ZS5vbmU7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gdG9rZW5WYWx1ZS5vdGhlci5yZXBsYWNlKFwie3tjb3VudH19XCIsIGNvdW50LnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnM/LmFkZFN1ZmZpeCkge1xuICAgIGlmIChvcHRpb25zLmNvbXBhcmlzb24gJiYgb3B0aW9ucy5jb21wYXJpc29uID4gMCkge1xuICAgICAgcmV0dXJuIFwiaW4gXCIgKyByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyBcIiBhZ29cIjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZEZvcm1hdExvbmdGbihhcmdzKSB7XG4gIHJldHVybiAob3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgLy8gVE9ETzogUmVtb3ZlIFN0cmluZygpXG4gICAgY29uc3Qgd2lkdGggPSBvcHRpb25zLndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogYXJncy5kZWZhdWx0V2lkdGg7XG4gICAgY29uc3QgZm9ybWF0ID0gYXJncy5mb3JtYXRzW3dpZHRoXSB8fCBhcmdzLmZvcm1hdHNbYXJncy5kZWZhdWx0V2lkdGhdO1xuICAgIHJldHVybiBmb3JtYXQ7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBidWlsZEZvcm1hdExvbmdGbiB9IGZyb20gXCIuLi8uLi9fbGliL2J1aWxkRm9ybWF0TG9uZ0ZuLmpzXCI7XG5cbmNvbnN0IGRhdGVGb3JtYXRzID0ge1xuICBmdWxsOiBcIkVFRUUsIE1NTU0gZG8sIHlcIixcbiAgbG9uZzogXCJNTU1NIGRvLCB5XCIsXG4gIG1lZGl1bTogXCJNTU0gZCwgeVwiLFxuICBzaG9ydDogXCJNTS9kZC95eXl5XCIsXG59O1xuXG5jb25zdCB0aW1lRm9ybWF0cyA9IHtcbiAgZnVsbDogXCJoOm1tOnNzIGEgenp6elwiLFxuICBsb25nOiBcImg6bW06c3MgYSB6XCIsXG4gIG1lZGl1bTogXCJoOm1tOnNzIGFcIixcbiAgc2hvcnQ6IFwiaDptbSBhXCIsXG59O1xuXG5jb25zdCBkYXRlVGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwie3tkYXRlfX0gJ2F0JyB7e3RpbWV9fVwiLFxuICBsb25nOiBcInt7ZGF0ZX19ICdhdCcge3t0aW1lfX1cIixcbiAgbWVkaXVtOiBcInt7ZGF0ZX19LCB7e3RpbWV9fVwiLFxuICBzaG9ydDogXCJ7e2RhdGV9fSwge3t0aW1lfX1cIixcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRMb25nID0ge1xuICBkYXRlOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogZGF0ZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG5cbiAgdGltZTogYnVpbGRGb3JtYXRMb25nRm4oe1xuICAgIGZvcm1hdHM6IHRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxuXG4gIGRhdGVUaW1lOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogZGF0ZVRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxufTtcbiIsImNvbnN0IGZvcm1hdFJlbGF0aXZlTG9jYWxlID0ge1xuICBsYXN0V2VlazogXCInbGFzdCcgZWVlZSAnYXQnIHBcIixcbiAgeWVzdGVyZGF5OiBcIid5ZXN0ZXJkYXkgYXQnIHBcIixcbiAgdG9kYXk6IFwiJ3RvZGF5IGF0JyBwXCIsXG4gIHRvbW9ycm93OiBcIid0b21vcnJvdyBhdCcgcFwiLFxuICBuZXh0V2VlazogXCJlZWVlICdhdCcgcFwiLFxuICBvdGhlcjogXCJQXCIsXG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0UmVsYXRpdmUgPSAodG9rZW4sIF9kYXRlLCBfYmFzZURhdGUsIF9vcHRpb25zKSA9PlxuICBmb3JtYXRSZWxhdGl2ZUxvY2FsZVt0b2tlbl07XG4iLCIvKipcbiAqIFRoZSBsb2NhbGl6ZSBmdW5jdGlvbiBhcmd1bWVudCBjYWxsYmFjayB3aGljaCBhbGxvd3MgdG8gY29udmVydCByYXcgdmFsdWUgdG9cbiAqIHRoZSBhY3R1YWwgdHlwZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY29udmVydFxuICpcbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgdmFsdWVcbiAqL1xuXG4vKipcbiAqIFRoZSBtYXAgb2YgbG9jYWxpemVkIHZhbHVlcyBmb3IgZWFjaCB3aWR0aC5cbiAqL1xuXG4vKipcbiAqIFRoZSBpbmRleCB0eXBlIG9mIHRoZSBsb2NhbGUgdW5pdCB2YWx1ZS4gSXQgdHlwZXMgY29udmVyc2lvbiBvZiB1bml0cyBvZlxuICogdmFsdWVzIHRoYXQgZG9uJ3Qgc3RhcnQgYXQgMCAoaS5lLiBxdWFydGVycykuXG4gKi9cblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgdW5pdCB2YWx1ZSB0byB0aGUgdHVwbGUgb2YgdmFsdWVzLlxuICovXG5cbi8qKlxuICogVGhlIHR1cGxlIG9mIGxvY2FsaXplZCBlcmEgdmFsdWVzLiBUaGUgZmlyc3QgZWxlbWVudCByZXByZXNlbnRzIEJDLFxuICogdGhlIHNlY29uZCBlbGVtZW50IHJlcHJlc2VudHMgQUQuXG4gKi9cblxuLyoqXG4gKiBUaGUgdHVwbGUgb2YgbG9jYWxpemVkIHF1YXJ0ZXIgdmFsdWVzLiBUaGUgZmlyc3QgZWxlbWVudCByZXByZXNlbnRzIFExLlxuICovXG5cbi8qKlxuICogVGhlIHR1cGxlIG9mIGxvY2FsaXplZCBkYXkgdmFsdWVzLiBUaGUgZmlyc3QgZWxlbWVudCByZXByZXNlbnRzIFN1bmRheS5cbiAqL1xuXG4vKipcbiAqIFRoZSB0dXBsZSBvZiBsb2NhbGl6ZWQgbW9udGggdmFsdWVzLiBUaGUgZmlyc3QgZWxlbWVudCByZXByZXNlbnRzIEphbnVhcnkuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTG9jYWxpemVGbihhcmdzKSB7XG4gIHJldHVybiAodmFsdWUsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gb3B0aW9ucz8uY29udGV4dCA/IFN0cmluZyhvcHRpb25zLmNvbnRleHQpIDogXCJzdGFuZGFsb25lXCI7XG5cbiAgICBsZXQgdmFsdWVzQXJyYXk7XG4gICAgaWYgKGNvbnRleHQgPT09IFwiZm9ybWF0dGluZ1wiICYmIGFyZ3MuZm9ybWF0dGluZ1ZhbHVlcykge1xuICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gYXJncy5kZWZhdWx0Rm9ybWF0dGluZ1dpZHRoIHx8IGFyZ3MuZGVmYXVsdFdpZHRoO1xuICAgICAgY29uc3Qgd2lkdGggPSBvcHRpb25zPy53aWR0aCA/IFN0cmluZyhvcHRpb25zLndpZHRoKSA6IGRlZmF1bHRXaWR0aDtcblxuICAgICAgdmFsdWVzQXJyYXkgPVxuICAgICAgICBhcmdzLmZvcm1hdHRpbmdWYWx1ZXNbd2lkdGhdIHx8IGFyZ3MuZm9ybWF0dGluZ1ZhbHVlc1tkZWZhdWx0V2lkdGhdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkZWZhdWx0V2lkdGggPSBhcmdzLmRlZmF1bHRXaWR0aDtcbiAgICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucz8ud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBhcmdzLmRlZmF1bHRXaWR0aDtcblxuICAgICAgdmFsdWVzQXJyYXkgPSBhcmdzLnZhbHVlc1t3aWR0aF0gfHwgYXJncy52YWx1ZXNbZGVmYXVsdFdpZHRoXTtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSBhcmdzLmFyZ3VtZW50Q2FsbGJhY2sgPyBhcmdzLmFyZ3VtZW50Q2FsbGJhY2sodmFsdWUpIDogdmFsdWU7XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gRm9yIHNvbWUgcmVhc29uIFR5cGVTY3JpcHQganVzdCBkb24ndCB3YW50IHRvIG1hdGNoIGl0LCBubyBtYXR0ZXIgaG93IGhhcmQgd2UgdHJ5LiBJIGNoYWxsZW5nZSB5b3UgdG8gdHJ5IHRvIHJlbW92ZSBpdCFcbiAgICByZXR1cm4gdmFsdWVzQXJyYXlbaW5kZXhdO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgYnVpbGRMb2NhbGl6ZUZuIH0gZnJvbSBcIi4uLy4uL19saWIvYnVpbGRMb2NhbGl6ZUZuLmpzXCI7XG5cbmNvbnN0IGVyYVZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCJCXCIsIFwiQVwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIkJDXCIsIFwiQURcIl0sXG4gIHdpZGU6IFtcIkJlZm9yZSBDaHJpc3RcIiwgXCJBbm5vIERvbWluaVwiXSxcbn07XG5cbmNvbnN0IHF1YXJ0ZXJWYWx1ZXMgPSB7XG4gIG5hcnJvdzogW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIlExXCIsIFwiUTJcIiwgXCJRM1wiLCBcIlE0XCJdLFxuICB3aWRlOiBbXCIxc3QgcXVhcnRlclwiLCBcIjJuZCBxdWFydGVyXCIsIFwiM3JkIHF1YXJ0ZXJcIiwgXCI0dGggcXVhcnRlclwiXSxcbn07XG5cbi8vIE5vdGU6IGluIEVuZ2xpc2gsIHRoZSBuYW1lcyBvZiBkYXlzIG9mIHRoZSB3ZWVrIGFuZCBtb250aHMgYXJlIGNhcGl0YWxpemVkLlxuLy8gSWYgeW91IGFyZSBtYWtpbmcgYSBuZXcgbG9jYWxlIGJhc2VkIG9uIHRoaXMgb25lLCBjaGVjayBpZiB0aGUgc2FtZSBpcyB0cnVlIGZvciB0aGUgbGFuZ3VhZ2UgeW91J3JlIHdvcmtpbmcgb24uXG4vLyBHZW5lcmFsbHksIGZvcm1hdHRlZCBkYXRlcyBzaG91bGQgbG9vayBsaWtlIHRoZXkgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBzZW50ZW5jZSxcbi8vIGUuZy4gaW4gU3BhbmlzaCBsYW5ndWFnZSB0aGUgd2Vla2RheXMgYW5kIG1vbnRocyBzaG91bGQgYmUgaW4gdGhlIGxvd2VyY2FzZS5cbmNvbnN0IG1vbnRoVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIkpcIiwgXCJGXCIsIFwiTVwiLCBcIkFcIiwgXCJNXCIsIFwiSlwiLCBcIkpcIiwgXCJBXCIsIFwiU1wiLCBcIk9cIiwgXCJOXCIsIFwiRFwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcbiAgICBcIkphblwiLFxuICAgIFwiRmViXCIsXG4gICAgXCJNYXJcIixcbiAgICBcIkFwclwiLFxuICAgIFwiTWF5XCIsXG4gICAgXCJKdW5cIixcbiAgICBcIkp1bFwiLFxuICAgIFwiQXVnXCIsXG4gICAgXCJTZXBcIixcbiAgICBcIk9jdFwiLFxuICAgIFwiTm92XCIsXG4gICAgXCJEZWNcIixcbiAgXSxcblxuICB3aWRlOiBbXG4gICAgXCJKYW51YXJ5XCIsXG4gICAgXCJGZWJydWFyeVwiLFxuICAgIFwiTWFyY2hcIixcbiAgICBcIkFwcmlsXCIsXG4gICAgXCJNYXlcIixcbiAgICBcIkp1bmVcIixcbiAgICBcIkp1bHlcIixcbiAgICBcIkF1Z3VzdFwiLFxuICAgIFwiU2VwdGVtYmVyXCIsXG4gICAgXCJPY3RvYmVyXCIsXG4gICAgXCJOb3ZlbWJlclwiLFxuICAgIFwiRGVjZW1iZXJcIixcbiAgXSxcbn07XG5cbmNvbnN0IGRheVZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCJTXCIsIFwiTVwiLCBcIlRcIiwgXCJXXCIsIFwiVFwiLCBcIkZcIiwgXCJTXCJdLFxuICBzaG9ydDogW1wiU3VcIiwgXCJNb1wiLCBcIlR1XCIsIFwiV2VcIiwgXCJUaFwiLCBcIkZyXCIsIFwiU2FcIl0sXG4gIGFiYnJldmlhdGVkOiBbXCJTdW5cIiwgXCJNb25cIiwgXCJUdWVcIiwgXCJXZWRcIiwgXCJUaHVcIiwgXCJGcmlcIiwgXCJTYXRcIl0sXG4gIHdpZGU6IFtcbiAgICBcIlN1bmRheVwiLFxuICAgIFwiTW9uZGF5XCIsXG4gICAgXCJUdWVzZGF5XCIsXG4gICAgXCJXZWRuZXNkYXlcIixcbiAgICBcIlRodXJzZGF5XCIsXG4gICAgXCJGcmlkYXlcIixcbiAgICBcIlNhdHVyZGF5XCIsXG4gIF0sXG59O1xuXG5jb25zdCBkYXlQZXJpb2RWYWx1ZXMgPSB7XG4gIG5hcnJvdzoge1xuICAgIGFtOiBcImFcIixcbiAgICBwbTogXCJwXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlcIixcbiAgICBub29uOiBcIm5cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbiAgYWJicmV2aWF0ZWQ6IHtcbiAgICBhbTogXCJBTVwiLFxuICAgIHBtOiBcIlBNXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbiAgd2lkZToge1xuICAgIGFtOiBcImEubS5cIixcbiAgICBwbTogXCJwLm0uXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbn07XG5cbmNvbnN0IGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMgPSB7XG4gIG5hcnJvdzoge1xuICAgIGFtOiBcImFcIixcbiAgICBwbTogXCJwXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlcIixcbiAgICBub29uOiBcIm5cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbiAgYWJicmV2aWF0ZWQ6IHtcbiAgICBhbTogXCJBTVwiLFxuICAgIHBtOiBcIlBNXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbiAgd2lkZToge1xuICAgIGFtOiBcImEubS5cIixcbiAgICBwbTogXCJwLm0uXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbn07XG5cbmNvbnN0IG9yZGluYWxOdW1iZXIgPSAoZGlydHlOdW1iZXIsIF9vcHRpb25zKSA9PiB7XG4gIGNvbnN0IG51bWJlciA9IE51bWJlcihkaXJ0eU51bWJlcik7XG5cbiAgLy8gSWYgb3JkaW5hbCBudW1iZXJzIGRlcGVuZCBvbiBjb250ZXh0LCBmb3IgZXhhbXBsZSxcbiAgLy8gaWYgdGhleSBhcmUgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgZ3JhbW1hdGljYWwgZ2VuZGVycyxcbiAgLy8gdXNlIGBvcHRpb25zLnVuaXRgLlxuICAvL1xuICAvLyBgdW5pdGAgY2FuIGJlICd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXRlJywgJ2RheU9mWWVhcicsXG4gIC8vICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJy5cblxuICBjb25zdCByZW0xMDAgPSBudW1iZXIgJSAxMDA7XG4gIGlmIChyZW0xMDAgPiAyMCB8fCByZW0xMDAgPCAxMCkge1xuICAgIHN3aXRjaCAocmVtMTAwICUgMTApIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwic3RcIjtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwibmRcIjtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwicmRcIjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bWJlciArIFwidGhcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBsb2NhbGl6ZSA9IHtcbiAgb3JkaW5hbE51bWJlcixcblxuICBlcmE6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBlcmFWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgcXVhcnRlcjogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IHF1YXJ0ZXJWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgICBhcmd1bWVudENhbGxiYWNrOiAocXVhcnRlcikgPT4gcXVhcnRlciAtIDEsXG4gIH0pLFxuXG4gIG1vbnRoOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogbW9udGhWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgZGF5OiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogZGF5VmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxuXG4gIGRheVBlcmlvZDogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IGRheVBlcmlvZFZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICAgIGZvcm1hdHRpbmdWYWx1ZXM6IGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMsXG4gICAgZGVmYXVsdEZvcm1hdHRpbmdXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxufTtcbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZE1hdGNoRm4oYXJncykge1xuICByZXR1cm4gKHN0cmluZywgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgY29uc3Qgd2lkdGggPSBvcHRpb25zLndpZHRoO1xuXG4gICAgY29uc3QgbWF0Y2hQYXR0ZXJuID1cbiAgICAgICh3aWR0aCAmJiBhcmdzLm1hdGNoUGF0dGVybnNbd2lkdGhdKSB8fFxuICAgICAgYXJncy5tYXRjaFBhdHRlcm5zW2FyZ3MuZGVmYXVsdE1hdGNoV2lkdGhdO1xuICAgIGNvbnN0IG1hdGNoUmVzdWx0ID0gc3RyaW5nLm1hdGNoKG1hdGNoUGF0dGVybik7XG5cbiAgICBpZiAoIW1hdGNoUmVzdWx0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2hlZFN0cmluZyA9IG1hdGNoUmVzdWx0WzBdO1xuXG4gICAgY29uc3QgcGFyc2VQYXR0ZXJucyA9XG4gICAgICAod2lkdGggJiYgYXJncy5wYXJzZVBhdHRlcm5zW3dpZHRoXSkgfHxcbiAgICAgIGFyZ3MucGFyc2VQYXR0ZXJuc1thcmdzLmRlZmF1bHRQYXJzZVdpZHRoXTtcblxuICAgIGNvbnN0IGtleSA9IEFycmF5LmlzQXJyYXkocGFyc2VQYXR0ZXJucylcbiAgICAgID8gZmluZEluZGV4KHBhcnNlUGF0dGVybnMsIChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3QobWF0Y2hlZFN0cmluZykpXG4gICAgICA6IC8vIFtUT0RPXSAtLSBJIGNoYWxsZW5nZSB5b3UgdG8gZml4IHRoZSB0eXBlXG4gICAgICAgIGZpbmRLZXkocGFyc2VQYXR0ZXJucywgKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChtYXRjaGVkU3RyaW5nKSk7XG5cbiAgICBsZXQgdmFsdWU7XG5cbiAgICB2YWx1ZSA9IGFyZ3MudmFsdWVDYWxsYmFjayA/IGFyZ3MudmFsdWVDYWxsYmFjayhrZXkpIDoga2V5O1xuICAgIHZhbHVlID0gb3B0aW9ucy52YWx1ZUNhbGxiYWNrXG4gICAgICA/IC8vIFtUT0RPXSAtLSBJIGNoYWxsZW5nZSB5b3UgdG8gZml4IHRoZSB0eXBlXG4gICAgICAgIG9wdGlvbnMudmFsdWVDYWxsYmFjayh2YWx1ZSlcbiAgICAgIDogdmFsdWU7XG5cbiAgICBjb25zdCByZXN0ID0gc3RyaW5nLnNsaWNlKG1hdGNoZWRTdHJpbmcubGVuZ3RoKTtcblxuICAgIHJldHVybiB7IHZhbHVlLCByZXN0IH07XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpbmRLZXkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgaWYgKFxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJlxuICAgICAgcHJlZGljYXRlKG9iamVjdFtrZXldKVxuICAgICkge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgZm9yIChsZXQga2V5ID0gMDsga2V5IDwgYXJyYXkubGVuZ3RoOyBrZXkrKykge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlba2V5XSkpIHtcbiAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRNYXRjaFBhdHRlcm5GbihhcmdzKSB7XG4gIHJldHVybiAoc3RyaW5nLCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHN0cmluZy5tYXRjaChhcmdzLm1hdGNoUGF0dGVybik7XG4gICAgaWYgKCFtYXRjaFJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgbWF0Y2hlZFN0cmluZyA9IG1hdGNoUmVzdWx0WzBdO1xuXG4gICAgY29uc3QgcGFyc2VSZXN1bHQgPSBzdHJpbmcubWF0Y2goYXJncy5wYXJzZVBhdHRlcm4pO1xuICAgIGlmICghcGFyc2VSZXN1bHQpIHJldHVybiBudWxsO1xuICAgIGxldCB2YWx1ZSA9IGFyZ3MudmFsdWVDYWxsYmFja1xuICAgICAgPyBhcmdzLnZhbHVlQ2FsbGJhY2socGFyc2VSZXN1bHRbMF0pXG4gICAgICA6IHBhcnNlUmVzdWx0WzBdO1xuXG4gICAgLy8gW1RPRE9dIEkgY2hhbGxlbmdlIHlvdSB0byBmaXggdGhlIHR5cGVcbiAgICB2YWx1ZSA9IG9wdGlvbnMudmFsdWVDYWxsYmFjayA/IG9wdGlvbnMudmFsdWVDYWxsYmFjayh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgIGNvbnN0IHJlc3QgPSBzdHJpbmcuc2xpY2UobWF0Y2hlZFN0cmluZy5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIHsgdmFsdWUsIHJlc3QgfTtcbiAgfTtcbn1cbiIsImltcG9ydCB7IGJ1aWxkTWF0Y2hGbiB9IGZyb20gXCIuLi8uLi9fbGliL2J1aWxkTWF0Y2hGbi5qc1wiO1xuaW1wb3J0IHsgYnVpbGRNYXRjaFBhdHRlcm5GbiB9IGZyb20gXCIuLi8uLi9fbGliL2J1aWxkTWF0Y2hQYXR0ZXJuRm4uanNcIjtcblxuY29uc3QgbWF0Y2hPcmRpbmFsTnVtYmVyUGF0dGVybiA9IC9eKFxcZCspKHRofHN0fG5kfHJkKT8vaTtcbmNvbnN0IHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4gPSAvXFxkKy9pO1xuXG5jb25zdCBtYXRjaEVyYVBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eKGJ8YSkvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKGJcXC4/XFxzP2NcXC4/fGJcXC4/XFxzP2NcXC4/XFxzP2VcXC4/fGFcXC4/XFxzP2RcXC4/fGNcXC4/XFxzP2VcXC4/KS9pLFxuICB3aWRlOiAvXihiZWZvcmUgY2hyaXN0fGJlZm9yZSBjb21tb24gZXJhfGFubm8gZG9taW5pfGNvbW1vbiBlcmEpL2ksXG59O1xuY29uc3QgcGFyc2VFcmFQYXR0ZXJucyA9IHtcbiAgYW55OiBbL15iL2ksIC9eKGF8YykvaV0sXG59O1xuXG5jb25zdCBtYXRjaFF1YXJ0ZXJQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXlsxMjM0XS9pLFxuICBhYmJyZXZpYXRlZDogL15xWzEyMzRdL2ksXG4gIHdpZGU6IC9eWzEyMzRdKHRofHN0fG5kfHJkKT8gcXVhcnRlci9pLFxufTtcbmNvbnN0IHBhcnNlUXVhcnRlclBhdHRlcm5zID0ge1xuICBhbnk6IFsvMS9pLCAvMi9pLCAvMy9pLCAvNC9pXSxcbn07XG5cbmNvbnN0IG1hdGNoTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXltqZm1hc29uZF0vaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKGphbnxmZWJ8bWFyfGFwcnxtYXl8anVufGp1bHxhdWd8c2VwfG9jdHxub3Z8ZGVjKS9pLFxuICB3aWRlOiAvXihqYW51YXJ5fGZlYnJ1YXJ5fG1hcmNofGFwcmlsfG1heXxqdW5lfGp1bHl8YXVndXN0fHNlcHRlbWJlcnxvY3RvYmVyfG5vdmVtYmVyfGRlY2VtYmVyKS9pLFxufTtcbmNvbnN0IHBhcnNlTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiBbXG4gICAgL15qL2ksXG4gICAgL15mL2ksXG4gICAgL15tL2ksXG4gICAgL15hL2ksXG4gICAgL15tL2ksXG4gICAgL15qL2ksXG4gICAgL15qL2ksXG4gICAgL15hL2ksXG4gICAgL15zL2ksXG4gICAgL15vL2ksXG4gICAgL15uL2ksXG4gICAgL15kL2ksXG4gIF0sXG5cbiAgYW55OiBbXG4gICAgL15qYS9pLFxuICAgIC9eZi9pLFxuICAgIC9ebWFyL2ksXG4gICAgL15hcC9pLFxuICAgIC9ebWF5L2ksXG4gICAgL15qdW4vaSxcbiAgICAvXmp1bC9pLFxuICAgIC9eYXUvaSxcbiAgICAvXnMvaSxcbiAgICAvXm8vaSxcbiAgICAvXm4vaSxcbiAgICAvXmQvaSxcbiAgXSxcbn07XG5cbmNvbnN0IG1hdGNoRGF5UGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL15bc210d2ZdL2ksXG4gIHNob3J0OiAvXihzdXxtb3x0dXx3ZXx0aHxmcnxzYSkvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKHN1bnxtb258dHVlfHdlZHx0aHV8ZnJpfHNhdCkvaSxcbiAgd2lkZTogL14oc3VuZGF5fG1vbmRheXx0dWVzZGF5fHdlZG5lc2RheXx0aHVyc2RheXxmcmlkYXl8c2F0dXJkYXkpL2ksXG59O1xuY29uc3QgcGFyc2VEYXlQYXR0ZXJucyA9IHtcbiAgbmFycm93OiBbL15zL2ksIC9ebS9pLCAvXnQvaSwgL153L2ksIC9edC9pLCAvXmYvaSwgL15zL2ldLFxuICBhbnk6IFsvXnN1L2ksIC9ebS9pLCAvXnR1L2ksIC9edy9pLCAvXnRoL2ksIC9eZi9pLCAvXnNhL2ldLFxufTtcblxuY29uc3QgbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXihhfHB8bWl8bnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2ksXG4gIGFueTogL14oW2FwXVxcLj9cXHM/bVxcLj98bWlkbmlnaHR8bm9vbnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2ksXG59O1xuY29uc3QgcGFyc2VEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgYW55OiB7XG4gICAgYW06IC9eYS9pLFxuICAgIHBtOiAvXnAvaSxcbiAgICBtaWRuaWdodDogL15taS9pLFxuICAgIG5vb246IC9ebm8vaSxcbiAgICBtb3JuaW5nOiAvbW9ybmluZy9pLFxuICAgIGFmdGVybm9vbjogL2FmdGVybm9vbi9pLFxuICAgIGV2ZW5pbmc6IC9ldmVuaW5nL2ksXG4gICAgbmlnaHQ6IC9uaWdodC9pLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IG1hdGNoID0ge1xuICBvcmRpbmFsTnVtYmVyOiBidWlsZE1hdGNoUGF0dGVybkZuKHtcbiAgICBtYXRjaFBhdHRlcm46IG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4sXG4gICAgcGFyc2VQYXR0ZXJuOiBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuLFxuICAgIHZhbHVlQ2FsbGJhY2s6ICh2YWx1ZSkgPT4gcGFyc2VJbnQodmFsdWUsIDEwKSxcbiAgfSksXG5cbiAgZXJhOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIHF1YXJ0ZXI6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hRdWFydGVyUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlUXVhcnRlclBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICAgIHZhbHVlQ2FsbGJhY2s6IChpbmRleCkgPT4gaW5kZXggKyAxLFxuICB9KSxcblxuICBtb250aDogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaE1vbnRoUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlTW9udGhQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgfSksXG5cbiAgZGF5OiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIGRheVBlcmlvZDogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBlcmlvZFBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcImFueVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGVyaW9kUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxufTtcbiIsImltcG9ydCB7IGZvcm1hdERpc3RhbmNlIH0gZnJvbSBcIi4vZW4tVVMvX2xpYi9mb3JtYXREaXN0YW5jZS5qc1wiO1xuaW1wb3J0IHsgZm9ybWF0TG9uZyB9IGZyb20gXCIuL2VuLVVTL19saWIvZm9ybWF0TG9uZy5qc1wiO1xuaW1wb3J0IHsgZm9ybWF0UmVsYXRpdmUgfSBmcm9tIFwiLi9lbi1VUy9fbGliL2Zvcm1hdFJlbGF0aXZlLmpzXCI7XG5pbXBvcnQgeyBsb2NhbGl6ZSB9IGZyb20gXCIuL2VuLVVTL19saWIvbG9jYWxpemUuanNcIjtcbmltcG9ydCB7IG1hdGNoIH0gZnJvbSBcIi4vZW4tVVMvX2xpYi9tYXRjaC5qc1wiO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBMb2NhbGVzXG4gKiBAc3VtbWFyeSBFbmdsaXNoIGxvY2FsZSAoVW5pdGVkIFN0YXRlcykuXG4gKiBAbGFuZ3VhZ2UgRW5nbGlzaFxuICogQGlzby02MzktMiBlbmdcbiAqIEBhdXRob3IgU2FzaGEgS29zcyBbQGtvc3Nub2NvcnBdKGh0dHBzOi8vZ2l0aHViLmNvbS9rb3Nzbm9jb3JwKVxuICogQGF1dGhvciBMZXNoYSBLb3NzIFtAbGVzaGFrb3NzXShodHRwczovL2dpdGh1Yi5jb20vbGVzaGFrb3NzKVxuICovXG5leHBvcnQgY29uc3QgZW5VUyA9IHtcbiAgY29kZTogXCJlbi1VU1wiLFxuICBmb3JtYXREaXN0YW5jZTogZm9ybWF0RGlzdGFuY2UsXG4gIGZvcm1hdExvbmc6IGZvcm1hdExvbmcsXG4gIGZvcm1hdFJlbGF0aXZlOiBmb3JtYXRSZWxhdGl2ZSxcbiAgbG9jYWxpemU6IGxvY2FsaXplLFxuICBtYXRjaDogbWF0Y2gsXG4gIG9wdGlvbnM6IHtcbiAgICB3ZWVrU3RhcnRzT246IDAgLyogU3VuZGF5ICovLFxuICAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogMSxcbiAgfSxcbn07XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZW5VUztcbiIsImltcG9ydCB7IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyB9IGZyb20gXCIuL2RpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cy5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZlllYXIgfSBmcm9tIFwiLi9zdGFydE9mWWVhci5qc1wiO1xuaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBnZXREYXlPZlllYXJ9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXREYXlPZlllYXJcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBkYXkgb2YgdGhlIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGRheSBvZiB0aGUgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIGRheSBvZiB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIGRheSBvZiB0aGUgeWVhciBpcyAyIEp1bHkgMjAxND9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldERheU9mWWVhcihuZXcgRGF0ZSgyMDE0LCA2LCAyKSlcbiAqIC8vPT4gMTgzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXlPZlllYXIoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG4gIGNvbnN0IGRpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoX2RhdGUsIHN0YXJ0T2ZZZWFyKF9kYXRlKSk7XG4gIGNvbnN0IGRheU9mWWVhciA9IGRpZmYgKyAxO1xuICByZXR1cm4gZGF5T2ZZZWFyO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGdldERheU9mWWVhcjtcbiIsImltcG9ydCB7IG1pbGxpc2Vjb25kc0luV2VlayB9IGZyb20gXCIuL2NvbnN0YW50cy5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZklTT1dlZWsgfSBmcm9tIFwiLi9zdGFydE9mSVNPV2Vlay5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZklTT1dlZWtZZWFyIH0gZnJvbSBcIi4vc3RhcnRPZklTT1dlZWtZZWFyLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGdldElTT1dlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXRJU09XZWVrXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBJU08gd2VlayBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgSVNPIHdlZWsgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgSVNPIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgSVNPLXdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMiBKYW51YXJ5IDIwMDU/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRJU09XZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpKVxuICogLy89PiA1M1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SVNPV2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgZGlmZiA9ICtzdGFydE9mSVNPV2VlayhfZGF0ZSkgLSArc3RhcnRPZklTT1dlZWtZZWFyKF9kYXRlKTtcblxuICAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIHdlZWtzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgYmVjYXVzZSB0aGUgbnVtYmVyIG9mXG4gIC8vIG1pbGxpc2Vjb25kcyBpbiBhIHdlZWsgaXMgbm90IGNvbnN0YW50IChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mXG4gIC8vIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdCkuXG4gIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBtaWxsaXNlY29uZHNJbldlZWspICsgMTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBnZXRJU09XZWVrO1xuIiwiaW1wb3J0IHsgZ2V0RGVmYXVsdE9wdGlvbnMgfSBmcm9tIFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCI7XG5pbXBvcnQgeyBjb25zdHJ1Y3RGcm9tIH0gZnJvbSBcIi4vY29uc3RydWN0RnJvbS5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZldlZWsgfSBmcm9tIFwiLi9zdGFydE9mV2Vlay5qc1wiO1xuaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBnZXRXZWVrWWVhcn0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGdldFdlZWtZZWFyXG4gKiBAY2F0ZWdvcnkgV2Vlay1OdW1iZXJpbmcgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjVGhlX0lTT193ZWVrX2RhdGVfc3lzdGVtXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zLlxuICpcbiAqIEByZXR1cm5zIFRoZSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMjYgRGVjZW1iZXIgMjAwNCB3aXRoIHRoZSBkZWZhdWx0IHNldHRpbmdzP1xuICogY29uc3QgcmVzdWx0ID0gZ2V0V2Vla1llYXIobmV3IERhdGUoMjAwNCwgMTEsIDI2KSlcbiAqIC8vPT4gMjAwNVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB3ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDI2IERlY2VtYmVyIDIwMDQgaWYgd2VlayBzdGFydHMgb24gU2F0dXJkYXk/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrWWVhcihuZXcgRGF0ZSgyMDA0LCAxMSwgMjYpLCB7IHdlZWtTdGFydHNPbjogNiB9KVxuICogLy89PiAyMDA0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMjYgRGVjZW1iZXIgMjAwNCBpZiB0aGUgZmlyc3Qgd2VlayBjb250YWlucyA0IEphbnVhcnk/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrWWVhcihuZXcgRGF0ZSgyMDA0LCAxMSwgMjYpLCB7IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogNCB9KVxuICogLy89PiAyMDA0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWVrWWVhcihkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7XG5cbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0aW9ucygpO1xuICBjb25zdCBmaXJzdFdlZWtDb250YWluc0RhdGUgPVxuICAgIG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICAxO1xuXG4gIGNvbnN0IGZpcnN0V2Vla09mTmV4dFllYXIgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIDApO1xuICBmaXJzdFdlZWtPZk5leHRZZWFyLnNldEZ1bGxZZWFyKHllYXIgKyAxLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICBmaXJzdFdlZWtPZk5leHRZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBzdGFydE9mTmV4dFllYXIgPSBzdGFydE9mV2VlayhmaXJzdFdlZWtPZk5leHRZZWFyLCBvcHRpb25zKTtcblxuICBjb25zdCBmaXJzdFdlZWtPZlRoaXNZZWFyID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTtcbiAgZmlyc3RXZWVrT2ZUaGlzWWVhci5zZXRGdWxsWWVhcih5ZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICBmaXJzdFdlZWtPZlRoaXNZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBzdGFydE9mVGhpc1llYXIgPSBzdGFydE9mV2VlayhmaXJzdFdlZWtPZlRoaXNZZWFyLCBvcHRpb25zKTtcblxuICBpZiAoK19kYXRlID49ICtzdGFydE9mTmV4dFllYXIpIHtcbiAgICByZXR1cm4geWVhciArIDE7XG4gIH0gZWxzZSBpZiAoK19kYXRlID49ICtzdGFydE9mVGhpc1llYXIpIHtcbiAgICByZXR1cm4geWVhcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geWVhciAtIDE7XG4gIH1cbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBnZXRXZWVrWWVhcjtcbiIsImltcG9ydCB7IGdldERlZmF1bHRPcHRpb25zIH0gZnJvbSBcIi4vX2xpYi9kZWZhdWx0T3B0aW9ucy5qc1wiO1xuaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuL2NvbnN0cnVjdEZyb20uanNcIjtcbmltcG9ydCB7IGdldFdlZWtZZWFyIH0gZnJvbSBcIi4vZ2V0V2Vla1llYXIuanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZXZWVrIH0gZnJvbSBcIi4vc3RhcnRPZldlZWsuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN0YXJ0T2ZXZWVrWWVhcn0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZXZWVrWWVhclxuICogQGNhdGVnb3J5IFdlZWstTnVtYmVyaW5nIFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjVGhlX0lTT193ZWVrX2RhdGVfc3lzdGVtXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKiBAdHlwZVBhcmFtIFJlc3VsdERhdGUgLSBUaGUgcmVzdWx0IGBEYXRlYCB0eXBlLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGFuIGEgd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgMiBKdWx5IDIwMDUgd2l0aCBkZWZhdWx0IHNldHRpbmdzOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDYsIDIpKVxuICogLy89PiBTdW4gRGVjIDI2IDIwMDQgMDA6MDA6MDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgMiBKdWx5IDIwMDVcbiAqIC8vIGlmIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHdlZWtcbiAqIC8vIGFuZCA0IEphbnVhcnkgaXMgYWx3YXlzIGluIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDYsIDIpLCB7XG4gKiAgIHdlZWtTdGFydHNPbjogMSxcbiAqICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0XG4gKiB9KVxuICogLy89PiBNb24gSmFuIDAzIDIwMDUgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZXZWVrWWVhcihkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTtcbiAgY29uc3QgZmlyc3RXZWVrQ29udGFpbnNEYXRlID1cbiAgICBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgMTtcblxuICBjb25zdCB5ZWFyID0gZ2V0V2Vla1llYXIoZGF0ZSwgb3B0aW9ucyk7XG4gIGNvbnN0IGZpcnN0V2VlayA9IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgMCk7XG4gIGZpcnN0V2Vlay5zZXRGdWxsWWVhcih5ZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICBmaXJzdFdlZWsuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IF9kYXRlID0gc3RhcnRPZldlZWsoZmlyc3RXZWVrLCBvcHRpb25zKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0T2ZXZWVrWWVhcjtcbiIsImltcG9ydCB7IG1pbGxpc2Vjb25kc0luV2VlayB9IGZyb20gXCIuL2NvbnN0YW50cy5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZldlZWsgfSBmcm9tIFwiLi9zdGFydE9mV2Vlay5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZldlZWtZZWFyIH0gZnJvbSBcIi4vc3RhcnRPZldlZWtZZWFyLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGdldFdlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXRXZWVrXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGxvY2FsIHdlZWsgaW5kZXggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGxvY2FsIHdlZWsgaW5kZXggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjVGhlX0lTT193ZWVrX2RhdGVfc3lzdGVtXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgbG9jYWwgd2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNSB3aXRoIGRlZmF1bHQgb3B0aW9ucz9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWsobmV3IERhdGUoMjAwNSwgMCwgMikpXG4gKiAvLz0+IDJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgbG9jYWwgd2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNSxcbiAqIC8vIGlmIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLFxuICogLy8gYW5kIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyIGFsd2F5cyBjb250YWlucyA0IEphbnVhcnk/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpLCB7XG4gKiAgIHdlZWtTdGFydHNPbjogMSxcbiAqICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0XG4gKiB9KVxuICogLy89PiA1M1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgZGlmZiA9ICtzdGFydE9mV2VlayhfZGF0ZSwgb3B0aW9ucykgLSArc3RhcnRPZldlZWtZZWFyKF9kYXRlLCBvcHRpb25zKTtcblxuICAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIHdlZWtzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgYmVjYXVzZSB0aGUgbnVtYmVyIG9mXG4gIC8vIG1pbGxpc2Vjb25kcyBpbiBhIHdlZWsgaXMgbm90IGNvbnN0YW50IChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mXG4gIC8vIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdCkuXG4gIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBtaWxsaXNlY29uZHNJbldlZWspICsgMTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBnZXRXZWVrO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGFkZExlYWRpbmdaZXJvcyhudW1iZXIsIHRhcmdldExlbmd0aCkge1xuICBjb25zdCBzaWduID0gbnVtYmVyIDwgMCA/IFwiLVwiIDogXCJcIjtcbiAgY29uc3Qgb3V0cHV0ID0gTWF0aC5hYnMobnVtYmVyKS50b1N0cmluZygpLnBhZFN0YXJ0KHRhcmdldExlbmd0aCwgXCIwXCIpO1xuICByZXR1cm4gc2lnbiArIG91dHB1dDtcbn1cbiIsImltcG9ydCB7IGFkZExlYWRpbmdaZXJvcyB9IGZyb20gXCIuLi9hZGRMZWFkaW5nWmVyb3MuanNcIjtcblxuLypcbiAqIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgIGEgIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgIHwgIEEqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGQgIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgIHwgIEQgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGggIHwgSG91ciBbMS0xMl0gICAgICAgICAgICAgICAgICAgIHwgIEggIHwgSG91ciBbMC0yM10gICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIG0gIHwgTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgIHwgIE0gIHwgTW9udGggICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHMgIHwgU2Vjb25kICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFMgIHwgRnJhY3Rpb24gb2Ygc2Vjb25kICAgICAgICAgICAgIHxcbiAqIHwgIHkgIHwgWWVhciAoYWJzKSAgICAgICAgICAgICAgICAgICAgIHwgIFkgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqXG4gKiBMZXR0ZXJzIG1hcmtlZCBieSAqIGFyZSBub3QgaW1wbGVtZW50ZWQgYnV0IHJlc2VydmVkIGJ5IFVuaWNvZGUgc3RhbmRhcmQuXG4gKi9cblxuZXhwb3J0IGNvbnN0IGxpZ2h0Rm9ybWF0dGVycyA9IHtcbiAgLy8gWWVhclxuICB5KGRhdGUsIHRva2VuKSB7XG4gICAgLy8gRnJvbSBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzNS90cjM1LTMxL3RyMzUtZGF0ZXMuaHRtbCNEYXRlX0Zvcm1hdF90b2tlbnNcbiAgICAvLyB8IFllYXIgICAgIHwgICAgIHkgfCB5eSB8ICAgeXl5IHwgIHl5eXkgfCB5eXl5eSB8XG4gICAgLy8gfC0tLS0tLS0tLS18LS0tLS0tLXwtLS0tfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfFxuICAgIC8vIHwgQUQgMSAgICAgfCAgICAgMSB8IDAxIHwgICAwMDEgfCAgMDAwMSB8IDAwMDAxIHxcbiAgICAvLyB8IEFEIDEyICAgIHwgICAgMTIgfCAxMiB8ICAgMDEyIHwgIDAwMTIgfCAwMDAxMiB8XG4gICAgLy8gfCBBRCAxMjMgICB8ICAgMTIzIHwgMjMgfCAgIDEyMyB8ICAwMTIzIHwgMDAxMjMgfFxuICAgIC8vIHwgQUQgMTIzNCAgfCAgMTIzNCB8IDM0IHwgIDEyMzQgfCAgMTIzNCB8IDAxMjM0IHxcbiAgICAvLyB8IEFEIDEyMzQ1IHwgMTIzNDUgfCA0NSB8IDEyMzQ1IHwgMTIzNDUgfCAxMjM0NSB8XG5cbiAgICBjb25zdCBzaWduZWRZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG4gICAgY29uc3QgeWVhciA9IHNpZ25lZFllYXIgPiAwID8gc2lnbmVkWWVhciA6IDEgLSBzaWduZWRZZWFyO1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3ModG9rZW4gPT09IFwieXlcIiA/IHllYXIgJSAxMDAgOiB5ZWFyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIE1vbnRoXG4gIE0oZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICByZXR1cm4gdG9rZW4gPT09IFwiTVwiID8gU3RyaW5nKG1vbnRoICsgMSkgOiBhZGRMZWFkaW5nWmVyb3MobW9udGggKyAxLCAyKTtcbiAgfSxcblxuICAvLyBEYXkgb2YgdGhlIG1vbnRoXG4gIGQoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0RGF0ZSgpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIEFNIG9yIFBNXG4gIGEoZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXRlLmdldEhvdXJzKCkgLyAxMiA+PSAxID8gXCJwbVwiIDogXCJhbVwiO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcImFcIjpcbiAgICAgIGNhc2UgXCJhYVwiOlxuICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gICAgICBjYXNlIFwiYWFhXCI6XG4gICAgICAgIHJldHVybiBkYXlQZXJpb2RFbnVtVmFsdWU7XG4gICAgICBjYXNlIFwiYWFhYWFcIjpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZVswXTtcbiAgICAgIGNhc2UgXCJhYWFhXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlID09PSBcImFtXCIgPyBcImEubS5cIiA6IFwicC5tLlwiO1xuICAgIH1cbiAgfSxcblxuICAvLyBIb3VyIFsxLTEyXVxuICBoKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldEhvdXJzKCkgJSAxMiB8fCAxMiwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBIb3VyIFswLTIzXVxuICBIKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldEhvdXJzKCksIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gTWludXRlXG4gIG0oZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0TWludXRlcygpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIFNlY29uZFxuICBzKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldFNlY29uZHMoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBGcmFjdGlvbiBvZiBzZWNvbmRcbiAgUyhkYXRlLCB0b2tlbikge1xuICAgIGNvbnN0IG51bWJlck9mRGlnaXRzID0gdG9rZW4ubGVuZ3RoO1xuICAgIGNvbnN0IG1pbGxpc2Vjb25kcyA9IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCk7XG4gICAgY29uc3QgZnJhY3Rpb25hbFNlY29uZHMgPSBNYXRoLnRydW5jKFxuICAgICAgbWlsbGlzZWNvbmRzICogTWF0aC5wb3coMTAsIG51bWJlck9mRGlnaXRzIC0gMyksXG4gICAgKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGZyYWN0aW9uYWxTZWNvbmRzLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxufTtcbiIsImltcG9ydCB7IGdldERheU9mWWVhciB9IGZyb20gXCIuLi8uLi9nZXREYXlPZlllYXIuanNcIjtcbmltcG9ydCB7IGdldElTT1dlZWsgfSBmcm9tIFwiLi4vLi4vZ2V0SVNPV2Vlay5qc1wiO1xuaW1wb3J0IHsgZ2V0SVNPV2Vla1llYXIgfSBmcm9tIFwiLi4vLi4vZ2V0SVNPV2Vla1llYXIuanNcIjtcbmltcG9ydCB7IGdldFdlZWsgfSBmcm9tIFwiLi4vLi4vZ2V0V2Vlay5qc1wiO1xuaW1wb3J0IHsgZ2V0V2Vla1llYXIgfSBmcm9tIFwiLi4vLi4vZ2V0V2Vla1llYXIuanNcIjtcblxuaW1wb3J0IHsgYWRkTGVhZGluZ1plcm9zIH0gZnJvbSBcIi4uL2FkZExlYWRpbmdaZXJvcy5qc1wiO1xuaW1wb3J0IHsgbGlnaHRGb3JtYXR0ZXJzIH0gZnJvbSBcIi4vbGlnaHRGb3JtYXR0ZXJzLmpzXCI7XG5cbmNvbnN0IGRheVBlcmlvZEVudW0gPSB7XG4gIGFtOiBcImFtXCIsXG4gIHBtOiBcInBtXCIsXG4gIG1pZG5pZ2h0OiBcIm1pZG5pZ2h0XCIsXG4gIG5vb246IFwibm9vblwiLFxuICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgYWZ0ZXJub29uOiBcImFmdGVybm9vblwiLFxuICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgbmlnaHQ6IFwibmlnaHRcIixcbn07XG5cbi8qXG4gKiB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8ICBhICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBKiB8IE1pbGxpc2Vjb25kcyBpbiBkYXkgICAgICAgICAgICB8XG4gKiB8ICBiICB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICB8ICBCICB8IEZsZXhpYmxlIGRheSBwZXJpb2QgICAgICAgICAgICB8XG4gKiB8ICBjICB8IFN0YW5kLWFsb25lIGxvY2FsIGRheSBvZiB3ZWVrICB8ICBDKiB8IExvY2FsaXplZCBob3VyIHcvIGRheSBwZXJpb2QgICB8XG4gKiB8ICBkICB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICB8ICBEICB8IERheSBvZiB5ZWFyICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBlICB8IExvY2FsIGRheSBvZiB3ZWVrICAgICAgICAgICAgICB8ICBFICB8IERheSBvZiB3ZWVrICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBmICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBGKiB8IERheSBvZiB3ZWVrIGluIG1vbnRoICAgICAgICAgICB8XG4gKiB8ICBnKiB8IE1vZGlmaWVkIEp1bGlhbiBkYXkgICAgICAgICAgICB8ICBHICB8IEVyYSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBoICB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICB8ICBIICB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBpISB8IElTTyBkYXkgb2Ygd2VlayAgICAgICAgICAgICAgICB8ICBJISB8IElTTyB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgICB8XG4gKiB8ICBqKiB8IExvY2FsaXplZCBob3VyIHcvIGRheSBwZXJpb2QgICB8ICBKKiB8IExvY2FsaXplZCBob3VyIHcvbyBkYXkgcGVyaW9kICB8XG4gKiB8ICBrICB8IEhvdXIgWzEtMjRdICAgICAgICAgICAgICAgICAgICB8ICBLICB8IEhvdXIgWzAtMTFdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBsKiB8IChkZXByZWNhdGVkKSAgICAgICAgICAgICAgICAgICB8ICBMICB8IFN0YW5kLWFsb25lIG1vbnRoICAgICAgICAgICAgICB8XG4gKiB8ICBtICB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBNICB8IE1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBuICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBOICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBvISB8IE9yZGluYWwgbnVtYmVyIG1vZGlmaWVyICAgICAgICB8ICBPICB8IFRpbWV6b25lIChHTVQpICAgICAgICAgICAgICAgICB8XG4gKiB8ICBwISB8IExvbmcgbG9jYWxpemVkIHRpbWUgICAgICAgICAgICB8ICBQISB8IExvbmcgbG9jYWxpemVkIGRhdGUgICAgICAgICAgICB8XG4gKiB8ICBxICB8IFN0YW5kLWFsb25lIHF1YXJ0ZXIgICAgICAgICAgICB8ICBRICB8IFF1YXJ0ZXIgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICByKiB8IFJlbGF0ZWQgR3JlZ29yaWFuIHllYXIgICAgICAgICB8ICBSISB8IElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgICB8XG4gKiB8ICBzICB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICB8ICBTICB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICB8XG4gKiB8ICB0ISB8IFNlY29uZHMgdGltZXN0YW1wICAgICAgICAgICAgICB8ICBUISB8IE1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICB8XG4gKiB8ICB1ICB8IEV4dGVuZGVkIHllYXIgICAgICAgICAgICAgICAgICB8ICBVKiB8IEN5Y2xpYyB5ZWFyICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICB2KiB8IFRpbWV6b25lIChnZW5lcmljIG5vbi1sb2NhdC4pICB8ICBWKiB8IFRpbWV6b25lIChsb2NhdGlvbikgICAgICAgICAgICB8XG4gKiB8ICB3ICB8IExvY2FsIHdlZWsgb2YgeWVhciAgICAgICAgICAgICB8ICBXKiB8IFdlZWsgb2YgbW9udGggICAgICAgICAgICAgICAgICB8XG4gKiB8ICB4ICB8IFRpbWV6b25lIChJU08tODYwMSB3L28gWikgICAgICB8ICBYICB8IFRpbWV6b25lIChJU08tODYwMSkgICAgICAgICAgICB8XG4gKiB8ICB5ICB8IFllYXIgKGFicykgICAgICAgICAgICAgICAgICAgICB8ICBZICB8IExvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICB8XG4gKiB8ICB6ICB8IFRpbWV6b25lIChzcGVjaWZpYyBub24tbG9jYXQuKSB8ICBaKiB8IFRpbWV6b25lIChhbGlhc2VzKSAgICAgICAgICAgICB8XG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgKiBhcmUgbm90IGltcGxlbWVudGVkIGJ1dCByZXNlcnZlZCBieSBVbmljb2RlIHN0YW5kYXJkLlxuICpcbiAqIExldHRlcnMgbWFya2VkIGJ5ICEgYXJlIG5vbi1zdGFuZGFyZCwgYnV0IGltcGxlbWVudGVkIGJ5IGRhdGUtZm5zOlxuICogLSBgb2AgbW9kaWZpZXMgdGhlIHByZXZpb3VzIHRva2VuIHRvIHR1cm4gaXQgaW50byBhbiBvcmRpbmFsIChzZWUgYGZvcm1hdGAgZG9jcylcbiAqIC0gYGlgIGlzIElTTyBkYXkgb2Ygd2Vlay4gRm9yIGBpYCBhbmQgYGlpYCBpcyByZXR1cm5zIG51bWVyaWMgSVNPIHdlZWsgZGF5cyxcbiAqICAgaS5lLiA3IGZvciBTdW5kYXksIDEgZm9yIE1vbmRheSwgZXRjLlxuICogLSBgSWAgaXMgSVNPIHdlZWsgb2YgeWVhciwgYXMgb3Bwb3NlZCB0byBgd2Agd2hpY2ggaXMgbG9jYWwgd2VlayBvZiB5ZWFyLlxuICogLSBgUmAgaXMgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIsIGFzIG9wcG9zZWQgdG8gYFlgIHdoaWNoIGlzIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIuXG4gKiAgIGBSYCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYElgIGFuZCBgaWBcbiAqICAgZm9yIHVuaXZlcnNhbCBJU08gd2Vlay1udW1iZXJpbmcgZGF0ZSwgd2hlcmVhc1xuICogICBgWWAgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGB3YCBhbmQgYGVgXG4gKiAgIGZvciB3ZWVrLW51bWJlcmluZyBkYXRlIHNwZWNpZmljIHRvIHRoZSBsb2NhbGUuXG4gKiAtIGBQYCBpcyBsb25nIGxvY2FsaXplZCBkYXRlIGZvcm1hdFxuICogLSBgcGAgaXMgbG9uZyBsb2NhbGl6ZWQgdGltZSBmb3JtYXRcbiAqL1xuXG5leHBvcnQgY29uc3QgZm9ybWF0dGVycyA9IHtcbiAgLy8gRXJhXG4gIEc6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBlcmEgPSBkYXRlLmdldEZ1bGxZZWFyKCkgPiAwID8gMSA6IDA7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gQUQsIEJDXG4gICAgICBjYXNlIFwiR1wiOlxuICAgICAgY2FzZSBcIkdHXCI6XG4gICAgICBjYXNlIFwiR0dHXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7IHdpZHRoOiBcImFiYnJldmlhdGVkXCIgfSk7XG4gICAgICAvLyBBLCBCXG4gICAgICBjYXNlIFwiR0dHR0dcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmVyYShlcmEsIHsgd2lkdGg6IFwibmFycm93XCIgfSk7XG4gICAgICAvLyBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdFxuICAgICAgY2FzZSBcIkdHR0dcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7IHdpZHRoOiBcIndpZGVcIiB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gWWVhclxuICB5OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgLy8gT3JkaW5hbCBudW1iZXJcbiAgICBpZiAodG9rZW4gPT09IFwieW9cIikge1xuICAgICAgY29uc3Qgc2lnbmVkWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG4gICAgICBjb25zdCB5ZWFyID0gc2lnbmVkWWVhciA+IDAgPyBzaWduZWRZZWFyIDogMSAtIHNpZ25lZFllYXI7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih5ZWFyLCB7IHVuaXQ6IFwieWVhclwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMueShkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhclxuICBZOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgc2lnbmVkV2Vla1llYXIgPSBnZXRXZWVrWWVhcihkYXRlLCBvcHRpb25zKTtcbiAgICAvLyBSZXR1cm5zIDEgZm9yIDEgQkMgKHdoaWNoIGlzIHllYXIgMCBpbiBKYXZhU2NyaXB0KVxuICAgIGNvbnN0IHdlZWtZZWFyID0gc2lnbmVkV2Vla1llYXIgPiAwID8gc2lnbmVkV2Vla1llYXIgOiAxIC0gc2lnbmVkV2Vla1llYXI7XG5cbiAgICAvLyBUd28gZGlnaXQgeWVhclxuICAgIGlmICh0b2tlbiA9PT0gXCJZWVwiKSB7XG4gICAgICBjb25zdCB0d29EaWdpdFllYXIgPSB3ZWVrWWVhciAlIDEwMDtcbiAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3ModHdvRGlnaXRZZWFyLCAyKTtcbiAgICB9XG5cbiAgICAvLyBPcmRpbmFsIG51bWJlclxuICAgIGlmICh0b2tlbiA9PT0gXCJZb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih3ZWVrWWVhciwgeyB1bml0OiBcInllYXJcIiB9KTtcbiAgICB9XG5cbiAgICAvLyBQYWRkaW5nXG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh3ZWVrWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICBSOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBpc29XZWVrWWVhciA9IGdldElTT1dlZWtZZWFyKGRhdGUpO1xuXG4gICAgLy8gUGFkZGluZ1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaXNvV2Vla1llYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gRXh0ZW5kZWQgeWVhci4gVGhpcyBpcyBhIHNpbmdsZSBudW1iZXIgZGVzaWduYXRpbmcgdGhlIHllYXIgb2YgdGhpcyBjYWxlbmRhciBzeXN0ZW0uXG4gIC8vIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBgeWAgYW5kIGB1YCBsb2NhbGl6ZXJzIGFyZSBCLkMuIHllYXJzOlxuICAvLyB8IFllYXIgfCBgeWAgfCBgdWAgfFxuICAvLyB8LS0tLS0tfC0tLS0tfC0tLS0tfFxuICAvLyB8IEFDIDEgfCAgIDEgfCAgIDEgfFxuICAvLyB8IEJDIDEgfCAgIDEgfCAgIDAgfFxuICAvLyB8IEJDIDIgfCAgIDIgfCAgLTEgfFxuICAvLyBBbHNvIGB5eWAgYWx3YXlzIHJldHVybnMgdGhlIGxhc3QgdHdvIGRpZ2l0cyBvZiBhIHllYXIsXG4gIC8vIHdoaWxlIGB1dWAgcGFkcyBzaW5nbGUgZGlnaXQgeWVhcnMgdG8gMiBjaGFyYWN0ZXJzIGFuZCByZXR1cm5zIG90aGVyIHllYXJzIHVuY2hhbmdlZC5cbiAgdTogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHllYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gUXVhcnRlclxuICBROiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgcXVhcnRlciA9IE1hdGguY2VpbCgoZGF0ZS5nZXRNb250aCgpICsgMSkgLyAzKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAzLCA0XG4gICAgICBjYXNlIFwiUVwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKHF1YXJ0ZXIpO1xuICAgICAgLy8gMDEsIDAyLCAwMywgMDRcbiAgICAgIGNhc2UgXCJRUVwiOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHF1YXJ0ZXIsIDIpO1xuICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoXG4gICAgICBjYXNlIFwiUW9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIocXVhcnRlciwgeyB1bml0OiBcInF1YXJ0ZXJcIiB9KTtcbiAgICAgIC8vIFExLCBRMiwgUTMsIFE0XG4gICAgICBjYXNlIFwiUVFRXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDEsIDIsIDMsIDQgKG5hcnJvdyBxdWFydGVyOyBjb3VsZCBiZSBub3QgbnVtZXJpY2FsKVxuICAgICAgY2FzZSBcIlFRUVFRXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLlxuICAgICAgY2FzZSBcIlFRUVFcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBTdGFuZC1hbG9uZSBxdWFydGVyXG4gIHE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBxdWFydGVyID0gTWF0aC5jZWlsKChkYXRlLmdldE1vbnRoKCkgKyAxKSAvIDMpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIDMsIDRcbiAgICAgIGNhc2UgXCJxXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcocXVhcnRlcik7XG4gICAgICAvLyAwMSwgMDIsIDAzLCAwNFxuICAgICAgY2FzZSBcInFxXCI6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MocXVhcnRlciwgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgM3JkLCA0dGhcbiAgICAgIGNhc2UgXCJxb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihxdWFydGVyLCB7IHVuaXQ6IFwicXVhcnRlclwiIH0pO1xuICAgICAgLy8gUTEsIFEyLCBRMywgUTRcbiAgICAgIGNhc2UgXCJxcXFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpXG4gICAgICBjYXNlIFwicXFxcXFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uXG4gICAgICBjYXNlIFwicXFxcVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIE1vbnRoXG4gIE06IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiTVwiOlxuICAgICAgY2FzZSBcIk1NXCI6XG4gICAgICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuTShkYXRlLCB0b2tlbik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoXG4gICAgICBjYXNlIFwiTW9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIobW9udGggKyAxLCB7IHVuaXQ6IFwibW9udGhcIiB9KTtcbiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlY1xuICAgICAgY2FzZSBcIk1NTVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuICAgICAgY2FzZSBcIk1NTU1NXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyXG4gICAgICBjYXNlIFwiTU1NTVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFN0YW5kLWFsb25lIG1vbnRoXG4gIEw6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAuLi4sIDEyXG4gICAgICBjYXNlIFwiTFwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKG1vbnRoICsgMSk7XG4gICAgICAvLyAwMSwgMDIsIC4uLiwgMTJcbiAgICAgIGNhc2UgXCJMTFwiOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKG1vbnRoICsgMSwgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoXG4gICAgICBjYXNlIFwiTG9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIobW9udGggKyAxLCB7IHVuaXQ6IFwibW9udGhcIiB9KTtcbiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlY1xuICAgICAgY2FzZSBcIkxMTFwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuICAgICAgY2FzZSBcIkxMTExMXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyXG4gICAgICBjYXNlIFwiTExMTFwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIExvY2FsIHdlZWsgb2YgeWVhclxuICB3OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgd2VlayA9IGdldFdlZWsoZGF0ZSwgb3B0aW9ucyk7XG5cbiAgICBpZiAodG9rZW4gPT09IFwid29cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIod2VlaywgeyB1bml0OiBcIndlZWtcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHdlZWssIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gSVNPIHdlZWsgb2YgeWVhclxuICBJOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaXNvV2VlayA9IGdldElTT1dlZWsoZGF0ZSk7XG5cbiAgICBpZiAodG9rZW4gPT09IFwiSW9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaXNvV2VlaywgeyB1bml0OiBcIndlZWtcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGlzb1dlZWssIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gRGF5IG9mIHRoZSBtb250aFxuICBkOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSBcImRvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0RGF0ZSgpLCB7IHVuaXQ6IFwiZGF0ZVwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuZChkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gRGF5IG9mIHllYXJcbiAgRDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGRheU9mWWVhciA9IGdldERheU9mWWVhcihkYXRlKTtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJEb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXlPZlllYXIsIHsgdW5pdDogXCJkYXlPZlllYXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRheU9mWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBEYXkgb2Ygd2Vla1xuICBFOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBUdWVcbiAgICAgIGNhc2UgXCJFXCI6XG4gICAgICBjYXNlIFwiRUVcIjpcbiAgICAgIGNhc2UgXCJFRUVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgXCJFRUVFRVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG4gICAgICBjYXNlIFwiRUVFRUVFXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwic2hvcnRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdWVzZGF5XG4gICAgICBjYXNlIFwiRUVFRVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBMb2NhbCBkYXkgb2Ygd2Vla1xuICBlOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBjb25zdCBsb2NhbERheU9mV2VlayA9IChkYXlPZldlZWsgLSBvcHRpb25zLndlZWtTdGFydHNPbiArIDgpICUgNyB8fCA3O1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIE51bWVyaWNhbCB2YWx1ZSAoTnRoIGRheSBvZiB3ZWVrIHdpdGggY3VycmVudCBsb2NhbGUgb3Igd2Vla1N0YXJ0c09uKVxuICAgICAgY2FzZSBcImVcIjpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhsb2NhbERheU9mV2Vlayk7XG4gICAgICAvLyBQYWRkZWQgbnVtZXJpY2FsIHZhbHVlXG4gICAgICBjYXNlIFwiZWVcIjpcbiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhsb2NhbERheU9mV2VlaywgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCA3dGhcbiAgICAgIGNhc2UgXCJlb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2VlaywgeyB1bml0OiBcImRheVwiIH0pO1xuICAgICAgY2FzZSBcImVlZVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImVlZWVlXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJlZWVlZWVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJlZWVlXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFN0YW5kLWFsb25lIGxvY2FsIGRheSBvZiB3ZWVrXG4gIGM6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpO1xuICAgIGNvbnN0IGxvY2FsRGF5T2ZXZWVrID0gKGRheU9mV2VlayAtIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgOCkgJSA3IHx8IDc7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gTnVtZXJpY2FsIHZhbHVlIChzYW1lIGFzIGluIGBlYClcbiAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcobG9jYWxEYXlPZldlZWspO1xuICAgICAgLy8gUGFkZGVkIG51bWVyaWNhbCB2YWx1ZVxuICAgICAgY2FzZSBcImNjXCI6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MobG9jYWxEYXlPZldlZWssIHRva2VuLmxlbmd0aCk7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCA3dGhcbiAgICAgIGNhc2UgXCJjb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2VlaywgeyB1bml0OiBcImRheVwiIH0pO1xuICAgICAgY2FzZSBcImNjY1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImNjY2NjXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJjY2NjY2NcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJjY2NjXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIElTTyBkYXkgb2Ygd2Vla1xuICBpOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBjb25zdCBpc29EYXlPZldlZWsgPSBkYXlPZldlZWsgPT09IDAgPyA3IDogZGF5T2ZXZWVrO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDJcbiAgICAgIGNhc2UgXCJpXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcoaXNvRGF5T2ZXZWVrKTtcbiAgICAgIC8vIDAyXG4gICAgICBjYXNlIFwiaWlcIjpcbiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhpc29EYXlPZldlZWssIHRva2VuLmxlbmd0aCk7XG4gICAgICAvLyAybmRcbiAgICAgIGNhc2UgXCJpb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihpc29EYXlPZldlZWssIHsgdW5pdDogXCJkYXlcIiB9KTtcbiAgICAgIC8vIFR1ZVxuICAgICAgY2FzZSBcImlpaVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImlpaWlpXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJpaWlpaWlcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJpaWlpXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIEFNIG9yIFBNXG4gIGE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICBjb25zdCBkYXlQZXJpb2RFbnVtVmFsdWUgPSBob3VycyAvIDEyID49IDEgPyBcInBtXCIgOiBcImFtXCI7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiYVwiOlxuICAgICAgY2FzZSBcImFhXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiYWFhXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZVxuICAgICAgICAgIC5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNhc2UgXCJhYWFhYVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJhYWFhXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIEFNLCBQTSwgbWlkbmlnaHQsIG5vb25cbiAgYjogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGxldCBkYXlQZXJpb2RFbnVtVmFsdWU7XG4gICAgaWYgKGhvdXJzID09PSAxMikge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5ub29uO1xuICAgIH0gZWxzZSBpZiAoaG91cnMgPT09IDApIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubWlkbmlnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGhvdXJzIC8gMTIgPj0gMSA/IFwicG1cIiA6IFwiYW1cIjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiYlwiOlxuICAgICAgY2FzZSBcImJiXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiYmJiXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZVxuICAgICAgICAgIC5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNhc2UgXCJiYmJiYlwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJiYmJiXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIGluIHRoZSBtb3JuaW5nLCBpbiB0aGUgYWZ0ZXJub29uLCBpbiB0aGUgZXZlbmluZywgYXQgbmlnaHRcbiAgQjogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGxldCBkYXlQZXJpb2RFbnVtVmFsdWU7XG4gICAgaWYgKGhvdXJzID49IDE3KSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLmV2ZW5pbmc7XG4gICAgfSBlbHNlIGlmIChob3VycyA+PSAxMikge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5hZnRlcm5vb247XG4gICAgfSBlbHNlIGlmIChob3VycyA+PSA0KSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm1vcm5pbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubmlnaHQ7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIkJcIjpcbiAgICAgIGNhc2UgXCJCQlwiOlxuICAgICAgY2FzZSBcIkJCQlwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcIkJCQkJCXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcIkJCQkJcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gSG91ciBbMS0xMl1cbiAgaDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gXCJob1wiKSB7XG4gICAgICBsZXQgaG91cnMgPSBkYXRlLmdldEhvdXJzKCkgJSAxMjtcbiAgICAgIGlmIChob3VycyA9PT0gMCkgaG91cnMgPSAxMjtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuaChkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gSG91ciBbMC0yM11cbiAgSDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gXCJIb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXRlLmdldEhvdXJzKCksIHsgdW5pdDogXCJob3VyXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5IKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBIb3VyIFswLTExXVxuICBLOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCkgJSAxMjtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJLb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihob3VycywgeyB1bml0OiBcImhvdXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGhvdXJzLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIEhvdXIgWzEtMjRdXG4gIGs6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBsZXQgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XG4gICAgaWYgKGhvdXJzID09PSAwKSBob3VycyA9IDI0O1xuXG4gICAgaWYgKHRva2VuID09PSBcImtvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaG91cnMsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gTWludXRlXG4gIG06IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09IFwibW9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRNaW51dGVzKCksIHsgdW5pdDogXCJtaW51dGVcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLm0oZGF0ZSwgdG9rZW4pO1xuICB9LFxuXG4gIC8vIFNlY29uZFxuICBzOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSBcInNvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0U2Vjb25kcygpLCB7IHVuaXQ6IFwic2Vjb25kXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5zKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBGcmFjdGlvbiBvZiBzZWNvbmRcbiAgUzogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5TKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBUaW1lem9uZSAoSVNPLTg2MDEuIElmIG9mZnNldCBpcyAwLCBvdXRwdXQgaXMgYWx3YXlzIGAnWidgKVxuICBYOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgaWYgKHRpbWV6b25lT2Zmc2V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gXCJaXCI7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gSG91cnMgYW5kIG9wdGlvbmFsIG1pbnV0ZXNcbiAgICAgIGNhc2UgXCJYXCI6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpO1xuXG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGBYWGBcbiAgICAgIGNhc2UgXCJYWFhYXCI6XG4gICAgICBjYXNlIFwiWFhcIjogLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aG91dCBgOmAgZGVsaW1pdGVyXG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYFhYWGBcbiAgICAgIGNhc2UgXCJYWFhYWFwiOlxuICAgICAgY2FzZSBcIlhYWFwiOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoSVNPLTg2MDEuIElmIG9mZnNldCBpcyAwLCBvdXRwdXQgaXMgYCcrMDA6MDAnYCBvciBlcXVpdmFsZW50KVxuICB4OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gSG91cnMgYW5kIG9wdGlvbmFsIG1pbnV0ZXNcbiAgICAgIGNhc2UgXCJ4XCI6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpO1xuXG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGB4eGBcbiAgICAgIGNhc2UgXCJ4eHh4XCI6XG4gICAgICBjYXNlIFwieHhcIjogLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aG91dCBgOmAgZGVsaW1pdGVyXG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYHh4eGBcbiAgICAgIGNhc2UgXCJ4eHh4eFwiOlxuICAgICAgY2FzZSBcInh4eFwiOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoR01UKVxuICBPOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgXCJPXCI6XG4gICAgICBjYXNlIFwiT09cIjpcbiAgICAgIGNhc2UgXCJPT09cIjpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgICAvLyBMb25nXG4gICAgICBjYXNlIFwiT09PT1wiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoc3BlY2lmaWMgbm9uLWxvY2F0aW9uKVxuICB6OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgXCJ6XCI6XG4gICAgICBjYXNlIFwienpcIjpcbiAgICAgIGNhc2UgXCJ6enpcIjpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgICAvLyBMb25nXG4gICAgICBjYXNlIFwienp6elwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBTZWNvbmRzIHRpbWVzdGFtcFxuICB0OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IE1hdGgudHJ1bmMoK2RhdGUgLyAxMDAwKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHRpbWVzdGFtcCwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBNaWxsaXNlY29uZHMgdGltZXN0YW1wXG4gIFQ6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcygrZGF0ZSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lU2hvcnQob2Zmc2V0LCBkZWxpbWl0ZXIgPSBcIlwiKSB7XG4gIGNvbnN0IHNpZ24gPSBvZmZzZXQgPiAwID8gXCItXCIgOiBcIitcIjtcbiAgY29uc3QgYWJzT2Zmc2V0ID0gTWF0aC5hYnMob2Zmc2V0KTtcbiAgY29uc3QgaG91cnMgPSBNYXRoLnRydW5jKGFic09mZnNldCAvIDYwKTtcbiAgY29uc3QgbWludXRlcyA9IGFic09mZnNldCAlIDYwO1xuICBpZiAobWludXRlcyA9PT0gMCkge1xuICAgIHJldHVybiBzaWduICsgU3RyaW5nKGhvdXJzKTtcbiAgfVxuICByZXR1cm4gc2lnbiArIFN0cmluZyhob3VycykgKyBkZWxpbWl0ZXIgKyBhZGRMZWFkaW5nWmVyb3MobWludXRlcywgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyhvZmZzZXQsIGRlbGltaXRlcikge1xuICBpZiAob2Zmc2V0ICUgNjAgPT09IDApIHtcbiAgICBjb25zdCBzaWduID0gb2Zmc2V0ID4gMCA/IFwiLVwiIDogXCIrXCI7XG4gICAgcmV0dXJuIHNpZ24gKyBhZGRMZWFkaW5nWmVyb3MoTWF0aC5hYnMob2Zmc2V0KSAvIDYwLCAyKTtcbiAgfVxuICByZXR1cm4gZm9ybWF0VGltZXpvbmUob2Zmc2V0LCBkZWxpbWl0ZXIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUaW1lem9uZShvZmZzZXQsIGRlbGltaXRlciA9IFwiXCIpIHtcbiAgY29uc3Qgc2lnbiA9IG9mZnNldCA+IDAgPyBcIi1cIiA6IFwiK1wiO1xuICBjb25zdCBhYnNPZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpO1xuICBjb25zdCBob3VycyA9IGFkZExlYWRpbmdaZXJvcyhNYXRoLnRydW5jKGFic09mZnNldCAvIDYwKSwgMik7XG4gIGNvbnN0IG1pbnV0ZXMgPSBhZGRMZWFkaW5nWmVyb3MoYWJzT2Zmc2V0ICUgNjAsIDIpO1xuICByZXR1cm4gc2lnbiArIGhvdXJzICsgZGVsaW1pdGVyICsgbWludXRlcztcbn1cbiIsImNvbnN0IGRhdGVMb25nRm9ybWF0dGVyID0gKHBhdHRlcm4sIGZvcm1hdExvbmcpID0+IHtcbiAgc3dpdGNoIChwYXR0ZXJuKSB7XG4gICAgY2FzZSBcIlBcIjpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLmRhdGUoeyB3aWR0aDogXCJzaG9ydFwiIH0pO1xuICAgIGNhc2UgXCJQUFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcuZGF0ZSh7IHdpZHRoOiBcIm1lZGl1bVwiIH0pO1xuICAgIGNhc2UgXCJQUFBcIjpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLmRhdGUoeyB3aWR0aDogXCJsb25nXCIgfSk7XG4gICAgY2FzZSBcIlBQUFBcIjpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcuZGF0ZSh7IHdpZHRoOiBcImZ1bGxcIiB9KTtcbiAgfVxufTtcblxuY29uc3QgdGltZUxvbmdGb3JtYXR0ZXIgPSAocGF0dGVybiwgZm9ybWF0TG9uZykgPT4ge1xuICBzd2l0Y2ggKHBhdHRlcm4pIHtcbiAgICBjYXNlIFwicFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcudGltZSh7IHdpZHRoOiBcInNob3J0XCIgfSk7XG4gICAgY2FzZSBcInBwXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHsgd2lkdGg6IFwibWVkaXVtXCIgfSk7XG4gICAgY2FzZSBcInBwcFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcudGltZSh7IHdpZHRoOiBcImxvbmdcIiB9KTtcbiAgICBjYXNlIFwicHBwcFwiOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHsgd2lkdGg6IFwiZnVsbFwiIH0pO1xuICB9XG59O1xuXG5jb25zdCBkYXRlVGltZUxvbmdGb3JtYXR0ZXIgPSAocGF0dGVybiwgZm9ybWF0TG9uZykgPT4ge1xuICBjb25zdCBtYXRjaFJlc3VsdCA9IHBhdHRlcm4ubWF0Y2goLyhQKykocCspPy8pIHx8IFtdO1xuICBjb25zdCBkYXRlUGF0dGVybiA9IG1hdGNoUmVzdWx0WzFdO1xuICBjb25zdCB0aW1lUGF0dGVybiA9IG1hdGNoUmVzdWx0WzJdO1xuXG4gIGlmICghdGltZVBhdHRlcm4pIHtcbiAgICByZXR1cm4gZGF0ZUxvbmdGb3JtYXR0ZXIocGF0dGVybiwgZm9ybWF0TG9uZyk7XG4gIH1cblxuICBsZXQgZGF0ZVRpbWVGb3JtYXQ7XG5cbiAgc3dpdGNoIChkYXRlUGF0dGVybikge1xuICAgIGNhc2UgXCJQXCI6XG4gICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcuZGF0ZVRpbWUoeyB3aWR0aDogXCJzaG9ydFwiIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIlBQXCI6XG4gICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcuZGF0ZVRpbWUoeyB3aWR0aDogXCJtZWRpdW1cIiB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJQUFBcIjpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7IHdpZHRoOiBcImxvbmdcIiB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJQUFBQXCI6XG4gICAgZGVmYXVsdDpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7IHdpZHRoOiBcImZ1bGxcIiB9KTtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGRhdGVUaW1lRm9ybWF0XG4gICAgLnJlcGxhY2UoXCJ7e2RhdGV9fVwiLCBkYXRlTG9uZ0Zvcm1hdHRlcihkYXRlUGF0dGVybiwgZm9ybWF0TG9uZykpXG4gICAgLnJlcGxhY2UoXCJ7e3RpbWV9fVwiLCB0aW1lTG9uZ0Zvcm1hdHRlcih0aW1lUGF0dGVybiwgZm9ybWF0TG9uZykpO1xufTtcblxuZXhwb3J0IGNvbnN0IGxvbmdGb3JtYXR0ZXJzID0ge1xuICBwOiB0aW1lTG9uZ0Zvcm1hdHRlcixcbiAgUDogZGF0ZVRpbWVMb25nRm9ybWF0dGVyLFxufTtcbiIsImNvbnN0IGRheU9mWWVhclRva2VuUkUgPSAvXkQrJC87XG5jb25zdCB3ZWVrWWVhclRva2VuUkUgPSAvXlkrJC87XG5cbmNvbnN0IHRocm93VG9rZW5zID0gW1wiRFwiLCBcIkREXCIsIFwiWVlcIiwgXCJZWVlZXCJdO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbih0b2tlbikge1xuICByZXR1cm4gZGF5T2ZZZWFyVG9rZW5SRS50ZXN0KHRva2VuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbih0b2tlbikge1xuICByZXR1cm4gd2Vla1llYXJUb2tlblJFLnRlc3QodG9rZW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2Fybk9yVGhyb3dQcm90ZWN0ZWRFcnJvcih0b2tlbiwgZm9ybWF0LCBpbnB1dCkge1xuICBjb25zdCBfbWVzc2FnZSA9IG1lc3NhZ2UodG9rZW4sIGZvcm1hdCwgaW5wdXQpO1xuICBjb25zb2xlLndhcm4oX21lc3NhZ2UpO1xuICBpZiAodGhyb3dUb2tlbnMuaW5jbHVkZXModG9rZW4pKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihfbWVzc2FnZSk7XG59XG5cbmZ1bmN0aW9uIG1lc3NhZ2UodG9rZW4sIGZvcm1hdCwgaW5wdXQpIHtcbiAgY29uc3Qgc3ViamVjdCA9IHRva2VuWzBdID09PSBcIllcIiA/IFwieWVhcnNcIiA6IFwiZGF5cyBvZiB0aGUgbW9udGhcIjtcbiAgcmV0dXJuIGBVc2UgXFxgJHt0b2tlbi50b0xvd2VyQ2FzZSgpfVxcYCBpbnN0ZWFkIG9mIFxcYCR7dG9rZW59XFxgIChpbiBcXGAke2Zvcm1hdH1cXGApIGZvciBmb3JtYXR0aW5nICR7c3ViamVjdH0gdG8gdGhlIGlucHV0IFxcYCR7aW5wdXR9XFxgOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRgO1xufVxuIiwiaW1wb3J0IHsgZGVmYXVsdExvY2FsZSB9IGZyb20gXCIuL19saWIvZGVmYXVsdExvY2FsZS5qc1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdE9wdGlvbnMgfSBmcm9tIFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCI7XG5pbXBvcnQgeyBmb3JtYXR0ZXJzIH0gZnJvbSBcIi4vX2xpYi9mb3JtYXQvZm9ybWF0dGVycy5qc1wiO1xuaW1wb3J0IHsgbG9uZ0Zvcm1hdHRlcnMgfSBmcm9tIFwiLi9fbGliL2Zvcm1hdC9sb25nRm9ybWF0dGVycy5qc1wiO1xuaW1wb3J0IHtcbiAgaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbixcbiAgaXNQcm90ZWN0ZWRXZWVrWWVhclRva2VuLFxuICB3YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yLFxufSBmcm9tIFwiLi9fbGliL3Byb3RlY3RlZFRva2Vucy5qc1wiO1xuaW1wb3J0IHsgaXNWYWxpZCB9IGZyb20gXCIuL2lzVmFsaWQuanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vLyBSZXhwb3J0cyBvZiBpbnRlcm5hbCBmb3IgbGlicmFyaWVzIHRvIHVzZS5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2lzc3Vlcy8zNjM4I2lzc3VlY29tbWVudC0xODc3MDgyODc0XG5leHBvcnQgeyBmb3JtYXR0ZXJzLCBsb25nRm9ybWF0dGVycyB9O1xuXG4vLyBUaGlzIFJlZ0V4cCBjb25zaXN0cyBvZiB0aHJlZSBwYXJ0cyBzZXBhcmF0ZWQgYnkgYHxgOlxuLy8gLSBbeVlRcU1Md0lkRGVjaWhIS2ttc11vIG1hdGNoZXMgYW55IGF2YWlsYWJsZSBvcmRpbmFsIG51bWJlciB0b2tlblxuLy8gICAob25lIG9mIHRoZSBjZXJ0YWluIGxldHRlcnMgZm9sbG93ZWQgYnkgYG9gKVxuLy8gLSAoXFx3KVxcMSogbWF0Y2hlcyBhbnkgc2VxdWVuY2VzIG9mIHRoZSBzYW1lIGxldHRlclxuLy8gLSAnJyBtYXRjaGVzIHR3byBxdW90ZSBjaGFyYWN0ZXJzIGluIGEgcm93XG4vLyAtICcoJyd8W14nXSkrKCd8JCkgbWF0Y2hlcyBhbnl0aGluZyBzdXJyb3VuZGVkIGJ5IHR3byBxdW90ZSBjaGFyYWN0ZXJzICgnKSxcbi8vICAgZXhjZXB0IGEgc2luZ2xlIHF1b3RlIHN5bWJvbCwgd2hpY2ggZW5kcyB0aGUgc2VxdWVuY2UuXG4vLyAgIFR3byBxdW90ZSBjaGFyYWN0ZXJzIGRvIG5vdCBlbmQgdGhlIHNlcXVlbmNlLlxuLy8gICBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyBzaW5nbGUgcXVvdGVcbi8vICAgdGhlbiB0aGUgc2VxdWVuY2Ugd2lsbCBjb250aW51ZSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuXG4vLyAtIC4gbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciB1bm1hdGNoZWQgYnkgcHJldmlvdXMgcGFydHMgb2YgdGhlIFJlZ0V4cHNcbmNvbnN0IGZvcm1hdHRpbmdUb2tlbnNSZWdFeHAgPVxuICAvW3lZUXFNTHdJZERlY2loSEtrbXNdb3woXFx3KVxcMSp8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7XG5cbi8vIFRoaXMgUmVnRXhwIGNhdGNoZXMgc3ltYm9scyBlc2NhcGVkIGJ5IHF1b3RlcywgYW5kIGFsc29cbi8vIHNlcXVlbmNlcyBvZiBzeW1ib2xzIFAsIHAsIGFuZCB0aGUgY29tYmluYXRpb25zIGxpa2UgYFBQUFBQUFBwcHBwcGBcbmNvbnN0IGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwID0gL1ArcCt8UCt8cCt8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7XG5cbmNvbnN0IGVzY2FwZWRTdHJpbmdSZWdFeHAgPSAvXicoW15dKj8pJz8kLztcbmNvbnN0IGRvdWJsZVF1b3RlUmVnRXhwID0gLycnL2c7XG5jb25zdCB1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCA9IC9bYS16QS1aXS87XG5cbmV4cG9ydCB7IGZvcm1hdCBhcyBmb3JtYXREYXRlIH07XG5cbi8qKlxuICogVGhlIHtAbGluayBmb3JtYXR9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBmb3JtYXRcbiAqIEBhbGlhcyBmb3JtYXREYXRlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEZvcm1hdCB0aGUgZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgZm9ybWF0dGVkIGRhdGUgc3RyaW5nIGluIHRoZSBnaXZlbiBmb3JtYXQuIFRoZSByZXN1bHQgbWF5IHZhcnkgYnkgbG9jYWxlLlxuICpcbiAqID4g4pqg77iPIFBsZWFzZSBub3RlIHRoYXQgdGhlIGBmb3JtYXRgIHRva2VucyBkaWZmZXIgZnJvbSBNb21lbnQuanMgYW5kIG90aGVyIGxpYnJhcmllcy5cbiAqID4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKlxuICogVGhlIGNoYXJhY3RlcnMgd3JhcHBlZCBiZXR3ZWVuIHR3byBzaW5nbGUgcXVvdGVzIGNoYXJhY3RlcnMgKCcpIGFyZSBlc2NhcGVkLlxuICogVHdvIHNpbmdsZSBxdW90ZXMgaW4gYSByb3csIHdoZXRoZXIgaW5zaWRlIG9yIG91dHNpZGUgYSBxdW90ZWQgc2VxdWVuY2UsIHJlcHJlc2VudCBhICdyZWFsJyBzaW5nbGUgcXVvdGUuXG4gKiAoc2VlIHRoZSBsYXN0IGV4YW1wbGUpXG4gKlxuICogRm9ybWF0IG9mIHRoZSBzdHJpbmcgaXMgYmFzZWQgb24gVW5pY29kZSBUZWNobmljYWwgU3RhbmRhcmQgIzM1OlxuICogaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjM1L3RyMzUtZGF0ZXMuaHRtbCNEYXRlX0ZpZWxkX1N5bWJvbF9UYWJsZVxuICogd2l0aCBhIGZldyBhZGRpdGlvbnMgKHNlZSBub3RlIDcgYmVsb3cgdGhlIHRhYmxlKS5cbiAqXG4gKiBBY2NlcHRlZCBwYXR0ZXJuczpcbiAqIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBhdHRlcm4gfCBSZXN1bHQgZXhhbXBsZXMgICAgICAgICAgICAgICAgICAgfCBOb3RlcyB8XG4gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tfFxuICogfCBFcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRy4uR0dHICB8IEFELCBCQyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdHR0cgICAgfCBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdCAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHR0dHRyAgIHwgQSwgQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBDYWxlbmRhciB5ZWFyICAgICAgICAgICAgICAgICAgIHwgeSAgICAgICB8IDQ0LCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHlvICAgICAgfCA0NHRoLCAxc3QsIDB0aCwgMTd0aCAgICAgICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eSAgICAgIHwgNDQsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeXl5ICAgICB8IDA0NCwgMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHl5eXkgICAgfCAwMDQ0LCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eXl5eSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1ICAgfFxuICogfCBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgIHwgWSAgICAgICB8IDQ0LCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlvICAgICAgfCA0NHRoLCAxc3QsIDE5MDB0aCwgMjAxN3RoICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWSAgICAgIHwgNDQsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgIHwgNSw4ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWVlZICAgICB8IDA0NCwgMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlZWVkgICAgfCAwMDQ0LCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgfCA1LDggICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWVlZWSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1ICAgfFxuICogfCBJU08gd2Vlay1udW1iZXJpbmcgeWVhciAgICAgICAgIHwgUiAgICAgICB8IC00MywgMCwgMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSICAgICAgfCAtNDMsIDAwLCAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSUlIgICAgIHwgLTA0MywgMDAwLCAwMDEsIDE5MDAsIDIwMTcgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlJSUiAgICB8IC0wMDQzLCAwMDAwLCAwMDAxLCAxOTAwLCAyMDE3ICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSUlJSICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDUsNyB8XG4gKiB8IEV4dGVuZGVkIHllYXIgICAgICAgICAgICAgICAgICAgfCB1ICAgICAgIHwgLTQzLCAwLCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXUgICAgICB8IC00MywgMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHV1dSAgICAgfCAtMDQzLCAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1dXV1ICAgIHwgLTAwNDMsIDAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXV1dXUgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNSAgIHxcbiAqIHwgUXVhcnRlciAoZm9ybWF0dGluZykgICAgICAgICAgICB8IFEgICAgICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRbyAgICAgIHwgMXN0LCAybmQsIDNyZCwgNHRoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVEgICAgICB8IDAxLCAwMiwgMDMsIDA0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFRUSAgICAgfCBRMSwgUTIsIFEzLCBRNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRUVFRICAgIHwgMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVFRUVEgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgUXVhcnRlciAoc3RhbmQtYWxvbmUpICAgICAgICAgICB8IHEgICAgICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxbyAgICAgIHwgMXN0LCAybmQsIDNyZCwgNHRoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXEgICAgICB8IDAxLCAwMiwgMDMsIDA0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFxcSAgICAgfCBRMSwgUTIsIFEzLCBRNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxcXFxICAgIHwgMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXFxcXEgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgTW9udGggKGZvcm1hdHRpbmcpICAgICAgICAgICAgICB8IE0gICAgICAgfCAxLCAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTJ0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU0gICAgICB8IDAxLCAwMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1NTSAgICAgfCBKYW4sIEZlYiwgLi4uLCBEZWMgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNTU1NICAgIHwgSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU1NTU0gICB8IEosIEYsIC4uLiwgRCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTW9udGggKHN0YW5kLWFsb25lKSAgICAgICAgICAgICB8IEwgICAgICAgfCAxLCAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTJ0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTEwgICAgICB8IDAxLCAwMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExMTCAgICAgfCBKYW4sIEZlYiwgLi4uLCBEZWMgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTExMICAgIHwgSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTExMTEwgICB8IEosIEYsIC4uLiwgRCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTG9jYWwgd2VlayBvZiB5ZWFyICAgICAgICAgICAgICB8IHcgICAgICAgfCAxLCAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3byAgICAgIHwgMXN0LCAybmQsIC4uLiwgNTN0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd3cgICAgICB8IDAxLCAwMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSVNPIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgICB8IEkgICAgICAgfCAxLCAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgNTN0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSUkgICAgICB8IDAxLCAwMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgICB8IGQgICAgICAgfCAxLCAyLCAuLi4sIDMxICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMzFzdCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGQgICAgICB8IDAxLCAwMiwgLi4uLCAzMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgRGF5IG9mIHllYXIgICAgICAgICAgICAgICAgICAgICB8IEQgICAgICAgfCAxLCAyLCAuLi4sIDM2NSwgMzY2ICAgICAgICAgICAgICAgfCA5ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMzY1dGgsIDM2NnRoICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgREQgICAgICB8IDAxLCAwMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgICB8IDkgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERERCAgICAgfCAwMDEsIDAwMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEREREICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyAgICAgfFxuICogfCBEYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgICAgICAgIHwgRS4uRUVFICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVFRUUgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRUVFRSAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRUVFRUVFICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgSVNPIGRheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgICB8IGkgICAgICAgfCAxLCAyLCAzLCAuLi4sIDcgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgN3RoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWkgICAgICB8IDAxLCAwMiwgLi4uLCAwNyAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaSAgICAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaWlpICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWlpaWkgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaWlpaSAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCA3ICAgICB8XG4gKiB8IExvY2FsIGRheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgfCBlICAgICAgIHwgMiwgMywgNCwgLi4uLCAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZW8gICAgICB8IDJuZCwgM3JkLCAuLi4sIDFzdCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlICAgICAgfCAwMiwgMDMsIC4uLiwgMDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWUgICAgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWVlZSAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlZWVlICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWVlZWUgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgICAgICAgfFxuICogfCBMb2NhbCBkYXkgb2Ygd2VlayAoc3RhbmQtYWxvbmUpIHwgYyAgICAgICB8IDIsIDMsIDQsIC4uLiwgMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvICAgICAgfCAybmQsIDNyZCwgLi4uLCAxc3QgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjYyAgICAgIHwgMDIsIDAzLCAuLi4sIDAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjICAgICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjY2MgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjY2NjYyAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjY2NjICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgICB8IGEuLmFhICAgfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYWEgICAgIHwgYW0sIHBtICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWFhYSAgICB8IGEubS4sIHAubS4gICAgICAgICAgICAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFhYWFhICAgfCBhLCBwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgfCBiLi5iYiAgIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYmJiICAgICB8IGFtLCBwbSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJiYmIgICAgfCBhLm0uLCBwLm0uLCBub29uLCBtaWRuaWdodCAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYmJiYiAgIHwgYSwgcCwgbiwgbWkgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBGbGV4aWJsZSBkYXkgcGVyaW9kICAgICAgICAgICAgIHwgQi4uQkJCICB8IGF0IG5pZ2h0LCBpbiB0aGUgbW9ybmluZywgLi4uICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJCQkIgICAgfCBhdCBuaWdodCwgaW4gdGhlIG1vcm5pbmcsIC4uLiAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCQkJCQiAgIHwgYXQgbmlnaHQsIGluIHRoZSBtb3JuaW5nLCAuLi4gICAgIHwgICAgICAgfFxuICogfCBIb3VyIFsxLTEyXSAgICAgICAgICAgICAgICAgICAgIHwgaCAgICAgICB8IDEsIDIsIC4uLiwgMTEsIDEyICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMXRoLCAxMnRoICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBoaCAgICAgIHwgMDEsIDAyLCAuLi4sIDExLCAxMiAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFswLTIzXSAgICAgICAgICAgICAgICAgICAgIHwgSCAgICAgICB8IDAsIDEsIDIsIC4uLiwgMjMgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhvICAgICAgfCAwdGgsIDFzdCwgMm5kLCAuLi4sIDIzcmQgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBISCAgICAgIHwgMDAsIDAxLCAwMiwgLi4uLCAyMyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFswLTExXSAgICAgICAgICAgICAgICAgICAgIHwgSyAgICAgICB8IDEsIDIsIC4uLiwgMTEsIDAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEtvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMXRoLCAwdGggICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLSyAgICAgIHwgMDEsIDAyLCAuLi4sIDExLCAwMCAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFsxLTI0XSAgICAgICAgICAgICAgICAgICAgIHwgayAgICAgICB8IDI0LCAxLCAyLCAuLi4sIDIzICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtvICAgICAgfCAyNHRoLCAxc3QsIDJuZCwgLi4uLCAyM3JkICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBrayAgICAgIHwgMjQsIDAxLCAwMiwgLi4uLCAyMyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBNaW51dGUgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbSAgICAgICB8IDAsIDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1vICAgICAgfCAwdGgsIDFzdCwgLi4uLCA1OXRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtbSAgICAgIHwgMDAsIDAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBTZWNvbmQgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcyAgICAgICB8IDAsIDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNvICAgICAgfCAwdGgsIDFzdCwgLi4uLCA1OXRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzcyAgICAgIHwgMDAsIDAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBGcmFjdGlvbiBvZiBzZWNvbmQgICAgICAgICAgICAgIHwgUyAgICAgICB8IDAsIDEsIC4uLiwgOSAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNTICAgICAgfCAwMCwgMDEsIC4uLiwgOTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTU1MgICAgIHwgMDAwLCAwMDEsIC4uLiwgOTk5ICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU1NTUyAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMgICAgIHxcbiAqIHwgVGltZXpvbmUgKElTTy04NjAxIHcvIFopICAgICAgICB8IFggICAgICAgfCAtMDgsICswNTMwLCBaICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWCAgICAgIHwgLTA4MDAsICswNTMwLCBaICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWFhYICAgICB8IC0wODowMCwgKzA1OjMwLCBaICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFhYWFggICAgfCAtMDgwMCwgKzA1MzAsIFosICsxMjM0NTYgICAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWFhYWCAgIHwgLTA4OjAwLCArMDU6MzAsIFosICsxMjozNDo1NiAgICAgIHwgICAgICAgfFxuICogfCBUaW1lem9uZSAoSVNPLTg2MDEgdy9vIFopICAgICAgIHwgeCAgICAgICB8IC0wOCwgKzA1MzAsICswMCAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4ICAgICAgfCAtMDgwMCwgKzA1MzAsICswMDAwICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB4eHggICAgIHwgLTA4OjAwLCArMDU6MzAsICswMDowMCAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeHh4eCAgICB8IC0wODAwLCArMDUzMCwgKzAwMDAsICsxMjM0NTYgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4eHh4ICAgfCAtMDg6MDAsICswNTozMCwgKzAwOjAwLCArMTI6MzQ6NTYgfCAgICAgICB8XG4gKiB8IFRpbWV6b25lIChHTVQpICAgICAgICAgICAgICAgICAgfCBPLi4uT09PIHwgR01ULTgsIEdNVCs1OjMwLCBHTVQrMCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgT09PTyAgICB8IEdNVC0wODowMCwgR01UKzA1OjMwLCBHTVQrMDA6MDAgICB8IDIgICAgIHxcbiAqIHwgVGltZXpvbmUgKHNwZWNpZmljIG5vbi1sb2NhdC4pICB8IHouLi56enogfCBHTVQtOCwgR01UKzU6MzAsIEdNVCswICAgICAgICAgICAgfCA2ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB6enp6ICAgIHwgR01ULTA4OjAwLCBHTVQrMDU6MzAsIEdNVCswMDowMCAgIHwgMiw2ICAgfFxuICogfCBTZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgICAgICAgIHwgdCAgICAgICB8IDUxMjk2OTUyMCAgICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR0ICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDcgICB8XG4gKiB8IE1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgfCBUICAgICAgIHwgNTEyOTY5NTIwOTAwICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFQgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNyAgIHxcbiAqIHwgTG9uZyBsb2NhbGl6ZWQgZGF0ZSAgICAgICAgICAgICB8IFAgICAgICAgfCAwNC8yOS8xNDUzICAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUCAgICAgIHwgQXByIDI5LCAxNDUzICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQICAgICB8IEFwcmlsIDI5dGgsIDE0NTMgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQUFAgICAgfCBGcmlkYXksIEFwcmlsIDI5dGgsIDE0NTMgICAgICAgICAgfCAyLDcgICB8XG4gKiB8IExvbmcgbG9jYWxpemVkIHRpbWUgICAgICAgICAgICAgfCBwICAgICAgIHwgMTI6MDAgQU0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHAgICAgICB8IDEyOjAwOjAwIEFNICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBwcCAgICAgfCAxMjowMDowMCBBTSBHTVQrMiAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcHBwICAgIHwgMTI6MDA6MDAgQU0gR01UKzAyOjAwICAgICAgICAgICAgIHwgMiw3ICAgfFxuICogfCBDb21iaW5hdGlvbiBvZiBkYXRlIGFuZCB0aW1lICAgIHwgUHAgICAgICB8IDA0LzI5LzE0NTMsIDEyOjAwIEFNICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQcHAgICAgfCBBcHIgMjksIDE0NTMsIDEyOjAwOjAwIEFNICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUFBwcHAgIHwgQXByaWwgMjl0aCwgMTQ1MyBhdCAuLi4gICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQUHBwcHB8IEZyaWRheSwgQXByaWwgMjl0aCwgMTQ1MyBhdCAuLi4gICB8IDIsNyAgIHxcbiAqIE5vdGVzOlxuICogMS4gXCJGb3JtYXR0aW5nXCIgdW5pdHMgKGUuZy4gZm9ybWF0dGluZyBxdWFydGVyKSBpbiB0aGUgZGVmYXVsdCBlbi1VUyBsb2NhbGVcbiAqICAgIGFyZSB0aGUgc2FtZSBhcyBcInN0YW5kLWFsb25lXCIgdW5pdHMsIGJ1dCBhcmUgZGlmZmVyZW50IGluIHNvbWUgbGFuZ3VhZ2VzLlxuICogICAgXCJGb3JtYXR0aW5nXCIgdW5pdHMgYXJlIGRlY2xpbmVkIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgdGhlIGxhbmd1YWdlXG4gKiAgICBpbiB0aGUgY29udGV4dCBvZiBhIGRhdGUuIFwiU3RhbmQtYWxvbmVcIiB1bml0cyBhcmUgYWx3YXlzIG5vbWluYXRpdmUgc2luZ3VsYXI6XG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdkbyBMTExMJywge2xvY2FsZTogY3N9KSAvLz0+ICc2LiBsaXN0b3BhZCdgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdkbyBNTU1NJywge2xvY2FsZTogY3N9KSAvLz0+ICc2LiBsaXN0b3BhZHUnYFxuICpcbiAqIDIuIEFueSBzZXF1ZW5jZSBvZiB0aGUgaWRlbnRpY2FsIGxldHRlcnMgaXMgYSBwYXR0ZXJuLCB1bmxlc3MgaXQgaXMgZXNjYXBlZCBieVxuICogICAgdGhlIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzIChzZWUgYmVsb3cpLlxuICogICAgSWYgdGhlIHNlcXVlbmNlIGlzIGxvbmdlciB0aGFuIGxpc3RlZCBpbiB0YWJsZSAoZS5nLiBgRUVFRUVFRUVFRUVgKVxuICogICAgdGhlIG91dHB1dCB3aWxsIGJlIHRoZSBzYW1lIGFzIGRlZmF1bHQgcGF0dGVybiBmb3IgdGhpcyB1bml0LCB1c3VhbGx5XG4gKiAgICB0aGUgbG9uZ2VzdCBvbmUgKGluIGNhc2Ugb2YgSVNPIHdlZWtkYXlzLCBgRUVFRWApLiBEZWZhdWx0IHBhdHRlcm5zIGZvciB1bml0c1xuICogICAgYXJlIG1hcmtlZCB3aXRoIFwiMlwiIGluIHRoZSBsYXN0IGNvbHVtbiBvZiB0aGUgdGFibGUuXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU0nKSAvLz0+ICdOb3YnYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NTScpIC8vPT4gJ05vdmVtYmVyJ2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTU1NJykgLy89PiAnTidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NTU0nKSAvLz0+ICdOb3ZlbWJlcidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NTU1NJykgLy89PiAnTm92ZW1iZXInYFxuICpcbiAqIDMuIFNvbWUgcGF0dGVybnMgY291bGQgYmUgdW5saW1pdGVkIGxlbmd0aCAoc3VjaCBhcyBgeXl5eXl5eXlgKS5cbiAqICAgIFRoZSBvdXRwdXQgd2lsbCBiZSBwYWRkZWQgd2l0aCB6ZXJvcyB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mIHRoZSBwYXR0ZXJuLlxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAneXl5eXl5eXknKSAvLz0+ICcwMDAwMjAxNydgXG4gKlxuICogNC4gYFFRUVFRYCBhbmQgYHFxcXFxYCBjb3VsZCBiZSBub3Qgc3RyaWN0bHkgbnVtZXJpY2FsIGluIHNvbWUgbG9jYWxlcy5cbiAqICAgIFRoZXNlIHRva2VucyByZXByZXNlbnQgdGhlIHNob3J0ZXN0IGZvcm0gb2YgdGhlIHF1YXJ0ZXIuXG4gKlxuICogNS4gVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIGB5YCBhbmQgYHVgIHBhdHRlcm5zIGFyZSBCLkMuIHllYXJzOlxuICpcbiAqICAgIHwgWWVhciB8IGB5YCB8IGB1YCB8XG4gKiAgICB8LS0tLS0tfC0tLS0tfC0tLS0tfFxuICogICAgfCBBQyAxIHwgICAxIHwgICAxIHxcbiAqICAgIHwgQkMgMSB8ICAgMSB8ICAgMCB8XG4gKiAgICB8IEJDIDIgfCAgIDIgfCAgLTEgfFxuICpcbiAqICAgIEFsc28gYHl5YCBhbHdheXMgcmV0dXJucyB0aGUgbGFzdCB0d28gZGlnaXRzIG9mIGEgeWVhcixcbiAqICAgIHdoaWxlIGB1dWAgcGFkcyBzaW5nbGUgZGlnaXQgeWVhcnMgdG8gMiBjaGFyYWN0ZXJzIGFuZCByZXR1cm5zIG90aGVyIHllYXJzIHVuY2hhbmdlZDpcbiAqXG4gKiAgICB8IFllYXIgfCBgeXlgIHwgYHV1YCB8XG4gKiAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS18XG4gKiAgICB8IDEgICAgfCAgIDAxIHwgICAwMSB8XG4gKiAgICB8IDE0ICAgfCAgIDE0IHwgICAxNCB8XG4gKiAgICB8IDM3NiAgfCAgIDc2IHwgIDM3NiB8XG4gKiAgICB8IDE0NTMgfCAgIDUzIHwgMTQ1MyB8XG4gKlxuICogICAgVGhlIHNhbWUgZGlmZmVyZW5jZSBpcyB0cnVlIGZvciBsb2NhbCBhbmQgSVNPIHdlZWstbnVtYmVyaW5nIHllYXJzIChgWWAgYW5kIGBSYCksXG4gKiAgICBleGNlcHQgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhcnMgYXJlIGRlcGVuZGVudCBvbiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gXG4gKiAgICBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAoY29tcGFyZSBbZ2V0SVNPV2Vla1llYXJdKGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvZ2V0SVNPV2Vla1llYXIpXG4gKiAgICBhbmQgW2dldFdlZWtZZWFyXShodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL2dldFdlZWtZZWFyKSkuXG4gKlxuICogNi4gU3BlY2lmaWMgbm9uLWxvY2F0aW9uIHRpbWV6b25lcyBhcmUgY3VycmVudGx5IHVuYXZhaWxhYmxlIGluIGBkYXRlLWZuc2AsXG4gKiAgICBzbyByaWdodCBub3cgdGhlc2UgdG9rZW5zIGZhbGwgYmFjayB0byBHTVQgdGltZXpvbmVzLlxuICpcbiAqIDcuIFRoZXNlIHBhdHRlcm5zIGFyZSBub3QgaW4gdGhlIFVuaWNvZGUgVGVjaG5pY2FsIFN0YW5kYXJkICMzNTpcbiAqICAgIC0gYGlgOiBJU08gZGF5IG9mIHdlZWtcbiAqICAgIC0gYElgOiBJU08gd2VlayBvZiB5ZWFyXG4gKiAgICAtIGBSYDogSVNPIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqICAgIC0gYHRgOiBzZWNvbmRzIHRpbWVzdGFtcFxuICogICAgLSBgVGA6IG1pbGxpc2Vjb25kcyB0aW1lc3RhbXBcbiAqICAgIC0gYG9gOiBvcmRpbmFsIG51bWJlciBtb2RpZmllclxuICogICAgLSBgUGA6IGxvbmcgbG9jYWxpemVkIGRhdGVcbiAqICAgIC0gYHBgOiBsb25nIGxvY2FsaXplZCB0aW1lXG4gKlxuICogOC4gYFlZYCBhbmQgYFlZWVlgIHRva2VucyByZXByZXNlbnQgd2Vlay1udW1iZXJpbmcgeWVhcnMgYnV0IHRoZXkgYXJlIG9mdGVuIGNvbmZ1c2VkIHdpdGggeWVhcnMuXG4gKiAgICBZb3Ugc2hvdWxkIGVuYWJsZSBgb3B0aW9ucy51c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnNgIHRvIHVzZSB0aGVtLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqXG4gKiA5LiBgRGAgYW5kIGBERGAgdG9rZW5zIHJlcHJlc2VudCBkYXlzIG9mIHRoZSB5ZWFyIGJ1dCB0aGV5IGFyZSBvZnRlbiBjb25mdXNlZCB3aXRoIGRheXMgb2YgdGhlIG1vbnRoLlxuICogICAgWW91IHNob3VsZCBlbmFibGUgYG9wdGlvbnMudXNlQWRkaXRpb25hbERheU9mWWVhclRva2Vuc2AgdG8gdXNlIHRoZW0uIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBmb3JtYXQgLSBUaGUgc3RyaW5nIG9mIHRva2Vuc1xuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBkYXRlIHN0cmluZ1xuICpcbiAqIEB0aHJvd3MgYGRhdGVgIG11c3Qgbm90IGJlIEludmFsaWQgRGF0ZVxuICogQHRocm93cyBgb3B0aW9ucy5sb2NhbGVgIG11c3QgY29udGFpbiBgbG9jYWxpemVgIHByb3BlcnR5XG4gKiBAdGhyb3dzIGBvcHRpb25zLmxvY2FsZWAgbXVzdCBjb250YWluIGBmb3JtYXRMb25nYCBwcm9wZXJ0eVxuICogQHRocm93cyB1c2UgYHl5eXlgIGluc3RlYWQgb2YgYFlZWVlgIGZvciBmb3JtYXR0aW5nIHllYXJzIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgdXNlIGB5eWAgaW5zdGVhZCBvZiBgWVlgIGZvciBmb3JtYXR0aW5nIHllYXJzIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgdXNlIGBkYCBpbnN0ZWFkIG9mIGBEYCBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIHVzZSBgZGRgIGluc3RlYWQgb2YgYEREYCBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIGZvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBSZXByZXNlbnQgMTEgRmVicnVhcnkgMjAxNCBpbiBtaWRkbGUtZW5kaWFuIGZvcm1hdDpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCAxLCAxMSksICdNTS9kZC95eXl5JylcbiAqIC8vPT4gJzAyLzExLzIwMTQnXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJlcHJlc2VudCAyIEp1bHkgMjAxNCBpbiBFc3BlcmFudG86XG4gKiBpbXBvcnQgeyBlb0xvY2FsZSB9IGZyb20gJ2RhdGUtZm5zL2xvY2FsZS9lbydcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCA2LCAyKSwgXCJkbyAnZGUnIE1NTU0geXl5eVwiLCB7XG4gKiAgIGxvY2FsZTogZW9Mb2NhbGVcbiAqIH0pXG4gKiAvLz0+ICcyLWEgZGUganVsaW8gMjAxNCdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXNjYXBlIHN0cmluZyBieSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVyczpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCA2LCAyLCAxNSksIFwiaCAnbycnY2xvY2snXCIpXG4gKiAvLz0+IFwiMyBvJ2Nsb2NrXCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdChkYXRlLCBmb3JtYXRTdHIsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0aW9ucygpO1xuICBjb25zdCBsb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMubG9jYWxlID8/IGRlZmF1bHRMb2NhbGU7XG5cbiAgY29uc3QgZmlyc3RXZWVrQ29udGFpbnNEYXRlID1cbiAgICBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgMTtcblxuICBjb25zdCB3ZWVrU3RhcnRzT24gPVxuICAgIG9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICAwO1xuXG4gIGNvbnN0IG9yaWdpbmFsRGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG5cbiAgaWYgKCFpc1ZhbGlkKG9yaWdpbmFsRGF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgdGltZSB2YWx1ZVwiKTtcbiAgfVxuXG4gIGxldCBwYXJ0cyA9IGZvcm1hdFN0clxuICAgIC5tYXRjaChsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cClcbiAgICAubWFwKChzdWJzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdO1xuICAgICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSBcInBcIiB8fCBmaXJzdENoYXJhY3RlciA9PT0gXCJQXCIpIHtcbiAgICAgICAgY29uc3QgbG9uZ0Zvcm1hdHRlciA9IGxvbmdGb3JtYXR0ZXJzW2ZpcnN0Q2hhcmFjdGVyXTtcbiAgICAgICAgcmV0dXJuIGxvbmdGb3JtYXR0ZXIoc3Vic3RyaW5nLCBsb2NhbGUuZm9ybWF0TG9uZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3Vic3RyaW5nO1xuICAgIH0pXG4gICAgLmpvaW4oXCJcIilcbiAgICAubWF0Y2goZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cClcbiAgICAubWFwKChzdWJzdHJpbmcpID0+IHtcbiAgICAgIC8vIFJlcGxhY2UgdHdvIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzIHdpdGggb25lIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJcbiAgICAgIGlmIChzdWJzdHJpbmcgPT09IFwiJydcIikge1xuICAgICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IFwiJ1wiIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdO1xuICAgICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSBcIidcIikge1xuICAgICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IGNsZWFuRXNjYXBlZFN0cmluZyhzdWJzdHJpbmcpIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JtYXR0ZXJzW2ZpcnN0Q2hhcmFjdGVyXSkge1xuICAgICAgICByZXR1cm4geyBpc1Rva2VuOiB0cnVlLCB2YWx1ZTogc3Vic3RyaW5nIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChmaXJzdENoYXJhY3Rlci5tYXRjaCh1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgICAgXCJGb3JtYXQgc3RyaW5nIGNvbnRhaW5zIGFuIHVuZXNjYXBlZCBsYXRpbiBhbHBoYWJldCBjaGFyYWN0ZXIgYFwiICtcbiAgICAgICAgICAgIGZpcnN0Q2hhcmFjdGVyICtcbiAgICAgICAgICAgIFwiYFwiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IHN1YnN0cmluZyB9O1xuICAgIH0pO1xuXG4gIC8vIGludm9rZSBsb2NhbGl6ZSBwcmVwcm9jZXNzb3IgKG9ubHkgZm9yIGZyZW5jaCBsb2NhbGVzIGF0IHRoZSBtb21lbnQpXG4gIGlmIChsb2NhbGUubG9jYWxpemUucHJlcHJvY2Vzc29yKSB7XG4gICAgcGFydHMgPSBsb2NhbGUubG9jYWxpemUucHJlcHJvY2Vzc29yKG9yaWdpbmFsRGF0ZSwgcGFydHMpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0dGVyT3B0aW9ucyA9IHtcbiAgICBmaXJzdFdlZWtDb250YWluc0RhdGUsXG4gICAgd2Vla1N0YXJ0c09uLFxuICAgIGxvY2FsZSxcbiAgfTtcblxuICByZXR1cm4gcGFydHNcbiAgICAubWFwKChwYXJ0KSA9PiB7XG4gICAgICBpZiAoIXBhcnQuaXNUb2tlbikgcmV0dXJuIHBhcnQudmFsdWU7XG5cbiAgICAgIGNvbnN0IHRva2VuID0gcGFydC52YWx1ZTtcblxuICAgICAgaWYgKFxuICAgICAgICAoIW9wdGlvbnM/LnVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2VucyAmJlxuICAgICAgICAgIGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbih0b2tlbikpIHx8XG4gICAgICAgICghb3B0aW9ucz8udXNlQWRkaXRpb25hbERheU9mWWVhclRva2VucyAmJlxuICAgICAgICAgIGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4odG9rZW4pKVxuICAgICAgKSB7XG4gICAgICAgIHdhcm5PclRocm93UHJvdGVjdGVkRXJyb3IodG9rZW4sIGZvcm1hdFN0ciwgU3RyaW5nKGRhdGUpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0dGVyID0gZm9ybWF0dGVyc1t0b2tlblswXV07XG4gICAgICByZXR1cm4gZm9ybWF0dGVyKG9yaWdpbmFsRGF0ZSwgdG9rZW4sIGxvY2FsZS5sb2NhbGl6ZSwgZm9ybWF0dGVyT3B0aW9ucyk7XG4gICAgfSlcbiAgICAuam9pbihcIlwiKTtcbn1cblxuZnVuY3Rpb24gY2xlYW5Fc2NhcGVkU3RyaW5nKGlucHV0KSB7XG4gIGNvbnN0IG1hdGNoZWQgPSBpbnB1dC5tYXRjaChlc2NhcGVkU3RyaW5nUmVnRXhwKTtcblxuICBpZiAoIW1hdGNoZWQpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cblxuICByZXR1cm4gbWF0Y2hlZFsxXS5yZXBsYWNlKGRvdWJsZVF1b3RlUmVnRXhwLCBcIidcIik7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZm9ybWF0O1xuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2XSwibWFwcGluZ3MiOiI7OztBQUFBLElBQUksaUJBQWlCLEVBQUU7QUFFdkIsU0FBZ0Isb0JBQW9CO0FBQ2xDLFFBQU87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMrQlQsU0FBZ0Is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