breeze-client 2.1.3 → 2.1.4-mjs
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.
- package/README.md +18 -5
- package/adapter-ajax-angularjs/{breeze-client-adapter-ajax-angularjs.d.ts → index.d.ts} +1 -0
- package/adapter-ajax-fetch/{breeze-client-adapter-ajax-fetch.d.ts → index.d.ts} +1 -0
- package/adapter-ajax-httpclient/{breeze-client-adapter-ajax-httpclient.d.ts → index.d.ts} +1 -0
- package/adapter-ajax-jquery/{breeze-client-adapter-ajax-jquery.d.ts → index.d.ts} +1 -0
- package/adapter-ajax-post/{breeze-client-adapter-ajax-post.d.ts → index.d.ts} +1 -0
- package/adapter-data-service-odata/{breeze-client-adapter-data-service-odata.d.ts → index.d.ts} +1 -0
- package/adapter-data-service-webapi/{breeze-client-adapter-data-service-webapi.d.ts → index.d.ts} +1 -0
- package/adapter-model-library-backing-store/{breeze-client-adapter-model-library-backing-store.d.ts → index.d.ts} +1 -0
- package/adapter-model-library-ko/{breeze-client-adapter-model-library-ko.d.ts → index.d.ts} +1 -0
- package/adapter-uri-builder-json/{breeze-client-adapter-uri-builder-json.d.ts → index.d.ts} +1 -0
- package/adapter-uri-builder-odata/{breeze-client-adapter-uri-builder-odata.d.ts → index.d.ts} +1 -0
- package/esm2020/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +130 -0
- package/esm2020/adapter-ajax-angularjs/adapter-core.mjs +49 -0
- package/esm2020/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.mjs +5 -0
- package/esm2020/adapter-ajax-fetch/adapter-ajax-fetch.mjs +132 -0
- package/esm2020/adapter-ajax-fetch/adapter-core.mjs +49 -0
- package/esm2020/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.mjs +5 -0
- package/esm2020/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +137 -0
- package/esm2020/adapter-ajax-httpclient/adapter-core.mjs +49 -0
- package/esm2020/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.mjs +5 -0
- package/esm2020/adapter-ajax-jquery/adapter-ajax-jquery.mjs +103 -0
- package/esm2020/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.mjs +5 -0
- package/esm2020/adapter-ajax-post/adapter-ajax-post.mjs +77 -0
- package/esm2020/adapter-ajax-post/breeze-client-adapter-ajax-post.mjs +5 -0
- package/esm2020/adapter-data-service-odata/adapter-core.mjs +49 -0
- package/esm2020/adapter-data-service-odata/adapter-data-service-odata.mjs +456 -0
- package/esm2020/adapter-data-service-odata/breeze-client-adapter-data-service-odata.mjs +5 -0
- package/esm2020/adapter-data-service-webapi/adapter-data-service-webapi.mjs +93 -0
- package/esm2020/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.mjs +5 -0
- package/esm2020/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +268 -0
- package/esm2020/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.mjs +5 -0
- package/esm2020/adapter-model-library-ko/adapter-model-library-ko.mjs +240 -0
- package/esm2020/adapter-model-library-ko/breeze-client-adapter-model-library-ko.mjs +5 -0
- package/esm2020/adapter-uri-builder-json/adapter-core.mjs +49 -0
- package/esm2020/adapter-uri-builder-json/adapter-uri-builder-json.mjs +36 -0
- package/esm2020/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.mjs +5 -0
- package/esm2020/adapter-uri-builder-odata/adapter-core.mjs +49 -0
- package/esm2020/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +190 -0
- package/esm2020/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.mjs +5 -0
- package/esm2020/breeze-client.mjs +5 -0
- package/esm2020/index.mjs +2 -0
- package/esm2020/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.mjs +5 -0
- package/esm2020/mixin-get-entity-graph/mixin-get-entity-graph.mjs +269 -0
- package/esm2020/mixin-save-queuing/breeze-client-mixin-save-queuing.mjs +5 -0
- package/esm2020/mixin-save-queuing/mixin-save-queuing.mjs +400 -0
- package/esm2020/src/abstract-data-service-adapter.mjs +296 -0
- package/esm2020/src/array.mjs +4 -0
- package/esm2020/src/assert-param.mjs +312 -0
- package/esm2020/src/breeze.mjs +85 -0
- package/esm2020/src/complex-array.mjs +117 -0
- package/esm2020/src/config.mjs +223 -0
- package/esm2020/src/core.mjs +707 -0
- package/esm2020/src/csdl-metadata-parser.mjs +385 -0
- package/esm2020/src/data-service.mjs +203 -0
- package/esm2020/src/data-type.mjs +444 -0
- package/esm2020/src/default-property-interceptor.mjs +460 -0
- package/esm2020/src/entity-action.mjs +45 -0
- package/esm2020/src/entity-aspect.mjs +806 -0
- package/esm2020/src/entity-group.mjs +187 -0
- package/esm2020/src/entity-key.mjs +116 -0
- package/esm2020/src/entity-manager.mjs +2094 -0
- package/esm2020/src/entity-metadata.mjs +2109 -0
- package/esm2020/src/entity-query.mjs +996 -0
- package/esm2020/src/entity-state.mjs +99 -0
- package/esm2020/src/enum.mjs +141 -0
- package/esm2020/src/event.mjs +256 -0
- package/esm2020/src/interface-registry.mjs +41 -0
- package/esm2020/src/key-generator.mjs +108 -0
- package/esm2020/src/local-query-comparison-options.mjs +65 -0
- package/esm2020/src/mapping-context.mjs +405 -0
- package/esm2020/src/naming-convention.mjs +88 -0
- package/esm2020/src/observable-array.mjs +183 -0
- package/esm2020/src/predicate.mjs +1232 -0
- package/esm2020/src/primitive-array.mjs +85 -0
- package/esm2020/src/query-options.mjs +152 -0
- package/esm2020/src/relation-array.mjs +173 -0
- package/esm2020/src/save-options.mjs +41 -0
- package/esm2020/src/unattached-children-map.mjs +58 -0
- package/esm2020/src/validate.mjs +988 -0
- package/esm2020/src/validation-options.mjs +64 -0
- package/fesm2015/{breeze-client-adapter-ajax-angularjs.js → breeze-client-adapter-ajax-angularjs.mjs} +2 -1
- package/fesm2015/breeze-client-adapter-ajax-angularjs.mjs.map +1 -0
- package/fesm2015/{breeze-client-adapter-ajax-fetch.js → breeze-client-adapter-ajax-fetch.mjs} +6 -3
- package/fesm2015/breeze-client-adapter-ajax-fetch.mjs.map +1 -0
- package/fesm2015/{breeze-client-adapter-ajax-httpclient.js → breeze-client-adapter-ajax-httpclient.mjs} +2 -1
- package/fesm2015/breeze-client-adapter-ajax-httpclient.mjs.map +1 -0
- package/fesm2015/{breeze-client-adapter-ajax-jquery.js → breeze-client-adapter-ajax-jquery.mjs} +3 -2
- package/fesm2015/breeze-client-adapter-ajax-jquery.mjs.map +1 -0
- package/fesm2015/{breeze-client-adapter-ajax-post.js → breeze-client-adapter-ajax-post.mjs} +2 -1
- package/fesm2015/breeze-client-adapter-ajax-post.mjs.map +1 -0
- package/fesm2015/{breeze-client-adapter-data-service-odata.js → breeze-client-adapter-data-service-odata.mjs} +21 -22
- package/fesm2015/breeze-client-adapter-data-service-odata.mjs.map +1 -0
- package/fesm2015/{breeze-client-adapter-data-service-webapi.js → breeze-client-adapter-data-service-webapi.mjs} +14 -13
- package/fesm2015/breeze-client-adapter-data-service-webapi.mjs.map +1 -0
- package/fesm2015/{breeze-client-adapter-model-library-backing-store.js → breeze-client-adapter-model-library-backing-store.mjs} +14 -13
- package/fesm2015/breeze-client-adapter-model-library-backing-store.mjs.map +1 -0
- package/fesm2015/{breeze-client-adapter-model-library-ko.js → breeze-client-adapter-model-library-ko.mjs} +14 -13
- package/fesm2015/breeze-client-adapter-model-library-ko.mjs.map +1 -0
- package/fesm2015/{breeze-client-adapter-uri-builder-json.js → breeze-client-adapter-uri-builder-json.mjs} +9 -8
- package/fesm2015/breeze-client-adapter-uri-builder-json.mjs.map +1 -0
- package/fesm2015/{breeze-client-adapter-uri-builder-odata.js → breeze-client-adapter-uri-builder-odata.mjs} +86 -86
- package/fesm2015/breeze-client-adapter-uri-builder-odata.mjs.map +1 -0
- package/fesm2015/{breeze-client-mixin-get-entity-graph.js → breeze-client-mixin-get-entity-graph.mjs} +2 -1
- package/fesm2015/breeze-client-mixin-get-entity-graph.mjs.map +1 -0
- package/fesm2015/{breeze-client-mixin-save-queuing.js → breeze-client-mixin-save-queuing.mjs} +2 -1
- package/fesm2015/breeze-client-mixin-save-queuing.mjs.map +1 -0
- package/fesm2015/{breeze-client.js → breeze-client.mjs} +409 -418
- package/fesm2015/breeze-client.mjs.map +1 -0
- package/{fesm5/breeze-client-adapter-ajax-angularjs.js → fesm2020/breeze-client-adapter-ajax-angularjs.mjs} +42 -42
- package/fesm2020/breeze-client-adapter-ajax-angularjs.mjs.map +1 -0
- package/{fesm5/breeze-client-adapter-ajax-fetch.js → fesm2020/breeze-client-adapter-ajax-fetch.mjs} +45 -43
- package/fesm2020/breeze-client-adapter-ajax-fetch.mjs.map +1 -0
- package/{fesm5/breeze-client-adapter-ajax-httpclient.js → fesm2020/breeze-client-adapter-ajax-httpclient.mjs} +44 -44
- package/fesm2020/breeze-client-adapter-ajax-httpclient.mjs.map +1 -0
- package/{fesm5/breeze-client-adapter-ajax-jquery.js → fesm2020/breeze-client-adapter-ajax-jquery.mjs} +19 -19
- package/fesm2020/breeze-client-adapter-ajax-jquery.mjs.map +1 -0
- package/{fesm5/breeze-client-adapter-ajax-post.js → fesm2020/breeze-client-adapter-ajax-post.mjs} +9 -11
- package/fesm2020/breeze-client-adapter-ajax-post.mjs.map +1 -0
- package/{fesm5/breeze-client-adapter-data-service-odata.js → fesm2020/breeze-client-adapter-data-service-odata.mjs} +127 -134
- package/fesm2020/breeze-client-adapter-data-service-odata.mjs.map +1 -0
- package/{fesm5/breeze-client-adapter-data-service-webapi.js → fesm2020/breeze-client-adapter-data-service-webapi.mjs} +39 -42
- package/fesm2020/breeze-client-adapter-data-service-webapi.mjs.map +1 -0
- package/{fesm5/breeze-client-adapter-model-library-backing-store.js → fesm2020/breeze-client-adapter-model-library-backing-store.mjs} +64 -64
- package/fesm2020/breeze-client-adapter-model-library-backing-store.mjs.map +1 -0
- package/{fesm5/breeze-client-adapter-model-library-ko.js → fesm2020/breeze-client-adapter-model-library-ko.mjs} +58 -58
- package/fesm2020/breeze-client-adapter-model-library-ko.mjs.map +1 -0
- package/fesm2020/breeze-client-adapter-uri-builder-json.mjs +92 -0
- package/fesm2020/breeze-client-adapter-uri-builder-json.mjs.map +1 -0
- package/fesm2020/breeze-client-adapter-uri-builder-odata.mjs +246 -0
- package/fesm2020/breeze-client-adapter-uri-builder-odata.mjs.map +1 -0
- package/{fesm5/breeze-client-mixin-get-entity-graph.js → fesm2020/breeze-client-mixin-get-entity-graph.mjs} +46 -45
- package/fesm2020/breeze-client-mixin-get-entity-graph.mjs.map +1 -0
- package/{fesm5/breeze-client-mixin-save-queuing.js → fesm2020/breeze-client-mixin-save-queuing.mjs} +117 -126
- package/fesm2020/breeze-client-mixin-save-queuing.mjs.map +1 -0
- package/{fesm5/breeze-client.js → fesm2020/breeze-client.mjs} +3396 -3612
- package/fesm2020/breeze-client.mjs.map +1 -0
- package/mixin-get-entity-graph/{breeze-client-mixin-get-entity-graph.d.ts → index.d.ts} +1 -0
- package/mixin-save-queuing/{breeze-client-mixin-save-queuing.d.ts → index.d.ts} +1 -0
- package/mjs/README.md +17 -0
- package/package.json +125 -11
- package/src/entity-metadata.d.ts +6 -4
- package/src/entity-query.d.ts +1 -1
- package/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.metadata.json +0 -1
- package/adapter-ajax-angularjs/package.json +0 -13
- package/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.metadata.json +0 -1
- package/adapter-ajax-fetch/package.json +0 -13
- package/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.metadata.json +0 -1
- package/adapter-ajax-httpclient/package.json +0 -13
- package/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.metadata.json +0 -1
- package/adapter-ajax-jquery/package.json +0 -13
- package/adapter-ajax-post/breeze-client-adapter-ajax-post.metadata.json +0 -1
- package/adapter-ajax-post/package.json +0 -13
- package/adapter-data-service-odata/breeze-client-adapter-data-service-odata.metadata.json +0 -1
- package/adapter-data-service-odata/package.json +0 -13
- package/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.metadata.json +0 -1
- package/adapter-data-service-webapi/package.json +0 -13
- package/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.metadata.json +0 -1
- package/adapter-model-library-backing-store/package.json +0 -13
- package/adapter-model-library-ko/breeze-client-adapter-model-library-ko.metadata.json +0 -1
- package/adapter-model-library-ko/package.json +0 -13
- package/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.metadata.json +0 -1
- package/adapter-uri-builder-json/package.json +0 -13
- package/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.metadata.json +0 -1
- package/adapter-uri-builder-odata/package.json +0 -13
- package/breeze-client.d.ts +0 -8
- package/breeze-client.metadata.json +0 -1
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.js +0 -190
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-fetch.umd.js +0 -190
- package/bundles/breeze-client-adapter-ajax-fetch.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.js +0 -195
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-jquery.umd.js +0 -115
- package/bundles/breeze-client-adapter-ajax-jquery.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-post.umd.js +0 -92
- package/bundles/breeze-client-adapter-ajax-post.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-post.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-ajax-post.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-data-service-odata.umd.js +0 -743
- package/bundles/breeze-client-adapter-data-service-odata.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-data-service-odata.umd.min.js +0 -16
- package/bundles/breeze-client-adapter-data-service-odata.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-data-service-webapi.umd.js +0 -326
- package/bundles/breeze-client-adapter-data-service-webapi.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js +0 -16
- package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.js +0 -280
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-model-library-ko.umd.js +0 -252
- package/bundles/breeze-client-adapter-model-library-ko.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-model-library-ko.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-model-library-ko.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-uri-builder-json.umd.js +0 -96
- package/bundles/breeze-client-adapter-uri-builder-json.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.js +0 -262
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js.map +0 -1
- package/bundles/breeze-client-mixin-get-entity-graph.umd.js +0 -258
- package/bundles/breeze-client-mixin-get-entity-graph.umd.js.map +0 -1
- package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js +0 -2
- package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js.map +0 -1
- package/bundles/breeze-client-mixin-save-queuing.umd.js +0 -579
- package/bundles/breeze-client-mixin-save-queuing.umd.js.map +0 -1
- package/bundles/breeze-client-mixin-save-queuing.umd.min.js +0 -16
- package/bundles/breeze-client-mixin-save-queuing.umd.min.js.map +0 -1
- package/bundles/breeze-client.umd.js +0 -14098
- package/bundles/breeze-client.umd.js.map +0 -1
- package/bundles/breeze-client.umd.min.js +0 -16
- package/bundles/breeze-client.umd.min.js.map +0 -1
- package/esm2015/adapter-ajax-angularjs/adapter-ajax-angularjs.js +0 -130
- package/esm2015/adapter-ajax-angularjs/adapter-core.js +0 -49
- package/esm2015/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +0 -5
- package/esm2015/adapter-ajax-fetch/adapter-ajax-fetch.js +0 -130
- package/esm2015/adapter-ajax-fetch/adapter-core.js +0 -49
- package/esm2015/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +0 -5
- package/esm2015/adapter-ajax-httpclient/adapter-ajax-httpclient.js +0 -137
- package/esm2015/adapter-ajax-httpclient/adapter-core.js +0 -49
- package/esm2015/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +0 -5
- package/esm2015/adapter-ajax-jquery/adapter-ajax-jquery.js +0 -103
- package/esm2015/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +0 -5
- package/esm2015/adapter-ajax-post/adapter-ajax-post.js +0 -77
- package/esm2015/adapter-ajax-post/breeze-client-adapter-ajax-post.js +0 -5
- package/esm2015/adapter-data-service-odata/adapter-core.js +0 -49
- package/esm2015/adapter-data-service-odata/adapter-data-service-odata.js +0 -459
- package/esm2015/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +0 -5
- package/esm2015/adapter-data-service-webapi/adapter-data-service-webapi.js +0 -93
- package/esm2015/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +0 -5
- package/esm2015/adapter-model-library-backing-store/adapter-model-library-backing-store.js +0 -268
- package/esm2015/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +0 -5
- package/esm2015/adapter-model-library-ko/adapter-model-library-ko.js +0 -240
- package/esm2015/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +0 -5
- package/esm2015/adapter-uri-builder-json/adapter-core.js +0 -49
- package/esm2015/adapter-uri-builder-json/adapter-uri-builder-json.js +0 -36
- package/esm2015/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +0 -5
- package/esm2015/adapter-uri-builder-odata/adapter-core.js +0 -49
- package/esm2015/adapter-uri-builder-odata/adapter-uri-builder-odata.js +0 -192
- package/esm2015/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +0 -5
- package/esm2015/breeze-client.js +0 -9
- package/esm2015/index.js +0 -2
- package/esm2015/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +0 -5
- package/esm2015/mixin-get-entity-graph/mixin-get-entity-graph.js +0 -269
- package/esm2015/mixin-save-queuing/breeze-client-mixin-save-queuing.js +0 -5
- package/esm2015/mixin-save-queuing/mixin-save-queuing.js +0 -400
- package/esm2015/src/abstract-data-service-adapter.js +0 -296
- package/esm2015/src/array.js +0 -4
- package/esm2015/src/assert-param.js +0 -312
- package/esm2015/src/breeze.js +0 -85
- package/esm2015/src/complex-array.js +0 -119
- package/esm2015/src/config.js +0 -223
- package/esm2015/src/core.js +0 -709
- package/esm2015/src/csdl-metadata-parser.js +0 -385
- package/esm2015/src/data-service.js +0 -203
- package/esm2015/src/data-type.js +0 -444
- package/esm2015/src/default-property-interceptor.js +0 -460
- package/esm2015/src/entity-action.js +0 -45
- package/esm2015/src/entity-aspect.js +0 -806
- package/esm2015/src/entity-group.js +0 -187
- package/esm2015/src/entity-key.js +0 -116
- package/esm2015/src/entity-manager.js +0 -2094
- package/esm2015/src/entity-metadata.js +0 -2109
- package/esm2015/src/entity-query.js +0 -996
- package/esm2015/src/entity-state.js +0 -99
- package/esm2015/src/enum.js +0 -141
- package/esm2015/src/event.js +0 -256
- package/esm2015/src/interface-registry.js +0 -41
- package/esm2015/src/key-generator.js +0 -108
- package/esm2015/src/local-query-comparison-options.js +0 -65
- package/esm2015/src/mapping-context.js +0 -405
- package/esm2015/src/naming-convention.js +0 -88
- package/esm2015/src/observable-array.js +0 -185
- package/esm2015/src/predicate.js +0 -1235
- package/esm2015/src/primitive-array.js +0 -87
- package/esm2015/src/query-options.js +0 -152
- package/esm2015/src/relation-array.js +0 -175
- package/esm2015/src/save-options.js +0 -41
- package/esm2015/src/unattached-children-map.js +0 -58
- package/esm2015/src/validate.js +0 -991
- package/esm2015/src/validation-options.js +0 -64
- package/esm5/adapter-ajax-angularjs/adapter-ajax-angularjs.js +0 -132
- package/esm5/adapter-ajax-angularjs/adapter-core.js +0 -49
- package/esm5/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +0 -5
- package/esm5/adapter-ajax-fetch/adapter-ajax-fetch.js +0 -132
- package/esm5/adapter-ajax-fetch/adapter-core.js +0 -49
- package/esm5/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +0 -5
- package/esm5/adapter-ajax-httpclient/adapter-ajax-httpclient.js +0 -139
- package/esm5/adapter-ajax-httpclient/adapter-core.js +0 -49
- package/esm5/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +0 -5
- package/esm5/adapter-ajax-jquery/adapter-ajax-jquery.js +0 -105
- package/esm5/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +0 -5
- package/esm5/adapter-ajax-post/adapter-ajax-post.js +0 -81
- package/esm5/adapter-ajax-post/breeze-client-adapter-ajax-post.js +0 -5
- package/esm5/adapter-data-service-odata/adapter-core.js +0 -49
- package/esm5/adapter-data-service-odata/adapter-data-service-odata.js +0 -466
- package/esm5/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +0 -5
- package/esm5/adapter-data-service-webapi/adapter-data-service-webapi.js +0 -98
- package/esm5/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +0 -5
- package/esm5/adapter-model-library-backing-store/adapter-model-library-backing-store.js +0 -270
- package/esm5/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +0 -5
- package/esm5/adapter-model-library-ko/adapter-model-library-ko.js +0 -242
- package/esm5/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +0 -5
- package/esm5/adapter-uri-builder-json/adapter-core.js +0 -49
- package/esm5/adapter-uri-builder-json/adapter-uri-builder-json.js +0 -38
- package/esm5/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +0 -5
- package/esm5/adapter-uri-builder-odata/adapter-core.js +0 -49
- package/esm5/adapter-uri-builder-odata/adapter-uri-builder-odata.js +0 -197
- package/esm5/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +0 -5
- package/esm5/breeze-client.js +0 -9
- package/esm5/index.js +0 -2
- package/esm5/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +0 -5
- package/esm5/mixin-get-entity-graph/mixin-get-entity-graph.js +0 -269
- package/esm5/mixin-save-queuing/breeze-client-mixin-save-queuing.js +0 -5
- package/esm5/mixin-save-queuing/mixin-save-queuing.js +0 -412
- package/esm5/src/abstract-data-service-adapter.js +0 -302
- package/esm5/src/array.js +0 -4
- package/esm5/src/assert-param.js +0 -317
- package/esm5/src/breeze.js +0 -85
- package/esm5/src/complex-array.js +0 -119
- package/esm5/src/config.js +0 -228
- package/esm5/src/core.js +0 -717
- package/esm5/src/csdl-metadata-parser.js +0 -385
- package/esm5/src/data-service.js +0 -207
- package/esm5/src/data-type.js +0 -451
- package/esm5/src/default-property-interceptor.js +0 -460
- package/esm5/src/entity-action.js +0 -52
- package/esm5/src/entity-aspect.js +0 -812
- package/esm5/src/entity-group.js +0 -189
- package/esm5/src/entity-key.js +0 -118
- package/esm5/src/entity-manager.js +0 -2112
- package/esm5/src/entity-metadata.js +0 -2144
- package/esm5/src/entity-query.js +0 -1023
- package/esm5/src/entity-state.js +0 -106
- package/esm5/src/enum.js +0 -144
- package/esm5/src/event.js +0 -259
- package/esm5/src/interface-registry.js +0 -43
- package/esm5/src/key-generator.js +0 -111
- package/esm5/src/local-query-comparison-options.js +0 -67
- package/esm5/src/mapping-context.js +0 -407
- package/esm5/src/naming-convention.js +0 -90
- package/esm5/src/observable-array.js +0 -201
- package/esm5/src/predicate.js +0 -1300
- package/esm5/src/primitive-array.js +0 -87
- package/esm5/src/query-options.js +0 -167
- package/esm5/src/relation-array.js +0 -175
- package/esm5/src/save-options.js +0 -43
- package/esm5/src/unattached-children-map.js +0 -60
- package/esm5/src/validate.js +0 -996
- package/esm5/src/validation-options.js +0 -66
- package/fesm2015/breeze-client-adapter-ajax-angularjs.js.map +0 -1
- package/fesm2015/breeze-client-adapter-ajax-fetch.js.map +0 -1
- package/fesm2015/breeze-client-adapter-ajax-httpclient.js.map +0 -1
- package/fesm2015/breeze-client-adapter-ajax-jquery.js.map +0 -1
- package/fesm2015/breeze-client-adapter-ajax-post.js.map +0 -1
- package/fesm2015/breeze-client-adapter-data-service-odata.js.map +0 -1
- package/fesm2015/breeze-client-adapter-data-service-webapi.js.map +0 -1
- package/fesm2015/breeze-client-adapter-model-library-backing-store.js.map +0 -1
- package/fesm2015/breeze-client-adapter-model-library-ko.js.map +0 -1
- package/fesm2015/breeze-client-adapter-uri-builder-json.js.map +0 -1
- package/fesm2015/breeze-client-adapter-uri-builder-odata.js.map +0 -1
- package/fesm2015/breeze-client-mixin-get-entity-graph.js.map +0 -1
- package/fesm2015/breeze-client-mixin-save-queuing.js.map +0 -1
- package/fesm2015/breeze-client.js.map +0 -1
- package/fesm5/breeze-client-adapter-ajax-angularjs.js.map +0 -1
- package/fesm5/breeze-client-adapter-ajax-fetch.js.map +0 -1
- package/fesm5/breeze-client-adapter-ajax-httpclient.js.map +0 -1
- package/fesm5/breeze-client-adapter-ajax-jquery.js.map +0 -1
- package/fesm5/breeze-client-adapter-ajax-post.js.map +0 -1
- package/fesm5/breeze-client-adapter-data-service-odata.js.map +0 -1
- package/fesm5/breeze-client-adapter-data-service-webapi.js.map +0 -1
- package/fesm5/breeze-client-adapter-model-library-backing-store.js.map +0 -1
- package/fesm5/breeze-client-adapter-model-library-ko.js.map +0 -1
- package/fesm5/breeze-client-adapter-uri-builder-json.js +0 -92
- package/fesm5/breeze-client-adapter-uri-builder-json.js.map +0 -1
- package/fesm5/breeze-client-adapter-uri-builder-odata.js +0 -250
- package/fesm5/breeze-client-adapter-uri-builder-odata.js.map +0 -1
- package/fesm5/breeze-client-mixin-get-entity-graph.js.map +0 -1
- package/fesm5/breeze-client-mixin-save-queuing.js.map +0 -1
- package/fesm5/breeze-client.js.map +0 -1
- package/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.metadata.json +0 -1
- package/mixin-get-entity-graph/package.json +0 -13
- package/mixin-save-queuing/breeze-client-mixin-save-queuing.metadata.json +0 -1
- package/mixin-save-queuing/package.json +0 -13
|
@@ -0,0 +1,707 @@
|
|
|
1
|
+
/** See if this comment will make it into .d.ts */
|
|
2
|
+
import { BreezeEnum } from './enum';
|
|
3
|
+
let hasOwnProperty = uncurry(Object.prototype.hasOwnProperty);
|
|
4
|
+
let arraySlice = uncurry(Array.prototype.slice);
|
|
5
|
+
let isES5Supported = function () {
|
|
6
|
+
try {
|
|
7
|
+
return !!(Object.getPrototypeOf && Object.defineProperty({}, 'x', {}));
|
|
8
|
+
}
|
|
9
|
+
catch (e) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
}();
|
|
13
|
+
// iterate over object
|
|
14
|
+
function objectForEach(obj, kvFn) {
|
|
15
|
+
for (let key in obj) {
|
|
16
|
+
if (hasOwnProperty(obj, key)) {
|
|
17
|
+
kvFn(key, obj[key]);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function objectMap(obj, kvFn) {
|
|
22
|
+
let results = [];
|
|
23
|
+
for (let key in obj) {
|
|
24
|
+
if (hasOwnProperty(obj, key)) {
|
|
25
|
+
let result = kvFn ? kvFn(key, obj[key]) : obj[key];
|
|
26
|
+
if (result !== undefined) {
|
|
27
|
+
results.push(result);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return results;
|
|
32
|
+
}
|
|
33
|
+
function objectFirst(obj, kvPredicate) {
|
|
34
|
+
for (let key in obj) {
|
|
35
|
+
if (hasOwnProperty(obj, key)) {
|
|
36
|
+
let value = obj[key];
|
|
37
|
+
if (kvPredicate(key, value)) {
|
|
38
|
+
return { key: key, value: value };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
function arrayFlatMap(arr, mapFn) {
|
|
45
|
+
return Array.prototype.concat.apply([], arr.map(mapFn));
|
|
46
|
+
}
|
|
47
|
+
function isSettable(obj, propertyName) {
|
|
48
|
+
let pd = getPropDescriptor(obj, propertyName);
|
|
49
|
+
if (pd == null)
|
|
50
|
+
return true;
|
|
51
|
+
return !!(pd.writable || pd.set);
|
|
52
|
+
}
|
|
53
|
+
function getPropDescriptor(obj, propertyName) {
|
|
54
|
+
if (!isES5Supported)
|
|
55
|
+
return undefined;
|
|
56
|
+
if (obj.hasOwnProperty(propertyName)) {
|
|
57
|
+
return Object.getOwnPropertyDescriptor(obj, propertyName);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
let nextObj = Object.getPrototypeOf(obj);
|
|
61
|
+
if (nextObj == null)
|
|
62
|
+
return undefined;
|
|
63
|
+
return getPropDescriptor(nextObj, propertyName);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Functional extensions
|
|
67
|
+
/** can be used like: persons.filter(propEq("firstName", "John")) */
|
|
68
|
+
function propEq(propertyName, value) {
|
|
69
|
+
return function (obj) {
|
|
70
|
+
return obj[propertyName] === value;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/** can be used like: persons.filter(propEq("firstName", "FirstName", "John")) */
|
|
74
|
+
function propsEq(property1Name, property2Name, value) {
|
|
75
|
+
return function (obj) {
|
|
76
|
+
return obj[property1Name] === value || obj[property2Name] === value;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/** can be used like persons.map(pluck("firstName")) */
|
|
80
|
+
function pluck(propertyName) {
|
|
81
|
+
return function (obj) {
|
|
82
|
+
return obj[propertyName];
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
// end functional extensions
|
|
86
|
+
/** Return an array of property values from source */
|
|
87
|
+
function getOwnPropertyValues(source) {
|
|
88
|
+
let result = [];
|
|
89
|
+
for (let name in source) {
|
|
90
|
+
if (hasOwnProperty(source, name)) {
|
|
91
|
+
result.push(source[name]);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
/** Copy properties from source to target. Returns target. */
|
|
97
|
+
function extend(target, source, propNames) {
|
|
98
|
+
if (!source)
|
|
99
|
+
return target;
|
|
100
|
+
if (propNames) {
|
|
101
|
+
propNames.forEach(function (propName) {
|
|
102
|
+
target[propName] = source[propName];
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
for (let propName in source) {
|
|
107
|
+
if (hasOwnProperty(source, propName)) {
|
|
108
|
+
target[propName] = source[propName];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return target;
|
|
113
|
+
}
|
|
114
|
+
/** Copy properties from defaults iff undefined on target. Returns target. */
|
|
115
|
+
function updateWithDefaults(target, defaults) {
|
|
116
|
+
for (let name in defaults) {
|
|
117
|
+
if (target[name] === undefined) {
|
|
118
|
+
target[name] = defaults[name];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return target;
|
|
122
|
+
}
|
|
123
|
+
/** Set ctor.defaultInstance to an instance of ctor with properties from target.
|
|
124
|
+
We want to insure that the object returned by ctor.defaultInstance is always immutable
|
|
125
|
+
Use 'target' as the primary template for the ctor.defaultInstance;
|
|
126
|
+
Use current 'ctor.defaultInstance' as the template for any missing properties
|
|
127
|
+
creates a new instance for ctor.defaultInstance
|
|
128
|
+
returns target unchanged */
|
|
129
|
+
function setAsDefault(target, ctor) {
|
|
130
|
+
ctor.defaultInstance = updateWithDefaults(new ctor(target), ctor.defaultInstance);
|
|
131
|
+
return target;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
'source' is an object that will be transformed into another
|
|
135
|
+
'template' is a map where the
|
|
136
|
+
keys: are the keys to return
|
|
137
|
+
if a key contains ','s then the key is treated as a delimited string with first of the
|
|
138
|
+
keys being the key to return and the others all valid aliases for this key
|
|
139
|
+
'values' are either
|
|
140
|
+
1) the 'default' value of the key
|
|
141
|
+
2) a function that takes in the source value and should return the value to set
|
|
142
|
+
The value from the source is then set on the target,
|
|
143
|
+
after first passing thru the fn, if provided, UNLESS:
|
|
144
|
+
1) it is the default value
|
|
145
|
+
2) it is undefined ( nulls WILL be set)
|
|
146
|
+
'target' is optional
|
|
147
|
+
- if it exists then properties of the target will be set ( overwritten if the exist)
|
|
148
|
+
- if it does not exist then a new object will be created as filled.
|
|
149
|
+
'target is returned.
|
|
150
|
+
*/
|
|
151
|
+
function toJson(source, template, target = {}) {
|
|
152
|
+
for (let key in template) {
|
|
153
|
+
let aliases = key.split(",");
|
|
154
|
+
let defaultValue = template[key];
|
|
155
|
+
// using some as a forEach with a 'break'
|
|
156
|
+
aliases.some(function (propName) {
|
|
157
|
+
if (!(propName in source))
|
|
158
|
+
return false;
|
|
159
|
+
let value = source[propName];
|
|
160
|
+
// there is a functional property defined with this alias ( not what we want to replace).
|
|
161
|
+
if (typeof value === 'function')
|
|
162
|
+
return false;
|
|
163
|
+
// '==' is deliberate here - idea is that null or undefined values will never get serialized
|
|
164
|
+
// if default value is set to null.
|
|
165
|
+
// tslint:disable-next-line
|
|
166
|
+
if (value == defaultValue)
|
|
167
|
+
return true;
|
|
168
|
+
if (Array.isArray(value) && value.length === 0)
|
|
169
|
+
return true;
|
|
170
|
+
if (typeof (defaultValue) === "function") {
|
|
171
|
+
value = defaultValue(value);
|
|
172
|
+
}
|
|
173
|
+
else if (typeof (value) === "object") {
|
|
174
|
+
if (value && value instanceof BreezeEnum) {
|
|
175
|
+
value = value.name;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (value === undefined)
|
|
179
|
+
return true;
|
|
180
|
+
target[aliases[0]] = value;
|
|
181
|
+
return true;
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
return target;
|
|
185
|
+
}
|
|
186
|
+
/** Replacer function for toJSONSafe, when serializing entities. Excludes entityAspect and other internal properties. */
|
|
187
|
+
function toJSONSafeReplacer(prop, val) {
|
|
188
|
+
if (prop === "entityAspect" || prop === "complexAspect" || prop === "entityType" || prop === "complexType"
|
|
189
|
+
|| prop === "getProperty" || prop === "setProperty"
|
|
190
|
+
|| prop === "constructor" || prop.charAt(0) === '_' || prop.charAt(0) === '$')
|
|
191
|
+
return;
|
|
192
|
+
return val;
|
|
193
|
+
}
|
|
194
|
+
/** Safely perform toJSON logic on objects with cycles. */
|
|
195
|
+
function toJSONSafe(obj, replacer) {
|
|
196
|
+
if (obj !== Object(obj))
|
|
197
|
+
return obj; // primitive value
|
|
198
|
+
if (obj._$visited)
|
|
199
|
+
return undefined;
|
|
200
|
+
if (obj.toJSON) {
|
|
201
|
+
let newObj = obj.toJSON();
|
|
202
|
+
if (newObj !== Object(newObj))
|
|
203
|
+
return newObj; // primitive value
|
|
204
|
+
if (newObj !== obj)
|
|
205
|
+
return toJSONSafe(newObj, replacer);
|
|
206
|
+
// toJSON returned the object unchanged.
|
|
207
|
+
obj = newObj;
|
|
208
|
+
}
|
|
209
|
+
obj._$visited = true;
|
|
210
|
+
let result;
|
|
211
|
+
if (obj instanceof Array) {
|
|
212
|
+
result = obj.map(function (o) {
|
|
213
|
+
return toJSONSafe(o, replacer);
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
else if (typeof (obj) === "function") {
|
|
217
|
+
result = undefined;
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
result = {};
|
|
221
|
+
for (let prop in obj) {
|
|
222
|
+
if (prop === "_$visited")
|
|
223
|
+
continue;
|
|
224
|
+
let val = obj[prop];
|
|
225
|
+
if (replacer) {
|
|
226
|
+
val = replacer(prop, val);
|
|
227
|
+
if (val === undefined)
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
val = toJSONSafe(val, replacer);
|
|
231
|
+
if (val === undefined)
|
|
232
|
+
continue;
|
|
233
|
+
result[prop] = val;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
delete obj._$visited;
|
|
237
|
+
return result;
|
|
238
|
+
}
|
|
239
|
+
/** Resolves the values of a list of properties by checking each property in multiple sources until a value is found. */
|
|
240
|
+
function resolveProperties(sources, propertyNames) {
|
|
241
|
+
let r = {};
|
|
242
|
+
let length = sources.length;
|
|
243
|
+
propertyNames.forEach(function (pn) {
|
|
244
|
+
for (let i = 0; i < length; i++) {
|
|
245
|
+
let src = sources[i];
|
|
246
|
+
if (src) {
|
|
247
|
+
let val = src[pn];
|
|
248
|
+
if (val !== undefined) {
|
|
249
|
+
r[pn] = val;
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
return r;
|
|
256
|
+
}
|
|
257
|
+
// array functions
|
|
258
|
+
function toArray(item) {
|
|
259
|
+
if (item == null) {
|
|
260
|
+
return [];
|
|
261
|
+
}
|
|
262
|
+
else if (Array.isArray(item)) {
|
|
263
|
+
return item;
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
return [item];
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/** a version of Array.map that doesn't require an array, i.e. works on arrays and scalars. */
|
|
270
|
+
// function map<T, U>(items: T | T[], fn: (v: T, ix?: number) => U, includeNull?: boolean): U | U[] {
|
|
271
|
+
function map(items, fn, includeNull) {
|
|
272
|
+
// whether to return nulls in array of results; default = true;
|
|
273
|
+
includeNull = includeNull == null ? true : includeNull;
|
|
274
|
+
if (items == null)
|
|
275
|
+
return items;
|
|
276
|
+
// let result: U[];
|
|
277
|
+
if (Array.isArray(items)) {
|
|
278
|
+
let result = [];
|
|
279
|
+
items.forEach(function (v, ix) {
|
|
280
|
+
let r = fn(v, ix);
|
|
281
|
+
if (r != null || includeNull) {
|
|
282
|
+
result[ix] = r;
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
return result;
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
let result = fn(items);
|
|
289
|
+
return result;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
function arrayFirst(array, predicate) {
|
|
293
|
+
for (let i = 0, j = array.length; i < j; i++) {
|
|
294
|
+
if (predicate(array[i])) {
|
|
295
|
+
return array[i];
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return null;
|
|
299
|
+
}
|
|
300
|
+
function arrayIndexOf(array, predicate) {
|
|
301
|
+
for (let i = 0, j = array.length; i < j; i++) {
|
|
302
|
+
if (predicate(array[i]))
|
|
303
|
+
return i;
|
|
304
|
+
}
|
|
305
|
+
return -1;
|
|
306
|
+
}
|
|
307
|
+
/** Add item if not already in array */
|
|
308
|
+
function arrayAddItemUnique(array, item) {
|
|
309
|
+
let ix = array.indexOf(item);
|
|
310
|
+
if (ix === -1)
|
|
311
|
+
array.push(item);
|
|
312
|
+
}
|
|
313
|
+
/** Remove items from the array
|
|
314
|
+
* @param array
|
|
315
|
+
* @param predicateOrItem - item to remove, or function to determine matching item
|
|
316
|
+
* @param shouldRemoveMultiple - true to keep removing after first match, false otherwise
|
|
317
|
+
*/
|
|
318
|
+
function arrayRemoveItem(array, predicateOrItem, shouldRemoveMultiple) {
|
|
319
|
+
let predicate = (isFunction(predicateOrItem) ? predicateOrItem : undefined);
|
|
320
|
+
let lastIx = array.length - 1;
|
|
321
|
+
let removed = false;
|
|
322
|
+
for (let i = lastIx; i >= 0; i--) {
|
|
323
|
+
if (predicate ? predicate(array[i]) : (array[i] === predicateOrItem)) {
|
|
324
|
+
array.splice(i, 1);
|
|
325
|
+
removed = true;
|
|
326
|
+
if (!shouldRemoveMultiple) {
|
|
327
|
+
return true;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return removed;
|
|
332
|
+
}
|
|
333
|
+
/** Combine array elements using the callback. Returns array with length == min(a1.length, a2.length) */
|
|
334
|
+
function arrayZip(a1, a2, callback) {
|
|
335
|
+
let result = [];
|
|
336
|
+
let n = Math.min(a1.length, a2.length);
|
|
337
|
+
for (let i = 0; i < n; ++i) {
|
|
338
|
+
result.push(callback(a1[i], a2[i]));
|
|
339
|
+
}
|
|
340
|
+
return result;
|
|
341
|
+
}
|
|
342
|
+
//function arrayDistinct(array) {
|
|
343
|
+
// array = array || [];
|
|
344
|
+
// let result = [];
|
|
345
|
+
// for (let i = 0, j = array.length; i < j; i++) {
|
|
346
|
+
// if (result.indexOf(array[i]) < 0)
|
|
347
|
+
// result.push(array[i]);
|
|
348
|
+
// }
|
|
349
|
+
// return result;
|
|
350
|
+
//}
|
|
351
|
+
// Not yet needed
|
|
352
|
+
//// much faster but only works on array items with a toString method that
|
|
353
|
+
//// returns distinct string for distinct objects. So this is safe for arrays with primitive
|
|
354
|
+
//// types but not for arrays with object types, unless toString() has been implemented.
|
|
355
|
+
//function arrayDistinctUnsafe(array) {
|
|
356
|
+
// let o = {}, i, l = array.length, r = [];
|
|
357
|
+
// for (i = 0; i < l; i += 1) {
|
|
358
|
+
// let v = array[i];
|
|
359
|
+
// o[v] = v;
|
|
360
|
+
// }
|
|
361
|
+
// for (i in o) r.push(o[i]);
|
|
362
|
+
// return r;
|
|
363
|
+
//}
|
|
364
|
+
function arrayEquals(a1, a2, equalsFn) {
|
|
365
|
+
//Check if the arrays are undefined/null
|
|
366
|
+
if (!a1 || !a2)
|
|
367
|
+
return false;
|
|
368
|
+
if (a1.length !== a2.length)
|
|
369
|
+
return false;
|
|
370
|
+
//go thru all the vars
|
|
371
|
+
for (let i = 0; i < a1.length; i++) {
|
|
372
|
+
//if the let is an array, we need to make a recursive check
|
|
373
|
+
//otherwise we'll just compare the values
|
|
374
|
+
if (Array.isArray(a1[i])) {
|
|
375
|
+
if (!arrayEquals(a1[i], a2[i]))
|
|
376
|
+
return false;
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
if (equalsFn) {
|
|
380
|
+
if (!equalsFn(a1[i], a2[i]))
|
|
381
|
+
return false;
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
if (a1[i] !== a2[i])
|
|
385
|
+
return false;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
return true;
|
|
390
|
+
}
|
|
391
|
+
// end of array functions
|
|
392
|
+
/** Returns an array for a source and a prop, and creates the prop if needed. */
|
|
393
|
+
function getArray(source, propName) {
|
|
394
|
+
let arr = source[propName];
|
|
395
|
+
if (!arr) {
|
|
396
|
+
arr = [];
|
|
397
|
+
source[propName] = arr;
|
|
398
|
+
}
|
|
399
|
+
return arr;
|
|
400
|
+
}
|
|
401
|
+
/** Calls requireLibCore on semicolon-separated libNames */
|
|
402
|
+
function requireLib(libNames, errMessage) {
|
|
403
|
+
let arrNames = libNames.split(";");
|
|
404
|
+
for (let i = 0, j = arrNames.length; i < j; i++) {
|
|
405
|
+
let lib = requireLibCore(arrNames[i]);
|
|
406
|
+
if (lib)
|
|
407
|
+
return lib;
|
|
408
|
+
}
|
|
409
|
+
if (errMessage) {
|
|
410
|
+
throw new Error("Unable to initialize " + libNames + ". " + errMessage);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
/** Returns the 'libName' module if loaded or else returns undefined */
|
|
414
|
+
function requireLibCore(libName) {
|
|
415
|
+
let win = window || (global ? global.window : undefined);
|
|
416
|
+
if (!win)
|
|
417
|
+
return; // Must run in a browser. Todo: add commonjs support
|
|
418
|
+
// get library from browser globals if we can
|
|
419
|
+
let lib = win[libName];
|
|
420
|
+
if (lib)
|
|
421
|
+
return lib;
|
|
422
|
+
// if require exists, maybe require can get it.
|
|
423
|
+
// This method is synchronous so it can't load modules with AMD.
|
|
424
|
+
// It can only obtain modules from require that have already been loaded.
|
|
425
|
+
// Developer should bootstrap such that the breeze module
|
|
426
|
+
// loads after all other libraries that breeze should find with this method
|
|
427
|
+
// See documentation
|
|
428
|
+
let r = win.require;
|
|
429
|
+
if (r) { // if require exists
|
|
430
|
+
if (r.defined) { // require.defined is not standard and may not exist
|
|
431
|
+
// require.defined returns true if module has been loaded
|
|
432
|
+
return r.defined(libName) ? r(libName) : undefined;
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
// require.defined does not exist so we have to call require('libName') directly.
|
|
436
|
+
// The require('libName') overload is synchronous and does not load modules.
|
|
437
|
+
// It throws an exception if the module isn't already loaded.
|
|
438
|
+
try {
|
|
439
|
+
return r(libName);
|
|
440
|
+
}
|
|
441
|
+
catch (e) {
|
|
442
|
+
// require('libName') threw because module not loaded
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
/** Execute fn while obj has tempValue for property */
|
|
449
|
+
function using(obj, property, tempValue, fn) {
|
|
450
|
+
if (!obj) {
|
|
451
|
+
return fn();
|
|
452
|
+
}
|
|
453
|
+
let originalValue = obj[property];
|
|
454
|
+
if (tempValue === originalValue) {
|
|
455
|
+
return fn();
|
|
456
|
+
}
|
|
457
|
+
obj[property] = tempValue;
|
|
458
|
+
try {
|
|
459
|
+
return fn();
|
|
460
|
+
}
|
|
461
|
+
finally {
|
|
462
|
+
if (originalValue === undefined) {
|
|
463
|
+
delete obj[property];
|
|
464
|
+
}
|
|
465
|
+
else {
|
|
466
|
+
obj[property] = originalValue;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
/** Call state = startFn(), call fn(), call endFn(state) */
|
|
471
|
+
function wrapExecution(startFn, endFn, fn) {
|
|
472
|
+
let state;
|
|
473
|
+
try {
|
|
474
|
+
state = startFn();
|
|
475
|
+
return fn();
|
|
476
|
+
}
|
|
477
|
+
catch (e) {
|
|
478
|
+
if (typeof (state) === 'object') {
|
|
479
|
+
state.error = e;
|
|
480
|
+
}
|
|
481
|
+
throw e;
|
|
482
|
+
}
|
|
483
|
+
finally {
|
|
484
|
+
endFn(state);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
/** Remember & return the value of fn() when it was called with its current args */
|
|
488
|
+
function memoize(fn) {
|
|
489
|
+
return function () {
|
|
490
|
+
let args = arraySlice(arguments), hash = "", i = args.length, currentArg = null;
|
|
491
|
+
while (i--) {
|
|
492
|
+
currentArg = args[i];
|
|
493
|
+
hash += (currentArg === Object(currentArg)) ? JSON.stringify(currentArg) : currentArg;
|
|
494
|
+
fn.memoize || (fn.memoize = {});
|
|
495
|
+
}
|
|
496
|
+
return (hash in fn.memoize) ?
|
|
497
|
+
fn.memoize[hash] :
|
|
498
|
+
fn.memoize[hash] = fn.apply(this, args);
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
function getUuid() {
|
|
502
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
|
503
|
+
// tslint:disable-next-line
|
|
504
|
+
let r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
|
|
505
|
+
return v.toString(16);
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
function durationToSeconds(duration) {
|
|
509
|
+
// basic algorithm from https://github.com/nezasa/iso8601-js-period
|
|
510
|
+
if (typeof duration !== "string")
|
|
511
|
+
throw new Error("Invalid ISO8601 duration '" + duration + "'");
|
|
512
|
+
// regex splits as follows - grp0, grp1, y, m, d, grp2, h, m, s
|
|
513
|
+
// 0 1 2 3 4 5 6 7 8
|
|
514
|
+
let struct = /^P((\d+Y)?(\d+M)?(\d+D)?)?(T(\d+H)?(\d+M)?(\d+S)?)?$/.exec(duration);
|
|
515
|
+
if (!struct)
|
|
516
|
+
throw new Error("Invalid ISO8601 duration '" + duration + "'");
|
|
517
|
+
let ymdhmsIndexes = [2, 3, 4, 6, 7, 8]; // -> grp1,y,m,d,grp2,h,m,s
|
|
518
|
+
let factors = [31104000,
|
|
519
|
+
2592000,
|
|
520
|
+
86400,
|
|
521
|
+
3600,
|
|
522
|
+
60,
|
|
523
|
+
1]; // second (1)
|
|
524
|
+
let seconds = 0;
|
|
525
|
+
for (let i = 0; i < 6; i++) {
|
|
526
|
+
let digit = struct[ymdhmsIndexes[i]];
|
|
527
|
+
// remove letters, replace by 0 if not defined
|
|
528
|
+
digit = (digit ? +digit.replace(/[A-Za-z]+/g, '') : 0);
|
|
529
|
+
seconds += digit * factors[i];
|
|
530
|
+
}
|
|
531
|
+
return seconds;
|
|
532
|
+
}
|
|
533
|
+
// is functions
|
|
534
|
+
function noop() {
|
|
535
|
+
// does nothing
|
|
536
|
+
}
|
|
537
|
+
function identity(x) {
|
|
538
|
+
return x;
|
|
539
|
+
}
|
|
540
|
+
function classof(o) {
|
|
541
|
+
if (o === null) {
|
|
542
|
+
return "null";
|
|
543
|
+
}
|
|
544
|
+
if (o === undefined) {
|
|
545
|
+
return "undefined";
|
|
546
|
+
}
|
|
547
|
+
return Object.prototype.toString.call(o).slice(8, -1).toLowerCase();
|
|
548
|
+
}
|
|
549
|
+
function isDate(o) {
|
|
550
|
+
return classof(o) === "date" && !isNaN(o.getTime());
|
|
551
|
+
}
|
|
552
|
+
function isDateString(s) {
|
|
553
|
+
// let rx = /^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/;
|
|
554
|
+
let rx = /^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)))$/;
|
|
555
|
+
return (typeof s === "string") && rx.test(s);
|
|
556
|
+
}
|
|
557
|
+
function isFunction(o) {
|
|
558
|
+
return classof(o) === "function";
|
|
559
|
+
}
|
|
560
|
+
// function isString(o: any) {
|
|
561
|
+
// return (typeof o === "string");
|
|
562
|
+
// }
|
|
563
|
+
// function isObject(o: any) {
|
|
564
|
+
// return (typeof o === "object");
|
|
565
|
+
// }
|
|
566
|
+
function isGuid(value) {
|
|
567
|
+
return (typeof value === "string") && /[a-fA-F\d]{8}-(?:[a-fA-F\d]{4}-){3}[a-fA-F\d]{12}/.test(value);
|
|
568
|
+
}
|
|
569
|
+
function isDuration(value) {
|
|
570
|
+
return (typeof value === "string") && /^(-|)?P[T]?[\d\.,\-]+[YMDTHS]/.test(value);
|
|
571
|
+
}
|
|
572
|
+
function isEmpty(obj) {
|
|
573
|
+
if (obj === null || obj === undefined) {
|
|
574
|
+
return true;
|
|
575
|
+
}
|
|
576
|
+
for (let key in obj) {
|
|
577
|
+
if (hasOwnProperty(obj, key)) {
|
|
578
|
+
return false;
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
return true;
|
|
582
|
+
}
|
|
583
|
+
function isNumeric(n) {
|
|
584
|
+
return !isNaN(parseFloat(n)) && isFinite(n);
|
|
585
|
+
}
|
|
586
|
+
// end of is Functions
|
|
587
|
+
// string functions
|
|
588
|
+
function stringStartsWith(str, prefix) {
|
|
589
|
+
// returns true for empty string or null prefix
|
|
590
|
+
if ((!str))
|
|
591
|
+
return false;
|
|
592
|
+
if (prefix === "" || prefix == null)
|
|
593
|
+
return true;
|
|
594
|
+
return str.indexOf(prefix, 0) === 0;
|
|
595
|
+
}
|
|
596
|
+
function stringEndsWith(str, suffix) {
|
|
597
|
+
// returns true for empty string or null suffix
|
|
598
|
+
if ((!str))
|
|
599
|
+
return false;
|
|
600
|
+
if (suffix === "" || suffix == null)
|
|
601
|
+
return true;
|
|
602
|
+
return str.indexOf(suffix, str.length - suffix.length) !== -1;
|
|
603
|
+
}
|
|
604
|
+
// Based on fragment from Dean Edwards' Base 2 library
|
|
605
|
+
/** format("a %1 and a %2", "cat", "dog") -> "a cat and a dog" */
|
|
606
|
+
function formatString(str, ...params) {
|
|
607
|
+
let args = arguments;
|
|
608
|
+
let pattern = RegExp("%([1-" + (arguments.length - 1) + "])", "g");
|
|
609
|
+
return str.replace(pattern, function (match, index) {
|
|
610
|
+
return args[index];
|
|
611
|
+
});
|
|
612
|
+
}
|
|
613
|
+
// See http://stackoverflow.com/questions/7225407/convert-camelcasetext-to-camel-case-text
|
|
614
|
+
/** Change text to title case with spaces, e.g. 'myPropertyName12' to 'My Property Name 12' */
|
|
615
|
+
let camelEdges = /([A-Z](?=[A-Z][a-z])|[^A-Z](?=[A-Z])|[a-zA-Z](?=[^a-zA-Z]))/g;
|
|
616
|
+
function titleCaseSpace(text) {
|
|
617
|
+
text = text.replace(camelEdges, '$1 ');
|
|
618
|
+
text = text.charAt(0).toUpperCase() + text.slice(1);
|
|
619
|
+
return text;
|
|
620
|
+
}
|
|
621
|
+
// end of string functions
|
|
622
|
+
// See Mark Miller’s explanation of what this does.
|
|
623
|
+
// http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
|
|
624
|
+
function uncurry(f) {
|
|
625
|
+
let call = Function.call;
|
|
626
|
+
return function () {
|
|
627
|
+
return call.apply(f, arguments);
|
|
628
|
+
};
|
|
629
|
+
}
|
|
630
|
+
// shims
|
|
631
|
+
if (!Object.create) {
|
|
632
|
+
Object.create = function (parent) {
|
|
633
|
+
let F = function () {
|
|
634
|
+
};
|
|
635
|
+
F.prototype = parent;
|
|
636
|
+
return new F();
|
|
637
|
+
};
|
|
638
|
+
}
|
|
639
|
+
// strings for error messages
|
|
640
|
+
const strings = {
|
|
641
|
+
"TO_TYPE": "Add 'EntityQuery.toType()' to your query, or call 'MetadataStore.setEntityTypeForResourceName()' to register an EntityType for this resourceName."
|
|
642
|
+
};
|
|
643
|
+
// // not all methods above are exported
|
|
644
|
+
export const core = {
|
|
645
|
+
isES5Supported: isES5Supported,
|
|
646
|
+
hasOwnProperty: hasOwnProperty,
|
|
647
|
+
getOwnPropertyValues: getOwnPropertyValues,
|
|
648
|
+
getPropertyDescriptor: getPropDescriptor,
|
|
649
|
+
objectForEach: objectForEach,
|
|
650
|
+
objectFirst: objectFirst,
|
|
651
|
+
objectMap: objectMap,
|
|
652
|
+
extend: extend,
|
|
653
|
+
propEq: propEq,
|
|
654
|
+
propsEq: propsEq,
|
|
655
|
+
pluck: pluck,
|
|
656
|
+
map: map,
|
|
657
|
+
resolveProperties: resolveProperties,
|
|
658
|
+
setAsDefault: setAsDefault,
|
|
659
|
+
updateWithDefaults: updateWithDefaults,
|
|
660
|
+
getArray: getArray,
|
|
661
|
+
toArray: toArray,
|
|
662
|
+
arrayEquals: arrayEquals,
|
|
663
|
+
arraySlice: arraySlice,
|
|
664
|
+
arrayFirst: arrayFirst,
|
|
665
|
+
arrayIndexOf: arrayIndexOf,
|
|
666
|
+
arrayRemoveItem: arrayRemoveItem,
|
|
667
|
+
arrayZip: arrayZip,
|
|
668
|
+
arrayAddItemUnique: arrayAddItemUnique,
|
|
669
|
+
arrayFlatMap: arrayFlatMap,
|
|
670
|
+
requireLib: requireLib,
|
|
671
|
+
using: using,
|
|
672
|
+
wrapExecution: wrapExecution,
|
|
673
|
+
memoize: memoize,
|
|
674
|
+
getUuid: getUuid,
|
|
675
|
+
durationToSeconds: durationToSeconds,
|
|
676
|
+
isSettable: isSettable,
|
|
677
|
+
isDate: isDate,
|
|
678
|
+
isDateString: isDateString,
|
|
679
|
+
isGuid: isGuid,
|
|
680
|
+
isDuration: isDuration,
|
|
681
|
+
isFunction: isFunction,
|
|
682
|
+
isEmpty: isEmpty,
|
|
683
|
+
isNumeric: isNumeric,
|
|
684
|
+
identity: identity,
|
|
685
|
+
noop: noop,
|
|
686
|
+
stringStartsWith: stringStartsWith,
|
|
687
|
+
stringEndsWith: stringEndsWith,
|
|
688
|
+
formatString: formatString,
|
|
689
|
+
titleCase: titleCaseSpace,
|
|
690
|
+
toJson: toJson,
|
|
691
|
+
toJSONSafe: toJSONSafe,
|
|
692
|
+
toJSONSafeReplacer: toJSONSafeReplacer,
|
|
693
|
+
strings: strings
|
|
694
|
+
};
|
|
695
|
+
// Unused
|
|
696
|
+
/*
|
|
697
|
+
// returns true for booleans, numbers, strings and dates
|
|
698
|
+
// false for null, and non-date objects, functions, and arrays
|
|
699
|
+
function isPrimitive(obj: any) {
|
|
700
|
+
if (obj == null) return false;
|
|
701
|
+
// true for numbers, strings, booleans and null, false for objects
|
|
702
|
+
if (obj != Object(obj)) return true;
|
|
703
|
+
return isDate(obj);
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
*/
|
|
707
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtEQUFrRDtBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBZXBDLElBQUksY0FBYyxHQUEwQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNyRyxJQUFJLFVBQVUsR0FBdUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEcsSUFBSSxjQUFjLEdBQVk7SUFDMUIsSUFBSTtRQUNBLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUMxRTtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1IsT0FBTyxLQUFLLENBQUM7S0FDaEI7QUFDTCxDQUFDLEVBQUcsQ0FBQztBQUVMLHNCQUFzQjtBQUN0QixTQUFTLGFBQWEsQ0FBQyxHQUFXLEVBQUUsSUFBb0M7SUFDcEUsS0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7UUFDakIsSUFBSSxjQUFjLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFO1lBQzFCLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDdkI7S0FDSjtBQUNMLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxHQUFXLEVBQUUsSUFBcUM7SUFDakUsSUFBSSxPQUFPLEdBQVUsRUFBRSxDQUFDO0lBQ3hCLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFO1FBQ2pCLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUMxQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElB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RSxhQUFhO0lBRTVCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLGlCQUFpQixFQUFFLGlCQUFpQjtJQUVwQyxVQUFVLEVBQUUsVUFBVTtJQUV0QixNQUFNLEVBQUUsTUFBTTtJQUNkLFlBQVksRUFBRSxZQUFZO0lBQzFCLE1BQU0sRUFBRSxNQUFNO0lBQ2QsVUFBVSxFQUFFLFVBQVU7SUFDdEIsVUFBVSxFQUFFLFVBQVU7SUFDdEIsT0FBTyxFQUFFLE9BQU87SUFDaEIsU0FBUyxFQUFFLFNBQVM7SUFFcEIsUUFBUSxFQUFFLFFBQVE7SUFDbEIsSUFBSSxFQUFFLElBQUk7SUFFVixnQkFBZ0IsRUFBRSxnQkFBZ0I7SUFDbEMsY0FBYyxFQUFFLGNBQWM7SUFDOUIsWUFBWSxFQUFFLFlBQVk7SUFDMUIsU0FBUyxFQUFFLGNBQWM7SUFFekIsTUFBTSxFQUFFLE1BQU07SUFDZCxVQUFVLEVBQUUsVUFBVTtJQUN0QixrQkFBa0IsRUFBRSxrQkFBa0I7SUFFdEMsT0FBTyxFQUFFLE9BQU87Q0FDbkIsQ0FBQztBQU9GLFNBQVM7QUFDVDs7Ozs7Ozs7OztFQVVFIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFNlZSBpZiB0aGlzIGNvbW1lbnQgd2lsbCBtYWtlIGl0IGludG8gLmQudHMgKi9cclxuaW1wb3J0IHsgQnJlZXplRW51bSB9IGZyb20gJy4vZW51bSc7XHJcbmRlY2xhcmUgdmFyIGdsb2JhbDogYW55O1xyXG5kZWNsYXJlIHZhciB3aW5kb3c6IGFueTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JDYWxsYmFjayB7XHJcbiAgICAoZXJyb3I6IEVycm9yKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDYWxsYmFjayB7XHJcbiAgICAoZGF0YTogYW55KTogdm9pZDtcclxufVxyXG5cclxuLy8gdHlwZSBQcmVkaWNhdGUgPSAoaTogYW55KSA9PiBib29sZWFuO1xyXG50eXBlIFByZWRpY2F0ZTxUPiA9IChpOiBUKSA9PiBib29sZWFuO1xyXG5cclxubGV0IGhhc093blByb3BlcnR5OiAob2JqOiBPYmplY3QsIGtleTogc3RyaW5nKSA9PiBib29sZWFuID0gdW5jdXJyeShPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcclxubGV0IGFycmF5U2xpY2U6IChhcjogYW55W10sIHN0YXJ0PzogbnVtYmVyLCBlbmQ/OiBudW1iZXIpID0+IGFueVtdID0gdW5jdXJyeShBcnJheS5wcm90b3R5cGUuc2xpY2UpO1xyXG5sZXQgaXNFUzVTdXBwb3J0ZWQ6IGJvb2xlYW4gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHJldHVybiAhIShPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAneCcsIHt9KSk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG59ICgpO1xyXG5cclxuLy8gaXRlcmF0ZSBvdmVyIG9iamVjdFxyXG5mdW5jdGlvbiBvYmplY3RGb3JFYWNoKG9iajogT2JqZWN0LCBrdkZuOiAoa2V5OiBzdHJpbmcsIHZhbDogYW55KSA9PiBhbnkpIHtcclxuICAgIGZvciAobGV0IGtleSBpbiBvYmopIHtcclxuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkob2JqLCBrZXkpKSB7XHJcbiAgICAgICAgICAgIGt2Rm4oa2V5LCBvYmpba2V5XSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBvYmplY3RNYXAob2JqOiBPYmplY3QsIGt2Rm4/OiAoa2V5OiBzdHJpbmcsIHZhbDogYW55KSA9PiBhbnkpOiBhbnlbXSB7XHJcbiAgICBsZXQgcmVzdWx0czogYW55W10gPSBbXTtcclxuICAgIGZvciAobGV0IGtleSBpbiBvYmopIHtcclxuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkob2JqLCBrZXkpKSB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBrdkZuID8ga3ZGbihrZXksIG9ialtrZXldKSA6IG9ialtrZXldO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG9iamVjdEZpcnN0KG9iajogT2JqZWN0LCBrdlByZWRpY2F0ZTogKGtleTogc3RyaW5nLCB2YWw6IGFueSkgPT4gYm9vbGVhbik6IHsga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkgfSB8IG51bGwge1xyXG4gICAgZm9yIChsZXQga2V5IGluIG9iaikge1xyXG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eShvYmosIGtleSkpIHtcclxuICAgICAgICAgICAgbGV0IHZhbHVlID0gb2JqW2tleV07XHJcbiAgICAgICAgICAgIGlmIChrdlByZWRpY2F0ZShrZXksIHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsga2V5OiBrZXksIHZhbHVlOiB2YWx1ZSB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFycmF5RmxhdE1hcDxULCBVPihhcnI6IFRbXSwgbWFwRm46IChhcmc6IFQpID0+IFVbXSkge1xyXG4gICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sIGFyci5tYXAobWFwRm4pKSBhcyBVW107XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzU2V0dGFibGUob2JqOiBPYmplY3QsIHByb3BlcnR5TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcGQgPSBnZXRQcm9wRGVzY3JpcHRvcihvYmosIHByb3BlcnR5TmFtZSk7XHJcbiAgICBpZiAocGQgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICByZXR1cm4gISEocGQud3JpdGFibGUgfHwgcGQuc2V0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0UHJvcERlc2NyaXB0b3Iob2JqOiBPYmplY3QsIHByb3BlcnR5TmFtZTogc3RyaW5nKTogUHJvcGVydHlEZXNjcmlwdG9yIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICghaXNFUzVTdXBwb3J0ZWQpIHJldHVybiB1bmRlZmluZWQ7XHJcblxyXG4gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wZXJ0eU5hbWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgbmV4dE9iaiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xyXG4gICAgICAgIGlmIChuZXh0T2JqID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgcmV0dXJuIGdldFByb3BEZXNjcmlwdG9yKG5leHRPYmosIHByb3BlcnR5TmFtZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIEZ1bmN0aW9uYWwgZXh0ZW5zaW9uc1xyXG5cclxuLyoqIGNhbiBiZSB1c2VkIGxpa2U6IHBlcnNvbnMuZmlsdGVyKHByb3BFcShcImZpcnN0TmFtZVwiLCBcIkpvaG5cIikpICovXHJcbmZ1bmN0aW9uIHByb3BFcShwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IChvYmo6IE9iamVjdCkgPT4gYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIG9ialtwcm9wZXJ0eU5hbWVdID09PSB2YWx1ZTtcclxuICAgIH07XHJcbn1cclxuXHJcbi8qKiBjYW4gYmUgdXNlZCBsaWtlOiBwZXJzb25zLmZpbHRlcihwcm9wRXEoXCJmaXJzdE5hbWVcIiwgXCJGaXJzdE5hbWVcIiwgXCJKb2huXCIpKSAqL1xyXG5mdW5jdGlvbiBwcm9wc0VxKHByb3BlcnR5MU5hbWU6IHN0cmluZywgcHJvcGVydHkyTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogKG9iajogT2JqZWN0KSA9PiBib29sZWFuIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAob2JqOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gb2JqW3Byb3BlcnR5MU5hbWVdID09PSB2YWx1ZSB8fCBvYmpbcHJvcGVydHkyTmFtZV0gPT09IHZhbHVlO1xyXG4gICAgfTtcclxufVxyXG5cclxuLyoqIGNhbiBiZSB1c2VkIGxpa2UgcGVyc29ucy5tYXAocGx1Y2soXCJmaXJzdE5hbWVcIikpICovXHJcbmZ1bmN0aW9uIHBsdWNrKHByb3BlcnR5TmFtZTogYW55KTogKG9iajogT2JqZWN0KSA9PiBhbnkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmo6IGFueSkge1xyXG4gICAgICAgIHJldHVybiBvYmpbcHJvcGVydHlOYW1lXTtcclxuICAgIH07XHJcbn1cclxuXHJcbi8vIGVuZCBmdW5jdGlvbmFsIGV4dGVuc2lvbnNcclxuXHJcbi8qKiBSZXR1cm4gYW4gYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzIGZyb20gc291cmNlICovXHJcbmZ1bmN0aW9uIGdldE93blByb3BlcnR5VmFsdWVzKHNvdXJjZTogT2JqZWN0KTogYW55W10ge1xyXG4gICAgbGV0IHJlc3VsdDogYW55W10gPSBbXTtcclxuICAgIGZvciAobGV0IG5hbWUgaW4gc291cmNlKSB7XHJcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5KHNvdXJjZSwgbmFtZSkpIHtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goc291cmNlW25hbWVdKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG4vKiogQ29weSBwcm9wZXJ0aWVzIGZyb20gc291cmNlIHRvIHRhcmdldC4gUmV0dXJucyB0YXJnZXQuICovXHJcbmZ1bmN0aW9uIGV4dGVuZCh0YXJnZXQ6IE9iamVjdCwgc291cmNlOiBPYmplY3QsIHByb3BOYW1lcz86IHN0cmluZ1tdKTogT2JqZWN0IHtcclxuICAgIGlmICghc291cmNlKSByZXR1cm4gdGFyZ2V0O1xyXG4gICAgaWYgKHByb3BOYW1lcykge1xyXG4gICAgICAgIHByb3BOYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xyXG4gICAgICAgICAgICB0YXJnZXRbcHJvcE5hbWVdID0gc291cmNlW3Byb3BOYW1lXTtcclxuICAgICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZm9yIChsZXQgcHJvcE5hbWUgaW4gc291cmNlKSB7XHJcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eShzb3VyY2UsIHByb3BOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BOYW1lXSA9IHNvdXJjZVtwcm9wTmFtZV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG59XHJcblxyXG4vKiogQ29weSBwcm9wZXJ0aWVzIGZyb20gZGVmYXVsdHMgaWZmIHVuZGVmaW5lZCBvbiB0YXJnZXQuICBSZXR1cm5zIHRhcmdldC4gKi9cclxuZnVuY3Rpb24gdXBkYXRlV2l0aERlZmF1bHRzKHRhcmdldDogT2JqZWN0LCBkZWZhdWx0czogT2JqZWN0KTogYW55IHtcclxuICAgIGZvciAobGV0IG5hbWUgaW4gZGVmYXVsdHMpIHtcclxuICAgICAgICBpZiAodGFyZ2V0W25hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGFyZ2V0W25hbWVdID0gZGVmYXVsdHNbbmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRhcmdldDtcclxufVxyXG5cclxuLyoqIFNldCBjdG9yLmRlZmF1bHRJbnN0YW5jZSB0byBhbiBpbnN0YW5jZSBvZiBjdG9yIHdpdGggcHJvcGVydGllcyBmcm9tIHRhcmdldC5cclxuICAgIFdlIHdhbnQgdG8gaW5zdXJlIHRoYXQgdGhlIG9iamVjdCByZXR1cm5lZCBieSBjdG9yLmRlZmF1bHRJbnN0YW5jZSBpcyBhbHdheXMgaW1tdXRhYmxlXHJcbiAgICBVc2UgJ3RhcmdldCcgYXMgdGhlIHByaW1hcnkgdGVtcGxhdGUgZm9yIHRoZSBjdG9yLmRlZmF1bHRJbnN0YW5jZTtcclxuICAgIFVzZSBjdXJyZW50ICdjdG9yLmRlZmF1bHRJbnN0YW5jZScgYXMgdGhlIHRlbXBsYXRlIGZvciBhbnkgbWlzc2luZyBwcm9wZXJ0aWVzXHJcbiAgICBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIGZvciBjdG9yLmRlZmF1bHRJbnN0YW5jZVxyXG4gICAgcmV0dXJucyB0YXJnZXQgdW5jaGFuZ2VkICovXHJcbmZ1bmN0aW9uIHNldEFzRGVmYXVsdCh0YXJnZXQ6IE9iamVjdCwgY3RvcjogeyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogYW55LCBkZWZhdWx0SW5zdGFuY2U/OiBhbnkgfSk6IGFueSB7XHJcbiAgICBjdG9yLmRlZmF1bHRJbnN0YW5jZSA9IHVwZGF0ZVdpdGhEZWZhdWx0cyhuZXcgY3Rvcih0YXJnZXQpLCBjdG9yLmRlZmF1bHRJbnN0YW5jZSk7XHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG59XHJcblxyXG4vKipcclxuICAgICdzb3VyY2UnIGlzIGFuIG9iamVjdCB0aGF0IHdpbGwgYmUgdHJhbnNmb3JtZWQgaW50byBhbm90aGVyXHJcbiAgICAndGVtcGxhdGUnIGlzIGEgbWFwIHdoZXJlIHRoZVxyXG4gICAgICAga2V5czogYXJlIHRoZSBrZXlzIHRvIHJldHVyblxyXG4gICAgICAgICBpZiBhIGtleSBjb250YWlucyAnLCdzIHRoZW4gdGhlIGtleSBpcyB0cmVhdGVkIGFzIGEgZGVsaW1pdGVkIHN0cmluZyB3aXRoIGZpcnN0IG9mIHRoZVxyXG4gICAgICAgICBrZXlzIGJlaW5nIHRoZSBrZXkgdG8gcmV0dXJuIGFuZCB0aGUgb3RoZXJzIGFsbCB2YWxpZCBhbGlhc2VzIGZvciB0aGlzIGtleVxyXG4gICAgICAgJ3ZhbHVlcycgYXJlIGVpdGhlclxyXG4gICAgICAgICAgIDEpIHRoZSAnZGVmYXVsdCcgdmFsdWUgb2YgdGhlIGtleVxyXG4gICAgICAgICAgIDIpIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBpbiB0aGUgc291cmNlIHZhbHVlIGFuZCBzaG91bGQgcmV0dXJuIHRoZSB2YWx1ZSB0byBzZXRcclxuICAgICAgICAgVGhlIHZhbHVlIGZyb20gdGhlIHNvdXJjZSBpcyB0aGVuIHNldCBvbiB0aGUgdGFyZ2V0LFxyXG4gICAgICAgICBhZnRlciBmaXJzdCBwYXNzaW5nIHRocnUgdGhlIGZuLCBpZiBwcm92aWRlZCwgVU5MRVNTOlxyXG4gICAgICAgICAgIDEpIGl0IGlzIHRoZSBkZWZhdWx0IHZhbHVlXHJcbiAgICAgICAgICAgMikgaXQgaXMgdW5kZWZpbmVkICggbnVsbHMgV0lMTCBiZSBzZXQpXHJcbiAgICAndGFyZ2V0JyBpcyBvcHRpb25hbFxyXG4gICAgICAgLSBpZiBpdCBleGlzdHMgdGhlbiBwcm9wZXJ0aWVzIG9mIHRoZSB0YXJnZXQgd2lsbCBiZSBzZXQgKCBvdmVyd3JpdHRlbiBpZiB0aGUgZXhpc3QpXHJcbiAgICAgICAtIGlmIGl0IGRvZXMgbm90IGV4aXN0IHRoZW4gYSBuZXcgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZCBhcyBmaWxsZWQuXHJcbiAgICAndGFyZ2V0IGlzIHJldHVybmVkLlxyXG4qL1xyXG5mdW5jdGlvbiB0b0pzb24oc291cmNlOiBPYmplY3QsIHRlbXBsYXRlOiBPYmplY3QsIHRhcmdldDogT2JqZWN0ID0ge30pOiBPYmplY3Qge1xyXG5cclxuICAgIGZvciAobGV0IGtleSBpbiB0ZW1wbGF0ZSkge1xyXG4gICAgICAgIGxldCBhbGlhc2VzID0ga2V5LnNwbGl0KFwiLFwiKTtcclxuICAgICAgICBsZXQgZGVmYXVsdFZhbHVlID0gdGVtcGxhdGVba2V5XTtcclxuICAgICAgICAvLyB1c2luZyBzb21lIGFzIGEgZm9yRWFjaCB3aXRoIGEgJ2JyZWFrJ1xyXG4gICAgICAgIGFsaWFzZXMuc29tZShmdW5jdGlvbiAocHJvcE5hbWUpIHtcclxuICAgICAgICAgICAgaWYgKCEocHJvcE5hbWUgaW4gc291cmNlKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBzb3VyY2VbcHJvcE5hbWVdO1xyXG4gICAgICAgICAgICAvLyB0aGVyZSBpcyBhIGZ1bmN0aW9uYWwgcHJvcGVydHkgZGVmaW5lZCB3aXRoIHRoaXMgYWxpYXMgKCBub3Qgd2hhdCB3ZSB3YW50IHRvIHJlcGxhY2UpLlxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIC8vICc9PScgaXMgZGVsaWJlcmF0ZSBoZXJlIC0gaWRlYSBpcyB0aGF0IG51bGwgb3IgdW5kZWZpbmVkIHZhbHVlcyB3aWxsIG5ldmVyIGdldCBzZXJpYWxpemVkXHJcbiAgICAgICAgICAgIC8vIGlmIGRlZmF1bHQgdmFsdWUgaXMgc2V0IHRvIG51bGwuXHJcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxyXG4gICAgICAgICAgICBpZiAodmFsdWUgPT0gZGVmYXVsdFZhbHVlKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGRlZmF1bHRWYWx1ZSkgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBkZWZhdWx0VmFsdWUodmFsdWUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiAodmFsdWUpID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUgaW5zdGFuY2VvZiBCcmVlemVFbnVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5uYW1lO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgdGFyZ2V0W2FsaWFzZXNbMF1dID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRhcmdldDtcclxufVxyXG5cclxuLyoqIFJlcGxhY2VyIGZ1bmN0aW9uIGZvciB0b0pTT05TYWZlLCB3aGVuIHNlcmlhbGl6aW5nIGVudGl0aWVzLiAgRXhjbHVkZXMgZW50aXR5QXNwZWN0IGFuZCBvdGhlciBpbnRlcm5hbCBwcm9wZXJ0aWVzLiAqL1xyXG5mdW5jdGlvbiB0b0pTT05TYWZlUmVwbGFjZXIocHJvcDogc3RyaW5nLCB2YWw6IGFueSkge1xyXG4gICAgaWYgKHByb3AgPT09IFwiZW50aXR5QXNwZWN0XCIgfHwgcHJvcCA9PT0gXCJjb21wbGV4QXNwZWN0XCIgfHwgcHJvcCA9PT0gXCJlbnRpdHlUeXBlXCIgfHwgcHJvcCA9PT0gXCJjb21wbGV4VHlwZVwiXHJcbiAgICAgICAgfHwgcHJvcCA9PT0gXCJnZXRQcm9wZXJ0eVwiIHx8IHByb3AgPT09IFwic2V0UHJvcGVydHlcIlxyXG4gICAgICAgIHx8IHByb3AgPT09IFwiY29uc3RydWN0b3JcIiB8fCBwcm9wLmNoYXJBdCgwKSA9PT0gJ18nIHx8IHByb3AuY2hhckF0KDApID09PSAnJCcpIHJldHVybjtcclxuICAgIHJldHVybiB2YWw7XHJcbn1cclxuXHJcbi8qKiBTYWZlbHkgcGVyZm9ybSB0b0pTT04gbG9naWMgb24gb2JqZWN0cyB3aXRoIGN5Y2xlcy4gKi9cclxuZnVuY3Rpb24gdG9KU09OU2FmZShvYmo6IGFueSwgcmVwbGFjZXI/OiAocHJvcDogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBhbnkpOiBhbnkge1xyXG4gICAgaWYgKG9iaiAhPT0gT2JqZWN0KG9iaikpIHJldHVybiBvYmo7IC8vIHByaW1pdGl2ZSB2YWx1ZVxyXG4gICAgaWYgKG9iai5fJHZpc2l0ZWQpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICBpZiAob2JqLnRvSlNPTikge1xyXG4gICAgICAgIGxldCBuZXdPYmogPSBvYmoudG9KU09OKCk7XHJcbiAgICAgICAgaWYgKG5ld09iaiAhPT0gT2JqZWN0KG5ld09iaikpIHJldHVybiBuZXdPYmo7IC8vIHByaW1pdGl2ZSB2YWx1ZVxyXG4gICAgICAgIGlmIChuZXdPYmogIT09IG9iaikgcmV0dXJuIHRvSlNPTlNhZmUobmV3T2JqLCByZXBsYWNlcik7XHJcbiAgICAgICAgLy8gdG9KU09OIHJldHVybmVkIHRoZSBvYmplY3QgdW5jaGFuZ2VkLlxyXG4gICAgICAgIG9iaiA9IG5ld09iajtcclxuICAgIH1cclxuICAgIG9iai5fJHZpc2l0ZWQgPSB0cnVlO1xyXG4gICAgbGV0IHJlc3VsdDogYW55O1xyXG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgcmVzdWx0ID0gb2JqLm1hcChmdW5jdGlvbiAobzogYW55KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0b0pTT05TYWZlKG8sIHJlcGxhY2VyKTtcclxuICAgICAgICB9KTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIChvYmopID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3VsdCA9IHt9O1xyXG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gb2JqKSB7XHJcbiAgICAgICAgICAgIGlmIChwcm9wID09PSBcIl8kdmlzaXRlZFwiKSBjb250aW51ZTtcclxuICAgICAgICAgICAgbGV0IHZhbCA9IG9ialtwcm9wXTtcclxuICAgICAgICAgICAgaWYgKHJlcGxhY2VyKSB7XHJcbiAgICAgICAgICAgICAgICB2YWwgPSByZXBsYWNlcihwcm9wLCB2YWwpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YWwgPSB0b0pTT05TYWZlKHZhbCwgcmVwbGFjZXIpO1xyXG4gICAgICAgICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICByZXN1bHRbcHJvcF0gPSB2YWw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZGVsZXRlIG9iai5fJHZpc2l0ZWQ7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG4vKiogUmVzb2x2ZXMgdGhlIHZhbHVlcyBvZiBhIGxpc3Qgb2YgcHJvcGVydGllcyBieSBjaGVja2luZyBlYWNoIHByb3BlcnR5IGluIG11bHRpcGxlIHNvdXJjZXMgdW50aWwgYSB2YWx1ZSBpcyBmb3VuZC4gKi9cclxuZnVuY3Rpb24gcmVzb2x2ZVByb3BlcnRpZXMoc291cmNlczogT2JqZWN0W10sIHByb3BlcnR5TmFtZXM6IHN0cmluZ1tdKTogYW55IHtcclxuICAgIGxldCByID0ge307XHJcbiAgICBsZXQgbGVuZ3RoID0gc291cmNlcy5sZW5ndGg7XHJcbiAgICBwcm9wZXJ0eU5hbWVzLmZvckVhY2goZnVuY3Rpb24gKHBuKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgc3JjID0gc291cmNlc1tpXTtcclxuICAgICAgICAgICAgaWYgKHNyYykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IHNyY1twbl07XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByW3BuXSA9IHZhbDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcblxyXG4vLyBhcnJheSBmdW5jdGlvbnNcclxuXHJcbmZ1bmN0aW9uIHRvQXJyYXkoaXRlbTogYW55KTogYW55W10ge1xyXG4gICAgaWYgKGl0ZW0gPT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xyXG4gICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gW2l0ZW1dO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogYSB2ZXJzaW9uIG9mIEFycmF5Lm1hcCB0aGF0IGRvZXNuJ3QgcmVxdWlyZSBhbiBhcnJheSwgaS5lLiB3b3JrcyBvbiBhcnJheXMgYW5kIHNjYWxhcnMuICovXHJcbi8vIGZ1bmN0aW9uIG1hcDxULCBVPihpdGVtczogVCB8IFRbXSwgZm46ICh2OiBULCBpeD86IG51bWJlcikgPT4gVSwgaW5jbHVkZU51bGw/OiBib29sZWFuKTogVSB8IFVbXSB7XHJcbiBmdW5jdGlvbiBtYXA8VD4oaXRlbXM6IFQgfCBUW10sIGZuOiAodjogVCwgaXg/OiBudW1iZXIpID0+IGFueSwgaW5jbHVkZU51bGw/OiBib29sZWFuKTogYW55IHwgYW55W10ge1xyXG4gICAgLy8gd2hldGhlciB0byByZXR1cm4gbnVsbHMgaW4gYXJyYXkgb2YgcmVzdWx0czsgZGVmYXVsdCA9IHRydWU7XHJcbiAgICBpbmNsdWRlTnVsbCA9IGluY2x1ZGVOdWxsID09IG51bGwgPyB0cnVlIDogaW5jbHVkZU51bGw7XHJcbiAgICBpZiAoaXRlbXMgPT0gbnVsbCkgcmV0dXJuIGl0ZW1zO1xyXG4gICAgLy8gbGV0IHJlc3VsdDogVVtdO1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbXMpKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdDogYW55W10gPSBbXTtcclxuICAgICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uICh2OiBhbnksIGl4OiBudW1iZXIpIHtcclxuICAgICAgICAgICAgbGV0IHIgPSBmbih2LCBpeCk7XHJcbiAgICAgICAgICAgIGlmIChyICE9IG51bGwgfHwgaW5jbHVkZU51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdFtpeF0gPSByO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZuKGl0ZW1zKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuLyoqIFJldHVybiBmaXJzdCBlbGVtZW50IG1hdGNoaW5nIHByZWRpY2F0ZSAqL1xyXG5mdW5jdGlvbiBhcnJheUZpcnN0PFQ+KGFycmF5OiBUW10sIHByZWRpY2F0ZTogUHJlZGljYXRlPGFueT4pOiBUO1xyXG5mdW5jdGlvbiBhcnJheUZpcnN0PFQ+KGFycmF5OiBUW10sIHByZWRpY2F0ZTogUHJlZGljYXRlPFQ+KSB7XHJcbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IGFycmF5Lmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG4gICAgICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaV0pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhcnJheVtpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufVxyXG5cclxuLyoqIFJldHVybiBpbmRleCBvZiBmaXJzdCBlbGVtZW50IG1hdGNoaW5nIHByZWRpY2F0ZSAqL1xyXG5mdW5jdGlvbiBhcnJheUluZGV4T2Y8VD4oYXJyYXk6IFRbXSwgcHJlZGljYXRlOiBQcmVkaWNhdGU8YW55Pik6IG51bWJlcjtcclxuZnVuY3Rpb24gYXJyYXlJbmRleE9mPFQ+KGFycmF5OiBUW10sIHByZWRpY2F0ZTogUHJlZGljYXRlPFQ+KTogbnVtYmVyIHtcclxuICAgIGZvciAobGV0IGkgPSAwLCBqID0gYXJyYXkubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpXSkpIHJldHVybiBpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIC0xO1xyXG59XHJcblxyXG4vKiogQWRkIGl0ZW0gaWYgbm90IGFscmVhZHkgaW4gYXJyYXkgKi9cclxuZnVuY3Rpb24gYXJyYXlBZGRJdGVtVW5pcXVlPFQ+KGFycmF5OiBUW10sIGl0ZW06IFQpIHtcclxuICAgIGxldCBpeCA9IGFycmF5LmluZGV4T2YoaXRlbSk7XHJcbiAgICBpZiAoaXggPT09IC0xKSBhcnJheS5wdXNoKGl0ZW0pO1xyXG59XHJcblxyXG4vKiogUmVtb3ZlIGl0ZW1zIGZyb20gdGhlIGFycmF5XHJcbiAqIEBwYXJhbSBhcnJheVxyXG4gKiBAcGFyYW0gcHJlZGljYXRlT3JJdGVtIC0gaXRlbSB0byByZW1vdmUsIG9yIGZ1bmN0aW9uIHRvIGRldGVybWluZSBtYXRjaGluZyBpdGVtXHJcbiAqIEBwYXJhbSBzaG91bGRSZW1vdmVNdWx0aXBsZSAtIHRydWUgdG8ga2VlcCByZW1vdmluZyBhZnRlciBmaXJzdCBtYXRjaCwgZmFsc2Ugb3RoZXJ3aXNlXHJcbiAqL1xyXG5mdW5jdGlvbiBhcnJheVJlbW92ZUl0ZW08VD4oYXJyYXk6IFRbXSwgcHJlZGljYXRlT3JJdGVtOiBUIHwgUHJlZGljYXRlPFQ+ICwgc2hvdWxkUmVtb3ZlTXVsdGlwbGU/OiBib29sZWFuKSB7XHJcbiAgICBsZXQgcHJlZGljYXRlID0gKGlzRnVuY3Rpb24ocHJlZGljYXRlT3JJdGVtKSA/IHByZWRpY2F0ZU9ySXRlbSA6IHVuZGVmaW5lZCkgYXMgUHJlZGljYXRlPFQ+O1xyXG4gICAgbGV0IGxhc3RJeCA9IGFycmF5Lmxlbmd0aCAtIDE7XHJcbiAgICBsZXQgcmVtb3ZlZCA9IGZhbHNlO1xyXG4gICAgZm9yIChsZXQgaSA9IGxhc3RJeDsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBpZiAocHJlZGljYXRlID8gcHJlZGljYXRlKGFycmF5W2ldKSA6IChhcnJheVtpXSA9PT0gcHJlZGljYXRlT3JJdGVtKSkge1xyXG4gICAgICAgICAgICBhcnJheS5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgIHJlbW92ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoIXNob3VsZFJlbW92ZU11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZW1vdmVkO1xyXG59XHJcblxyXG4vKiogQ29tYmluZSBhcnJheSBlbGVtZW50cyB1c2luZyB0aGUgY2FsbGJhY2suICBSZXR1cm5zIGFycmF5IHdpdGggbGVuZ3RoID09IG1pbihhMS5sZW5ndGgsIGEyLmxlbmd0aCkgKi9cclxuZnVuY3Rpb24gYXJyYXlaaXAoYTE6IGFueVtdLCBhMjogYW55W10sIGNhbGxiYWNrOiAoeDE6IGFueSwgeDI6IGFueSkgPT4gYW55KTogYW55W10ge1xyXG4gICAgbGV0IHJlc3VsdDogYW55W10gPSBbXTtcclxuICAgIGxldCBuID0gTWF0aC5taW4oYTEubGVuZ3RoLCBhMi5sZW5ndGgpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyArK2kpIHtcclxuICAgICAgICByZXN1bHQucHVzaChjYWxsYmFjayhhMVtpXSwgYTJbaV0pKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbi8vZnVuY3Rpb24gYXJyYXlEaXN0aW5jdChhcnJheSkge1xyXG4vLyAgICBhcnJheSA9IGFycmF5IHx8IFtdO1xyXG4vLyAgICBsZXQgcmVzdWx0ID0gW107XHJcbi8vICAgIGZvciAobGV0IGkgPSAwLCBqID0gYXJyYXkubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcbi8vICAgICAgICBpZiAocmVzdWx0LmluZGV4T2YoYXJyYXlbaV0pIDwgMClcclxuLy8gICAgICAgICAgICByZXN1bHQucHVzaChhcnJheVtpXSk7XHJcbi8vICAgIH1cclxuLy8gICAgcmV0dXJuIHJlc3VsdDtcclxuLy99XHJcblxyXG4vLyBOb3QgeWV0IG5lZWRlZFxyXG4vLy8vIG11Y2ggZmFzdGVyIGJ1dCBvbmx5IHdvcmtzIG9uIGFycmF5IGl0ZW1zIHdpdGggYSB0b1N0cmluZyBtZXRob2QgdGhhdFxyXG4vLy8vIHJldHVybnMgZGlzdGluY3Qgc3RyaW5nIGZvciBkaXN0aW5jdCBvYmplY3RzLiAgU28gdGhpcyBpcyBzYWZlIGZvciBhcnJheXMgd2l0aCBwcmltaXRpdmVcclxuLy8vLyB0eXBlcyBidXQgbm90IGZvciBhcnJheXMgd2l0aCBvYmplY3QgdHlwZXMsIHVubGVzcyB0b1N0cmluZygpIGhhcyBiZWVuIGltcGxlbWVudGVkLlxyXG4vL2Z1bmN0aW9uIGFycmF5RGlzdGluY3RVbnNhZmUoYXJyYXkpIHtcclxuLy8gICAgbGV0IG8gPSB7fSwgaSwgbCA9IGFycmF5Lmxlbmd0aCwgciA9IFtdO1xyXG4vLyAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSArPSAxKSB7XHJcbi8vICAgICAgICBsZXQgdiA9IGFycmF5W2ldO1xyXG4vLyAgICAgICAgb1t2XSA9IHY7XHJcbi8vICAgIH1cclxuLy8gICAgZm9yIChpIGluIG8pIHIucHVzaChvW2ldKTtcclxuLy8gICAgcmV0dXJuIHI7XHJcbi8vfVxyXG5cclxuZnVuY3Rpb24gYXJyYXlFcXVhbHMoYTE6IGFueVtdLCBhMjogYW55W10sIGVxdWFsc0ZuPzogKHgxOiBhbnksIHgyOiBhbnkpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIC8vQ2hlY2sgaWYgdGhlIGFycmF5cyBhcmUgdW5kZWZpbmVkL251bGxcclxuICAgIGlmICghYTEgfHwgIWEyKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKGExLmxlbmd0aCAhPT0gYTIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy9nbyB0aHJ1IGFsbCB0aGUgdmFyc1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIC8vaWYgdGhlIGxldCBpcyBhbiBhcnJheSwgd2UgbmVlZCB0byBtYWtlIGEgcmVjdXJzaXZlIGNoZWNrXHJcbiAgICAgICAgLy9vdGhlcndpc2Ugd2UnbGwganVzdCBjb21wYXJlIHRoZSB2YWx1ZXNcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhMVtpXSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcnJheUVxdWFscyhhMVtpXSwgYTJbaV0pKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGVxdWFsc0ZuKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWVxdWFsc0ZuKGExW2ldLCBhMltpXSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChhMVtpXSAhPT0gYTJbaV0pIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG4vLyBlbmQgb2YgYXJyYXkgZnVuY3Rpb25zXHJcblxyXG4vKiogUmV0dXJucyBhbiBhcnJheSBmb3IgYSBzb3VyY2UgYW5kIGEgcHJvcCwgYW5kIGNyZWF0ZXMgdGhlIHByb3AgaWYgbmVlZGVkLiAqL1xyXG5mdW5jdGlvbiBnZXRBcnJheShzb3VyY2U6IE9iamVjdCwgcHJvcE5hbWU6IHN0cmluZyk6IGFueVtdIHtcclxuICAgIGxldCBhcnIgPSBzb3VyY2VbcHJvcE5hbWVdO1xyXG4gICAgaWYgKCFhcnIpIHtcclxuICAgICAgICBhcnIgPSBbXTtcclxuICAgICAgICBzb3VyY2VbcHJvcE5hbWVdID0gYXJyO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFycjtcclxufVxyXG5cclxuLyoqIENhbGxzIHJlcXVpcmVMaWJDb3JlIG9uIHNlbWljb2xvbi1zZXBhcmF0ZWQgbGliTmFtZXMgKi9cclxuZnVuY3Rpb24gcmVxdWlyZUxpYihsaWJOYW1lczogc3RyaW5nLCBlcnJNZXNzYWdlPzogc3RyaW5nKSB7XHJcbiAgICBsZXQgYXJyTmFtZXMgPSBsaWJOYW1lcy5zcGxpdChcIjtcIik7XHJcbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IGFyck5hbWVzLmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG4gICAgICAgIGxldCBsaWIgPSByZXF1aXJlTGliQ29yZShhcnJOYW1lc1tpXSk7XHJcbiAgICAgICAgaWYgKGxpYikgcmV0dXJuIGxpYjtcclxuICAgIH1cclxuICAgIGlmIChlcnJNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGluaXRpYWxpemUgXCIgKyBsaWJOYW1lcyArIFwiLiAgXCIgKyBlcnJNZXNzYWdlKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG4vKiogUmV0dXJucyB0aGUgJ2xpYk5hbWUnIG1vZHVsZSBpZiBsb2FkZWQgb3IgZWxzZSByZXR1cm5zIHVuZGVmaW5lZCAqL1xyXG5mdW5jdGlvbiByZXF1aXJlTGliQ29yZShsaWJOYW1lOiBzdHJpbmcpIHtcclxuICAgIGxldCB3aW4gPSB3aW5kb3cgfHwgKGdsb2JhbCA/IGdsb2JhbC53aW5kb3cgOiB1bmRlZmluZWQpO1xyXG4gICAgaWYgKCF3aW4pIHJldHVybjsgLy8gTXVzdCBydW4gaW4gYSBicm93c2VyLiBUb2RvOiBhZGQgY29tbW9uanMgc3VwcG9ydFxyXG5cclxuICAgIC8vIGdldCBsaWJyYXJ5IGZyb20gYnJvd3NlciBnbG9iYWxzIGlmIHdlIGNhblxyXG4gICAgbGV0IGxpYiA9IHdpbltsaWJOYW1lXTtcclxuICAgIGlmIChsaWIpIHJldHVybiBsaWI7XHJcblxyXG4gICAgLy8gaWYgcmVxdWlyZSBleGlzdHMsIG1heWJlIHJlcXVpcmUgY2FuIGdldCBpdC5cclxuICAgIC8vIFRoaXMgbWV0aG9kIGlzIHN5bmNocm9ub3VzIHNvIGl0IGNhbid0IGxvYWQgbW9kdWxlcyB3aXRoIEFNRC5cclxuICAgIC8vIEl0IGNhbiBvbmx5IG9idGFpbiBtb2R1bGVzIGZyb20gcmVxdWlyZSB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGxvYWRlZC5cclxuICAgIC8vIERldmVsb3BlciBzaG91bGQgYm9vdHN0cmFwIHN1Y2ggdGhhdCB0aGUgYnJlZXplIG1vZHVsZVxyXG4gICAgLy8gbG9hZHMgYWZ0ZXIgYWxsIG90aGVyIGxpYnJhcmllcyB0aGF0IGJyZWV6ZSBzaG91bGQgZmluZCB3aXRoIHRoaXMgbWV0aG9kXHJcbiAgICAvLyBTZWUgZG9jdW1lbnRhdGlvblxyXG4gICAgbGV0IHIgPSB3aW4ucmVxdWlyZTtcclxuICAgIGlmIChyKSB7IC8vIGlmIHJlcXVpcmUgZXhpc3RzXHJcbiAgICAgICAgaWYgKHIuZGVmaW5lZCkgeyAvLyByZXF1aXJlLmRlZmluZWQgaXMgbm90IHN0YW5kYXJkIGFuZCBtYXkgbm90IGV4aXN0XHJcbiAgICAgICAgICAgIC8vIHJlcXVpcmUuZGVmaW5lZCByZXR1cm5zIHRydWUgaWYgbW9kdWxlIGhhcyBiZWVuIGxvYWRlZFxyXG4gICAgICAgICAgICByZXR1cm4gci5kZWZpbmVkKGxpYk5hbWUpID8gcihsaWJOYW1lKSA6IHVuZGVmaW5lZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyByZXF1aXJlLmRlZmluZWQgZG9lcyBub3QgZXhpc3Qgc28gd2UgaGF2ZSB0byBjYWxsIHJlcXVpcmUoJ2xpYk5hbWUnKSBkaXJlY3RseS5cclxuICAgICAgICAgICAgLy8gVGhlIHJlcXVpcmUoJ2xpYk5hbWUnKSBvdmVybG9hZCBpcyBzeW5jaHJvbm91cyBhbmQgZG9lcyBub3QgbG9hZCBtb2R1bGVzLlxyXG4gICAgICAgICAgICAvLyBJdCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBtb2R1bGUgaXNuJ3QgYWxyZWFkeSBsb2FkZWQuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcihsaWJOYW1lKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gcmVxdWlyZSgnbGliTmFtZScpIHRocmV3IGJlY2F1c2UgbW9kdWxlIG5vdCBsb2FkZWRcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEV4ZWN1dGUgZm4gd2hpbGUgb2JqIGhhcyB0ZW1wVmFsdWUgZm9yIHByb3BlcnR5ICovXHJcbmZ1bmN0aW9uIHVzaW5nKG9iajogT2JqZWN0LCBwcm9wZXJ0eTogc3RyaW5nLCB0ZW1wVmFsdWU6IGFueSwgZm46ICgpID0+IGFueSkge1xyXG4gICAgaWYgKCFvYmopIHtcclxuICAgICAgICByZXR1cm4gZm4oKTtcclxuICAgIH1cclxuICAgIGxldCBvcmlnaW5hbFZhbHVlID0gb2JqW3Byb3BlcnR5XTtcclxuICAgIGlmICh0ZW1wVmFsdWUgPT09IG9yaWdpbmFsVmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gZm4oKTtcclxuICAgIH1cclxuICAgIG9ialtwcm9wZXJ0eV0gPSB0ZW1wVmFsdWU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHJldHVybiBmbigpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgICBpZiAob3JpZ2luYWxWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvYmpbcHJvcGVydHldO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9ialtwcm9wZXJ0eV0gPSBvcmlnaW5hbFZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIENhbGwgc3RhdGUgPSBzdGFydEZuKCksIGNhbGwgZm4oKSwgY2FsbCBlbmRGbihzdGF0ZSkgKi9cclxuZnVuY3Rpb24gd3JhcEV4ZWN1dGlvbihzdGFydEZuOiAoKSA9PiBhbnksIGVuZEZuOiAoc3RhdGU6IGFueSkgPT4gYW55LCBmbjogKCkgPT4gYW55KSB7XHJcbiAgICBsZXQgc3RhdGU6IGFueTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgc3RhdGUgPSBzdGFydEZuKCk7XHJcbiAgICAgICAgcmV0dXJuIGZuKCk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiAoc3RhdGUpID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICBzdGF0ZS5lcnJvciA9IGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IGU7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIGVuZEZuKHN0YXRlKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIFJlbWVtYmVyICYgcmV0dXJuIHRoZSB2YWx1ZSBvZiBmbigpIHdoZW4gaXQgd2FzIGNhbGxlZCB3aXRoIGl0cyBjdXJyZW50IGFyZ3MgKi9cclxuZnVuY3Rpb24gbWVtb2l6ZShmbjogYW55KTogYW55IHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IGFyZ3MgPSBhcnJheVNsaWNlKDxhbnk+YXJndW1lbnRzKSxcclxuICAgICAgICAgICAgaGFzaCA9IFwiXCIsXHJcbiAgICAgICAgICAgIGkgPSBhcmdzLmxlbmd0aCxcclxuICAgICAgICAgICAgY3VycmVudEFyZzogYW55ID0gbnVsbDtcclxuICAgICAgICB3aGlsZSAoaS0tKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRBcmcgPSBhcmdzW2ldO1xyXG4gICAgICAgICAgICBoYXNoICs9IChjdXJyZW50QXJnID09PSBPYmplY3QoY3VycmVudEFyZykpID8gSlNPTi5zdHJpbmdpZnkoY3VycmVudEFyZykgOiBjdXJyZW50QXJnO1xyXG4gICAgICAgICAgICBmbi5tZW1vaXplIHx8IChmbi5tZW1vaXplID0ge30pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKGhhc2ggaW4gZm4ubWVtb2l6ZSkgP1xyXG4gICAgICAgICAgICBmbi5tZW1vaXplW2hhc2hdIDpcclxuICAgICAgICAgICAgZm4ubWVtb2l6ZVtoYXNoXSA9IGZuLmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0VXVpZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHtcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcclxuICAgICAgICBsZXQgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDAsIHYgPSBjID09ICd4JyA/IHIgOiAociAmIDB4MyB8IDB4OCk7XHJcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGR1cmF0aW9uVG9TZWNvbmRzKGR1cmF0aW9uOiBzdHJpbmcpIHtcclxuICAgIC8vIGJhc2ljIGFsZ29yaXRobSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9uZXphc2EvaXNvODYwMS1qcy1wZXJpb2RcclxuICAgIGlmICh0eXBlb2YgZHVyYXRpb24gIT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgSVNPODYwMSBkdXJhdGlvbiAnXCIgKyBkdXJhdGlvbiArIFwiJ1wiKTtcclxuXHJcbiAgICAvLyByZWdleCBzcGxpdHMgYXMgZm9sbG93cyAtIGdycDAsIGdycDEsIHksIG0sIGQsIGdycDIsIGgsIG0sIHNcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgMSAgICAgMiAgMyAgNCAgNSAgICAgNiAgNyAgOFxyXG4gICAgbGV0IHN0cnVjdCA9IC9eUCgoXFxkK1kpPyhcXGQrTSk/KFxcZCtEKT8pPyhUKFxcZCtIKT8oXFxkK00pPyhcXGQrUyk/KT8kLy5leGVjKGR1cmF0aW9uKTtcclxuICAgIGlmICghc3RydWN0KSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIElTTzg2MDEgZHVyYXRpb24gJ1wiICsgZHVyYXRpb24gKyBcIidcIik7XHJcblxyXG4gICAgbGV0IHltZGhtc0luZGV4ZXMgPSBbMiwgMywgNCwgNiwgNywgOF07IC8vIC0+IGdycDEseSxtLGQsZ3JwMixoLG0sc1xyXG4gICAgbGV0IGZhY3RvcnMgPSBbMzExMDQwMDAsIC8vIHllYXIgKDM2MCoyNCo2MCo2MClcclxuICAgICAgICAyNTkyMDAwLCAgICAgICAgICAgICAvLyBtb250aCAoMzAqMjQqNjAqNjApXHJcbiAgICAgICAgODY0MDAsICAgICAgICAgICAgICAgLy8gZGF5ICgyNCo2MCo2MClcclxuICAgICAgICAzNjAwLCAgICAgICAgICAgICAgICAvLyBob3VyICg2MCo2MClcclxuICAgICAgICA2MCwgICAgICAgICAgICAgICAgICAvLyBtaW51dGUgKDYwKVxyXG4gICAgICAgIDFdOyAgICAgICAgICAgICAgICAgIC8vIHNlY29uZCAoMSlcclxuXHJcbiAgICBsZXQgc2Vjb25kcyA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xyXG4gICAgICAgIGxldCBkaWdpdCA9IHN0cnVjdFt5bWRobXNJbmRleGVzW2ldXTtcclxuICAgICAgICAvLyByZW1vdmUgbGV0dGVycywgcmVwbGFjZSBieSAwIGlmIG5vdCBkZWZpbmVkXHJcbiAgICAgICAgZGlnaXQgPSA8YW55PihkaWdpdCA/ICtkaWdpdC5yZXBsYWNlKC9bQS1aYS16XSsvZywgJycpIDogMCk7XHJcbiAgICAgICAgc2Vjb25kcyArPSA8YW55PmRpZ2l0ICogZmFjdG9yc1tpXTtcclxuICAgIH1cclxuICAgIHJldHVybiBzZWNvbmRzO1xyXG5cclxufVxyXG5cclxuLy8gaXMgZnVuY3Rpb25zXHJcblxyXG5mdW5jdGlvbiBub29wKCkge1xyXG4gICAgLy8gZG9lcyBub3RoaW5nXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlkZW50aXR5KHg6IGFueSk6IGFueSB7XHJcbiAgICByZXR1cm4geDtcclxufVxyXG5cclxuZnVuY3Rpb24gY2xhc3NvZihvOiBhbnkpIHtcclxuICAgIGlmIChvID09PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIFwibnVsbFwiO1xyXG4gICAgfVxyXG4gICAgaWYgKG8gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNEYXRlKG86IGFueSkge1xyXG4gICAgcmV0dXJuIGNsYXNzb2YobykgPT09IFwiZGF0ZVwiICYmICFpc05hTihvLmdldFRpbWUoKSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzRGF0ZVN0cmluZyhzOiBzdHJpbmcpIHtcclxuICAgIC8vIGxldCByeCA9IC9eKFxcZHs0fXxbK1xcLV1cXGR7Nn0pKD86LShcXGR7Mn0pKD86LShcXGR7Mn0pKT8pPyg/OlQoXFxkezJ9KTooXFxkezJ9KSg/OjooXFxkezJ9KSg/OlxcLihcXGR7M30pKT8pPyg/OihaKXwoWytcXC1dKShcXGR7Mn0pKD86OihcXGR7Mn0pKT8pPyk/JC87XHJcbiAgICBsZXQgcnggPSAvXigoXFxkezR9LVswMV1cXGQtWzAtM11cXGRUWzAtMl1cXGQ6WzAtNV1cXGQ6WzAtNV1cXGRcXC5cXGQrKFsrLV1bMC0yXVxcZDpbMC01XVxcZHxaKSl8KFxcZHs0fS1bMDFdXFxkLVswLTNdXFxkVFswLTJdXFxkOlswLTVdXFxkOlswLTVdXFxkKFsrLV1bMC0yXVxcZDpbMC01XVxcZHxaKSl8KFxcZHs0fS1bMDFdXFxkLVswLTNdXFxkVFswLTJdXFxkOlswLTVdXFxkKFsrLV1bMC0yXVxcZDpbMC01XVxcZHxaKSkpJC87XHJcbiAgICByZXR1cm4gKHR5cGVvZiBzID09PSBcInN0cmluZ1wiKSAmJiByeC50ZXN0KHMpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKG86IGFueSkge1xyXG4gICAgcmV0dXJuIGNsYXNzb2YobykgPT09IFwiZnVuY3Rpb25cIjtcclxufVxyXG5cclxuLy8gZnVuY3Rpb24gaXNTdHJpbmcobzogYW55KSB7XHJcbi8vICAgICByZXR1cm4gKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKTtcclxuLy8gfVxyXG5cclxuLy8gZnVuY3Rpb24gaXNPYmplY3QobzogYW55KSB7XHJcbi8vICAgICByZXR1cm4gKHR5cGVvZiBvID09PSBcIm9iamVjdFwiKTtcclxuLy8gfVxyXG5cclxuZnVuY3Rpb24gaXNHdWlkKHZhbHVlOiBhbnkpIHtcclxuICAgIHJldHVybiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSAmJiAvW2EtZkEtRlxcZF17OH0tKD86W2EtZkEtRlxcZF17NH0tKXszfVthLWZBLUZcXGRdezEyfS8udGVzdCh2YWx1ZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzRHVyYXRpb24odmFsdWU6IGFueSkge1xyXG4gICAgcmV0dXJuICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpICYmIC9eKC18KT9QW1RdP1tcXGRcXC4sXFwtXStbWU1EVEhTXS8udGVzdCh2YWx1ZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzRW1wdHkob2JqOiBhbnkpIHtcclxuICAgIGlmIChvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGZvciAobGV0IGtleSBpbiBvYmopIHtcclxuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkob2JqLCBrZXkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNOdW1lcmljKG46IGFueSkge1xyXG4gICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KG4pKSAmJiBpc0Zpbml0ZShuKTtcclxufVxyXG5cclxuXHJcblxyXG4vLyBlbmQgb2YgaXMgRnVuY3Rpb25zXHJcblxyXG4vLyBzdHJpbmcgZnVuY3Rpb25zXHJcblxyXG5mdW5jdGlvbiBzdHJpbmdTdGFydHNXaXRoKHN0cjogc3RyaW5nLCBwcmVmaXg6IHN0cmluZykge1xyXG4gICAgLy8gcmV0dXJucyB0cnVlIGZvciBlbXB0eSBzdHJpbmcgb3IgbnVsbCBwcmVmaXhcclxuICAgIGlmICgoIXN0cikpIHJldHVybiBmYWxzZTtcclxuICAgIGlmIChwcmVmaXggPT09IFwiXCIgfHwgcHJlZml4ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgcmV0dXJuIHN0ci5pbmRleE9mKHByZWZpeCwgMCkgPT09IDA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHN0cmluZ0VuZHNXaXRoKHN0cjogc3RyaW5nLCBzdWZmaXg6IHN0cmluZykge1xyXG4gICAgLy8gcmV0dXJucyB0cnVlIGZvciBlbXB0eSBzdHJpbmcgb3IgbnVsbCBzdWZmaXhcclxuICAgIGlmICgoIXN0cikpIHJldHVybiBmYWxzZTtcclxuICAgIGlmIChzdWZmaXggPT09IFwiXCIgfHwgc3VmZml4ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgcmV0dXJuIHN0ci5pbmRleE9mKHN1ZmZpeCwgc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpICE9PSAtMTtcclxufVxyXG5cclxuLy8gQmFzZWQgb24gZnJhZ21lbnQgZnJvbSBEZWFuIEVkd2FyZHMnIEJhc2UgMiBsaWJyYXJ5XHJcbi8qKiBmb3JtYXQoXCJhICUxIGFuZCBhICUyXCIsIFwiY2F0XCIsIFwiZG9nXCIpIC0+IFwiYSBjYXQgYW5kIGEgZG9nXCIgKi9cclxuZnVuY3Rpb24gZm9ybWF0U3RyaW5nKHN0cjogc3RyaW5nLCAuLi5wYXJhbXM6IGFueVtdKSB7XHJcbiAgICBsZXQgYXJncyA9IGFyZ3VtZW50cztcclxuICAgIGxldCBwYXR0ZXJuID0gUmVnRXhwKFwiJShbMS1cIiArIChhcmd1bWVudHMubGVuZ3RoIC0gMSkgKyBcIl0pXCIsIFwiZ1wiKTtcclxuICAgIHJldHVybiBzdHIucmVwbGFjZShwYXR0ZXJuLCBmdW5jdGlvbiAobWF0Y2gsIGluZGV4KSB7XHJcbiAgICAgICAgcmV0dXJuIGFyZ3NbaW5kZXhdO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8vIFNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzcyMjU0MDcvY29udmVydC1jYW1lbGNhc2V0ZXh0LXRvLWNhbWVsLWNhc2UtdGV4dFxyXG4vKiogQ2hhbmdlIHRleHQgdG8gdGl0bGUgY2FzZSB3aXRoIHNwYWNlcywgZS5nLiAnbXlQcm9wZXJ0eU5hbWUxMicgdG8gJ015IFByb3BlcnR5IE5hbWUgMTInICovXHJcbmxldCBjYW1lbEVkZ2VzID0gLyhbQS1aXSg/PVtBLVpdW2Etel0pfFteQS1aXSg/PVtBLVpdKXxbYS16QS1aXSg/PVteYS16QS1aXSkpL2c7XHJcbmZ1bmN0aW9uIHRpdGxlQ2FzZVNwYWNlKHRleHQ6IHN0cmluZykge1xyXG4gICAgdGV4dCA9IHRleHQucmVwbGFjZShjYW1lbEVkZ2VzLCAnJDEgJyk7XHJcbiAgICB0ZXh0ID0gdGV4dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleHQuc2xpY2UoMSk7XHJcbiAgICByZXR1cm4gdGV4dDtcclxufVxyXG5cclxuLy8gZW5kIG9mIHN0cmluZyBmdW5jdGlvbnNcclxuXHJcbi8vIFNlZSBNYXJrIE1pbGxlcuKAmXMgZXhwbGFuYXRpb24gb2Ygd2hhdCB0aGlzIGRvZXMuXHJcbi8vIGh0dHA6Ly93aWtpLmVjbWFzY3JpcHQub3JnL2Rva3UucGhwP2lkPWNvbnZlbnRpb25zOnNhZmVfbWV0YV9wcm9ncmFtbWluZ1xyXG5mdW5jdGlvbiB1bmN1cnJ5KGY6IGFueSkge1xyXG4gICAgbGV0IGNhbGwgPSBGdW5jdGlvbi5jYWxsO1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gY2FsbC5hcHBseShmLCBhcmd1bWVudHMpO1xyXG4gICAgfTtcclxufVxyXG5cclxuLy8gc2hpbXNcclxuXHJcbmlmICghT2JqZWN0LmNyZWF0ZSkge1xyXG4gICAgT2JqZWN0LmNyZWF0ZSA9IGZ1bmN0aW9uIChwYXJlbnQ6IGFueSkge1xyXG4gICAgICAgIGxldCBGID0gPGFueT5mdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBGLnByb3RvdHlwZSA9IHBhcmVudDtcclxuICAgICAgICByZXR1cm4gbmV3IEYoKTtcclxuICAgIH07XHJcbn1cclxuXHJcbi8vIHN0cmluZ3MgZm9yIGVycm9yIG1lc3NhZ2VzXHJcblxyXG5jb25zdCBzdHJpbmdzID0ge1xyXG4gICAgXCJUT19UWVBFXCI6IFwiQWRkICdFbnRpdHlRdWVyeS50b1R5cGUoKScgdG8geW91ciBxdWVyeSwgb3IgY2FsbCAnTWV0YWRhdGFTdG9yZS5zZXRFbnRpdHlUeXBlRm9yUmVzb3VyY2VOYW1lKCknIHRvIHJlZ2lzdGVyIGFuIEVudGl0eVR5cGUgZm9yIHRoaXMgcmVzb3VyY2VOYW1lLlwiXHJcbn1cclxuXHJcbi8vIC8vIG5vdCBhbGwgbWV0aG9kcyBhYm92ZSBhcmUgZXhwb3J0ZWRcclxuZXhwb3J0IGNvbnN0IGNvcmUgPSB7XHJcbiAgICBpc0VTNVN1cHBvcnRlZDogaXNFUzVTdXBwb3J0ZWQsXHJcbiAgICBoYXNPd25Qcm9wZXJ0eTogaGFzT3duUHJvcGVydHksXHJcbiAgICBnZXRPd25Qcm9wZXJ0eVZhbHVlczogZ2V0T3duUHJvcGVydHlWYWx1ZXMsXHJcbiAgICBnZXRQcm9wZXJ0eURlc2NyaXB0b3I6IGdldFByb3BEZXNjcmlwdG9yLFxyXG4gICAgb2JqZWN0Rm9yRWFjaDogb2JqZWN0Rm9yRWFjaCxcclxuICAgIG9iamVjdEZpcnN0OiBvYmplY3RGaXJzdCxcclxuICAgIG9iamVjdE1hcDogb2JqZWN0TWFwLCAvLyBUT0RPOiByZXBsYWNlIHRoaXMgd2l0aCBzb21ldGhpbmcgc3Ryb25nbHkgdHlwZWQuXHJcbiAgICBleHRlbmQ6IGV4dGVuZCxcclxuICAgIHByb3BFcTogcHJvcEVxLFxyXG4gICAgcHJvcHNFcTogcHJvcHNFcSxcclxuICAgIHBsdWNrOiBwbHVjayxcclxuICAgIG1hcDogbWFwLFxyXG4gICAgcmVzb2x2ZVByb3BlcnRpZXM6IHJlc29sdmVQcm9wZXJ0aWVzLFxyXG4gICAgc2V0QXNEZWZhdWx0OiBzZXRBc0RlZmF1bHQsXHJcbiAgICB1cGRhdGVXaXRoRGVmYXVsdHM6IHVwZGF0ZVdpdGhEZWZhdWx0cyxcclxuICAgIGdldEFycmF5OiBnZXRBcnJheSxcclxuICAgIHRvQXJyYXk6IHRvQXJyYXksXHJcbiAgICBhcnJheUVxdWFsczogYXJyYXlFcXVhbHMsXHJcbiAgICBhcnJheVNsaWNlOiBhcnJheVNsaWNlLFxyXG4gICAgYXJyYXlGaXJzdDogYXJyYXlGaXJzdCxcclxuICAgIGFycmF5SW5kZXhPZjogYXJyYXlJbmRleE9mLFxyXG4gICAgYXJyYXlSZW1vdmVJdGVtOiBhcnJheVJlbW92ZUl0ZW0sXHJcbiAgICBhcnJheVppcDogYXJyYXlaaXAsXHJcbiAgICBhcnJheUFkZEl0ZW1VbmlxdWU6IGFycmF5QWRkSXRlbVVuaXF1ZSxcclxuICAgIGFycmF5RmxhdE1hcDogYXJyYXlGbGF0TWFwLFxyXG5cclxuICAgIHJlcXVpcmVMaWI6IHJlcXVpcmVMaWIsXHJcbiAgICB1c2luZzogdXNpbmcsXHJcbiAgICB3cmFwRXhlY3V0aW9uOiB3cmFwRXhlY3V0aW9uLFxyXG5cclxuICAgIG1lbW9pemU6IG1lbW9pemUsXHJcbiAgICBnZXRVdWlkOiBnZXRVdWlkLFxyXG4gICAgZHVyYXRpb25Ub1NlY29uZHM6IGR1cmF0aW9uVG9TZWNvbmRzLFxyXG5cclxuICAgIGlzU2V0dGFibGU6IGlzU2V0dGFibGUsXHJcblxyXG4gICAgaXNEYXRlOiBpc0RhdGUsXHJcbiAgICBpc0RhdGVTdHJpbmc6IGlzRGF0ZVN0cmluZyxcclxuICAgIGlzR3VpZDogaXNHdWlkLFxyXG4gICAgaXNEdXJhdGlvbjogaXNEdXJhdGlvbixcclxuICAgIGlzRnVuY3Rpb246IGlzRnVuY3Rpb24sXHJcbiAgICBpc0VtcHR5OiBpc0VtcHR5LFxyXG4gICAgaXNOdW1lcmljOiBpc051bWVyaWMsXHJcblxyXG4gICAgaWRlbnRpdHk6IGlkZW50aXR5LFxyXG4gICAgbm9vcDogbm9vcCxcclxuXHJcbiAgICBzdHJpbmdTdGFydHNXaXRoOiBzdHJpbmdTdGFydHNXaXRoLFxyXG4gICAgc3RyaW5nRW5kc1dpdGg6IHN0cmluZ0VuZHNXaXRoLFxyXG4gICAgZm9ybWF0U3RyaW5nOiBmb3JtYXRTdHJpbmcsXHJcbiAgICB0aXRsZUNhc2U6IHRpdGxlQ2FzZVNwYWNlLFxyXG5cclxuICAgIHRvSnNvbjogdG9Kc29uLFxyXG4gICAgdG9KU09OU2FmZTogdG9KU09OU2FmZSxcclxuICAgIHRvSlNPTlNhZmVSZXBsYWNlcjogdG9KU09OU2FmZVJlcGxhY2VyLFxyXG5cclxuICAgIHN0cmluZ3M6IHN0cmluZ3NcclxufTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JDYWxsYmFjayB7XHJcbiAgICAoZXJyb3I6IGFueSk6IHZvaWQ7XHJcbn1cclxuXHJcblxyXG4vLyBVbnVzZWRcclxuLypcclxuLy8gcmV0dXJucyB0cnVlIGZvciBib29sZWFucywgbnVtYmVycywgc3RyaW5ncyBhbmQgZGF0ZXNcclxuLy8gZmFsc2UgZm9yIG51bGwsIGFuZCBub24tZGF0ZSBvYmplY3RzLCBmdW5jdGlvbnMsIGFuZCBhcnJheXNcclxuZnVuY3Rpb24gaXNQcmltaXRpdmUob2JqOiBhbnkpIHtcclxuICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gdHJ1ZSBmb3IgbnVtYmVycywgc3RyaW5ncywgYm9vbGVhbnMgYW5kIG51bGwsIGZhbHNlIGZvciBvYmplY3RzXHJcbiAgICBpZiAob2JqICE9IE9iamVjdChvYmopKSByZXR1cm4gdHJ1ZTtcclxuICAgIHJldHVybiBpc0RhdGUob2JqKTtcclxufVxyXG5cclxuKi8iXX0=
|